# ReelMoney > ReelMoney generates short form content (AI slideshows and hook and demo videos) for a brand and publishes it to TikTok, YouTube, Instagram and LinkedIn, through a scoped REST API and an MCP server. Base URL: https://reel.money. Every request carries an API key created by the account owner at https://reel.money/brands//api_keys and sent as `Authorization: Bearer rm_...`. A key belongs to one brand. ## Docs - [Quickstart](https://reel.money/api-docs/quickstart.md): key to first slideshow to first post, with curl and MCP configs. - [Authentication](https://reel.money/api-docs/authentication.md): scopes, rate limits, idempotency keys, error envelope. - [Endpoints](https://reel.money/api-docs/endpoints.md): every REST endpoint, grouped, with the upload and generation flows. - [MCP server](https://reel.money/api-docs/mcp.md): the 18 tools, annotations, client configs, result size etiquette. - [Errors](https://reel.money/api-docs/errors.md): every error code with its cause, its fix and whether a retry helps. - [Posting](https://reel.money/api-docs/posting.md): platform rules, connecting accounts, scheduling, partial success. ## Machine readable - [OpenAPI 3.1 spec](https://reel.money/openapi.json): the full contract, every endpoint, schema and example. - MCP server: `https://reel.money/mcp`, streamable HTTP, stateless, same bearer key. POST only; GET answers 405. - Capabilities: `GET https://reel.money/api/v1/capabilities` returns the live enums (design styles, image worlds, fonts, aspect ratios, platform caps, poll intervals). - Error lookup: `GET https://reel.money/api/v1/errors/{code}` explains any code the API returns. ## How to work with this API - Call `GET /api/v1/account` before generating anything and read the remaining slideshow quota. Stop early rather than failing halfway through a run. - Creating a slideshow or a video answers 202 with a job, not with content. Poll `GET /api/v1/jobs/{job_id}` and wait at least `poll_after_seconds` between polls. Polling faster does not finish it sooner, it only spends the request ceiling. - Stop polling the moment a job reads `succeeded` or `failed`. A settled job never changes again. - To get an MP4 of a slideshow that already exists, call `POST /api/v1/slideshows/{id}/render`. Never generate a second slideshow for that. - Leave `design_style` out of a create unless the caller asked for a specific look. ReelMoney then picks a recipe the brand has not used lately, which is what keeps a feed varied. - Upload files in this order: `POST /api/v1/direct_uploads` to presign, `PUT` the bytes to the returned URL with the returned headers, then `POST /api/v1/media` with the `signed_id`. Skipping the last step loses the file. - Run `POST /api/v1/posts/validate` before every `POST /api/v1/posts`. It costs one request and it turns a half failed publish into a fixable list of verdicts. - Posting is partial by design. Read `overall_status`, then walk `results` and retry only the accounts that failed and only when their error is retryable. Never resend the whole request. - Connecting a social account needs a person: call `POST /api/v1/connections/link`, relay the URL, and confirm with `GET /api/v1/connections`. Do not try to complete an OAuth flow yourself. - Scheduled posts need `scheduled_at` at least 5 minutes ahead in ISO 8601. Cancel with `DELETE /api/v1/posts/{id}` only while a post is still draft, pending or scheduled. - Scopes gate everything: `brand:read` for account, brand, shorts and jobs; `media:read` and `media:write` for media; `content:write` for creating and rendering; `posts:read` to validate and list; `posts:write` to publish, schedule and cancel; `analytics:read` for metrics. A 403 `missing_scope` names the scope in `details.required_scope`, and only a person can add it to the key. - A key acts on its own brand. Pass `brand_id` (REST query parameter or MCP tool argument) only when the key has the `brands:all` scope and you mean a different brand the account owns; call `GET /api/v1/account` or the `get_account` tool to list the brands and their ids. - Send an `Idempotency-Key` header on every create. Retrying a timed out request with the same key replays the first answer instead of making a second slideshow. - Branch on the `code` field in an error, never on the message text, and look up anything unfamiliar at `GET /api/v1/errors/{code}`. - These endpoints send no CORS headers. Call them from a server or an agent runtime, never from a browser page.