AdaptlyPost Public API API

REST API for creating, scheduling, and managing social media posts across Facebook, Instagram, Threads, TikTok, X (Twitter), Bluesky, Mastodon, LinkedIn, Pinterest, YouTube, Google Business Profile, Tumblr, WordPress and Telegram. Register webhooks to receive `post.published`, `post.partially_failed

Operations 55

GET /me Describe the calling key #
GET /workspaces List the workspaces the caller can act in #
POST /social-posts Create a post (immediate, scheduled, or draft) #
GET /social-posts List posts #
POST /social-posts/validate Dry-run a post without creating it #
POST /social-posts/bulk/validate Dry-run a bulk schedule without creating posts #
POST /social-posts/bulk Bulk schedule up to 100 posts #
GET /social-posts/{id} Get a post by ID #
PATCH /social-posts/{id} Update a draft or scheduled post #
DELETE /social-posts/{id} Delete a post #
GET /social-posts/{id}/results Get per-platform publishing results for a post #
POST /social-posts/{id}/publish Publish or schedule a draft post #
POST /social-posts/{id}/unschedule Unschedule a post #
POST /social-posts/{id}/retry Retry failed platforms of a post #
GET /recurring-posts List recurring posts #
GET /recurring-posts/{id} Get a recurring post #
DELETE /recurring-posts/{id} Delete a recurring post #
POST /recurring-posts/{id}/pause Pause a recurring post #
POST /recurring-posts/{id}/resume Resume a recurring post #
GET /rss-feeds List RSS feeds #
POST /rss-feeds Connect an RSS feed #
POST /rss-feeds/preview Preview an RSS feed #
GET /rss-feeds/{id} Get an RSS feed #
PATCH /rss-feeds/{id} Update an RSS feed #
DELETE /rss-feeds/{id} Delete an RSS feed #
GET /rss-feeds/{id}/items List the items an RSS feed has seen #
POST /rss-feeds/{id}/pause Pause an RSS feed #
POST /rss-feeds/{id}/resume Resume an RSS feed #
POST /rss-feeds/{id}/check Check an RSS feed now #
GET /social-accounts List connected social accounts #
POST /social-accounts/{id}/check Re-check an account with its platform now #
DELETE /social-accounts/{id} Remove a social account from the workspace #
GET /social-accounts/{id}/instagram-audio Search Instagram music and original sounds for a Reel #
GET /social-accounts/{id}/pinterest-boards List the boards of a Pinterest account #
POST /upload-urls Get presigned upload URLs for media files #
POST /webhooks Register a webhook endpoint #
GET /webhooks List registered webhooks #
GET /webhooks/{id} Get a webhook by ID #
PATCH /webhooks/{id} Update a webhook (URL or active state) #
DELETE /webhooks/{id} Delete a webhook #
POST /webhooks/{id}/test Send a signed webhook.test event to the endpoint #
GET /analytics/overview Workspace-wide totals for a date window, with previous-window comparison #
GET /analytics/timeseries Metrics bucketed by day, week or month #
GET /analytics/platform-breakdown The same metrics as the overview, one row per platform #
GET /analytics/posts Per-post metrics for every tracked post published in the window, paginated #
GET /analytics/top-posts Best-performing posts in the window by one metric #
GET /analytics/discovered-posts Posts found on the connected accounts that were not published through AdaptlyPost #
GET /analytics/sync-status Freshness of the analytics data, per connected account #
POST /analytics/sync Ask for an analytics refresh now #
POST /ai/captions Generate a caption #
POST /ai/captions/refine Rewrite an existing caption #
POST /ai/images Start an image generation #
GET /ai/images/{jobId} Read an image generation job #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/adaptlypost-com:adaptlypost-public-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

adaptlypost-com-api-openapi.json Raw ↑
{"openapi":"3.0.3","info":{"title":"AdaptlyPost Public API","version":"1.0.0","description":"REST API for creating, scheduling, and managing social media posts across Facebook, Instagram, Threads, TikTok, X (Twitter), Bluesky, Mastodon, LinkedIn, Pinterest, YouTube, Google Business Profile, Tumblr, WordPress and Telegram. Register webhooks to receive `post.published`, `post.partially_failed`, `post.failed`, `post.scheduled`, `account.unauthorized`, `image.completed` and `image.failed` events. Read post performance through the `/analytics/*` endpoints: views, likes, comments, shares, followers and engagement rate per workspace, per platform, per day and per post, with a comparison against the previous window of the same length. Connecting an account imports its posts from the last 180 days, and analytics are kept from then on for as long as the account stays connected, so any date range in that history can be queried. A post keeps refreshing for 180 days after it is published and then holds its last captured numbers. Refreshes run on a schedule; `POST /analytics/sync` asks for one now. Webhook deliveries are signed: the `x-adaptly-signature` header contains `sha256=HMAC_SHA256(secret, \"{x-adaptly-timestamp}.{rawBody}\")`. Every response carries the RFC 9331 rate-limit fields so a client can pace itself instead of discovering the limit through a 429: `RateLimit-Policy`, `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, the seconds until the window rolls over. A 429 adds `Retry-After` with the same number of seconds. Limits are counted per API key."},"servers":[{"url":"https://post.adaptlypost.com/post/api/v1"}],"security":[{"bearerAuth":[]}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Describe the calling key","tags":["Account"],"responses":{"200":{"description":"The calling key, its role and its permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Open to every valid key, whatever its role, so an agent can find out what it may do before it tries.","parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]}},"/workspaces":{"get":{"operationId":"listWorkspaces","summary":"List the workspaces the caller can act in","description":"An OAuth sign-in reaches every workspace its member belongs to, across organizations; an API key reaches only its own. Send a returned `id` in the `X-Workspace-Id` header to act in that workspace. `current` marks the workspace this call landed in. Open to every valid key, whatever its role, so an agent can find out what it may do before it tries.","tags":["Account"],"responses":{"200":{"description":"The reachable workspaces","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceList"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]}},"/social-posts":{"post":{"operationId":"createPost","summary":"Create a post (immediate, scheduled, or draft)","description":"A draft (`saveAsDraft: true`) needs only `posts.draft`. A post with a future `scheduledAt` also needs `posts.schedule`, and a post that publishes now also needs `posts.publish`; without it the call answers 403 `permission_denied`. Requires the `posts.draft` permission.","tags":["Posts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSocialPostRequest"}}}},"responses":{"201":{"description":"Post created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostResponse"}}}},"400":{"description":"Validation error. When the post itself is invalid, `code` is `post_validation_failed` and `issues` lists every problem found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]},"get":{"operationId":"listPosts","summary":"List posts","tags":["Posts"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["NEWEST","OLDEST"]}},{"name":"statuses","in":"query","schema":{"type":"array","items":{"type":"string","enum":["DRAFT","SCHEDULED","PENDING","PUBLISHING","COMPLETED","PARTIAL_FAILURE","FAILED"]}},"explode":true,"description":"Filter by status"},{"name":"platforms","in":"query","schema":{"type":"array","items":{"type":"string","enum":["FACEBOOK","INSTAGRAM","THREADS","TIKTOK","TWITTER","BLUESKY","LINKEDIN","PINTEREST","YOUTUBE","MASTODON","TELEGRAM","GOOGLE_BUSINESS","TUMBLR","WORDPRESS"]}},"explode":true,"description":"Posts targeting any of these platforms"},{"name":"startDate","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"Paginated posts","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"total":{"type":"integer"},"hasMore":{"type":"boolean"}}}}}},"400":{"description":"Unknown query parameter or invalid filter value. The message names the offending parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.read`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.read` permission."}},"/social-posts/validate":{"post":{"operationId":"validatePost","summary":"Dry-run a post without creating it","description":"Takes the same body as `POST /social-posts` and runs every check the create call runs, plus the ones that usually fail only at publish time (TikTok creator limits, YouTube upload quota, expired tokens, Pinterest boards, X credits), without creating a post, uploading media or writing anything. Always answers 200 with a report: `valid` is false when any issue has severity `ERROR`. Issues tied to one account are listed under that account in `accounts`; the rest are in `issues`. `notChecked` lists what only the platform can decide at publish time, so `valid: true` is not a guarantee. The report also names the permissions creating the post would need, and a missing one shows up as a `PERMISSION_DENIED` issue. Requires the `posts.draft` permission.","tags":["Posts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSocialPostRequest"}}}},"responses":{"200":{"description":"Validation report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostValidationReport"}}}},"400":{"description":"Malformed request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]}},"/social-posts/bulk/validate":{"post":{"operationId":"validateBulkPosts","summary":"Dry-run a bulk schedule without creating posts","description":"Takes the same body as `POST /social-posts/bulk` and answers with one validation report per item, in request order. Requires the `posts.draft` permission.","tags":["Posts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSchedulePostsRequest"}}}},"responses":{"200":{"description":"Validation report per item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPostValidationReport"}}}},"400":{"description":"Malformed request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]}},"/social-posts/bulk":{"post":{"operationId":"bulkSchedulePosts","summary":"Bulk schedule up to 100 posts","tags":["Posts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSchedulePostsRequest"}}}},"responses":{"201":{"description":"Bulk scheduling result","content":{"application/json":{"schema":{"type":"object","properties":{"totalScheduled":{"type":"integer"},"totalFailed":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"postId":{"type":"string"},"success":{"type":"boolean"},"isScheduled":{"type":"boolean"},"scheduledAt":{"type":"string","format":"date-time"},"errorMessage":{"type":"string"}}}}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.schedule`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.schedule` permission.","parameters":[{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}]}},"/social-posts/{id}":{"get":{"operationId":"getPost","summary":"Get a post by ID","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"The post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.read`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.read` permission."},"patch":{"operationId":"updatePost","summary":"Update a draft or scheduled post","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSocialPostRequest"}}}},"responses":{"200":{"description":"Updated post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.draft` permission."},"delete":{"operationId":"deletePost","summary":"Delete a post","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Post is being published and cannot be deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.draft` permission."}},"/social-posts/{id}/results":{"get":{"operationId":"getPostResults","summary":"Get per-platform publishing results for a post","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"Per-platform results","content":{"application/json":{"schema":{"type":"object","properties":{"postId":{"type":"string"},"status":{"$ref":"#/components/schemas/PostStatus"},"results":{"type":"array","items":{"type":"object","properties":{"platformId":{"type":"string"},"platform":{"$ref":"#/components/schemas/PlatformType"},"accountName":{"type":"string"},"status":{"$ref":"#/components/schemas/PlatformPostStatus"},"platformPostId":{"type":"string"},"errorMessage":{"type":"string"},"tiktokDraftFallback":{"type":"boolean","description":"TikTok delivered the content to the inbox as a draft because the daily active-user cap was hit"},"publishedAt":{"type":"string","format":"date-time"}}}}}}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.read`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.read` permission."}},"/social-posts/{id}/publish":{"post":{"operationId":"publishDraft","summary":"Publish or schedule a draft post","description":"Without `scheduledAt` the draft is scheduled for its planned date when it has one in the future, and published now otherwise; send `publishNow: true` to publish a dated draft now. Scheduling the draft for a future date also needs `posts.schedule`, and publishing it now also needs `posts.publish`, so a key that holds only `posts.draft` cannot publish; the call answers 403 `permission_denied`. Requires the `posts.draft` permission.","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishDraftRequest"}}}},"responses":{"201":{"description":"Publish result","content":{"application/json":{"schema":{"type":"object","properties":{"postId":{"type":"string"},"queuedPlatforms":{"type":"array","items":{"$ref":"#/components/schemas/PlatformType"}},"isScheduled":{"type":"boolean"},"scheduledAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Post is not a draft, or both `scheduledAt` and `publishNow` were sent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/social-posts/{id}/unschedule":{"post":{"operationId":"unschedulePost","summary":"Unschedule a post","description":"Turns a scheduled or dated draft post back into an undated draft. Requires the `posts.draft` permission.","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"The post as an undated draft","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Post is neither a draft nor scheduled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/social-posts/{id}/retry":{"post":{"operationId":"retryFailedPlatforms","summary":"Retry failed platforms of a post","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryFailedPlatformsRequest"}}}},"responses":{"201":{"description":"Retry result","content":{"application/json":{"schema":{"type":"object","properties":{"postId":{"type":"string"},"queuedPlatforms":{"type":"array","items":{"$ref":"#/components/schemas/PlatformType"}},"isScheduled":{"type":"boolean"}}}}}},"400":{"description":"A value in `platformIds` matches no platform entry of the post, or none of the matched entries has failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.publish`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.publish` permission."}},"/recurring-posts":{"get":{"operationId":"listRecurringPosts","summary":"List recurring posts","description":"Series created by passing `recurrence` to `POST /social-posts`. Only the next occurrence of an active series exists as a scheduled post. Requires the `posts.read` permission.","tags":["Recurring posts"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"statuses","in":"query","schema":{"type":"array","items":{"type":"string","enum":["ACTIVE","PAUSED","ENDED"]}},"explode":true},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"Paginated recurring posts","content":{"application/json":{"schema":{"type":"object","properties":{"recurringPosts":{"type":"array","items":{"$ref":"#/components/schemas/RecurringPost"}},"total":{"type":"integer"},"hasMore":{"type":"boolean"}}}}}},"400":{"description":"Unknown query parameter or invalid filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.read`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/recurring-posts/{id}":{"get":{"operationId":"getRecurringPost","summary":"Get a recurring post","tags":["Recurring posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Recurring post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"The recurring post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringPost"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.read`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Recurring post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Requires the `posts.read` permission."},"delete":{"operationId":"deleteRecurringPost","summary":"Delete a recurring post","description":"Stops the series and deletes its upcoming scheduled post. Posts that already went out are kept. Requires the `posts.draft` permission.","tags":["Recurring posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Recurring post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Recurring post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/recurring-posts/{id}/pause":{"post":{"operationId":"pauseRecurringPost","summary":"Pause a recurring post","description":"Stops creating occurrences and deletes the upcoming scheduled post. Requires the `posts.draft` permission.","tags":["Recurring posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Recurring post ID"},{"name":"X-Workspace-Id","in":"header","required":false,"schema":{"type":"string"},"description":"The workspace to act in, for OAuth sign-ins that reach several workspaces. Take the id from `GET /workspaces`. Without it the call lands in the default workspace. A workspace the caller cannot reach answers 403 with `code: workspace_access_denied`. An API key belongs to one workspace: send its own id or leave the header out"}],"responses":{"200":{"description":"The paused recurring post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringPost"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's role does not hold `posts.draft`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionDeniedError"}}}},"404":{"description":"Recurring post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/recurring-posts/{id}/resume":{"post":{"operationId":"resumeRecurringPost","summary":"Resume a recurring post","description":"Continues from the next occurrence after now. Occurrences missed while paused are not published. Requires the `posts.draft` permission.","tags":["Recurring posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Recur

# --- truncated at 32 KB (191 KB total) ---
# Full source: https://artifacts.apis.io/adaptlypost-com/openapi/_original/adaptlypost-com-api-openapi.json