Getting started
Introduction
The Rewivo API is REST over HTTPS. Requests and responses are JSON, except clip downloads, which are MP4.
Every JSON response has the same envelope: status (true or false), message, data, and on errors a code you can branch on. Times are ISO 8601 in UTC.
This is version 1. New fields and endpoints are added to v1 without notice, so ignore fields you don't know. Anything that would break your code ships as a new version under a new path, and v1 keeps working.
Response envelope
statusbooleantrue when the call did what you asked.
messagestringA short, human-readable summary.
codestringOnly on errors: a stable code, see Errors.
dataobject | nullThe result. null on errors.
Example
{
"status": true,
"message": "Clipper run",
"data": {
"id": "6ae17a2b8d1f5667984404c1",
"status": "COMPLETED"
}
}Getting started
Authentication
Make an API key in your workspace, under Developer. Send it on every request as a bearer token. The key is shown once; keep it secret, because anyone holding it can spend the workspace's credits.
A key acts as the member who made it, within the scopes you gave it. If that member leaves the workspace or loses the permission, the key stops working for it.
| Scope | Allows |
|---|---|
| clipper.job.read | List and read runs, download clips |
| clipper.job.create | Start runs, read caption styles |
| scheduler.post.read | List connected accounts and auto-schedules |
| scheduler.post.create | Create auto-schedules |
Request
curl "https://www.rewivo.com/api/external/v1/clipper" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": false,
"code": "UNAUTHORIZED",
"message": "This API key is invalid, revoked or expired",
"data": null
}Getting started
Errors
Errors answer with an HTTP status and a code in the body. Branch on the code; the message is for people and may change.
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR | A field is missing or wrong. The message names it, e.g. range.from: Use hh:mm:ss |
| 400 | REJECTED | The request was understood but refused, e.g. not enough credits or a link that can't be read |
| 401 | UNAUTHORIZED | No API key, or one that is invalid, revoked or expired |
| 402 | WORKSPACE_LOCKED | The workspace is locked: its owner's plan doesn't cover it |
| 402 | PLAN_REQUIRED | The workspace owner's plan doesn't include the API |
| 403 | FORBIDDEN | The key lacks the scope, or its maker can no longer do this |
| 404 | NOT_FOUND | No such run or clip in this workspace |
| 409 | STORAGE_FULL | The workspace's storage is full; delete old runs or get more |
| 429 | RATE_LIMITED | Too many requests; wait for Retry-After seconds |
| 502 | ENGINE_ERROR | Clipping failed upstream; retry later |
| 503 | UNAVAILABLE | Clipping is unavailable right now |
Example
{
"status": false,
"code": "VALIDATION_ERROR",
"message": "range.from: Use hh:mm:ss",
"data": null
}Getting started
Rate limits
Each key may make 60 requests a minute, and each IP address 120. Past that you get 429 with a Retry-After header in seconds. A workspace can also queue at most 20 runs at once; runs past its plan's concurrency wait their turn.
Example
{
"status": false,
"code": "RATE_LIMITED",
"message": "Too many requests for this key",
"data": null
}Clipper
The run object
A run turns one long video into short clips: it reads the video, finds the moments worth posting, then edits, captions and scores each clip. Poll a run or use a webhook to know when it's done.
Attributes
idstringThe run's id. Use it with GET /clipper/{id}.
statusenumWhere the run is: QUEUED, INITIALIZING, DOWNLOADING, TRANSCRIBING, GENERATING, GENERATED, ANALYZING, RENDERING, COMPLETED, FAILED. COMPLETED and FAILED are final.
titlestring | nullThe video's title, known once the run has read the video.
sourceobjectWhat the run clips.
typeenumYOUTUBE (a link) or FILE (a video uploaded in the app).
urlstringThe YouTube link. Only on YOUTUBE sources.
subtitlebooleanWhether the creator's own subtitle file (SRT) was used instead of a transcript.
clipsarray of objectsThe clips found, best first by index. Empty until the run has planned them.
idstringThe clip's id.
indexintegerIts place in the run, from 0.
statusenumWAITING, VOICING_HOOK, RENDERING_SCENES, ANALYZED, COMPLETED, SKIPPED, FAILED.
titlestringA title for posting.
hookstringThe opening line written for the clip.
scorenumber | nullHow likely the clip is to perform, 0 to 10. Null until scored.
videoobject | null{ url }: the finished MP4, downloaded with the same API key. Null until rendered.
watermarkbooleanWhether the clips carry the Rewivo watermark (plans without watermark removal).
expiresAtstring | nullISO 8601 time the clips are deleted, by your plan's retention. Null: kept.
createdAtstringISO 8601 time the run started.
Example
{
"id": "6ae17a2b8d1f5667984404c1",
"status": "COMPLETED",
"title": "Inside the Mind of a Master Procrastinator | Tim Urban | TED",
"source": {
"type": "YOUTUBE",
"url": "https://www.youtube.com/watch?v=arj7oStGLkU",
"subtitle": false
},
"clips": [
{
"id": "6ae17a2b8d1f5667984404c7",
"index": 0,
"status": "COMPLETED",
"title": "Why deadlines save procrastinators",
"hook": "Your brain has a panic monster, and it's on your side.",
"score": 8.6,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c7/video"
}
},
{
"id": "6ae17a2b8d1f5667984404c8",
"index": 1,
"status": "COMPLETED",
"title": "The instant gratification monkey",
"hook": "There's a monkey at the wheel of your brain.",
"score": 7.9,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c8/video"
}
}
],
"watermark": false,
"expiresAt": "2026-11-27T04:26:26.881Z",
"createdAt": "2026-10-28T04:26:26.881Z"
}Clipper
Start a run
POST/clipperclipper.job.createStarts a run on a YouTube link. It costs 1 credit per started minute clipped (the range, or the whole video), held when the run starts.
Settings you leave out follow the key maker's saved clipper settings in the app (caption, hook card, genre, length, frame), and the workspace's (template, layout).
Body
source.urlstringrequiredA YouTube video link (youtube.com or youtu.be).
rangeobject | null{ from, to } in hh:mm:ss: clip only this part, and pay only for it. Default: the whole video.
languageobjectLanguages, as ISO codes or AUTO.
inputenumThe spoken language. Default AUTO (detected).
outputenumThe language of hooks, titles and captions. Default: saved setting, else AUTO (the spoken one).
genreenumHow to judge moments: AUTO, PODCAST, EDUKASI, KOMEDI, STORY, MOTIVASI, REACTION, GAMING, SPORTS.
durationenumClip length in seconds: AUTO, UNDER15, 15_30, 30_45, 45_60, 60_90, 90_120, 120_180.
aspect.ratioenum9:16, 1:1 or 16:9.
plannerenumAGENCY (best picks: an editor and a judge per run) or LITE (one pass and rule-based cuts, far less processing). Left out: the platform default. Administrators only.
resolutionobjectCeilings, lowered to what your plan allows.
sourceintegerDownload quality, 144 to 4320. Default 1080 (LITE: the platform's Lite default, 720 unless changed).
exportintegerClip quality: 480, 720 or 1080. Default 1080 (LITE: the platform's Lite default, 720 unless changed).
request.instructionstringWhat to look for, up to 500 characters, e.g. "every moment about pricing".
captionobject | null{ pack: { id, item } } from GET /clipper/option. null: no captions. Left out: the saved style.
Request
curl -X POST "https://www.rewivo.com/api/external/v1/clipper" \
-H "Authorization: Bearer $REWIVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": {
"url": "https://www.youtube.com/watch?v=arj7oStGLkU"
}
}'Response
{
"status": true,
"message": "Clipper started",
"data": {
"id": "6ae17a2b8d1f5667984404c1",
"status": "QUEUED",
"title": null,
"source": {
"type": "YOUTUBE",
"url": "https://www.youtube.com/watch?v=arj7oStGLkU",
"subtitle": false
},
"clips": [],
"watermark": false,
"expiresAt": "2026-11-27T04:26:26.881Z",
"createdAt": "2026-10-28T04:26:26.881Z"
}
}Clipper
List runs
GET/clipperclipper.job.readThe workspace's runs, newest first.
Query
pageintegerPage, from 1. Default 1.
limitintegerRuns a page, 1 to 100. Default 20.
Request
curl "https://www.rewivo.com/api/external/v1/clipper" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": true,
"message": "Clipper runs",
"data": {
"items": [
{
"id": "6ae17a2b8d1f5667984404c1",
"status": "COMPLETED",
"title": "Inside the Mind of a Master Procrastinator | Tim Urban | TED",
"source": {
"type": "YOUTUBE",
"url": "https://www.youtube.com/watch?v=arj7oStGLkU",
"subtitle": false
},
"clips": [
{
"id": "6ae17a2b8d1f5667984404c7",
"index": 0,
"status": "COMPLETED",
"title": "Why deadlines save procrastinators",
"hook": "Your brain has a panic monster, and it's on your side.",
"score": 8.6,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c7/video"
}
},
{
"id": "6ae17a2b8d1f5667984404c8",
"index": 1,
"status": "COMPLETED",
"title": "The instant gratification monkey",
"hook": "There's a monkey at the wheel of your brain.",
"score": 7.9,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c8/video"
}
}
],
"watermark": false,
"expiresAt": "2026-11-27T04:26:26.881Z",
"createdAt": "2026-10-28T04:26:26.881Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1
}
}
}Clipper
Get a run
GET/clipper/{id}clipper.job.readOne run with its clips. Poll it every 15 to 30 seconds until status is COMPLETED or FAILED, or use a webhook instead.
Path
idstringrequiredThe run's id.
Request
curl "https://www.rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": true,
"message": "Clipper run",
"data": {
"id": "6ae17a2b8d1f5667984404c1",
"status": "COMPLETED",
"title": "Inside the Mind of a Master Procrastinator | Tim Urban | TED",
"source": {
"type": "YOUTUBE",
"url": "https://www.youtube.com/watch?v=arj7oStGLkU",
"subtitle": false
},
"clips": [
{
"id": "6ae17a2b8d1f5667984404c7",
"index": 0,
"status": "COMPLETED",
"title": "Why deadlines save procrastinators",
"hook": "Your brain has a panic monster, and it's on your side.",
"score": 8.6,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c7/video"
}
},
{
"id": "6ae17a2b8d1f5667984404c8",
"index": 1,
"status": "COMPLETED",
"title": "The instant gratification monkey",
"hook": "There's a monkey at the wheel of your brain.",
"score": 7.9,
"video": {
"url": "https://rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c8/video"
}
}
],
"watermark": false,
"expiresAt": "2026-11-27T04:26:26.881Z",
"createdAt": "2026-10-28T04:26:26.881Z"
}
}Clipper
Download a clip
GET/clipper/{id}/clip/{clipId}/videoclipper.job.readThe finished clip as an MP4 (the clip's video.url). Send the same Authorization header. Range requests work, so downloads can resume.
Path
idstringrequiredThe run's id.
clipIdstringrequiredThe clip's id.
Request
curl "https://www.rewivo.com/api/external/v1/clipper/6ae17a2b8d1f5667984404c1/clip/6ae17a2b8d1f5667984404c7/video" \ -H "Authorization: Bearer $REWIVO_API_KEY" \ -o clip.mp4
Response
HTTP/1.1 200 OK Content-Type: video/mp4 Content-Disposition: attachment; filename="<id>-<clipId>.mp4" Accept-Ranges: bytes <MP4 bytes>
Clipper
Caption styles
GET/clipper/optionclipper.job.createThe caption styles a run can use, for caption.pack when starting a run.
Request
curl "https://www.rewivo.com/api/external/v1/clipper/option" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": true,
"message": "Clipper options",
"data": {
"caption": {
"items": [
{
"pack": {
"id": "highlighter",
"item": "highlighter"
},
"name": "Highlighter"
},
{
"pack": {
"id": "neon-sign",
"item": "neon-sign"
},
"name": "Neon Sign"
}
]
}
}
}Scheduler
Connected accounts
GET/platformscheduler.post.readThe workspace's connected social accounts and the formats each can publish: the targets an auto-schedule can use. Connect accounts in the app, under Platform.
Item attributes
idstringThe account's id, for targets[].platformId.
providerenumYOUTUBE, TIKTOK, INSTAGRAM, FACEBOOK, THREADS, X, LINKEDIN, PINTEREST, SNAPCHAT, BLUESKY, REDDIT, TELEGRAM.
namestringThe account's display name.
usernamestring | nullIts handle, where the network has one.
statusenumACTIVE, EXPIRED (reconnect it in the app) or REVOKED.
formatsarray of enumsWhat it can publish, e.g. SHORT, REEL, VIDEO.
Request
curl "https://www.rewivo.com/api/external/v1/platform" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": true,
"message": "Platforms",
"data": {
"items": [
{
"id": "6ae0f3c18d1f566798440312",
"provider": "YOUTUBE",
"name": "Rewivo Clips",
"username": "@rewivoclips",
"status": "ACTIVE",
"formats": [
"VIDEO",
"SHORT"
]
},
{
"id": "6ae0f3c18d1f566798440313",
"provider": "TIKTOK",
"name": "rewivo",
"username": "rewivo",
"status": "ACTIVE",
"formats": [
"VIDEO"
]
}
]
}
}Scheduler
The auto-schedule object
An auto-schedule posts clips for you on a cadence, e.g. every weekday at 19:00, at most 2 a day, only clips scoring 7 or more. When active, it places its backlog at once, then each new clip as it finishes.
Attributes
idstringThe auto-schedule's id.
namestringIts name, up to 80 characters.
isActivebooleanOnly an active auto-schedule places posts.
sourceobject{ type: "CLIPPER", clipperIds: string[] | null }: the runs whose clips it posts. clipperIds null: every run, future ones too.
targetsarray of objectsWhere each clip goes, 1 to 30.
platformIdstringA connected account, from GET /platform.
formatenumA format that account publishes: VIDEO, SHORT, REEL, POST, STORY, PIN, SPOTLIGHT, CAROUSEL, PHOTO, TEXT.
aspectobject | null{ ratios: ["9:16"] }: only clips in these frames go to this account. Null: every clip.
cadenceobjectWhen posts go out.
timezonestringIANA timezone, e.g. Asia/Jakarta.
timesarray of stringsPosting times, HH:MM, 1 to 24.
interval.daysintegerPost every this many days, 1 to 30.
startstring | nullFirst day, YYYY-MM-DD. Null: the next day with a free slot.
weekdaysarray of integersDays posts go out, 0 Sunday to 6 Saturday. Empty: every day.
orderenumWhich clip a slot takes first: SCORE, NEWEST, OLDEST or RANDOM.
conditionobjectA tree of checks a clip must pass at a slot: a group { not, match: "ALL" | "ANY", children } or a check { not, left, operator, right } (EQ NE GT GTE LT LTE CONTAINS IN), sides with {{ video.score }} / {{ posts.workspace.day }} / {{ posts.manual.day }}-style variables and arithmetic.
createdAtstringISO 8601 time it was made.
Example
{
"id": "6ae1a0d48d1f566798440a10",
"name": "Weekday evenings",
"isActive": true,
"source": {
"type": "CLIPPER",
"clipperIds": [
"6ae17a2b8d1f5667984404c1"
]
},
"targets": [
{
"platformId": "6ae0f3c18d1f566798440312",
"format": "SHORT",
"aspect": null
}
],
"cadence": {
"timezone": "Asia/Jakarta",
"times": [
"19:00"
],
"interval": {
"days": 1
},
"start": "2026-11-02",
"weekdays": [
1,
2,
3,
4,
5
]
},
"order": "SCORE",
"condition": {
"not": false,
"match": "ALL",
"children": [
{
"not": false,
"left": "{{posts.rule.day}}",
"operator": "LT",
"right": 2
},
{
"not": false,
"left": "{{video.score}}",
"operator": "GTE",
"right": 7
}
]
},
"createdAt": "2026-10-28T05:02:11.410Z"
}Scheduler
List auto-schedules
GET/scheduler/autoscheduler.post.readThe workspace's auto-schedules, oldest first.
Request
curl "https://www.rewivo.com/api/external/v1/scheduler/auto" \ -H "Authorization: Bearer $REWIVO_API_KEY"
Response
{
"status": true,
"message": "Auto-schedules",
"data": {
"items": [
{
"id": "6ae1a0d48d1f566798440a10",
"name": "Weekday evenings",
"isActive": true,
"source": {
"type": "CLIPPER",
"clipperIds": [
"6ae17a2b8d1f5667984404c1"
]
},
"targets": [
{
"platformId": "6ae0f3c18d1f566798440312",
"format": "SHORT",
"aspect": null
}
],
"cadence": {
"timezone": "Asia/Jakarta",
"times": [
"19:00"
],
"interval": {
"days": 1
},
"start": "2026-11-02",
"weekdays": [
1,
2,
3,
4,
5
]
},
"order": "SCORE",
"condition": {
"not": false,
"match": "ALL",
"children": [
{
"not": false,
"left": "{{posts.rule.day}}",
"operator": "LT",
"right": 2
},
{
"not": false,
"left": "{{video.score}}",
"operator": "GTE",
"right": 7
}
]
},
"createdAt": "2026-10-28T05:02:11.410Z"
}
]
}
}Scheduler
Create an auto-schedule
POST/scheduler/autoscheduler.post.createCreates an auto-schedule for clipper clips. The timezone defaults to the workspace's.
Body
namestringrequiredUp to 80 characters.
isActivebooleanDefault true.
clipperIdsarray of stringsRuns whose clips it posts, 1 to 200. Leave it out (or null) for every run, future ones too.
targetsarray of objectsrequiredWhere clips go, 1 to 30.
platformIdstringrequiredFrom GET /platform.
formatenumrequiredOne of that account's formats.
aspect.ratiosarray of stringsOnly clips in these frames, e.g. ["9:16"]. Default: every clip.
cadenceobjectrequiredWhen posts go out.
timesarray of stringsrequiredHH:MM, 1 to 24 times.
timezonestringIANA timezone. Default: the workspace's.
weekdaysarray of integers0 Sunday to 6 Saturday. Default: every day.
interval.daysintegerEvery this many days, 1 to 30. Default 1.
startstring | nullFirst day, YYYY-MM-DD. Default: the next free day.
orderenumSCORE, NEWEST, OLDEST or RANDOM. Default SCORE.
conditionobjectA tree of checks a clip must pass at a slot: a group { not, match: "ALL" | "ANY", children } or a check { not, left, operator, right } (EQ NE GT GTE LT LTE CONTAINS IN), sides with {{ video.score }} / {{ posts.workspace.day }} / {{ posts.manual.day }}-style variables and arithmetic. Default: never posted before.
Request
curl -X POST "https://www.rewivo.com/api/external/v1/scheduler/auto" \
-H "Authorization: Bearer $REWIVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily Shorts",
"targets": [
{
"platformId": "6ae0f3c18d1f566798440312",
"format": "SHORT"
}
],
"cadence": {
"times": [
"19:00"
]
}
}'Response
{
"status": true,
"message": "Auto-schedule created",
"data": {
"id": "6ae1a0d48d1f566798440a10",
"name": "Weekday evenings",
"isActive": true,
"source": {
"type": "CLIPPER",
"clipperIds": [
"6ae17a2b8d1f5667984404c1"
]
},
"targets": [
{
"platformId": "6ae0f3c18d1f566798440312",
"format": "SHORT",
"aspect": null
}
],
"cadence": {
"timezone": "Asia/Jakarta",
"times": [
"19:00"
],
"interval": {
"days": 1
},
"start": "2026-11-02",
"weekdays": [
1,
2,
3,
4,
5
]
},
"order": "SCORE",
"condition": {
"not": false,
"match": "ALL",
"children": [
{
"not": false,
"left": "{{posts.rule.day}}",
"operator": "LT",
"right": 2
},
{
"not": false,
"left": "{{video.score}}",
"operator": "GTE",
"right": 7
}
]
},
"createdAt": "2026-10-28T05:02:11.410Z"
}
}Webhooks
Webhooks
Add a webhook in your workspace, under Developer, to hear when a run ends instead of polling. Rewivo sends a POST with a JSON body to your HTTPS URL, then fetch the run with GET /clipper/{id}.
Each delivery is tried once and must answer 2xx within 10 seconds. After 20 failures in a row the webhook is switched off. The Test button sends a PING.
Payload
idstringUnique per delivery: use it to ignore repeats.
typeenumThe event.
createdAtstringISO 8601 time it was sent.
dataobjectWhat happened.
workspace.idstringThe workspace.
clipper.idstringThe run (not on PING).
clipper.titlestring | nullIts title.
clip.countintegerClips made (CLIPPER_COMPLETED only).
| Event | When |
|---|---|
| CLIPPER_COMPLETED | A run finished; data.clip.count is how many clips it made |
| CLIPPER_FAILED | A run failed; its credits are returned |
| PING | The Test button in Developer |
Example
{
"id": "1f7c2a9e-5d1b-4a3e-9c51-0b7f2e6d8a40",
"type": "CLIPPER_COMPLETED",
"createdAt": "2026-10-28T04:41:09.120Z",
"data": {
"workspace": {
"id": "6adad79b346c09ef8cf1228b"
},
"clipper": {
"id": "6ae17a2b8d1f5667984404c1",
"title": "Inside the Mind of a Master Procrastinator | Tim Urban | TED"
},
"clip": {
"count": 2
}
}
}Webhooks
Verify a webhook
Every delivery carries Rewivo-Signature: t=<unix seconds>,v1=<hex>. v1 is the HMAC-SHA256 of "<t>.<raw body>" with the webhook's secret (shown once, when you add it).
Compute it over the raw body, before parsing the JSON, compare in constant time, and refuse timestamps older than 5 minutes so an old delivery can't be replayed.
Code
import crypto from "node:crypto";
// header: the Rewivo-Signature header; rawBody: the request body as a string
export const verify = (header, rawBody, secret) => {
const { t, v1 } = Object.fromEntries(header.split(",").map((part) => part.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
};AI assistants
MCP server
Connect Claude, ChatGPT or any MCP client to Rewivo as a remote MCP server (Streamable HTTP). It uses the same API key, so the same scopes, limits and credits apply.
URL: /api/mcp on your Rewivo address, with the header Authorization: Bearer rwv_….
A key with the ai.tool.run scope also lists the in-app AI's tools (video editor, voice, posts, workspaces, memory…), run as the key's member with its role. Editor tools take surface: { kind: "editor.project" or "editor.template", id }, the id in the editor's URL. The same tools are plain HTTP too: GET /api/external/v1/tool lists them with their input schemas, POST /api/external/v1/tool/{name} with { input } runs one.
| Tool | Does | Scope |
|---|---|---|
| clipper_start | Starts a run (url, from, to, duration, language, instruction, caption) | clipper.job.create |
| clipper_get | Gets a run and its clips | clipper.job.read |
| clipper_list | Lists runs | clipper.job.read |
| clipper_options | Lists caption styles | clipper.job.create |
| platform_list | Lists connected accounts | scheduler.post.read |
| schedule_create | Creates an auto-schedule | scheduler.post.create |
| schedule_list | Lists auto-schedules | scheduler.post.read |
| editor_state, html_view, html_edit, voice_create, post_create, … | The in-app AI's tools (tools/list shows each with its schema) | ai.tool.run |
Code
{
"mcpServers": {
"rewivo": {
"type": "http",
"url": "https://rewivo.com/api/mcp",
"headers": {
"Authorization": "Bearer rwv_…"
}
}
}
}Reference
Values
Every value an enum field accepts or returns.
| Field | Values |
|---|---|
| language.input / language.output | AUTO, id, en, ms, jv, su, tl, vi, th, zh, ja, ko, hi, bn, ta, ur, ar, fa, he, tr, ru, uk, pl, de, fr, es, pt, it, nl, sv, ro, el |
| genre | AUTO, PODCAST, EDUKASI, KOMEDI, STORY, MOTIVASI, REACTION, GAMING, SPORTS |
| duration | AUTO, UNDER15, 15_30, 30_45, 45_60, 60_90, 90_120, 120_180 |
| aspect.ratio | 9:16, 1:1, 16:9 |
| run status | QUEUED, INITIALIZING, DOWNLOADING, TRANSCRIBING, GENERATING, GENERATED, ANALYZING, RENDERING, COMPLETED, FAILED |
| clip status | WAITING, VOICING_HOOK, RENDERING_SCENES, ANALYZED, COMPLETED, SKIPPED, FAILED |
| platform provider | YOUTUBE, TIKTOK, INSTAGRAM, FACEBOOK, THREADS, X, LINKEDIN, PINTEREST, SNAPCHAT, BLUESKY, REDDIT, TELEGRAM |
| target format | VIDEO, SHORT, REEL, POST, STORY, PIN, SPOTLIGHT, CAROUSEL, PHOTO, TEXT |