Now generating video with Google Veo, Runway, and OpenAI Sora — see how it works

Help Docs

API Reference

Landio API

A REST API for scripting and integrating with your workspace directly — the same operations available in the app, callable from anywhere.

Authentication

Create an API key from Settings → API keys in your workspace. Every request needs it as a bearer token:

Authorization: Bearer landio_...

A key acts with the same permissions as the account that created it — the same role-based access control the web app itself enforces applies to every API request too. Revoke a key at any time from the same Settings page.

Response format

Successful responses are JSON, wrapped in a top-level data field. Errors return a 4xx status with { "error": "...", "error_description": "..." }.

Endpoints

GET/api/v1/accounts

List every social account connected to your workspace.

Example

curl https://your-domain.com/api/v1/accounts \
  -H "Authorization: Bearer landio_..."
GET/api/v1/content

List posts, newest first. Supports ?status= and ?page= query params.

Example

curl "https://your-domain.com/api/v1/content?status=DRAFT&page=1" \
  -H "Authorization: Bearer landio_..."
POST/api/v1/content

Create a new draft post targeting one or more connected accounts.

Request body

{
  "title": "Spring sale announcement",
  "brief": "Announce our 20% spring sale, ends Sunday",
  "objective": "SALES",
  "tone": "PROMOTIONAL",
  "format": "POST",
  "socialAccountIds": ["<account-id>"]
}

Example

curl -X POST https://your-domain.com/api/v1/content \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"title":"Spring sale","brief":"Announce our 20% spring sale","objective":"SALES","tone":"PROMOTIONAL","format":"POST","socialAccountIds":["<account-id>"]}'
GET/api/v1/content/:id

Get one post's full detail, including every platform variant and its status.

Example

curl https://your-domain.com/api/v1/content/<content-id> \
  -H "Authorization: Bearer landio_..."
POST/api/v1/variants/:id/schedule

Schedule one platform variant to publish at a specific future time.

Request body

{ "scheduledAt": "2026-09-20T14:00:00Z" }

Example

curl -X POST https://your-domain.com/api/v1/variants/<variant-id>/schedule \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"scheduledAt":"2026-09-20T14:00:00Z"}'
POST/api/v1/variants/:id/publish

Publish one platform variant immediately — this goes live right away, no undo.

Example

curl -X POST https://your-domain.com/api/v1/variants/<variant-id>/publish \
  -H "Authorization: Bearer landio_..."
POST/api/v1/bulk-plans

Plan a week or month of posts. Topics are planned in the background — poll the plan until its status is PLANNED, then start it. postTypeMix values are relative weights.

Request body

{
  "startDay": "2026-10-05",
  "endDay": "2026-11-01",
  "socialAccountIds": ["<account-id>"],
  "postsPerWeek": 5,
  "daysOfWeek": [1, 2, 3, 4, 5],
  "postingTimes": ["10:00"],
  "postTypeMix": { "TEXT": 1, "IMAGE": 3, "CAROUSEL": 1, "VIDEO": 0 },
  "guidance": "Autumn menu launch and customer stories"
}

Example

curl -X POST https://your-domain.com/api/v1/bulk-plans \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"startDay":"2026-10-05","endDay":"2026-11-01","socialAccountIds":["<account-id>"],"postsPerWeek":5,"daysOfWeek":[1,2,3,4,5],"postingTimes":["10:00"],"postTypeMix":{"TEXT":1,"IMAGE":3,"CAROUSEL":1,"VIDEO":0}}'
GET/api/v1/bulk-plans/:id

Get a bulk plan with every post slot, its status and, once made, its content id.

Example

curl https://your-domain.com/api/v1/bulk-plans/<plan-id> \
  -H "Authorization: Bearer landio_..."
POST/api/v1/bulk-plans/:id/start

Make and schedule a planned plan's posts. mode BULK (default) uses your AI provider's batch API at about half the AI cost, ready within hours; INSTANT makes them now. approval AUTO (default) schedules each post; REVIEW sends each for approval.

Request body

{ "mode": "BULK", "approval": "AUTO" }

Example

curl -X POST https://your-domain.com/api/v1/bulk-plans/<plan-id>/start \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"mode":"BULK","approval":"AUTO"}'
GET/api/v1/analytics

Workspace-wide performance: totals, top content, and per-platform breakdown.

Example

curl https://your-domain.com/api/v1/analytics \
  -H "Authorization: Bearer landio_..."
POST/api/v1/media/import

Copy a public image or video into your media library. Use the returned mediaAssetId in the video endpoints.

Request body

{ "url": "https://example.com/clip.mp4", "kind": "video" }

Example

curl -X POST https://your-domain.com/api/v1/media/import \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/clip.mp4","kind":"video"}'
POST/api/v1/videos/talking

Talking video: one face (influencerId, videoCloneId, imageUrl or imageMediaId) saying a script, or lip-syncing a recording (audioUrl, any format). Optional: voice, engine, background (puts the person somewhere new first), changeVoiceId (re-voices the recording). Returns a jobId.

Request body

{
  "influencerId": "<influencer-id>",
  "script": "Three things I wish I knew before my first marathon…",
  "voice": { "voiceId": "OPENAI:coral", "language": "English" }
}

Example

curl -X POST https://your-domain.com/api/v1/videos/talking \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"influencerId":"<influencer-id>","script":"Three things I wish I knew…"}'
POST/api/v1/videos/lipsync

Lip-sync API: re-sync the lips in your footage (videoUrl or videoMediaId) to a new script or recording (audioUrl). Needs a Sync Labs key; consent must be true.

Request body

{ "videoUrl": "https://example.com/me.mp4", "audioUrl": "https://example.com/new-line.mp3", "consent": true }

Example

curl -X POST https://your-domain.com/api/v1/videos/lipsync \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"videoUrl":"https://example.com/me.mp4","audioUrl":"https://example.com/new-line.mp3","consent":true}'
POST/api/v1/videos/finish

Finish a library video: captions (20 styles, custom colours), b-roll images or clips, zooms, music, logo, intro/outro and contact bar. Everything but mediaAssetId has a default.

Request body

{
  "mediaAssetId": "<video-id>",
  "captions": { "style": "KARAOKE", "highlightColor": "#FFD400" },
  "broll": { "media": "MIX" },
  "autoEdit": { "zooms": true, "music": true },
  "brandKitId": "<kit-id>", "intro": true, "outro": true
}

Example

curl -X POST https://your-domain.com/api/v1/videos/finish \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"mediaAssetId":"<video-id>","captions":{"style":"KARAOKE"}}'
GET/api/v1/videos/templates

List the video templates you can start from.

Example

curl https://your-domain.com/api/v1/videos/templates \
  -H "Authorization: Bearer landio_..."
POST/api/v1/videos/templates

A whole finished video from a template — script, voice, presenter, captions and edit. Give a brief, a productId, or a productUrl (the page is imported as a product first).

Request body

{ "templateId": "ugc-testimonial", "productUrl": "https://yourstore.com/products/serum", "influencerId": "<influencer-id>" }

Example

curl -X POST https://your-domain.com/api/v1/videos/templates \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"templateId":"ugc-testimonial","productUrl":"https://yourstore.com/products/serum","influencerId":"<influencer-id>"}'
POST/api/v1/videos/dub

Translate & dub a library video into up to five languages (ElevenLabs language codes, e.g. hi, es, ta), in the speaker's own voice — lipSync: true re-syncs the lips too. Returns one jobId per language.

Request body

{ "mediaAssetId": "<video-id>", "targetLanguages": ["hi", "es"], "lipSync": true }

Example

curl -X POST https://your-domain.com/api/v1/videos/dub \
  -H "Authorization: Bearer landio_..." \
  -H "Content-Type: application/json" \
  -d '{"mediaAssetId":"<video-id>","targetLanguages":["hi","es"]}'
GET/api/v1/videos/:kind/:id

Poll any video job (kind: talking, lipsync, finish, templates or dub) until status is COMPLETED or FAILED. When done, result.url is the finished video.

Example

curl https://your-domain.com/api/v1/videos/talking/<job-id> \
  -H "Authorization: Bearer landio_..."

Before you build

Rules the API enforces

Worth knowing up front — each of these will reject a request rather than fail quietly later.

Every request is workspace-scoped

A key belongs to one workspace and can only reach that workspace's data. There is no cross-workspace read, even for someone who belongs to both.

Keys inherit the role that made them

A key created by an editor cannot approve content. Permissions are checked per request against that role, not just at the point the key was issued.

Publishing is idempotent

Sending the same scheduled publish twice does not post twice. Requests are keyed against the schedule, so retrying after a timeout is safe.

Platform limits still apply

The API won't let you build a post a network would reject — unsupported formats fail validation here rather than at publish time.

Don't have a workspace yet?

Create a free account, connect an account, and generate your first API key in minutes.

Get Started Free