API Reference · v1

Build with Arlo.

REST + MCP. API-key auth. Everything you need to embed personalized rails, get recommendations, and resolve titles — all against https://api.arlotv.ai.

Quick start

One curl. No SDK required.

curl https://api.arlotv.ai/v1/recommendations \
  -H "X-API-Key: arlo_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "query": "quiet documentary, sunday morning",
    "limit": 3
  }'

query is required; limit defaults to 5, max 20. The response is JSON with a results array of ranked, scored picks from your catalog:

{
  "results": [
    {
      "content_id": "first-reformed",
      "title": "First Reformed",
      "description": "Schrader at his most precise...",
      "pdp_url": "https://...",
      "image": "https://...",
      "final_score": 0.91,
      "components": { "semantic": 0.82, "behavior": 0.12, "diversity": 0.04, "zeitgeist": 0 },
      "vibe": "austere, contemplative",
      "personalized": false,
      "genres": ["Drama"],
      "year": 2017,
      "runtime_minutes": 113,
      "content_rating": "R"
    }
  ],
  "strategy": "semantic",
  "cold_start_tier": null,
  "request_id": "uuid"
}

Authentication

Every request is authenticated with the X-API-Key header — or, equivalently, Authorization: Bearer <key> (both are accepted; X-API-Key is canonical and wins if you send both). Get a key from your dashboard or self-serve at signup.

Two key flavors per organization:

API keys are server-side only — never embed a key in browser or app code. Keys are shown once at creation and stored hashed; keep yours in a secrets manager and call Arlo from your backend.

X-API-Key: arlo_live_8a3f...e0b2
# — or —
Authorization: Bearer arlo_live_8a3f...e0b2

Embed rails

Personalized, gray-label "For You" rails for your own UI — the flagship partner endpoint. Your backend sends the user's current taste signals; Arlo uses them as ranking input for that request only, scopes the output to your catalog, and returns rails. Arlo stores no user data — customer_id is an opaque pass-through key, never a stored identity.

POST/v1/embed/rails
{
  "customer_id": "your-opaque-user-id",
  "signals": {
    "favorites": ["content_id", "..."],
    "likes":     ["content_id", "..."],
    "dislikes":  ["content_id", "..."]
  },
  "max": 6,
  "country": "US"
}

Response:

{
  "rails": [
    {
      "rail_id": "string",
      "title": "Because you liked ...",
      "items": [
        { "content_id": "string", "rec_id": "string", "position": 0 }
      ]
    }
  ]
}

Recommendations

Natural-language query in, ranked and scored picks from your catalog out — for search boxes, "surprise me" buttons, and editorial tooling. Pass an optional X-User-Token header (an end-user token) to enable personalized reranking.

POST/v1/recommendations
{
  "query": "quiet documentary, sunday morning",
  "limit": 5,
  "exclude": ["already-shown-slug"],
  "context": { "country_code": "US", "platform": "api" }
}

Response is the shape shown in the quick start: a top-level results array plus strategy, cold_start_tier, and request_id.

Title enrichment

Full record for a single title: raw catalog metadata plus Arlo's text + visual enrichment (summary, themes, audience context, tone score, color palette, shot style).

GET/v1/enrichment/:slug

Query string: ?client_id=<catalog>. client_id required. Unknown slugs return 404.

Orgs & keys

Self-serve organization and key lifecycle. Signup is public; everything else is authenticated with your X-API-Key.

EndpointAuthNotes
POST /v1/orgsnone (public)Signup: {name, email, plan?, catalog_id?} → org + first API key. The key is shown once — store it immediately.
GET /v1/orgs/:org_idX-API-KeyOrg detail + current-month usage.
POST /v1/orgs/:org_id/keysX-API-KeyMint an additional key ({label?}).
DELETE /v1/orgs/:org_id/keys/:key_idX-API-KeyRevoke — the old key 401s immediately.
POST /v1/orgs/:org_id/keys/:key_id/rotateX-API-KeyNew key now; the old key keeps working for a 24-hour grace period.

MCP

For AI agents (Claude, ChatGPT, Cursor, n8n, anything MCP-aware), use the Model Context Protocol endpoint instead of REST — Streamable HTTP transport, same X-API-Key auth. A key is required on every request — there is no anonymous tier.

POSThttps://api.arlotv.ai/mcp/v1

Full tool surface, connection guides per host (Claude Desktop / Cursor / n8n), and tiered rate limits documented in the MCP guide.

Errors

Standard HTTP codes. Body is always JSON with an error message.

CodeMeaningAction
400Malformed request — the message names the missing or invalid field.Fix the request body.
401API key missing, invalid, revoked, or expired.Check the X-API-Key header; rotate or mint a new key if needed.
404Unknown slug (enrichment lookup).Verify the slug against your catalog.
429Rate limit exceeded.Back off; respect the Retry-After header.
5xxServer error. Note: embed rails never 5xxs — it returns 200 {"rails": []} instead.Retry with exponential backoff; degrade gracefully.

Rate limits

Per-tier monthly quotas + per-minute burst caps. Quota resets at the start of each billing cycle. 429 responses include a Retry-After header, and every response carries X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset headers.

TierCalls / monthBurstPrice
Starter10,00060 req/minfree
Growth100,000300 req/min$299/mo
Scale1,000,0001,000 req/min$999/mo
Enterprisecustom / unlimited10,000 req/mincustom

SDKs

The REST API is plain JSON over HTTPS — every language has it. First-party SDKs:

Until then, curl + your HTTP library of choice works fine. Sample integration: see the chat app at app.arlotv.ai.

Have everything you need?