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.
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.comGetting 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:
| Intent | API call | Result state |
|---|---|---|
| Save as idea / draft | saveAsDraft: true (default) | draft |
| Schedule | saveAsDraft: false + scheduledAt | scheduled |
| Publish now | saveAsDraft: false, no scheduledAt | queued |
| Cancel | DELETE /v1/posts/:id | cancelled |
| Edit | PUT /v1/posts/:id | unchanged state |
Payload reference
Use a single POST /v1/posts endpoint for all platforms. Platform-specific options go inside content:
| Field | Type | Description |
|---|---|---|
| contentType | text | image | video | Required |
| message | string | Primary text (Facebook, LinkedIn, Threads) |
| caption | string | Caption (Instagram, TikTok photo) |
| imageUrls | string[] | Required for image posts |
| videoUrl | string | Required for video posts |
| platformCaptions | Record<string,string> | Per-platform caption overrides |
| perAccount | object | Per-target overrides keyed by target id |
| object | privacy, place, call_to_action, first_comment | |
| object | location_id, collaborators, first_comment | |
| object | visibility | |
| tiktok | object | privacy_level, title, description |
| youtube | object | title, description, privacyStatus, tags |
| threads | object | quotePostId, repostPostId, topicTag |
OpenAPI
Import the machine-readable spec into Postman, Cursor, or your agent tooling:
https://cutedyno.com/docs/api/openapi.jsonEndpoints
/v1/social-pagesList 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
| Name | Type | Required | Description |
|---|---|---|---|
| pages | array | - | List of connected pages |
| pages[].id | string | - | Use as targetIds when creating posts |
| pages[].platform | string | - | facebook, instagram, linkedin, threads, tiktok, youtube |
| pages[].platformPageId | string | - | Platform-native page identifier |
| pages[].pageName | string | - | 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"
}
]
}/v1/postsList Posts
Returns publish jobs (posts) for the workspace tied to the API key.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page= 1 | integer | - | Page number |
| limit= 20 | integer | - | Results per page (max 100) |
| state | string | - | Filter by state: draft, scheduled, queued, published, cancelled, failed, etc. |
| contentType | string | - | Filter by contentType: text, image, video |
| platform | string | - | Filter by target platform |
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| posts | array | - | Array of post summaries |
| page | integer | - | Current page |
| limit | integer | - | Page size |
| total | integer | - | 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
}/v1/posts/:idGet Post
Returns a single post with full content, including platform options and per-account overrides.
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| post.id | string | - | Post UUID |
| post.state | string | - | Current state |
| post.content | object | - | Full PublishContentShape |
| post.targets | array | - | 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": []
}
}/v1/postsCreate 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
| Name | Type | Required | Description |
|---|---|---|---|
| content | object | - | PublishContentShape, message, caption, imageUrls, videoUrl, platform options |
| targetIds | string[] | - | Page ids from GET /v1/social-pages |
| scheduledAt | string | - | ISO 8601 datetime, schedule for later (requires saveAsDraft: false) |
| saveAsDraft= true | boolean | - | true = draft/idea, false = publish or schedule |
| caption | string | - | Legacy flat body only |
| message | string | - | Legacy flat body only |
| contentType= text | string | - | text | image | video |
| targets | array | - | Legacy flat body only |
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | - | New post UUID |
| state | string | - | 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"
}/v1/posts/:idUpdate Post
Edits a draft or scheduled post. Cannot edit published, processing, or partially published posts.
Body parameters
| Name | Type | Required | Description |
|---|---|---|---|
| content | object | - | Partial PublishContentShape |
| targetIds | string[] | - | Replace targets with new page ids |
| scheduledAt | string | - | Reschedule (ISO 8601) |
| message | string | - | Shorthand for content.message |
| caption | string | - | Shorthand for content.caption |
| imageUrls | string[] | - | Image URLs |
| videoUrl | string | - | Video URL |
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| message | string | - | Success message |
| post | object | - | 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"
}
}/v1/posts/:idCancel Post
Cancels a scheduled or queued post. Sets state to cancelled.
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| message | string | - | Success message |
| id | string | - | Post UUID |
| state | string | - | 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"
}/v1/upload/signed-urlGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| fileName | string | Yes | Original file name with extension |
| fileType | string | Yes | MIME type, e.g. image/jpeg or video/mp4 |
Response fields
| Name | Type | Required | Description |
|---|---|---|---|
| signedUrl | string | - | Presigned PUT URL (expires) |
| publicUrl | string | - | Public CDN URL after upload |
| key | string | - | 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"
}