API-referens
Varje anrop nedan har ett exempel på begäran och svar, följt av jobbtillstånd, felkoder, gränser och lagringstider. Ny här? Börja med utvecklarguiden.
Översikt
- Bas-URL:
https://api.video-to-notes.com. Varje sökväg börjar med/api/v1. - Begäranden och svar är JSON över HTTPS. Skicka
Content-Type: application/jsonmed varje begärandetext. - Tider är Unix-tidsstämplar i sekunder (UTC). Positioner i en inspelning är sekunder från filens början.
- ID:n och markörer är ogenomskinliga strängar. Spara dem exakt som du får dem.
- Varje felsvar innehåller ett
request_id. Ange det när du kontaktar supporten. - Svar skickas med
Cache-Control: no-store; spara dem inte i delade cacheminnen. - Det maskinläsbara kontraktet finns i openapi.json (OpenAPI 3.1) och paid-api.schema.json (JSON Schema).
Autentisering
Skicka din API-nyckel som bearer-token med varje API-begäran. Nycklar börjar med vtn_prod_. Du skapar och återkallar nycklar när du är inloggad på webbplatsen; en API-nyckel kan inte hantera nycklar, betalningar eller kontot.
Authorization: Bearer vtn_prod_...En nyckel som saknas, är felformad, har gått ut eller har återkallats ger 401 UNAUTHORIZED. Skicka aldrig nyckeln till de signerade lagrings-URL:erna: de har sin egen behörighet. Curl-exemplen på den här sidan använder den här lilla hjälpfunktionen, som skickar nyckeln till curl via standard in:
# Sends the key through stdin, so it never appears in the process list.
vtn() {
printf 'header = "Authorization: Bearer %s"\n' "$VTN_API_KEY" |
curl -s --config - "$@"
}Konto
GET /api/v1/account
Returnerar abonnemanget, de återstående abonnemangssekunderna, slutet på den aktuella tilldelningen samt de funktioner och gränser som gäller för kontot just nu. Läs det innan du laddar upp: om eligible eller capabilities.api_admission_enabled är false avvisas nya jobb.
vtn "$VTN_API_BASE/api/v1/account"{
"plan": "basic",
"eligible": true,
"remaining_seconds": 64800,
"allowance_expires_at": 1792886400,
"capabilities": {
"api_admission_enabled": true,
"key_creation_enabled": true,
"server_upload_enabled": true,
"long_jobs": true,
"formats": [
"mp4", "m4v", "mov", "webm", "mkv", "ogv", "avi", "wmv", "asf",
"flv", "mpg", "mpeg", "vob", "ts", "mts", "m2ts", "3gp", "3g2",
"mxf", "mp3", "m4a", "aac", "wav", "flac", "ogg", "oga", "opus",
"wma", "amr", "aiff", "aif", "caf", "ac3"
],
"audio_languages": [
"auto", "af", "am", "ar", "hy", "az", "be", "bn", "bs", "bg", "my",
"ca", "zh", "hr", "cs", "da", "nl", "en", "et", "tl", "fi", "fr",
"gl", "ka", "de", "el", "gu", "ha", "he", "hi", "hu", "is", "id",
"it", "ja", "kn", "kk", "km", "ko", "lv", "lt", "mk", "ms", "ml",
"mt", "mr", "mn", "ne", "no", "fa", "pl", "pt", "pa", "ro", "ru",
"sr", "sk", "sl", "es", "sw", "sv", "ta", "te", "th", "tr", "uk",
"uz", "vi"
],
"notes_languages": [
"auto", "af", "am", "ar", "hy", "az", "be", "bn", "bs", "bg", "my",
"ca", "zh", "hr", "cs", "da", "nl", "en", "et", "tl", "fi", "fr",
"gl", "ka", "de", "el", "gu", "ha", "he", "hi", "hu", "is", "id",
"it", "ja", "kn", "kk", "km", "ko", "lv", "lt", "mk", "ms", "ml",
"mt", "mr", "mn", "ne", "no", "fa", "pl", "pt", "pa", "ro", "ru",
"sr", "sk", "sl", "es", "sw", "sv", "ta", "te", "th", "tr", "uk",
"uz", "vi"
],
"download_formats": ["transcript_txt", "notes_md", "notes_html", "notes_pdf"],
"email_opt_in": false,
"limits": {
"max_upload_bytes": 8589934592,
"max_selection_seconds": null,
"active_jobs": 1,
"active_uploads": 1,
"daily_uploads": 10,
"daily_upload_bytes": 21474836480,
"new_requests_per_minute": 12,
"read_requests_per_minute": 60,
"poll_after_seconds": 5,
"result_page_bytes": 1000000,
"result_page_items": 32,
"upload_url_seconds": 900,
"download_url_seconds": 600,
"result_retention_seconds": 86400,
"recovery_retention_seconds": 172800,
"idempotency_retention_seconds": 34560000
}
}
}Uppladdningar
Filer laddas upp i delar direkt till lagringen via signerade URL:er. Ett konto kan ha en aktiv uppladdning åt gången.
POST /api/v1/uploads
Startar en uppladdning. Skicka den exakta filstorleken i byte och filändelsen. Svaret anger part_size och part_count: dela filen i delar om part_size byte; den sista delen får vara mindre.
vtn -X POST "$VTN_API_BASE/api/v1/uploads" \
-H "Content-Type: application/json" \
-d '{
"byte_size": 1048576,
"extension": "mp4"
}'{
"upload_id": "upload-1",
"state": "created",
"expires_at": 1792807200,
"part_size": 16777216,
"part_count": 1,
"error": null
}POST /api/v1/uploads/{upload_id}/parts
Returnerar signerade uppladdnings-URL:er för 1 till 100 delnummer. Varje URL gäller i upp till 15 minuter; begär en ny när den löper ut eller när en del måste skickas igen.
vtn -X POST "$VTN_API_BASE/api/v1/uploads/upload-1/parts" \
-H "Content-Type: application/json" \
-d '{
"part_numbers": [1]
}'{
"upload_id": "upload-1",
"targets": [
{
"part_number": 1,
"url": "https://example.invalid/signed",
"expires_at": 1792800900
}
]
}PUT {signed part URL}
Skicka varje del som råa byte i en HTTP-PUT till dess signerade URL, utan Authorization-header. Spara svarsheadern ETag exakt som den returneras, inklusive citattecknen. Varje URL accepterar bara sin dels exakta storlek: part_size för varje del utom den sista, som innehåller de återstående byten. En body med någon annan längd avvisas med HTTP 403.
# PART_URL comes from the parts response; send no Authorization header.
curl -s --upload-file part-0001.bin --dump-header - --output /dev/null \
"$PART_URL" | grep -i '^etag:'POST /api/v1/uploads/{upload_id}/complete
Slutför uppladdningen. Skicka varje delnummer med dess ETag. Att slutföra en uppladdning startar inte bearbetningen; skapa ett jobb därefter.
vtn -X POST "$VTN_API_BASE/api/v1/uploads/upload-1/complete" \
-H "Content-Type: application/json" \
-d '{
"parts": [
{
"part_number": 1,
"etag": "opaque-etag"
}
]
}'{
"upload_id": "upload-1",
"state": "uploaded",
"expires_at": 1792807200,
"part_size": 16777216,
"part_count": 1,
"error": null
}GET /api/v1/uploads/{upload_id}
Returnerar tillståndet för en uppladdning: created, uploading, uploaded, probing, probed, failed, aborted eller expired.
vtn "$VTN_API_BASE/api/v1/uploads/upload-1"{
"upload_id": "upload-1",
"state": "uploaded",
"expires_at": 1792807200,
"part_size": 16777216,
"part_count": 1,
"error": null
}POST /api/v1/uploads/{upload_id}/abort
Avbryter en uppladdning som du inte kommer att använda och frigör kontots uppladdningsplats. Det är säkert att anropa den igen.
vtn -X POST "$VTN_API_BASE/api/v1/uploads/upload-1/abort" \
-H "Content-Type: application/json" \
-d '{}'Jobb
Ett jobb bearbetar en uppladdad fil till en transkription och anteckningar. Ett konto kan köra ett jobb åt gången.
POST /api/v1/jobs
Startar bearbetningen av en uppladdad fil. Headern Idempotency-Key krävs: 1 till 128 skrivbara ASCII-tecken utan mellanslag, ny för varje jobb. Valfria fält är range (start_seconds och end_seconds, båda krävs om fältet finns), audio_language och notes_language. Returnerar 202 med jobbet i tillståndet preparing. Samma nyckel med samma innehåll returnerar samma jobb; samma nyckel med annat innehåll returnerar 409.
vtn -X POST "$VTN_API_BASE/api/v1/jobs" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d '{
"upload_id": "upload-1",
"range": {
"start_seconds": 5,
"end_seconds": 60
},
"audio_language": null,
"notes_language": "en"
}'{
"job_id": "job-1",
"state": "preparing",
"stage": "probe",
"created_at": 1792800000,
"expires_at": 1792807200,
"result_expires_at": null,
"idempotency_expires_at": 1827360000,
"poll_after_seconds": 5,
"status_url": "/api/v1/jobs/job-1",
"result_url": "/api/v1/jobs/job-1/result",
"completed_units": 0,
"total_units": null,
"charged_seconds": 0,
"result_available": false,
"can_resume": false,
"warnings": [],
"error": null
}GET /api/v1/jobs/{job_id}
Returnerar tillståndet, aktuell fas, förloppet (completed_units av total_units), charged_seconds, varningar och eventuellt fel. Ett misslyckat jobb returnerar ändå 200; läs dess error.
vtn "$VTN_API_BASE/api/v1/jobs/job-1"{
"job_id": "job-1",
"state": "completed",
"stage": "terminal",
"created_at": 1792800000,
"expires_at": 1792807200,
"result_expires_at": 1792886400,
"idempotency_expires_at": 1827360000,
"poll_after_seconds": 5,
"status_url": "/api/v1/jobs/job-1",
"result_url": "/api/v1/jobs/job-1/result",
"completed_units": 8,
"total_units": 8,
"charged_seconds": 1140,
"result_available": true,
"can_resume": false,
"warnings": [],
"error": null
}POST /api/v1/jobs/{job_id}/cancel
Stoppar ett jobb. Färdiga delar finns kvar och reserverad tid som inte användes återförs. Det är säkert att anropa den igen.
vtn -X POST "$VTN_API_BASE/api/v1/jobs/job-1/cancel" \
-H "Content-Type: application/json" \
-d '{}'POST /api/v1/jobs/{job_id}/resume
Återupptar ett avbrutet jobb när dess status anger can_resume: true. Det kräver ett aktivt abonnemang och kontrollerar din återstående tid igen. Delar som redan har bearbetats debiteras inte igen.
vtn -X POST "$VTN_API_BASE/api/v1/jobs/job-1/resume" \
-H "Content-Type: application/json" \
-d '{}'Resultat
GET /api/v1/jobs/{job_id}/result
Returnerar en resultatsida med upp till 32 objekt och 1 MB. Objekten är ordnade och har en kind: transcript (text med tidsatta segment), notes (Markdown), gap (ljud som inte kunde bearbetas) eller warning. Skicka next_cursor som frågeparametern cursor för att hämta nästa sida, tills den är null. Varje sida kan lista upp till fyra nedladdningslänkar i artifacts, giltiga i upp till 10 minuter. Om jobbet återupptas medan du läser returnerar API:t 409 JOB_CONFLICT; börja då om från första sidan.
vtn --get "$VTN_API_BASE/api/v1/jobs/job-1/result" \
--data-urlencode "cursor=$NEXT_CURSOR" # omit for the first page{
"job_id": "job-1",
"snapshot": "generation-1",
"items": [
{
"index": 0,
"kind": "transcript",
"text": "Welcome to the weekly planning meeting.",
"segments": [
{
"text": "Welcome to the weekly planning meeting.",
"start_seconds": 0,
"end_seconds": 4.2,
"timing_quality": "approximate",
"timing_method": "provider_segment"
}
]
},
{
"index": 0,
"kind": "notes",
"text": "## Summary\n\nThe team agreed on the launch plan.\n\n## Key points\n\n- Launch moves to Monday."
}
],
"next_cursor": "opaque-account-bound-cursor",
"artifacts": [
{
"format": "notes_md",
"url": "https://example.invalid/signed-notes",
"expires_at": 1792800600
}
],
"charged_seconds": 1140,
"partial": false,
"expires_at": 1792886400
}Varje transkriptionssegment anger sin timing_quality: aligned, approximate eller unavailable. Ungefärliga tider ligger nära talet men är inte exakta på ordnivå.
Nedladdningsformaten är transcript_txt (TXT), notes_md (Markdown), notes_html (HTML) och notes_pdf (PDF). Långa anteckningar kan vara uppdelade på flera filer; ladda ned dem i ordning. Kontoanropet visar de format som finns just nu.
Jobbtillstånd
| Tillstånd | Betydelse |
|---|---|
preparing | Servern kontrollerar filen och planerar arbetet. |
queued | Jobbet väntar på att starta. |
processing | Ljudet extraheras, transkriberas och görs om till anteckningar. |
completed | Klart. Den fullständiga transkriptionen och anteckningarna finns tillgängliga. |
completed_with_gaps | Klart, men en del av ljudet kunde inte bearbetas. Se gap-objekten. |
interrupted | Stoppat före slutet. Kontrollera can_resume. |
cancelled | Stoppat på din begäran. Färdiga delar finns kvar. |
failed | Jobbet kunde inte bearbetas. Se error. |
expired | Innehållet sparas inte längre. |
stage visar steget som pågår: probe, planning, admission, extraction, transcription, notes, publication och till sist terminal.
Fel
Alla fel har samma JSON-innehåll. retryable anger om samma begäran kan lyckas senare, och retry_after_seconds hur länge du ska vänta.
{
"error": {
"code": "RATE_LIMITED",
"message": "Request refused.",
"retryable": true,
"retry_after_seconds": 5
},
"request_id": "request-1"
}| Kod | HTTP | Betydelse | Vad du gör |
|---|---|---|---|
UNAUTHORIZED | 401 | Nyckeln saknas, är felformad, har gått ut, har återkallats eller hör till en annan miljö. | Kontrollera nyckeln eller skapa en ny. |
FORBIDDEN | 403 | Nyckeln kan inte användas för den här begäran. | Hantera nycklar och betalningar på webbplatsen. |
NOT_FOUND | 404 | Uppladdningen eller jobbet finns inte eller tillhör ett annat konto. | Kontrollera ID:t. |
VALIDATION_ERROR | 400 | Innehållet, en header eller en frågeparameter är ogiltig. | Rätta begäran; upprepa den inte oförändrad. |
PLAN_REQUIRED | 403 | Kontot har inget aktivt Basic- eller Plus-abonnemang. | Välj ett abonnemang och försök sedan igen. |
INSUFFICIENT_BALANCE | 403 | Den återstående abonnemangstiden räcker inte till det valda ljudet. | Välj ett kortare intervall eller vänta tills dina timmar förnyas. |
CAPABILITY_DISABLED | 503 | Nya jobb är pausade eller en funktion är avstängd. | Försök igen senare; kontoanropet visar aktuell status. |
UNSUPPORTED_MEDIA | 400 | Formatet stöds inte, eller den uppladdade storleken skiljer sig från den angivna. | Ladda upp en fil som stöds med dess exakta storlek. |
MEDIA_TOO_LARGE | 413 | Filen är större än gränsen. | Ladda upp en fil på högst 8 GiB. |
PROBE_FAILED | 400 | Filen har inget ljudspår som går att avkoda, eller intervallet ligger utanför filen. | Kontrollera filen och intervallet. Ingen tid debiteras. |
IDEMPOTENCY_CONFLICT | 409 | Idempotency-Key har redan använts med andra indata. | Använd en ny nyckel för ett nytt jobb. |
IDEMPOTENCY_EXPIRED | 410 | Det ursprungliga jobbet för den här nyckeln har löpt ut. | Upprepa det inte; starta ett nytt jobb med en ny nyckel. |
JOB_CONFLICT | 409 | En annan uppladdning eller ett annat jobb är aktivt, tillståndet tillåter inte åtgärden, eller resultatet ändrades medan du bläddrade. | Vänta på det aktuella jobbet eller börja bläddra om från första sidan. |
RESULT_EXPIRED | 410 | Resultatet sparas inte längre. | Spara resultaten innan de löper ut. |
RATE_LIMITED | 429 | För många begäranden, eller så är den dagliga uppladdningsgränsen nådd. | Vänta enligt Retry-After och försök sedan igen. |
UNAVAILABLE | 503 | En tjänst är tillfälligt otillgänglig. | Försök igen med allt längre pauser. |
Gränser
Det här är standardvärdena. Kontoanropet returnerar de värden som gäller för ditt konto; utgå från dem.
| Gräns | Standard | Fält i capabilities.limits |
|---|---|---|
| Filstorlek | 8 GiB | max_upload_bytes |
| Valt ljud per jobb | Din återstående abonnemangstid (null betyder inget annat tak) | max_selection_seconds |
| Aktiva uppladdningar och jobb | En av varje per konto | active_uploads, active_jobs |
| Uppladdningar per UTC-dygn | 10 uppladdningar, totalt 20 GiB | daily_uploads, daily_upload_bytes |
| Nya jobb och återupptaganden | 12 per minut | new_requests_per_minute |
| Andra begäranden | 60 per minut för alla nycklar sammanlagt | read_requests_per_minute |
| Statusfrågor | Högst var femte sekund | poll_after_seconds |
| Resultatsida | 32 objekt och 1 MB | result_page_items, result_page_bytes |
| Signerad uppladdnings-URL | Gäller i upp till 15 minuter | upload_url_seconds |
| Nedladdningslänk | Gäller i upp till 10 minuter | download_url_seconds |
| Misslyckad autentisering | 30 per minut per IP-adress; därefter får varje begäran från den adressen 429, även med en giltig nyckel, tills minuten har gått | — |
Lagringstider
| Data | Sparas i |
|---|---|
| Uppladdning utan jobb | Cirka 2 timmar |
| Resultatsidor och nedladdningsfiler | Cirka 24 timmar efter att jobbet är klart |
| Återställning av transkriptionen | Cirka 48 timmar |
| Idempotenspost, utan innehåll | 400 dagar |
Värdena i expires_at i varje svar gäller; använd dem i stället för de här standardvärdena.
Ändringslogg
API-versionen ingår i sökvägen. Ändringar i v1 listas här med datum.
- 2026-10-24: API v1 tillgängligt för abonnemangen Basic och Plus.