CuteDyno/Docs/API Reference

Introduction

The CuteDyno REST API lets you list connected social pages, create and manage posts, and upload media programmatically. Authenticate with a workspace API key (cdyn_live_*) from the dashboard. All endpoints are scoped to one workspace.

Connect social accounts in the dashboard first. OAuth connect/disconnect is not available via API key.

Authentication

Send your workspace API key as a Bearer token on every request. Keys start with cdyn_live_ and are scoped to one workspace. Create keys in the dashboard under API keys.

Authorization: Bearer cdyn_live_...

Base URL

https://api.cutedyno.com

Getting started

Follow this workflow to create your first post via API:

1. Connect social accounts in the dashboard (OAuth).
2. GET /v1/social-pages, collect id values as targetIds.

3. (Optional) POST /v1/upload/signed-url, upload media, use publicUrl in content.

4. POST /v1/posts with content and targetIds.

5. PUT /v1/posts/:id to edit, or DELETE /v1/posts/:id to cancel.

Post lifecycle

Map your intent to API calls and resulting states:

IntentAPI callResult state
Save as idea / draftsaveAsDraft: true (default)draft
SchedulesaveAsDraft: false + scheduledAtscheduled
Publish nowsaveAsDraft: false, no scheduledAtqueued
CancelDELETE /v1/posts/:idcancelled
EditPUT /v1/posts/:idunchanged state
saveAsDraft defaults to true. Omitting it saves as draft, not publish.
Edit: draft, scheduled, in_review, approved. Cancel: scheduled or queued only.

Payload reference

Use a single POST /v1/posts endpoint for all platforms. Platform-specific options go inside content:

FieldTypeDescription
contentTypetext | image | videoRequired
messagestringPrimary text (Facebook, LinkedIn, Threads)
captionstringCaption (Instagram, TikTok photo)
imageUrlsstring[]Required for image posts
videoUrlstringRequired for video posts
platformCaptionsRecord<string,string>Per-platform caption overrides
perAccountobjectPer-target overrides keyed by target id
facebookobjectprivacy, place, call_to_action, first_comment
instagramobjectlocation_id, collaborators, first_comment
linkedinobjectvisibility
tiktokobjectprivacy_level, title, description
youtubeobjecttitle, description, privacyStatus, tags
threadsobjectquotePostId, repostPostId, topicTag
Character limits: Instagram caption 2,200 · LinkedIn 3,000 · Threads 500 · YouTube title 100 · TikTok video title 2,200.

OpenAPI

Import the machine-readable spec into Postman, Cursor, or your agent tooling:

https://cutedyno.com/docs/api/openapi.json

Endpoints

GET/v1/social-pages

List Social Pages

Returns connected social pages for the workspace tied to your API key. Use each page id as a targetId when creating posts. Connect accounts in the dashboard first, OAuth is not available via API key.

Response fields

NameTypeRequiredDescription
pagesarray-List of connected pages
pages[].idstring-Use as targetIds when creating posts
pages[].platformstring-facebook, instagram, linkedin, threads, tiktok, youtube
pages[].platformPageIdstring-Platform-native page identifier
pages[].pageNamestring-Display name

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error

Request

curl "https://api.cutedyno.com/v1/social-pages" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "pages": [
    {
      "id": "page-ext-id-123",
      "platform": "linkedin",
      "platformPageId": "page-ext-id-123",
      "pageName": "My Company Page"
    }
  ]
}
GET/v1/posts

List Posts

Returns publish jobs (posts) for the workspace tied to the API key.

Query parameters

NameTypeRequiredDescription
page= 1integer-Page number
limit= 20integer-Results per page (max 100)
statestring-Filter by state: draft, scheduled, queued, published, cancelled, failed, etc.
contentTypestring-Filter by contentType: text, image, video
platformstring-Filter by target platform

Response fields

NameTypeRequiredDescription
postsarray-Array of post summaries
pageinteger-Current page
limitinteger-Page size
totalinteger-Total matching posts

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error

Request

curl "https://api.cutedyno.com/v1/posts?page=1&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "posts": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "state": "draft",
      "contentType": "text",
      "caption": "Launch day thread",
      "message": "Launch day thread",
      "scheduledAt": null,
      "createdAt": "2026-06-17T10:00:00.000Z",
      "targets": []
    }
  ],
  "page": 1,
  "limit": 20,
  "total": 1
}
GET/v1/posts/:id

Get Post

Returns a single post with full content, including platform options and per-account overrides.

Response fields

NameTypeRequiredDescription
post.idstring-Post UUID
post.statestring-Current state
post.contentobject-Full PublishContentShape
post.targetsarray-Target pages

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error
  • 404 , Post not found

Request

curl "https://api.cutedyno.com/v1/posts/POST_ID" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "post": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "state": "draft",
    "contentType": "text",
    "message": "Hello world",
    "content": {
      "contentType": "text",
      "message": "Hello world"
    },
    "targets": []
  }
}
POST/v1/posts

Create Post

Creates a draft, scheduled, or immediately queued post. Use content + targetIds (recommended) or the legacy flat body. saveAsDraft defaults to true, omitting it saves as draft ("idea"), not publish.

Body parameters

NameTypeRequiredDescription
contentobject-PublishContentShape, message, caption, imageUrls, videoUrl, platform options
targetIdsstring[]-Page ids from GET /v1/social-pages
scheduledAtstring-ISO 8601 datetime, schedule for later (requires saveAsDraft: false)
saveAsDraft= trueboolean-true = draft/idea, false = publish or schedule
captionstring-Legacy flat body only
messagestring-Legacy flat body only
contentType= textstring-text | image | video
targetsarray-Legacy flat body only

Response fields

NameTypeRequiredDescription
idstring-New post UUID
statestring-draft | scheduled | queued

Errors

  • 400 , Invalid request body or API key not tied to a user
  • 401 , Missing or invalid API key
  • 402 , Post limit reached for billing period
  • 403 , Workspace not found or access denied
  • 404 , No valid pages for targetIds
  • 500 , Server error

Request

curl -X POST https://api.cutedyno.com/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": {
      "contentType": "text",
      "message": "Launch day thread"
    },
    "targetIds": ["page-ext-id-123"],
    "saveAsDraft": true
  }'

Response

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "state": "draft"
}
PUT/v1/posts/:id

Update Post

Edits a draft or scheduled post. Cannot edit published, processing, or partially published posts.

Body parameters

NameTypeRequiredDescription
contentobject-Partial PublishContentShape
targetIdsstring[]-Replace targets with new page ids
scheduledAtstring-Reschedule (ISO 8601)
messagestring-Shorthand for content.message
captionstring-Shorthand for content.caption
imageUrlsstring[]-Image URLs
videoUrlstring-Video URL

Response fields

NameTypeRequiredDescription
messagestring-Success message
postobject-Updated post object

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error
  • 400 , Cannot edit post in current state
  • 404 , Post not found

Request

curl -X PUT https://api.cutedyno.com/v1/posts/POST_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content":{"message":"Updated text"}}'

Response

{
  "message": "Post updated",
  "post": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "state": "draft"
  }
}
DELETE/v1/posts/:id

Cancel Post

Cancels a scheduled or queued post. Sets state to cancelled.

Response fields

NameTypeRequiredDescription
messagestring-Success message
idstring-Post UUID
statestring-cancelled

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error
  • 400 , Only scheduled or queued posts can be cancelled
  • 404 , Post not found

Request

curl -X DELETE https://api.cutedyno.com/v1/posts/POST_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "message": "Post cancelled",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "state": "cancelled"
}
POST/v1/upload/signed-url

Get Signed Upload URL

Returns a presigned S3 URL for uploading media. PUT your file to signedUrl, then use publicUrl in content.imageUrls or content.videoUrl.

Body parameters

NameTypeRequiredDescription
fileNamestringYesOriginal file name with extension
fileTypestringYesMIME type, e.g. image/jpeg or video/mp4

Response fields

NameTypeRequiredDescription
signedUrlstring-Presigned PUT URL (expires)
publicUrlstring-Public CDN URL after upload
keystring-S3 object key

Errors

  • 401 , Missing, invalid, or expired API key
  • 500 , Server error
  • 400 , fileName and fileType are required

Request

curl -X POST https://api.cutedyno.com/v1/upload/signed-url \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"photo.jpg","fileType":"image/jpeg"}'

Response

{
  "signedUrl": "https://s3.example.com/presigned...",
  "publicUrl": "https://cdn.cutedyno.com/workspace-xxx/images/photo.jpg",
  "key": "workspace-xxx/images/123-photo.jpg"
}