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
/api/v1/accountsList every social account connected to your workspace.
Example
curl https://your-domain.com/api/v1/accounts \ -H "Authorization: Bearer landio_..."
/api/v1/contentList 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_..."
/api/v1/contentCreate 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>"]}'/api/v1/content/:idGet 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_..."
/api/v1/variants/:id/scheduleSchedule 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"}'/api/v1/variants/:id/publishPublish 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_..."
/api/v1/bulk-plansPlan 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}}'/api/v1/bulk-plans/:idGet 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_..."
/api/v1/bulk-plans/:id/startMake 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"}'/api/v1/analyticsWorkspace-wide performance: totals, top content, and per-platform breakdown.
Example
curl https://your-domain.com/api/v1/analytics \ -H "Authorization: Bearer landio_..."
/api/v1/media/importCopy 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"}'/api/v1/videos/talkingTalking 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…"}'/api/v1/videos/lipsyncLip-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}'/api/v1/videos/finishFinish 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"}}'/api/v1/videos/templatesList the video templates you can start from.
Example
curl https://your-domain.com/api/v1/videos/templates \ -H "Authorization: Bearer landio_..."
/api/v1/videos/templatesA 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>"}'/api/v1/videos/dubTranslate & 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"]}'/api/v1/videos/:kind/:idPoll 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