PublishQPublishQ

Create posts

Creates a post for one or more connected accounts.

POST
/posts

Creates a post for one or more connected accounts.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

PublishQ API key sent as Authorization: Bearer pq_live_....

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://publishq.com/api/v1/posts" \  -H "Content-Type: application/json" \  -d '{    "content": "Just shipped our new API — schedule posts to 8 platforms with one call 🚀",    "scheduledAt": "2026-04-01T12:00:00Z",    "mediaIds": [      "d4c3b2a1-0987-6543-21fe-dcba09876543"    ],    "accounts": [      {        "accountId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"      },      {        "accountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901"      }    ]  }'
{
  "id": "9f8e7d6c-5b4a-3210-fedc-ba0987654321",
  "content": "Just shipped our new API — schedule posts to 8 platforms with one call 🚀",
  "status": "DRAFT",
  "errorMessage": "string",
  "mediaIds": [
    "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  ],
  "scheduledAt": "2026-04-01T12:00:00Z",
  "publishedAt": "2019-08-24T14:15:22Z",
  "createdAt": "2026-03-30T10:00:00Z",
  "accounts": [
    {
      "accountId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "platform": "TWITTER",
      "accountName": "@publishq",
      "status": "DRAFT",
      "externalUrl": "https://x.com/publishq/status/1234567890",
      "publishedAt": "2026-04-01T12:01:23Z",
      "errorMessage": "Token expired. Please reconnect your Twitter account.",
      "postOverrides": {
        "content": "Short version for Twitter — check the link in bio!",
        "thumbnailTimestamp": 5000,
        "mediaIds": [
          "497f6eca-6276-4993-bfeb-53cbbbba6f08"
        ]
      },
      "platformSpecificSettings": {
        "property1": null,
        "property2": null
      }
    }
  ]
}

{
  "error": {
    "title": "Bad Request",
    "status": 400,
    "code": "validation_failed",
    "message": "Request validation failed",
    "instance": "/api/v1/posts",
    "details": {
      "errors": [
        {
          "path": "text",
          "message": "Invalid input: expected string, received undefined",
          "code": "invalid_type"
        }
      ]
    }
  }
}

{
  "error": {
    "title": "Unauthorized",
    "status": 401,
    "code": "missing_auth",
    "message": "Missing Authorization header",
    "instance": "/api/v1/posts"
  }
}

{
  "error": {
    "title": "Payment Required",
    "status": 402,
    "code": "posting_limits_exceeded",
    "message": "Posting limits exceeded",
    "instance": "/api/v1/posts",
    "details": {
      "limitErrors": [
        "Monthly scheduled post limit reached"
      ],
      "upgradeRequired": true
    }
  }
}
{
  "error": {
    "title": "Forbidden",
    "status": 403,
    "code": "insufficient_scope",
    "message": "Missing required scope: posts:write",
    "instance": "/api/v1/posts"
  }
}
{
  "error": {
    "title": "Too Many Requests",
    "status": 429,
    "code": "rate_limit_exceeded",
    "message": "Too Many Requests",
    "instance": "/api/v1/posts",
    "details": {
      "retryAfter": 60
    }
  }
}