{"openapi":"3.1.0","info":{"title":"SnapDub API","version":"1.0.0","description":"Turn long videos into vertical clips with captions, re-cut them, schedule them to connected TikTok,\nYouTube and Instagram accounts, and read views and clipping campaign earnings - everything the\nSnapDub app does, from code. The same actions power the [AI assistant connector](/mcp-server).\n\n**Get a key.** The API comes with every paid plan. Create a key in SnapDub under\n[Settings, API keys](/settings/api); it is shown once, acts as you in your workspace, and making\nclips with it spends your credits like the app does. Paste it under **Authentication** on this page\nto try any endpoint right here; every endpoint also shows ready code in curl, JavaScript, Python\nand more.\n\n**The flow.** `POST /videos` with a link answers at once with a `video_id`. Making clips takes\nminutes: poll `GET /videos/{id}` until `status` is `done` (it moves through `waiting to start`,\n`fetching the video`, `processing`, `making the clips`; a `failed` video carries an `error` and its\ncredits come back), then read `GET /videos/{id}/clips`, best first. Download links are signed and\nlast an hour.\n\n```js\nconst api = (path, init = {}) => fetch(`https://snapdub.ai/api/v1${path}`, { ...init,\n  headers: { Authorization: `Bearer ${process.env.SNAPDUB_KEY}`, \"Content-Type\": \"application/json\" } }).then((r) => r.json());\nconst video = await api(\"/videos\", { method: \"POST\", body: JSON.stringify({ url: \"https://www.youtube.com/watch?v=...\", clips: 5 }) });\n// ...poll /videos/${video.video_id} until status is \"done\", then:\nconst { clips } = await api(`/videos/${video.video_id}/clips`);\n```\n\n**Conventions.** JSON in and out; query strings work for reads. Times are ISO 8601 - one without a\nUTC offset is read in your workspace's time zone. Errors are `{\"error\": \"...\"}` in plain words:\n401 unknown or revoked key, 402 free plan, 422 understood but cannot be done (no credits, unknown\nid, a network not connected), 429 more than 120 requests a minute.\n","contact":{"name":"SnapDub support","email":"hello@snapdub.ai","url":"https://snapdub.ai/contact"}},"servers":[{"url":"https://snapdub.ai/api/v1"}],"security":[{"bearer":[]}],"tags":[{"name":"Videos"},{"name":"Clips"},{"name":"Posting"},{"name":"Campaigns"},{"name":"Account"}],"paths":{"/me":{"get":{"operationId":"me","summary":"Account and credits","description":"Shows the signed-in SnapDub account: plan, credits left and whether clips carry the free-plan watermark.","tags":["Account"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"account":"My workspace","plan":"Pro","credits_left":8420,"watermark_on_clips":false,"upgrade_url":"https://snapdub.ai/billing"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/estimate":{"post":{"operationId":"estimate","summary":"Price a video before making clips","description":"Says how many credits POST /videos would spend on a link with the same settings, and whether the account has enough. Reads only the link's title and length; spends nothing.","tags":["Videos"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"title":"Episode 41","duration_seconds":3480,"clips":5,"credits_needed":412,"credits_available":8420,"enough":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Link to the source video."},"clips":{"type":"integer","minimum":1,"maximum":20,"description":"How many clips to make. Defaults to 6."},"clip_length_seconds":{"type":"integer","minimum":15,"maximum":180,"description":"Longest a clip may run, in seconds. Defaults to 180."},"captions":{"type":"boolean","description":"Burn captions into the clips. Defaults to true."},"translate_to":{"type":"string","description":"Language code to translate the captions into, e.g. \"es\". Leave out to keep the original language."},"template":{"type":"string","description":"Name of one of the account's templates (see GET /templates) to apply its style."}}}}}}}},"/videos":{"get":{"operationId":"videos_index","summary":"Recent videos","description":"Lists the account's most recent videos (newest first) with their status.","tags":["Videos"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"post":{"operationId":"videos_create","summary":"Make clips from a video","description":"Turns a long video link (YouTube, Twitch, Kick, Rumble or Zoom) into short vertical clips with captions. Spends credits; processing takes a few minutes to tens of minutes depending on length. Returns the new video's video_id and status; the clips are listed once its status is \"done\".","tags":["Videos"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"video_id":"9f3c2a71","title":"Episode 41","kind":"best moments, scored","status":"fetching the video","progress_percent":0,"duration_seconds":3480,"clips_ready":0,"credits_spent":412,"credits_left":8008,"created_at":"2026-10-21T18:02:11Z","url":"https://snapdub.ai/videos/9f3c2a71"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Link to the source video."},"clips":{"type":"integer","minimum":1,"maximum":20,"description":"How many clips to make. Defaults to 6."},"clip_length_seconds":{"type":"integer","minimum":15,"maximum":180,"description":"Longest a clip may run, in seconds. Defaults to 180."},"captions":{"type":"boolean","description":"Burn captions into the clips. Defaults to true."},"translate_to":{"type":"string","description":"Language code to translate the captions into, e.g. \"es\". Leave out to keep the original language."},"template":{"type":"string","description":"Name of one of the account's templates (see GET /templates) to apply its style."}}}}}}}},"/videos/{id}":{"get":{"operationId":"videos_show","summary":"Video status","description":"Shows one video's processing status and progress; status \"done\" means its clips are ready.","tags":["Videos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The video_id from POST /videos or GET /videos."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"video_id":"9f3c2a71","title":"Episode 41","status":"done","progress_percent":100,"clips_ready":5,"url":"https://snapdub.ai/videos/9f3c2a71"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/videos/{id}/clips":{"get":{"operationId":"videos_clips","summary":"Clips of a video","description":"Lists a finished video's clips, best first: title, virality score (0-100), description, hashtags, length and a download link that expires in an hour.","tags":["Videos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The video_id from POST /videos or GET /videos."},{"name":"include_links","in":"query","required":false,"schema":{"type":"boolean"},"description":"Include each clip's download link. Defaults to true; set false when only titles and scores are needed - the links are long."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"video_id":"9f3c2a71","title":"Episode 41","status":"done","clips_ready":5,"clips":[{"clip_id":"a1b2c3d4","title":"The 10,000 hour lie","virality_score":94,"duration_seconds":42.0,"description":"Why most people quit right before it works.","hashtags":"#podcast #motivation","download_url":"https://... (signed, valid for an hour)","thumbnail_url":"https://..."}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/videos/{id}/transcript":{"get":{"operationId":"videos_transcript","summary":"Transcript of a clip or video","description":"Returns what is said in a clip, or in a whole video, as plain text or as SRT subtitles with timings. A clip's transcript is free; a whole video's comes with paid plans. Long videos can be read a part at a time with from_seconds and to_seconds.","tags":["Videos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"A video_id from GET /videos, for the whole video's transcript."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["txt","srt"]},"description":"txt (default) or srt."},{"name":"from_seconds","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Whole video only: start of the part to read."},{"name":"to_seconds","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Whole video only: end of the part to read."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/clips/{id}":{"get":{"operationId":"clips_show","summary":"One clip in detail","description":"Returns one clip: title, description, hashtags, score, whether it is still rendering, where it sits in the source video (start and end, in seconds) and how far each end can be moved for a re-cut, plus a download link that expires in an hour.","tags":["Clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The clip_id from GET /videos/{id}/clips."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"patch":{"operationId":"clips_update","summary":"Edit a clip","description":"Changes a clip's description or hashtags (free), its title (free, unless the title is shown in the video itself, which re-renders it), or re-cuts it with a new start and end within the range GET /clips/{id} reports. A re-render costs a few credits and takes a minute or two. Only the fields given change.","tags":["Clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The clip_id from GET /videos/{id}/clips."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"hashtags":{"type":"string","description":"Space-separated, with or without #, e.g. \"#podcast #ai\". Replaces the current ones."},"start_seconds":{"type":"number","description":"New start, in seconds of the source video (see GET /clips/{id})."},"end_seconds":{"type":"number","description":"New end, in seconds of the source video (see GET /clips/{id})."}}}}}}}},"/clips/{id}/stats":{"get":{"operationId":"clips_stats","summary":"How a clip is doing","description":"Returns one clip's posts on each network (link, views, likes, comments, shares, when last updated) and the clipping campaigns it was submitted to, with an estimate of what its views earn.","tags":["Clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The clip_id from GET /videos/{id}/clips."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/clips/{id}/transcript":{"get":{"operationId":"clips_transcript","summary":"Transcript of a clip or video","description":"Returns what is said in a clip, or in a whole video, as plain text or as SRT subtitles with timings. A clip's transcript is free; a whole video's comes with paid plans. Long videos can be read a part at a time with from_seconds and to_seconds.","tags":["Clips"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"A clip_id from GET /videos/{id}/clips. Give this or video_id."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["txt","srt"]},"description":"txt (default) or srt."},{"name":"from_seconds","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Whole video only: start of the part to read."},{"name":"to_seconds","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Whole video only: end of the part to read."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/templates":{"get":{"operationId":"templates","summary":"Templates","description":"Lists the account's saved templates (caption style, layout, branding). Each name is a valid value for POST /videos's template argument.","tags":["Account"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/campaigns":{"get":{"operationId":"campaigns_index","summary":"Live clipping campaigns","description":"Lists live paid clipping campaigns (pay per 1,000 views) that still have budget left, e.g. Whop Content Rewards. Sort by budget left, rate per 1,000 views, room per clipper, or newest.","tags":["Campaigns"],"parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["budget","rate","room","new"]},"description":"Defaults to budget."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/campaigns/{id}":{"get":{"operationId":"campaigns_show","summary":"One clipping campaign","description":"Returns one clipping campaign's details - pay per 1,000 views, cap per clip, allowed platforms, requirements, budget left, end date and its page - and the clips this account already submitted to it.","tags":["Campaigns"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The campaign_id from GET /campaigns."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/campaigns/{id}/submissions":{"post":{"operationId":"campaigns_submit","summary":"Track a clip in a campaign","description":"Records in SnapDub that a posted clip was submitted to a clipping campaign, so its views and estimated earnings are tracked (see GET /earnings). This does not submit it to the brand: that is done on the campaign's own page, which the reply links to.","tags":["Campaigns"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The campaign_id from GET /campaigns."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["clip_id"],"properties":{"clip_id":{"type":"string","description":"The clip_id of the posted clip."},"post_url":{"type":"string","description":"Link to the clip's post. Leave out to use the post SnapDub published for it."}}}}}}}},"/social_accounts":{"get":{"operationId":"social_accounts","summary":"Connected social accounts","description":"Lists the social networks connected in SnapDub (TikTok, YouTube, Instagram and others) with the handle, whether a post can go out there now and, if not, what the person has to do. Also says how many posts the account has left.","tags":["Posting"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/posts":{"get":{"operationId":"posts_index","summary":"Scheduled posts","description":"Lists the clips waiting on the Content Plan to be posted, soonest first, and the posts from the last 7 days that failed or were skipped, with the reason.","tags":["Posting"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"post":{"operationId":"posts_create","summary":"Schedule a clip to social media","description":"Puts a finished clip on the SnapDub Content Plan to be posted to the person's connected social accounts at a given time (or now). It publishes publicly on their behalf, using the privacy and other answers saved in their plan settings. GET /social_accounts shows which networks are ready.","tags":["Posting"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"},"example":{"scheduled":[{"post_id":"812","clip_id":"a1b2c3d4","clip_title":"The 10,000 hour lie","platform":"tiktok","post_at":"2026-11-02T18:00:00+02:00","status":"scheduled"}],"skipped":[{"platform":"youtube","reason":"Answer YouTube's made-for-kids question in your plan settings."}],"plan_url":"https://snapdub.ai/plan"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["clip_id","platforms"],"properties":{"clip_id":{"type":"string","description":"The clip_id from GET /videos/{id}/clips."},"platforms":{"type":"array","items":{"type":"string","enum":["tiktok","instagram","youtube","facebook","bluesky","telegram","linkedin","pinterest","x"]},"minItems":1,"description":"Networks to post to, e.g. [\"tiktok\", \"youtube\"]."},"post_at":{"type":"string","description":"When to post, ISO 8601 (e.g. \"2026-11-02T18:00\"). Without a UTC offset it is read in the account's own time zone. Leave out to post now."}}}}}}}},"/posts/{id}":{"patch":{"operationId":"posts_update","summary":"Move a scheduled post","description":"Moves a post that has not gone out yet on the Content Plan to another time.","tags":["Posting"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The post_id from POST /posts or GET /posts."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["post_at"],"properties":{"post_at":{"type":"string","description":"New time, ISO 8601 (e.g. \"2026-11-02T18:00\"). Without a UTC offset it is read in the account's own time zone."}}}}}}},"delete":{"operationId":"posts_destroy","summary":"Remove a scheduled post","description":"Removes a post that has not gone out yet from the Content Plan, so it will not be published. Posts already published are not affected.","tags":["Posting"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The post_id from POST /posts or GET /posts."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/posts/{id}/retry":{"post":{"operationId":"posts_retry","summary":"Retry a failed post","description":"Sends a post that failed or was skipped again, right away. Says what still needs fixing if it would fail the same way.","tags":["Posting"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The post_id from GET /posts."}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stats":{"get":{"operationId":"stats","summary":"How posts are doing","description":"Returns the last 30 days of posting through SnapDub: posts per network, views gained (total and per day), clips made, the best-performing clip and, for clips linked to clipping campaigns, an estimate of what their views earn. Views update about once a day.","tags":["Posting"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/earnings":{"get":{"operationId":"earnings","summary":"Campaign earnings","description":"Lists the clips submitted to clipping campaigns: campaign, post link, the status marked in SnapDub, views that count toward the campaign and an estimated payout, with totals per currency.","tags":["Campaigns"],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key, sd_live_..."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}},"responses":{"Unauthorized":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PaymentRequired":{"description":"The workspace is on the free plan; the API comes with paid plans.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unprocessable":{"description":"Understood but cannot be done: unknown id, not enough credits, a network not connected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"More than 120 requests a minute with this key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}