Saltar al contenido

Developers

Connect Originl to your tools or your AI assistant

Everything you do in the dashboard (checking the autopilot, creating variants, approving them, scheduling them and measuring how they perform) you can also do from your code or by asking Claude or Cursor. Same key, same rules, same balance.

What it's for

Automate the daily work

Pick the winning video, create variants, approve and schedule them without opening the dashboard. Handy when you run many profiles.

Ask your assistant

With MCP, Claude or Cursor can see your account and act for you: "how is Luna's autopilot doing today?", "approve the best three and schedule them this week".

Take the data to your dashboard

24 and 72 hour views, saves, shares and follows for every variant, for your reports, your CRM or your spreadsheet.

Know the moment it happens

Signed webhooks when a variant is ready, when it is published and when its 72 hour results are in.

Who it's for

Agencies

You manage several creators' profiles and want your own workflow: bulk approval, scheduling per client and a monthly report with your numbers.

Creator SaaS

You run your own tool for creators and want to offer variants that work inside it, with Originl behind it.

Teams with their own dashboard

You already work in Notion, Airtable, Zapier or an internal dashboard and want Originl to fit in there instead of opening another tab.

What you can see and do

Each key has read or read and write permissions and acts with the team role of whoever created it. It only sees your account's profiles.

With read

  • Your account, your plan and this month's balance (variants and AI credits).
  • Your profiles, their networks and the autopilot status (how many are due today, how many went out, why it is stopped if it is).
  • Each profile's winning videos, with their multiple over the median views.
  • Every variant: preview, cover, caption, quality, how different it is from the original, status and metrics.
  • The full calendar, whether each post comes from the autopilot, hooks or AI.
  • Monthly results and Radar ideas (what is going viral in your niche).

With write, also

  • Pick a winning video as base and create variants (re-edit or recreate with AI).
  • Approve or discard variants.
  • Schedule or move a post, following the calendar rules.
  • Pause and resume the autopilot.

How it's billed

Included in the Viral plan ($299 a month): 300 variants a month and 4,000 AI credits with the included profile, and up to 10 people on the team.

  • The API and MCP have no separate price and no per-request fees.
  • Every variant you create and every AI credit you spend counts against your plan, exactly as if you did it in the dashboard. Reading data, approving or scheduling costs nothing.
  • Before spending AI credits you request a quote: it tells you what each model will cost and whether your balance covers it. When creating, you state the most you accept to spend; if the price went up, nothing is spent and you are told.
  • If you run out of balance, the API returns a clear error and never leaves anything half done.

See the plans

Quickstart in 5 minutes

The examples use curl. Keep your key in an environment variable and never put it in a website's or an app's code: the API does not accept calls from the browser, only from your server.

  1. Create a key

    In the dashboard, Settings, API and MCP. Give it a name (for example, "My server") and choose its permissions. The key starts with ol_live_ and is shown only once.

    bash
    export ORIGINL_API_KEY="ol_live_..."
  2. Check it works

    Returns your account, your plan and the key's permissions.

    bash
    curl https://api.getoriginl.com/v1/cuenta \
      -H "Authorization: Bearer $ORIGINL_API_KEY"
  3. List your profiles

    Note the id of the profile you will work with. Lists are paginated with next_cursor.

    bash
    curl "https://api.getoriginl.com/v1/perfiles?limite=25" \
      -H "Authorization: Bearer $ORIGINL_API_KEY"
  4. Pick a winning video

    Look at its winning videos and pick one as base video by sending its url. Picking costs nothing.

    bash
    curl https://api.getoriginl.com/v1/perfiles/PERFIL_ID/ganadores \
      -H "Authorization: Bearer $ORIGINL_API_KEY"
    
    curl -X POST https://api.getoriginl.com/v1/perfiles/PERFIL_ID/videos \
      -H "Authorization: Bearer $ORIGINL_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: $(uuidgen)" \
      -d '{"url": "https://www.instagram.com/reel/C9xYz12AbCd/"}'
  5. Create variants

    Always send an Idempotency-Key: if the connection drops and you retry, you will not get two batches. The result shows up in GET /v1/videos/{id} and in the variante.lista webhook.

    bash
    curl -X POST https://api.getoriginl.com/v1/videos/VIDEO_ID/variantes \
      -H "Authorization: Bearer $ORIGINL_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: 4f7d2c1a-9b8e-4c3d-a2b1-0e9f8d7c6b5a" \
      -d '{"n": "max"}'
    
    curl https://api.getoriginl.com/v1/videos/VIDEO_ID \
      -H "Authorization: Bearer $ORIGINL_API_KEY"
  6. Approve the ones you like

    A copy that is too close to the original cannot be approved: that is how we protect the account.

    bash
    curl -X POST https://api.getoriginl.com/v1/variantes/VARIANTE_ID/aprobar \
      -H "Authorization: Bearer $ORIGINL_API_KEY" \
      -H "Idempotency-Key: $(uuidgen)"
  7. Schedule them

    Pick the time or let the autopilot do it. If it breaks a rule (for example, two variants of the same video less than 72 h apart), you get a 409 with the rule and the nearest valid slot.

    bash
    curl -X POST https://api.getoriginl.com/v1/calendario/VARIANTE_ID/programar \
      -H "Authorization: Bearer $ORIGINL_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: $(uuidgen)" \
      -d '{"programada_para": "2026-11-03T18:30:00+01:00"}'
    
    curl "https://api.getoriginl.com/v1/calendario?perfil_id=PERFIL_ID" \
      -H "Authorization: Bearer $ORIGINL_API_KEY"
  8. Measure the results

    Average 72 hour views per month, the change against last month and the best variant. Each variant's metrics are in GET /v1/variantes.

    bash
    curl "https://api.getoriginl.com/v1/perfiles/PERFIL_ID/resultados?meses=2" \
      -H "Authorization: Bearer $ORIGINL_API_KEY"

Optional: recreate with AI

First request the quote (it costs nothing). Then create with max_creditos_ia equal to the total of the model you pick.

bash
curl -X POST https://api.getoriginl.com/v1/videos/VIDEO_ID/ia/cotizacion \
  -H "Authorization: Bearer $ORIGINL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"n": 2, "calidad": "estandar"}'
# -> "modelos": [{"modelo": "seedance-2.0-mini", "total": 608, "alcanza": true, ...}]

curl -X POST https://api.getoriginl.com/v1/videos/VIDEO_ID/ia/variantes \
  -H "Authorization: Bearer $ORIGINL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"n": 2, "calidad": "estandar", "modelo": "seedance-2.0-mini", "max_creditos_ia": 608}'

Your AI assistant, connected (MCP)

MCP is the standard AI assistants use to work with external tools. Originl offers a remote MCP server with 18 tools (status, profiles, autopilot, videos, variants, calendar, results, Radar ideas and creating variants) using the same key as the API. With a read-only key, your assistant only sees the read tools.

MCP server URL: https://api.getoriginl.com/mcp

To create with AI, the assistant shows you the quote first and only spends if you accept it.

Claude (web and Claude Desktop)

  1. Open Customize and then Connectors.
  2. Click "+ Add" and "Add custom connector". Name it Originl.
  3. Paste the MCP server URL and click Continue.
  4. Under Authentication choose "No sign in".
  5. Under "Request headers" add Authorization with the value Bearer followed by your key, then click Add.
  6. On Team and Enterprise plans the organization admin adds it (Organization settings, Connectors) and each person clicks Connect.

Claude Desktop with a config file

If you prefer the claude_desktop_config.json file (or your account does not have request headers in connectors yet), use the mcp-remote bridge. It needs Node 18 or later. The key goes in an environment variable, with no space after "Authorization:".

claude_desktop_config.json
{
  "mcpServers": {
    "originl": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.getoriginl.com/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer ol_live_..."
      }
    }
  }
}

Claude Code

Run this in a terminal and check the connection with /mcp inside Claude Code. With --scope user you get it in every project.

bash
claude mcp add --transport http --scope user originl https://api.getoriginl.com/mcp \
  --header "Authorization: Bearer ol_live_..."

Or in the project's .mcp.json file, with the key in an environment variable so it never reaches git:

.mcp.json
{
  "mcpServers": {
    "originl": {
      "type": "http",
      "url": "https://api.getoriginl.com/mcp",
      "headers": {
        "Authorization": "Bearer ${ORIGINL_API_KEY}"
      }
    }
  }
}

Cursor

Paste this into ~/.cursor/mcp.json (all your projects) or .cursor/mcp.json (just one), save and enable Originl in Settings, MCP. The key is read from the ORIGINL_API_KEY environment variable (or type the key there instead, after Bearer).

mcp.json
{
  "mcpServers": {
    "originl": {
      "url": "https://api.getoriginl.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:ORIGINL_API_KEY}"
      }
    }
  }
}

ChatGPTComing soon

Coming soon. Today ChatGPT only accepts connectors with sign-in (OAuth) or no authentication, and Originl needs the header with your key. Meanwhile, use Claude, Claude Code or Cursor.

Webhooks

Create up to 5 endpoints in Settings, API and MCP. Your server receives a JSON POST each time something happens; the "Send test" button sends a prueba event right away.

variante.listaThe engine delivered a new variant and you can approve it.
variante.publicadaThe variant is now published on the network.
variante.resultado_72hIts 72 hour views are in (field vistas_72h).

What you receive

Headers Originl-Event (the event), Originl-Delivery (delivery id: store it so you never process the same one twice) and Originl-Signature.

HTTP
POST /tu-endpoint HTTP/1.1
Content-Type: application/json
User-Agent: Originl-Webhooks/1.0
Originl-Event: variante.lista
Originl-Delivery: 8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f
Originl-Signature: t=1793112000,v1=5d41402abc4b2a76b9719d911017c592...

{
  "id": "evt_3f9a1c2b7d4e4f60a1b2c3d4e5f60718",
  "type": "variante.lista",
  "created_at": "2026-10-27T18:40:00+00:00",
  "data": {
    "perfil_id": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
    "video_id": "7d9e1a2b-3c4d-4e5f-8a6b-9c0d1e2f3a4b",
    "variante": { "id": "0b6c3f2e-...", "estado": "propuesta", "calidad": 86.5, "...": "..." }
  }
}

Verify the signature

Originl-Signature looks like t=<seconds>,v1=<hex>, where v1 is the HMAC-SHA256 of the text "t.body" (the raw body, exactly as received) using the whsec_ secret you see only once when creating the endpoint. Reject signatures that do not match and those older than 5 minutes.

Node.js
import crypto from "node:crypto";

// cuerpo: el cuerpo CRUDO tal cual llega (string), antes de parsear el JSON.
export function firmaValida(cuerpo, cabecera, secreto) {
  const p = Object.fromEntries(cabecera.split(",").map((x) => x.split("=")));
  const esperada = crypto.createHmac("sha256", secreto).update(`${p.t}.${cuerpo}`).digest("hex");
  const a = Buffer.from(esperada), b = Buffer.from(p.v1 ?? "");
  const reciente = Math.abs(Date.now() / 1000 - Number(p.t)) < 300;
  return reciente && a.length === b.length && crypto.timingSafeEqual(a, b);
}
Python
import hashlib, hmac, time

def firma_valida(cuerpo: bytes, cabecera: str, secreto: str) -> bool:
    p = dict(x.split("=", 1) for x in cabecera.split(","))
    esperada = hmac.new(secreto.encode(), f"{p['t']}.".encode() + cuerpo, hashlib.sha256).hexdigest()
    reciente = abs(time.time() - int(p["t"])) < 300
    return reciente and hmac.compare_digest(esperada, p.get("v1", ""))

Retries and delivery

  • Reply with a 2xx in under 15 seconds; do the heavy work afterwards.
  • If it fails, it is retried after 1, 5 and 30 minutes and after 2, 6 and 12 hours (7 attempts). Each attempt is signed again.
  • After 20 failed deliveries in a row the endpoint is disabled and the dashboard says so; you reactivate it with one click.
  • Only https (ports 443 or 8443), to public addresses, without following redirects.

Limits

  • 60 requests per minute per key and 120 per account. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; over the limit you get a 429 with Retry-After.
  • Up to 10 active keys per account. Revoke the ones you do not use.
  • Bodies of 64 KB at most. Lists of 1 to 100 items per page (25 by default).
  • An Idempotency-Key lasts 24 hours: the same key with the same request returns the same response without repeating the action.
  • The calendar is queried in windows of 62 days at most.
  • Several wrong keys in a row from the same IP block that IP for a while.

Errors

Always with the right HTTP status and the same shape: {"error": {"code": "...", "message": "..."}}. message is plain language you can show your user (in Spanish for now); branch on code.

StatuscodeWhat it means
401sin_clave, clave_no_validaThe Authorization header is missing, or the key does not exist or was revoked.
403plan_sin_apiYour plan does not include the API (comes with planes_url to change plan).
403alcance_insuficiente, sin_permisoThe key is read-only or your team role does not allow that change.
404no_encontradoIt does not exist or is not in your account.
409reglaThe time breaks a calendar rule: comes with reglas and propuesta.
409cotizacion_cambiada, modelo_no_disponibleThe AI price rose above max_creditos_ia or that model does not work for the video. Nothing is spent.
409peticion_en_cursoA request with that Idempotency-Key is already running.
422peticion_no_validaA field is not valid: comes with campos and the reason for each.
422idempotency_key_reutilizadaYou used the same Idempotency-Key with a different request.
429demasiadas_peticionesYou went over the limit: wait as long as Retry-After says.
503no_disponibleA service is not responding right now. Retry with the same Idempotency-Key.
JSON
HTTP/1.1 409 Conflict
{
  "error": {
    "code": "regla",
    "message": "Hay otra variante del mismo vídeo a menos de 72 horas.",
    "reglas": [{ "codigo": "misma_base", "mensaje": "Hay otra variante del mismo vídeo a menos de 72 horas." }],
    "propuesta": "2026-11-05T17:30:00+00:00"
  }
}

Reference and help

Ready to connect it?

The API and MCP are in the Viral plan. Create your key in Settings, API and MCP.Full API reference