Files
songs2vid/app/api/v1/route.ts
T
Atakan Doğan Özban 9404efd86c Align preview typography with FFmpeg output, add video/song title split, and ship OSS updates.
Separate YouTube video titles from on-video song/artist fields with Pro gating, serve curated fonts and watermark assets for 1:1 preview parity, and include billing/API/docs/deploy stack for self-hosted release.
2026-07-27 16:26:19 +02:00

65 lines
2.2 KiB
TypeScript

import { NextResponse } from "next/server";
import { API_DOCS_URL } from "@/lib/plans";
export async function GET() {
return NextResponse.json({
name: "Songs2VID API",
version: "1.0",
authentication: "Authorization: Bearer <api_key>",
requirements: ["Pro subscription", "YouTube account connected"],
rateLimit: "60 requests per minute per account (plus any approved bonus)",
guidance: {
recommended:
"For most jobs (especially 5+ audio files): POST /api/v1/upload per file, then POST /api/v1/jobs with the returned paths",
batch:
"POST /api/v1/jobs/batch is for small packs only. Large multipart bodies may fail with 'failed to parse body as FormData'",
},
endpoints: [
{
method: "POST",
path: "/api/v1/upload",
description:
"Upload image, audio, PNG logo, or .ttf/.otf font (Pro typography; font ≤10MB)",
body: "multipart/form-data: file, type (image|audio|logo|font)",
},
{
method: "POST",
path: "/api/v1/jobs",
description:
"Create a video job from uploaded file paths. Pro: layout templates, blur, watermark, per-item covers",
body: "application/json: { imagePath, items[{ audioPath, audioFilename, metadata }] }",
},
{
method: "POST",
path: "/api/v1/jobs/batch",
description:
"One-shot batch for small packs only; large uploads may fail FormData parsing; prefer upload + jobs",
body: "multipart/form-data: image, audio[] (repeatable), metadata? (JSON string)",
},
{
method: "GET",
path: "/api/v1/playlists",
description: "List YouTube playlists for the authenticated Pro account",
},
{
method: "POST",
path: "/api/v1/playlists",
description: "Create a YouTube playlist",
body: "application/json: { title, description?, privacy? (public|unlisted|private) }",
},
{
method: "GET",
path: "/api/v1/jobs",
description: "List recent jobs",
query: "limit (default 20, max 100)",
},
{
method: "GET",
path: "/api/v1/jobs/:id",
description: "Get job status and item details",
},
],
docs: API_DOCS_URL,
});
}