De Clevera REST API gebruiken
Roep Clevera aan vanuit je eigen scripts: basis-URL, bearer-token-authenticatie, eindpunten en de benodigde machtigingen, de offerte-dan-starten-flow voor betaald werk, idempotentie, foutopmaak en snelheidslimieten.
Met de REST API van Clevera kunnen je eigen scripts en services doen wat een agent via MCP kan: je bibliotheek lezen, video's en artikelen aanvragen, video's exporteren, aan documentatiesites werken en taken volgen. Dit artikel behandelt de basis-URL, authenticatie, de aanvraagflow voor betaald werk, fouten en snelheidslimieten.
Basisprincipes
| Basis-URL | https://app.clevera.ai/api/v1 |
| Authenticatie | Authorization: Bearer <token> met een API-token (begint met clv_agent_) |
| Opmaak | JSON in en uit. Stuur Accept: application/json en, bij een body, Content-Type: application/json. |
| ID's | Publieke ID's, zoals job_… voor taken. Gebruik de ID's die de API teruggeeft. |
Controleer een token met GET /docs/me:
curl -H "Authorization: Bearer $CLEVERA_TOKEN" \
-H "Accept: application/json" \
https://app.clevera.ai/api/v1/docs/me
Het antwoord geeft aan namens wie het token handelt: de naam en verloopdatum van het token, de persoon en hun huidige rol, de werkruimte, de sites in scope en de machtigingen die op dit moment werken (de machtigingen van het token ingeperkt tot de huidige rol van de persoon). Roep dit aan als een aanroep wordt geweigerd.
Eindpunten
Elk eindpunt heeft de getoonde machtiging nodig. Een aanroep zonder deze machtiging geeft 403 forbidden_ability terug. Zie Agent-machtigingen.
Bibliotheek en materiaal
| Methode en pad | Machtiging | Wat het doet |
|---|---|---|
GET /create/types |
any | De video- en social clip-soorten die je kunt aanvragen. |
GET /library |
library:read |
Video's, opnames en artikelen die de eigenaar van het token kan zien. |
GET /recordings |
library:read |
Alleen opnames. |
GET /library/{item} |
library:read |
Eén item. |
GET /library/{item}/transcript |
library:read |
Het transcript ervan. |
GET /library/{item}/article |
library:read |
Het artikel ervan. |
GET /library/{item}/embed |
library:read |
De embed-code ervan. |
GET /materials |
library:read |
Geüploade afbeeldingen, video's en PDF's. |
POST /materials, POST /materials/import, POST /materials/uploads, POST /materials/uploads/{upload_id}/complete |
materials:write |
Voeg een afbeelding, video of PDF toe (direct, via een URL of als grote upload). |
Video's en artikelen
| Methode en pad | Machtiging | Wat het doet |
|---|---|---|
POST /videos/quotes |
videos:create |
Vraag een offerte aan voor een video uit een opname (type: how_to, product_demo, cleanup, styled_video), een artikel uit een opname (article) of een vertaling (translation). |
POST /videos |
videos:create + credits:spend |
Maak de aangevraagde video (quote_id). |
POST /articles/from-recording |
videos:create + credits:spend |
Maak het aangevraagde artikel. |
POST /videos/translations |
videos:create + credits:spend |
Maak de aangevraagde vertaling. |
POST /clips/quotes |
videos:create |
Vraag een offerte aan voor een social clip (soorten uit GET /create/types). |
POST /clips |
videos:create + credits:spend |
Maak de aangevraagde social clip. |
POST /videos/{video_id}/exports |
videos:export |
Render een MP4: resolution 1080p (standaard), 2k of 4k; altijd 60 fps. Gratis. |
Taken en credits
| Methode en pad | Machtiging | Wat het doet |
|---|---|---|
POST /quotes |
de machtiging van het werk | Een offerte voor elk soort taak. |
POST /jobs |
de machtiging van het werk (+ credits:spend bij betaling) |
Start een aangevraagde taak. |
GET /jobs |
jobs:read |
Takenlijst. |
GET /jobs/{job} |
jobs:read |
Status en resultaat van één taak. |
GET /jobs/{job}/wait |
jobs:read |
Wacht op een wijziging in plaats van pollen. |
GET /jobs/{job}/events |
jobs:read |
De voortgangsgebeurtenissen van de taak. |
POST /jobs/{job}/cancel |
jobs:read |
Annuleer een taak. Te laat: "Deze taak kan niet meer worden geannuleerd." |
GET /credits |
credits:spend of jobs:read |
Het creditsaldo van de werkruimte. |
Documentatiesites
| Methode en pad | Machtiging | Wat het doet |
|---|---|---|
GET /docs/sites, GET /docs/sites/{site}, GET /docs/sites/{site}/tree, GET /docs/sites/{site}/pages |
content:read |
Sites in de scope van het token en hun pagina's. |
GET /docs/sites/{site}/search, GET /docs/pages/{page}, GET /docs/pages/{page}/revisions |
content:read |
Zoek en lees pagina's, inclusief concepten. |
POST /docs/sites/{site}/articles, PATCH /docs/pages/{page}/article, POST /docs/pages/{page}/review |
articles:write |
Maak en bewerk conceptartikelen, dien in voor beoordeling. Live artikelen vereisen ook site:publish. |
PATCH /docs/pages/{page}, DELETE /docs/pages/{page}, POST /docs/sites/{site}/sections, PATCH /docs/sections/{section} |
structure:write |
Verplaats, hernoem, verberg en verwijder pagina's; secties. |
GET/POST /docs/sites/{site}/site-pages, PUT /docs/site-pages/{page}/body |
content:read / site-pages:write |
Home-, contact- en juridische pagina's. |
GET/POST /docs/sites/{site}/changelog, PATCH /docs/changelog/{entry} |
content:read / changelog:write |
Changelog-items als concepten. |
POST /docs/media, POST /docs/media/uploads |
media:write |
Upload afbeeldingen. |
POST /docs/sites/{site}/publish, POST /docs/pages/{page}/ready, POST /docs/changelog/{entry}/publish |
site:publish |
Publiceer wat lezers zien. |
GET /insights/sites/{site}, …/gaps, …/feedback |
insights:read |
Zoek hiaten, onbeantwoorde vragen, paginaterugkoppeling. |
PATCH /docs/sites/{site}/settings, …/appearance, PUT …/navigation, POST …/redirects |
site:configure |
Site-instellingen. |
POST /docs/sites |
sites:create |
Maak een documentatiesite. |
Meer over agents en documentatiesites: Verbind AI-agents met je documentatiesites.
Betaald werk aanvragen
Werk dat credits kost, verloopt altijd eerst via een offerte, en dan starten:
- Vraag een offerte aan.
POST /videos/quotes(of/clips/quotes) met wat je wilt. Het antwoord bevat eenquote_iden het creditbereik. Een offerte is 15 minuten geldig en kan eenmaal worden gebruikt. - Test het eventueel (dry-run). Stuur de start met
"dry_run": trueom te zien of het zou starten, goedkeuring nodig heeft of wordt geblokkeerd. Er wordt niets geschreven. - Start het.
POST /videosmetquote_iden eenIdempotency-Key-header. Het antwoord is202met een taak. - Volg het.
GET /jobs/{job}/waittotdat destatusvan de taak verandert, of luister naar webhooks.
curl -X POST https://app.clevera.ai/api/v1/videos/quotes \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-d '{"type": "how_to", "recording_id": "<recording id>", "language": "en-US"}'
curl -X POST https://app.clevera.ai/api/v1/videos \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: 3f6c1a2e-8d4b-4f7a-9c1e-2b5d7e9f0a13" \
-d '{"quote_id": "<quote id>"}'
Taakstatussen:
| Status | Betekenis |
|---|---|
queued |
Geaccepteerd, staat op het punt te draaien. |
running |
Bezig met uitvoeren. |
needs_input |
Wacht op een persoon, meestal een goedkeuring bij Agent-verzoeken. De taak bevat een link en een verloopdatum. |
succeeded |
Klaar. De taak linkt naar de nieuwe video of het nieuwe artikel. |
failed |
Mislukt; de taak bevat een error_code. |
canceled |
Geannuleerd, of de goedkeuring is geweigerd. |
expired |
Niemand heeft het binnen 24 uur goedgekeurd. |
Of een start direct draait of wacht op een persoon, hangt af van de bestedingslimieten van het token en de instelling Automatisch goedkeuren hieronder. Zie Agent-uitgaven en goedkeuringen beheren.
Opnieuw proberen en idempotentie
Stuur een Idempotency-Key-header (een verse UUID per actie) bij elke aanmaak en start. Als het netwerk wegvalt en je probeert het opnieuw met dezelfde sleutel en body, krijg je het eerste antwoord terug in plaats van een tweede video. Sleutels worden 24 uur onthouden.
| Code | Betekenis |
|---|---|
idempotency_key_reused |
Dezelfde sleutel met een andere body. Gebruik een nieuwe sleutel voor een nieuwe aanvraag. |
idempotency_in_progress |
De eerste aanvraag met deze sleutel is nog bezig. Wacht en probeer het opnieuw. |
idempotency_conflict |
"Deze idempotentie-sleutel is gebruikt voor een andere aanvraag." |
Fouten
Elke fout heeft dezelfde vorm, met een bericht dat aangeeft wat je vervolgens moet doen:
{
"error": {
"code": "forbidden_ability",
"message": "This token lacks the videos:create ability. Ask the workspace member who owns it for a token that has it.",
"details": { "ability": "videos:create" }
},
"request_id": "req_example"
}
Vermeld de request_id wanneer je contact opneemt met de ondersteuning.
| HTTP | Codes | Typische oorzaak |
|---|---|---|
| 401 | unauthenticated, token_expired, token_revoked |
Geen token, een verkeerd token, of een token dat is verlopen of ingetrokken. |
| 402 | insufficient_credits |
De werkruimte heeft onvoldoende credits voor de offerte. |
| 403 | forbidden_ability, forbidden_role, forbidden_item, ip_not_allowed, live_content_needs_publish, site_paused, forbidden |
Een ontbrekende machtiging, de rol van de eigenaar, toegang tot collecties of de IP-whitelist. |
| 403 | plan_locked |
"De agent-API zit niet in het abonnement van deze werkruimte. Het is beschikbaar vanaf Pro." |
| 404 | not_found, unknown_kind |
"Geen … met dat ID in de scope van dit token. Lijst of zoek eerst en gebruik een teruggegeven ID." |
| 409 | revision_conflict, quote_used, not_cancelable, idempotency_* |
De inhoud is gewijzigd, de offerte is gebruikt of er is een conflict bij opnieuw proberen. |
| 410 | quote_expired |
"Deze offerte is verlopen. Vraag een nieuwe offerte aan." |
| 413 | unsupported_media |
Het bestand is te groot of geen ondersteund type. |
| 422 | validation_failed, invalid_input, quote_mismatch, limit_reached |
Een veld is onjuist; details benoemt het. |
| 429 | rate_limited, cap_exceeded, busy |
Te veel aanvragen, een bestedingslimiet of twee starts tegelijk. |
Elk bericht, met de oplossing: Agent- en API-fouten oplossen.
Snelheidslimieten
| Limiet | Waarde | Bericht |
|---|---|---|
| Aanvragen per token | 300 per minuut | "Dit token zit boven de aanvraagsnelheid. Wacht en probeer het opnieuw." |
| Aanvragen per werkruimte | 1.200 per minuut, alle tokens samen | "Deze werkruimte zit boven de aanvraagsnelheid voor agents. Wacht en probeer het opnieuw." |
| Schrijfacties per token | 60 per minuut | "Te veel schrijfacties vanaf dit token. Wacht en probeer het opnieuw." |
| Schrijfacties per token per dag | 2.000 | "Dit token heeft de dagelijkse schrijflimiet bereikt. Probeer het morgen opnieuw." |
| Publicaties per token | 10 per uur | "Dit token heeft de uurlimiet voor publicaties bereikt. Probeer het later opnieuw." |
| Betaalde starts | 20 per uur per token, 100 per dag per werkruimte | rate_limited met retry_after |
| Uploads | 30 per minuut; 500 MB per dag per token; 25 MB per bestand | "Te veel uploads vanaf dit token. Wacht en probeer het opnieuw." / "Dit token heeft het dagelijkse uploadvolume bereikt. Probeer het morgen opnieuw." |
| Aanroepen zonder geldig token | 60 per minuut per IP-adres | "Te veel aanvragen. Wacht en probeer het opnieuw." |
Een 429-antwoord bevat een Retry-After-header en retry_after (seconden) in de body. Wacht zo lang voordat je het opnieuw probeert. Lezen, offertes en statuscontroles kosten geen credits.