{"openapi":"3.1.0","info":{"title":"Ojelio API","version":"1.1.0","description":"Make videos from text and pictures, follow them, and download them. The API comes with the paid plans. Keys are made on the \"Keys and webhooks\" page of the app (owners and admins). The reference: https://ojelio.com/docs/api","contact":{"email":"support@ojelio.com"},"termsOfService":"https://ojelio.com/terms"},"servers":[{"url":"https://ojelio.com/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Videos","description":"Make, follow, approve, cancel and list videos."},{"name":"Options","description":"What a new video can ask for in this workspace."}],"paths":{"/videos":{"post":{"tags":["Videos"],"operationId":"createVideo","summary":"Make a video","description":"Starts a video and answers at once with it, `queued`. Fields left out take the workspace's defaults (see `GET /options`). Credits are held for the most the video can cost and only what it used is charged.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Up to 200 characters, a UUID say. A repeat with the same key answers 200 with the same video instead of making another.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewVideo"}}}},"responses":{"200":{"description":"The video made earlier with this `Idempotency-Key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"201":{"description":"The video, made.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: locked options, a paused workspace or maker, a removed video. `code`: `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such video in the key's workspace. `code`: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The video is not in a state that allows this. `code`: `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request cannot be used: a field, the content's length, or content refused. `code`: `invalid_request`, `content_refused`, `too_long`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Videos"],"operationId":"listVideos","summary":"List videos","description":"The workspace's videos, newest first, from the app and the API alike.","parameters":[{"name":"limit","in":"query","description":"How many, 1 to 50.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","description":"`next_cursor` of the page before.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of videos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoList"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request cannot be used: a field, the content's length, or content refused. `code`: `invalid_request`, `content_refused`, `too_long`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/videos/{id}":{"get":{"tags":["Videos"],"operationId":"getVideo","summary":"Get a video","description":"Its status and steps, its credits, and, once delivered, links to its files. The links last an hour: ask again for fresh ones.","parameters":[{"name":"id","in":"path","required":true,"description":"The video's ID, as `id` in a video (10 characters).","schema":{"type":"string"}}],"responses":{"200":{"description":"The video.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such video in the key's workspace. `code`: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/videos/{id}/approve":{"post":{"tags":["Videos"],"operationId":"approveVideo","summary":"Approve a video's script","description":"A video made with `review_before_render` waits in `review` once its script is written. This makes it go on with the script as written. Editing the script is done on the video's page in the app (`app_url`).","parameters":[{"name":"id","in":"path","required":true,"description":"The video's ID, as `id` in a video (10 characters).","schema":{"type":"string"}}],"responses":{"200":{"description":"The video, going on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: locked options, a paused workspace or maker, a removed video. `code`: `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such video in the key's workspace. `code`: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The video is not in a state that allows this. `code`: `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/videos/{id}/cancel":{"post":{"tags":["Videos"],"operationId":"cancelVideo","summary":"Cancel a video","description":"Stops a video that is `queued`, `running` or in `review`. The steps already finished are charged.","parameters":[{"name":"id","in":"path","required":true,"description":"The video's ID, as `id` in a video (10 characters).","schema":{"type":"string"}}],"responses":{"200":{"description":"The video, canceled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such video in the key's workspace. `code`: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The video is not in a state that allows this. `code`: `conflict`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/options":{"get":{"tags":["Options"],"operationId":"getOptions","summary":"What a video can ask for","description":"The values each field of a new video takes in this workspace, including the IDs of its styles and music, and what a video gets when it leaves a field out.","responses":{"200":{"description":"The options.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}}},"401":{"description":"No key, or a key that is not valid or was revoked. `code`: `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace is on the free plan, or has too few credits. `code`: `plan_required`, `insufficient_credits`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or a daily limit reached. Wait for `Retry-After` seconds (or until `retry_at`). `code`: `rate_limited`, `limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait, for `rate_limited` on a key.","schema":{"type":"integer"}}}},"500":{"description":"Something went wrong on our side. Try again. `code`: `internal`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{"video.completed":{"post":{"operationId":"videoCompleted","summary":"A video is ready: `data.video.files` has its links","description":"Sent to each endpoint that listens for `video.completed`, from the workspace's videos made in the app or with the API. Answer with a 2xx within 10 seconds; anything else is tried again, up to 8 attempts over about 23 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The message's ID, the same at every attempt: use it to ignore repeats.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in seconds since 1970 (UTC).","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated signatures, each `v1,` and the base64 HMAC-SHA256 of `<webhook-id>.<webhook-timestamp>.<body>` keyed with the bytes of the endpoint's secret after `whsec_` (base64).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookMessage"}],"properties":{"type":{"const":"video.completed"}}}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 10 seconds, is tried again."}}}},"video.failed":{"post":{"operationId":"videoFailed","summary":"A video could not be made: `data.video.error` says why","description":"Sent to each endpoint that listens for `video.failed`, from the workspace's videos made in the app or with the API. Answer with a 2xx within 10 seconds; anything else is tried again, up to 8 attempts over about 23 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The message's ID, the same at every attempt: use it to ignore repeats.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in seconds since 1970 (UTC).","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated signatures, each `v1,` and the base64 HMAC-SHA256 of `<webhook-id>.<webhook-timestamp>.<body>` keyed with the bytes of the endpoint's secret after `whsec_` (base64).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookMessage"}],"properties":{"type":{"const":"video.failed"}}}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 10 seconds, is tried again."}}}},"video.review_ready":{"post":{"operationId":"videoReviewReady","summary":"A video's script waits for its review (`review_before_render`)","description":"Sent to each endpoint that listens for `video.review_ready`, from the workspace's videos made in the app or with the API. Answer with a 2xx within 10 seconds; anything else is tried again, up to 8 attempts over about 23 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The message's ID, the same at every attempt: use it to ignore repeats.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in seconds since 1970 (UTC).","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"Space-separated signatures, each `v1,` and the base64 HMAC-SHA256 of `<webhook-id>.<webhook-timestamp>.<body>` keyed with the bytes of the endpoint's secret after `whsec_` (base64).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookMessage"}],"properties":{"type":{"const":"video.review_ready"}}}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 10 seconds, is tried again."}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer ojk_...`. A key belongs to its workspace and stops working while the workspace is on the free plan."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"description":"Further fields depend on the code: `field` names the field at fault, `retry_after` (seconds) or `retry_at` (time) when to try again, `needed` and `available` credits, `words` and `max` for a long text, `fields` and `locked` for locked options, `status` for a conflict.","properties":{"code":{"type":"string","enum":["unauthorized","plan_required","insufficient_credits","forbidden","not_found","conflict","invalid_request","content_refused","too_long","rate_limited","limit_reached","internal"],"description":"Stable, for programs."},"message":{"type":"string","description":"In English, for people. It can change."},"field":{"type":"string"}},"additionalProperties":true}}},"Block":{"oneOf":[{"type":"object","title":"Text","required":["type","content"],"properties":{"type":{"const":"text"},"content":{"type":"string","minLength":1,"description":"A paragraph or more."}}},{"type":"object","title":"Image","required":["type","url"],"properties":{"type":{"const":"image"},"url":{"type":"string","format":"uri","maxLength":2000,"description":"A public http or https address."},"alt":{"type":"string","maxLength":300,"description":"What the picture shows: it helps the scenes use it."}}}]},"NewVideo":{"type":"object","required":["title","rights_confirmed"],"properties":{"title":{"type":"string","minLength":1,"maxLength":120},"rights_confirmed":{"const":true,"description":"You have the rights to use this content (Terms of Service), asked on every video."},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"},"description":"The content, in order: text and pictures (up to 10). At least one text block, unless the video has neither voice nor captions. Up to 10,000 words."},"source_url":{"type":"string","format":"uri","maxLength":2000,"description":"Where the content comes from, kept with the video."},"format":{"type":"string","enum":["vertical","square"]},"language":{"type":"string","enum":["en-US","pt-BR"],"description":"Of the narration and captions, which are written in it whatever the content's language."},"text":{"type":"string","enum":["adapted","exact"],"description":"`adapted`: a script written from the content for the length asked. `exact`: the text read as it is; the length follows it."},"visuals":{"type":"string","enum":["scenes","single_image"],"description":"`scenes`: pictures made for each part. `single_image`: `image_url` throughout."},"voice":{"type":"boolean","description":"A narrator reads the script."},"captions":{"type":"boolean","description":"Captions on the video. A video needs voice or captions, unless it is a `single_image`."},"seconds":{"type":"integer","enum":[30,45,60,90],"description":"The length of an `adapted` video (90 on the paid plans). Ignored for `exact`. A video without voice and captions takes 5 to 15 instead (8 by default)."},"if_too_long":{"type":"string","enum":["error","adapt"],"default":"error","description":"An `exact` text too long for the plan's videos: `error` refuses it (`too_long`), `adapt` makes it `adapted` instead."},"image_url":{"type":"string","format":"uri","maxLength":2000,"description":"The picture of a `single_image` video: JPEG, PNG or WebP, up to 4 MB, at least 400 pixels a side."},"style":{"type":"string","maxLength":100,"description":"A style's `id` from `GET /options`."},"narrator":{"type":"string","maxLength":100,"description":"A narrator's `id` from `GET /options`, of the video's language."},"music":{"type":"string","maxLength":100,"description":"A track's `id` from `GET /options`, or `none`."},"character":{"type":"boolean","description":"`false` leaves the brand kit's character out of the scenes."},"logo":{"type":"boolean","description":"The workspace's logo on the video, where its brand kit puts it (paid plans). Left out, the brand kit's choice. `false` is refused (403) when `GET /options` says `logo_required`; `true` is refused (422) when the workspace has no logo to show."},"review_before_render":{"type":"boolean","description":"Stop in `review` once the script is written, until it is approved."}},"additionalProperties":true},"Video":{"type":"object","required":["id","object","status","title","origin","steps","credits","files","app_url","created_at"],"properties":{"id":{"type":"string"},"object":{"const":"video"},"status":{"type":"string","enum":["queued","running","review","completed","failed","canceled","removed"],"description":"`queued`, `running`, `review` (waiting for its script's approval), then `completed`, `failed` or `canceled`. `removed`: taken down after a copyright notice."},"title":{"type":"string"},"origin":{"type":"string","enum":["paste","import","terminal","plugin","api"],"description":"Where it was made: `api`, or in the app (`paste`, `import`), the terminal or the plugin."},"format":{"type":"string","enum":["vertical","square"]},"language":{"type":"string","enum":["en-US","pt-BR"]},"text":{"type":"string","enum":["adapted","exact"]},"visuals":{"type":"string","enum":["scenes","single_image"]},"voice":{"type":"boolean"},"captions":{"type":"boolean"},"seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The finished video's length."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"mock":{"type":"boolean","description":"A test video made without the AI services (development only)."},"created_at":{"type":"string","format":"date-time"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","required":["name","status"],"properties":{"name":{"type":"string","enum":["check","script","voice","visuals","render"]},"status":{"type":"string","enum":["pending","running","completed","failed","skipped"]}}}},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why it failed, when `failed`."},"credits":{"type":"object","required":["estimated","charged","on_hold"],"properties":{"estimated":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The most it can cost."},"charged":{"type":"integer","description":"Charged so far."},"on_hold":{"type":"boolean","description":"Credits are held while it is made."}}},"files":{"anyOf":[{"type":"object","required":["video","video_bytes","poster","captions_vtt","captions_srt","expires_at"],"properties":{"video":{"type":"string","format":"uri","description":"The MP4."},"video_bytes":{"anyOf":[{"type":"integer","description":"The MP4's size in bytes."},{"type":"null"}]},"poster":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"captions_vtt":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"captions_srt":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"expires_at":{"type":"string","format":"date-time","description":"The links work until then (an hour)."}}},{"type":"null"}],"description":"Once `completed`: signed links to its files, an hour long."},"app_url":{"type":"string","format":"uri","description":"The video's page in the app."}}},"VideoList":{"type":"object","required":["object","data","next_cursor"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Video"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass as `cursor` for the next page; null on the last."}}},"Choice":{"type":"object","required":["id","name","built_in"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"built_in":{"type":"boolean"}}},"Options":{"type":"object","required":["object","formats","languages","text","visuals","seconds","narrators","styles","music","defaults","options_locked","logo_required"],"properties":{"object":{"const":"options"},"formats":{"type":"array","items":{"type":"string","enum":["vertical","square"]}},"languages":{"type":"array","items":{"type":"string","enum":["en-US","pt-BR"]}},"text":{"type":"array","items":{"type":"string","enum":["adapted","exact"]}},"visuals":{"type":"array","items":{"type":"string","enum":["scenes","single_image"]}},"seconds":{"type":"array","items":{"type":"integer"},"description":"The lengths this workspace's plan allows."},"narrators":{"type":"array","items":{"type":"object","required":["id","name","language","gender"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"language":{"type":"string","enum":["en-US","pt-BR"]},"gender":{"type":"string"}}}},"styles":{"type":"array","items":{"$ref":"#/components/schemas/Choice"},"description":"The built-in styles the workspace shows, and its own."},"music":{"type":"array","items":{"$ref":"#/components/schemas/Choice"},"description":"The built-in tracks and the workspace's own. `none` is no music."},"defaults":{"type":"object","description":"What a video gets for a field it leaves out: the brand kit's choices.","required":["format","language","seconds","text","visuals","voice","captions","review_before_render","style","music","narrators","character","logo"],"properties":{"format":{"type":"string","enum":["vertical","square"]},"language":{"type":"string","enum":["en-US","pt-BR"]},"seconds":{"type":"integer"},"text":{"type":"string","enum":["adapted","exact"]},"visuals":{"type":"string","enum":["scenes","single_image"]},"voice":{"type":"boolean"},"captions":{"type":"boolean"},"review_before_render":{"type":"boolean"},"style":{"type":"string"},"music":{"type":"string"},"narrators":{"type":"object","description":"The narrator for each language.","additionalProperties":{"type":"string"}},"character":{"type":"boolean","description":"The brand kit has a character, in the scenes unless `character: false`."},"logo":{"type":"boolean","description":"The workspace has a logo its videos can show, on them unless `logo: false`."}}},"options_locked":{"type":"boolean","description":"The brand kit locks `text`, `visuals`, `voice` and `captions`: other values are refused (403)."},"logo_required":{"type":"boolean","description":"The brand kit puts the logo on every video: `logo: false` is refused (403)."}}},"WebhookMessage":{"type":"object","required":["id","type","created_at","data"],"properties":{"id":{"type":"string","description":"The same as the `webhook-id` header."},"type":{"type":"string","enum":["video.completed","video.failed","video.review_ready","webhook.test"]},"created_at":{"type":"string","format":"date-time","description":"When the event happened (not the attempt)."},"data":{"type":"object","properties":{"video":{"$ref":"#/components/schemas/Video","description":"The video as it is when the attempt is made, links fresh."},"message":{"type":"string","description":"For `webhook.test` only."}}}}}}},"x-rate-limits":{"perKey":"120 calls a minute","videosPerWorkspace":"200 videos an hour"}}