API-viite
Jokaisella alla olevalla kutsulla on esimerkkipyyntö ja -vastaus, ja niiden jälkeen tulevat töiden tilat, virhekoodit, rajat ja säilytysajat. Oletko uusi? Aloita kehittäjäoppaasta.
Yleiskatsaus
- Perus-URL:
https://api.video-to-notes.com. Jokainen polku alkaa/api/v1. - Pyynnöt ja vastaukset ovat JSONia HTTPS:n yli. Lähetä jokaisen pyyntörungon mukana
Content-Type: application/json. - Ajat ovat Unix-aikaleimoja sekunteina (UTC). Kohdat tallenteessa ovat sekunteja tiedoston alusta.
- Tunnisteet ja kursorit ovat läpinäkymättömiä merkkijonoja. Tallenna ne täsmälleen sellaisina kuin saat ne.
- Jokainen virhevastaus sisältää kentän
request_id. Kerro se, kun otat yhteyttä tukeen. - Vastaukset lähetetään otsakkeella
Cache-Control: no-store; älä tallenna niitä jaettuihin välimuisteihin. - Koneluettava sopimus on tiedostoissa openapi.json (OpenAPI 3.1) ja paid-api.schema.json (JSON Schema).
Todennus
Lähetä API-avaimesi bearer-tunnisteena jokaisen API-pyynnön mukana. Avaimet alkavat vtn_prod_. Luot ja perut avaimet sivustolle kirjautuneena; API-avaimella ei voi hallita avaimia, maksuja eikä tiliä.
Authorization: Bearer vtn_prod_...Puuttuva, virheellinen, vanhentunut tai peruttu avain palauttaa 401 UNAUTHORIZED. Älä koskaan lähetä avainta allekirjoitettuihin tallennustilan URL-osoitteisiin: niillä on oma valtuutuksensa. Tämän sivun curl-esimerkit käyttävät tätä pientä apufunktiota, joka välittää avaimen curlille vakiosyötteen kautta:
# 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 - "$@"
}Tili
GET /api/v1/account
Palauttaa tilauksen, jäljellä olevat tilaussekunnit, nykyisen kiintiön päättymisen sekä tiliin juuri nyt sovellettavat ominaisuudet ja rajat. Lue se ennen lataamista: jos eligible tai capabilities.api_admission_enabled on false, uudet työt hylätään.
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
}
}
}Lataukset
Tiedostot ladataan osina suoraan tallennustilaan allekirjoitettujen URL-osoitteiden kautta. Tilillä voi olla yksi aktiivinen lataus kerrallaan.
POST /api/v1/uploads
Aloittaa latauksen. Lähetä tiedoston tarkka koko tavuina ja tiedostopääte. Vastaus kertoo part_size- ja part_count-arvot: jaa tiedosto part_size tavun osiin; viimeinen osa saa olla pienempi.
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
Palauttaa allekirjoitetut lataus-URL-osoitteet 1–100 osanumerolle. Jokainen URL on voimassa enintään 15 minuuttia; pyydä uusi, kun se vanhenee tai kun osa on lähetettävä uudelleen.
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}
Lähetä jokainen osa raakatavuina HTTP-PUT-pyynnössä sen allekirjoitettuun URL-osoitteeseen ilman Authorization-otsaketta. Säilytä vastausotsake ETag täsmälleen sellaisena kuin se palautuu, lainausmerkit mukaan lukien. Kukin URL-osoite hyväksyy vain osansa tarkan koon: part_size jokaiselle osalle paitsi viimeiselle, joka sisältää jäljellä olevat tavut. Muun pituinen runko hylätään HTTP 403 -vastauksella.
# 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
Viimeistelee latauksen. Lähetä jokainen osanumero sen ETag-arvon kanssa. Latauksen viimeistely ei käynnistä käsittelyä; luo sen jälkeen työ.
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}
Palauttaa latauksen tilan: created, uploading, uploaded, probing, probed, failed, aborted tai 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
Keskeyttää latauksen, jota et aio käyttää, ja vapauttaa tilin latauspaikan. Kutsun voi turvallisesti toistaa.
vtn -X POST "$VTN_API_BASE/api/v1/uploads/upload-1/abort" \
-H "Content-Type: application/json" \
-d '{}'Työt
Työ käsittelee yhden ladatun tiedoston litteroinniksi ja muistiinpanoiksi. Tili voi suorittaa yhden työn kerrallaan.
POST /api/v1/jobs
Käynnistää ladatun tiedoston käsittelyn. Otsake Idempotency-Key on pakollinen: 1–128 tulostettavaa ASCII-merkkiä ilman välilyöntejä, uusi jokaiselle työlle. Valinnaiset kentät ovat range (start_seconds ja end_seconds, molemmat pakollisia, jos kenttä on mukana), audio_language ja notes_language. Palauttaa 202 ja työn tilassa preparing. Sama avain samalla rungolla palauttaa saman työn; sama avain eri rungolla palauttaa 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}
Palauttaa tilan, nykyisen vaiheen, edistymisen (completed_units / total_units), charged_seconds-arvon, varoitukset ja mahdollisen virheen. Myös epäonnistunut työ palauttaa 200; lue sen 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
Pysäyttää työn. Valmiit osat säilyvät saatavilla ja käyttämätön varattu aika palautetaan. Kutsun voi turvallisesti toistaa.
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
Jatkaa keskeytynyttä työtä, kun sen tila ilmoittaa can_resume: true. Se vaatii aktiivisen tilauksen ja tarkistaa jäljellä olevan aikasi uudelleen. Jo käsitellyistä osista ei veloiteta uudelleen.
vtn -X POST "$VTN_API_BASE/api/v1/jobs/job-1/resume" \
-H "Content-Type: application/json" \
-d '{}'Tulokset
GET /api/v1/jobs/{job_id}/result
Palauttaa yhden tulossivun, jossa on enintään 32 kohdetta ja 1 Mt. Kohteet ovat järjestyksessä, ja niillä on kind: transcript (teksti ajoitettuine jaksoineen), notes (Markdown), gap (ääni, jota ei voitu käsitellä) tai warning. Anna next_cursor kyselyparametrina cursor saadaksesi seuraavan sivun, kunnes se on null. Jokaisella sivulla voi olla artifacts-kentässä enintään neljä latauslinkkiä, jotka ovat voimassa enintään 10 minuuttia. Jos työtä jatketaan lukemisen aikana, API palauttaa 409 JOB_CONFLICT; aloita silloin uudelleen ensimmäiseltä sivulta.
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
}Jokainen litteroinnin jakso ilmoittaa timing_quality-arvonsa: aligned, approximate tai unavailable. Likimääräiset ajat ovat lähellä puhetta, mutta eivät sanan tarkkuudella.
Latausmuodot ovat transcript_txt (TXT), notes_md (Markdown), notes_html (HTML) ja notes_pdf (PDF). Pitkät muistiinpanot voivat jakautua useaan tiedostoon; lataa ne järjestyksessä. Tilikutsu listaa juuri nyt saatavilla olevat muodot.
Työn tilat
| Tila | Merkitys |
|---|---|
preparing | Palvelin tarkistaa tiedostoa ja suunnittelee työtä. |
queued | Työ odottaa aloitusta. |
processing | Ääntä erotetaan, litteroidaan ja muutetaan muistiinpanoiksi. |
completed | Valmis. Koko litterointi ja muistiinpanot ovat saatavilla. |
completed_with_gaps | Valmis, mutta osaa äänestä ei voitu käsitellä. Katso gap-kohteet. |
interrupted | Pysähtyi ennen loppua. Tarkista can_resume. |
cancelled | Pysäytetty pyynnöstäsi. Valmiit osat säilyvät saatavilla. |
failed | Työtä ei voitu käsitellä. Katso error. |
expired | Sisältöä ei enää säilytetä. |
stage näyttää käynnissä olevan vaiheen: probe, planning, admission, extraction, transcription, notes, publication ja lopuksi terminal.
Virheet
Jokaisella virheellä on sama JSON-runko. retryable kertoo, voiko sama pyyntö onnistua myöhemmin, ja retry_after_seconds, kuinka kauan odottaa.
{
"error": {
"code": "RATE_LIMITED",
"message": "Request refused.",
"retryable": true,
"retry_after_seconds": 5
},
"request_id": "request-1"
}| Koodi | HTTP | Merkitys | Mitä tehdä |
|---|---|---|---|
UNAUTHORIZED | 401 | Avain puuttuu tai on virheellinen, vanhentunut, peruttu tai toisen ympäristön avain. | Tarkista avain tai luo uusi. |
FORBIDDEN | 403 | Avainta ei voi käyttää tähän pyyntöön. | Hallitse avaimia ja maksuja sivustolla. |
NOT_FOUND | 404 | Latausta tai työtä ei ole, tai se kuuluu toiselle tilille. | Tarkista tunniste. |
VALIDATION_ERROR | 400 | Runko, otsake tai kyselyparametri on virheellinen. | Korjaa pyyntö; älä toista sitä muuttamattomana. |
PLAN_REQUIRED | 403 | Tilillä ei ole aktiivista Basic- tai Plus-tilausta. | Valitse tilaus ja yritä sitten uudelleen. |
INSUFFICIENT_BALANCE | 403 | Jäljellä oleva tilausaika ei riitä valittuun ääneen. | Valitse lyhyempi väli tai odota, että tuntisi uusiutuvat. |
CAPABILITY_DISABLED | 503 | Uudet työt on keskeytetty tai jokin ominaisuus on pois päältä. | Yritä myöhemmin uudelleen; tilikutsu näyttää nykyisen tilanteen. |
UNSUPPORTED_MEDIA | 400 | Muotoa ei tueta, tai ladattu koko poikkeaa ilmoitetusta. | Lataa tuettu tiedosto sen tarkalla koolla. |
MEDIA_TOO_LARGE | 413 | Tiedosto ylittää rajan. | Lataa enintään 8 GiB:n tiedosto. |
PROBE_FAILED | 400 | Tiedostossa ei ole purettavaa ääniraitaa, tai väli on tiedoston ulkopuolella. | Tarkista tiedosto ja väli. Aikaa ei veloiteta. |
IDEMPOTENCY_CONFLICT | 409 | Idempotency-Key on jo käytetty eri syötteillä. | Käytä uudelle työlle uutta avainta. |
IDEMPOTENCY_EXPIRED | 410 | Tämän avaimen alkuperäinen työ on vanhentunut. | Älä toista sitä; aloita uusi työ uudella avaimella. |
JOB_CONFLICT | 409 | Toinen lataus tai työ on käynnissä, tila ei salli toimintoa, tai tulos muuttui sivutuksen aikana. | Odota nykyistä työtä tai aloita sivutus alusta. |
RESULT_EXPIRED | 410 | Tulosta ei enää säilytetä. | Tallenna tulokset ennen kuin ne vanhenevat. |
RATE_LIMITED | 429 | Liikaa pyyntöjä, tai päivittäinen latausraja on täynnä. | Odota Retry-After-arvon mukaan ja yritä sitten uudelleen. |
UNAVAILABLE | 503 | Jokin palvelu on tilapäisesti poissa käytöstä. | Yritä uudelleen kasvavin viivein. |
Rajat
Nämä ovat oletusarvot. Tilikutsu palauttaa tiliisi sovellettavat arvot; luota niihin.
| Raja | Oletus | Kenttä kohteessa capabilities.limits |
|---|---|---|
| Tiedoston koko | 8 GiB | max_upload_bytes |
| Valittu ääni työtä kohden | Jäljellä oleva tilausaikasi (null tarkoittaa, ettei muuta ylärajaa ole) | max_selection_seconds |
| Aktiiviset lataukset ja työt | Yksi kumpaakin tiliä kohden | active_uploads, active_jobs |
| Lataukset UTC-vuorokaudessa | 10 latausta, yhteensä 20 GiB | daily_uploads, daily_upload_bytes |
| Uudet työt ja jatkamiset | 12 minuutissa | new_requests_per_minute |
| Muut pyynnöt | 60 minuutissa kaikilla avaimilla yhteensä | read_requests_per_minute |
| Tilakyselyt | Enintään viiden sekunnin välein | poll_after_seconds |
| Tulossivu | 32 kohdetta ja 1 Mt | result_page_items, result_page_bytes |
| Allekirjoitettu lataus-URL | Voimassa enintään 15 minuuttia | upload_url_seconds |
| Latauslinkki | Voimassa enintään 10 minuuttia | download_url_seconds |
| Epäonnistunut todennus | 30 minuutissa IP-osoitetta kohden; sen jälkeen jokainen pyyntö siitä osoitteesta saa vastauksen 429, myös kelvollisella avaimella, kunnes minuutti on kulunut | — |
Säilytys
| Tiedot | Säilytysaika |
|---|---|
| Lataus ilman työtä | Noin 2 tuntia |
| Tulossivut ja ladattavat tiedostot | Noin 24 tuntia työn valmistumisesta |
| Litteroinnin palautus | Noin 48 tuntia |
| Idempotenssitietue ilman sisältöä | 400 päivää |
Kunkin vastauksen expires_at-arvot ovat ratkaisevia; käytä niitä näiden oletusarvojen sijaan.
Muutosloki
API-versio on osa polkua. Version 1 muutokset luetellaan tässä päivämäärineen.
- 2026-10-24: API v1 saatavilla Basic- ja Plus-tilauksille.