openapi: 3.1.0 info: title: dopost Social Scheduler Media Posts API version: v1 summary: REST API for scheduling and publishing posts across Instagram, Facebook, TikTok, Pinterest, X, and YouTube. description: 'Hand-authored OpenAPI 3.1 specification for the dopost Social Media Scheduler API, derived from public documentation at https://dopost.co/docs/api as of 2026-05-27. Authentication uses an API key passed via the `x-api-key` header. API key generation happens inside the dopost web app. All endpoints are mounted under `/api/v1/` and return `application/json`. NOTE: Per-network publish options (Instagram, Facebook, TikTok, Pinterest, X, YouTube) are referenced in the dopost docs but the exact field-level schemas for each network are not enumerated in the public docs visible to anonymous users. They are modeled here as `additionalProperties: true` containers so spec consumers do not lose data, and the review notes (review.yml) flag these as `reconciled: false`. ' contact: name: dopost url: https://dopost.co/ license: name: Proprietary url: https://dopost.co/ servers: - url: https://dopost.co description: Production security: - ApiKeyAuth: [] tags: - name: Posts description: Schedule, retrieve, reschedule, and delete posts across connected networks. paths: /api/v1/post/publish: post: tags: - Posts operationId: publishPost summary: Publish or schedule a post description: 'Publish a post immediately or schedule it for a future time on a single connected social account. When `publishAt` is `null`, the post publishes immediately. When `publishAt` is an ISO 8601 timestamp, the post is scheduled. ' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PublishPostRequest' examples: immediate: summary: Publish immediately value: accountId: acc_01HXYZ... text: Hello from the dopost API! publishAt: null scheduled: summary: Schedule for later value: accountId: acc_01HXYZ... text: New product drop tomorrow. publishAt: '2026-06-01T15:00:00Z' responses: '200': description: Post accepted for publishing or scheduling content: application/json: schema: $ref: '#/components/schemas/Post' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/Unprocessable' '429': $ref: '#/components/responses/RateLimited' /api/v1/post: get: tags: - Posts operationId: listPosts summary: List posts description: Retrieve posts from your workspace with optional status filtering and cursor-based pagination. parameters: - name: status in: query required: false description: Filter by post status. schema: $ref: '#/components/schemas/PostStatus' - name: cursor in: query required: false description: Opaque cursor returned by a previous response for pagination. schema: type: string - name: limit in: query required: false description: Maximum number of posts to return. schema: type: integer minimum: 1 maximum: 100 responses: '200': description: Paginated list of posts content: application/json: schema: $ref: '#/components/schemas/PostList' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' /api/v1/post/{postId}: get: tags: - Posts operationId: getPost summary: Get a post by ID parameters: - $ref: '#/components/parameters/PostId' responses: '200': description: Post details content: application/json: schema: $ref: '#/components/schemas/Post' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' patch: tags: - Posts operationId: reschedulePost summary: Reschedule a post description: Update the scheduled publish time of a draft or scheduled post. parameters: - $ref: '#/components/parameters/PostId' requestBody: required: true content: application/json: schema: type: object required: - publishAt properties: publishAt: type: string format: date-time description: New ISO 8601 publish time. examples: reschedule: value: publishAt: '2026-06-02T12:00:00Z' responses: '200': description: Updated post content: application/json: schema: $ref: '#/components/schemas/Post' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/Unprocessable' /api/v1/post/delete/{postId}: delete: tags: - Posts operationId: deletePost summary: Delete a post description: Delete a draft or scheduled post. Published posts cannot be deleted. parameters: - $ref: '#/components/parameters/PostId' responses: '204': description: Post deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '409': description: Post is in a state that cannot be deleted (e.g. already published). content: application/json: schema: $ref: '#/components/schemas/Error' components: responses: NotFound: description: Resource not found. content: application/json: schema: $ref: '#/components/schemas/Error' Unprocessable: description: Validation failed against platform constraints (character/media limits, schedule window, etc). content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Error' RateLimited: description: Rate limit exceeded. content: application/json: schema: $ref: '#/components/schemas/Error' BadRequest: description: The request body is malformed. content: application/json: schema: $ref: '#/components/schemas/Error' parameters: PostId: name: postId in: path required: true schema: type: string description: Unique identifier of the post. schemas: NetworkOptions: type: object description: 'Network-specific publish options. dopost docs reference per-network option blocks (e.g. Instagram feed/story/reel, YouTube short, Pinterest board) but do not enumerate every field publicly. This object is intentionally open. ' additionalProperties: true Post: type: object properties: id: type: string accountId: type: string status: $ref: '#/components/schemas/PostStatus' text: type: string publishAt: type: - string - 'null' format: date-time publishedAt: type: - string - 'null' format: date-time mediaIds: type: array items: type: string platform: $ref: '#/components/schemas/Platform' createdAt: type: string format: date-time updatedAt: type: string format: date-time PostList: type: object properties: data: type: array items: $ref: '#/components/schemas/Post' nextCursor: type: - string - 'null' PostStatus: type: string enum: - draft - scheduled - published - failed PublishPostRequest: type: object required: - accountId - text properties: accountId: type: string description: ID of the connected social account that owns the post. text: type: string description: Post body / caption text. publishAt: type: - string - 'null' format: date-time description: ISO 8601 timestamp when the post should publish. `null` publishes immediately. mediaIds: type: array description: Optional list of `mediaId` values previously created via the Media API. items: type: string instagram: $ref: '#/components/schemas/NetworkOptions' facebook: $ref: '#/components/schemas/NetworkOptions' tiktok: $ref: '#/components/schemas/NetworkOptions' pinterest: $ref: '#/components/schemas/NetworkOptions' x: $ref: '#/components/schemas/NetworkOptions' youtube: $ref: '#/components/schemas/NetworkOptions' Platform: type: string description: Supported social network identifier. enum: - instagram - facebook - tiktok - pinterest - x - youtube Error: type: object required: - message properties: code: type: string message: type: string details: type: object additionalProperties: true securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: Workspace API key issued from the dopost web app.