Developer docs

Public API reference

Supported customer-facing endpoints for DoroSocial API-token integrations. Internal browser and admin routes are not part of this contract.

Base URL

https://doro.social/api/v1/public

All requests use Authorization: Bearer $DORO_API_TOKEN.

GET
/accounts/tiktok/{account_id}/creator-info

Read TikTok creator settings

Discover available privacy choices and account interaction restrictions before publishing. Save explicit tiktok_publish_options on the post; never infer customer disclosure or consent.

Required scope: accounts:read

Try with curl

curl https://doro.social/api/v1/public/accounts/tiktok/{account_id}/creator-info \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the typed creator settings.
GET
/accounts/pinterest/{account_id}/boards

Discover Pinterest boards

Read connected account boards. Pinterest publishing remains disabled by the product eligibility policy; discovery is not a publication guarantee.

Required scope: accounts:read

Try with curl

curl https://doro.social/api/v1/public/accounts/pinterest/{account_id}/boards \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for board IDs, names and privacy.
GET
/jobs/{job_id}

Track background delivery

Inspect pending, queued, running, succeeded, failed or reconciliation_required work. Requires content:read and posts:read for publication jobs or transcripts:read for transcription. A succeeded publishing job can still need provider processing; read post status for the final outcome.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/jobs/{job_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

Safe job metadata; provider payloads and credentials are not returned.
GET
/content

List content

Cursor-paginated drafts and other content; filter content_type and archived.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/content \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/content/{content_id}

Read content

Read saved description, links, tags, metadata, timestamps and archive state.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/content/{content_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
PATCH
/content/{content_id}/archive

Archive or restore content

Retains content and publication history. Active scheduled or publishing references block archival.

Required scope: content:archive

Try with curl

curl -X PATCH https://doro.social/api/v1/public/content/{content_id}/archive \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "archived": true
}'

Request body

{
  "brand_id": 42,
  "archived": true
}

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/accounts

Discover destinations

List active connected accounts and the account_ids field to use for each platform. Provider credentials are never returned.

Required scope: accounts:read

Try with curl

curl https://doro.social/api/v1/public/accounts \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/limits

Read limits

Current plan posting/storage limits and finite request bounds; preflight is advisory.

Required scope: limits:read

Try with curl

curl https://doro.social/api/v1/public/limits \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/capabilities

Discover the API

Supported publishing platforms, configured content types/statuses, effective scopes, platform settings and explicit unavailable-platform reasons.

Required scope: brand:read

Try with curl

curl https://doro.social/api/v1/public/capabilities \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/posts/{post_id}/preflight

Check a post

Checks current source, destination and posting limits without submitting publication.

Required scope: posts:read

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/preflight \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/posts/{post_id}/unschedule

Return to draft

Only future unclaimed schedules can be unscheduled. Preserves the post ID.

Required scope: posts:schedule

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/unschedule \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/posts/{post_id}/cancel

Cancel a post

Cancels a draft or future unclaimed schedule; preserves history.

Required scope: posts:cancel

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/cancel \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/posts/{post_id}/publish

Publish now

Returns 202 after durable acceptance. Poll /posts/{post_id}/status for the actual provider outcome. Supports Idempotency-Key.

Required scope: posts:publish

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/publish \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/posts/{post_id}/retry

Retry a failed post

Only known retryable failures without a remote-post identifier can be retried. Unknown outcomes require reconciliation. Supports Idempotency-Key.

Required scope: posts:retry

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/retry \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/content/{content_id}/transcription

Request a transcript

Reuses existing/computing results, checks available credits and submits a transcription job.

Required scope: transcripts:create

Try with curl

curl https://doro.social/api/v1/public/content/{content_id}/transcription \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42
}'

Request body

{
  "brand_id": 42
}

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/content/{content_id}/assets

Read carousel assets

Returns ordered asset IDs, media dimensions, size, alt text and readiness.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/content/{content_id}/assets \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
PATCH
/content/{content_id}/assets/order

Reorder carousel assets

Provide every current asset ID once. Active schedules and publishing block changes.

Required scope: content:update

Try with curl

curl -X PATCH https://doro.social/api/v1/public/content/{content_id}/assets/order \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "asset_ids": [
    32,
    31
  ]
}'

Request body

{
  "brand_id": 42,
  "asset_ids": [
    32,
    31
  ]
}

Example response

See the linked OpenAPI contract for the complete response schema.
DELETE
/content/{content_id}/assets/{asset_id}

Remove a carousel asset

Retains at least one asset; source deletion is deferred until the database change is durable.

Required scope: content:update

Try with curl

curl -X DELETE https://doro.social/api/v1/public/content/{content_id}/assets/{asset_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/media/uploads/multipart/status

Inspect an upload

Inspect state and expiry using the original session credentials. Preserve ETags locally to resume through sign-parts.

Required scope: media:upload

Try with curl

curl https://doro.social/api/v1/public/media/uploads/multipart/status \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "object_key": "<start.object_key>",
  "upload_id": "<start.upload_id>",
  "session_token": "<start.session_token>"
}'

Request body

{
  "brand_id": 42,
  "object_key": "<start.object_key>",
  "upload_id": "<start.upload_id>",
  "session_token": "<start.session_token>"
}

Example response

See the linked OpenAPI contract for the complete response schema.
POST
/media/uploads/multipart/abort

Abort an upload

Abort unfinished storage work. Completed uploads cannot be aborted; repeated confirmed aborts are safe.

Required scope: media:upload

Try with curl

curl https://doro.social/api/v1/public/media/uploads/multipart/abort \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "object_key": "<start.object_key>",
  "upload_id": "<start.upload_id>",
  "session_token": "<start.session_token>"
}'

Request body

{
  "brand_id": 42,
  "object_key": "<start.object_key>",
  "upload_id": "<start.upload_id>",
  "session_token": "<start.session_token>"
}

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/audit

Read API history

Cursor by after_id. Redacted operation/resource metadata excludes tokens and request bodies.

Required scope: audit:read

Try with curl

curl https://doro.social/api/v1/public/audit \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

See the linked OpenAPI contract for the complete response schema.
GET
/context

Read account context

Returns the token owner's account, active brands, default brand, and scopes.

Required scope: brand:read

Try with curl

curl https://doro.social/api/v1/public/context \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "account": { "id": 123, "email": "[email protected]" },
  "brands": [{ "id": 42, "name": "Main Brand", "is_active": true }],
  "default_brand_id": 42,
  "scopes": ["brand:read", "posts:read"]
}
GET
/brands

List brands

Lists active brands available to the token owner.

Required scope: brand:read

Try with curl

curl https://doro.social/api/v1/public/brands \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "brands": [{ "id": 42, "name": "Main Brand", "is_active": true }]
}
POST
/content

Create content

Creates a source content item that posts can be attached to.

Required scope: content:create

Try with curl

curl https://doro.social/api/v1/public/content \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "title": "Repurpose webinar into clips",
  "content_type": "TEXT",
  "status": "DRAFT",
  "description": "Source notes for the integration"
}'

Request body

{
  "brand_id": 42,
  "title": "Repurpose webinar into clips",
  "content_type": "TEXT",
  "status": "DRAFT",
  "description": "Source notes for the integration"
}

Example response

{
  "content": {
    "id": 1001,
    "brand_id": 42,
    "title": "Repurpose webinar into clips",
    "content_type": "TEXT",
    "status": "DRAFT",
    "created_at": "2026-07-06T22:00:00Z"
  }
}
PATCH
/content/{content_id}

Update content

Updates customer-owned metadata on an existing source content item, including title, status, description, links, hashtags, tags, duration, orientation, and metadata.

Required scope: content:update

Try with curl

curl -X PATCH https://doro.social/api/v1/public/content/{content_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Updated webinar clips",
  "tags": ["webinar", "launch"],
  "metadata": { "campaign": "summer-launch" }
}'

Request body

{
  "title": "Updated webinar clips",
  "tags": ["webinar", "launch"],
  "metadata": { "campaign": "summer-launch" }
}

Example response

{
  "content": {
    "id": 1001,
    "brand_id": 42,
    "title": "Updated webinar clips",
    "content_type": "TEXT",
    "status": "DRAFT",
    "tags": ["launch", "webinar"],
    "metadata": { "campaign": "summer-launch" },
    "created_at": "2026-07-06T22:00:00Z"
  }
}
POST
/posts

Create or schedule a post

Creates a draft post, or schedules it when scheduled_for is present. For TikTok (TT), omit account_ids.tiktok_account_id when the brand has exactly one active TikTok account; provide it only when multiple active TikTok accounts are connected.

Required scope: posts:create, posts:schedule when scheduling

Try with curl

curl https://doro.social/api/v1/public/posts \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "content_id": 1001,
  "platform": "LI",
  "text": "Launch copy for LinkedIn.",
  "scheduled_for": "2030-07-10T16:00:00Z"
}'

Request body

{
  "brand_id": 42,
  "content_id": 1001,
  "platform": "LI",
  "text": "Launch copy for LinkedIn.",
  "scheduled_for": "2030-07-10T16:00:00Z"
}

Example response

{
  "post": {
    "id": 789,
    "brand_id": 42,
    "content_id": 1001,
    "platform": "LI",
    "status": "scheduled",
    "title": null,
    "text": "Launch copy for LinkedIn.",
    "scheduled_for": "2030-07-10T16:00:00Z",
    "published_at": null,
    "external_url": null,
    "error": null,
    "created_at": "2026-07-06T22:00:00Z"
  }
}
GET
/published-content

List published content and transcripts

Returns unique published content with cursor pagination. Filter by publication date or type; include=transcript returns up to 50 normalized transcripts per page.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/published-content \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "data": [],
  "next_cursor": null
}
GET
/content/{content_id}/transcript

Read one content transcript

Returns a normalized published transcript. Reading an unpublished transcript additionally requires transcripts:read.

Required scope: content:read

Try with curl

curl https://doro.social/api/v1/public/content/{content_id}/transcript \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "content_id": 1001,
  "transcript": { "status": "completed", "text": "...", "segments": [] }
}
PATCH
/posts/{post_id}

Update a scheduled post

Edits drafts and future unclaimed scheduled posts, including destination selection. Set a future scheduled_for to schedule a draft. Published, publishing, failed, and due scheduled posts are not editable.

Required scope: posts:update, posts:schedule when changing scheduled_for

Try with curl

curl -X PATCH https://doro.social/api/v1/public/posts/{post_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "text": "Updated scheduled post copy.",
  "scheduled_for": "2030-07-10T18:00:00Z"
}'

Request body

{
  "text": "Updated scheduled post copy.",
  "scheduled_for": "2030-07-10T18:00:00Z"
}

Example response

{
  "post": {
    "id": 789,
    "brand_id": 42,
    "content_id": 1001,
    "platform": "LI",
    "status": "scheduled",
    "title": null,
    "text": "Updated scheduled post copy.",
    "scheduled_for": "2030-07-10T18:00:00Z",
    "published_at": null,
    "external_url": null,
    "error": null,
    "created_at": "2026-07-06T22:00:00Z"
  }
}
GET
/posts

List posts

Lists posts for a brand, optionally filtered by content, platform, or status.

Required scope: posts:read

Try with curl

curl https://doro.social/api/v1/public/posts \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "posts": [],
  "total": 0,
  "page": 1,
  "size": 50,
  "pages": 0
}
GET
/posts/{post_id}

Read one post

Returns a single post for the selected brand.

Required scope: posts:read

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id} \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "post": {
    "id": 789,
    "brand_id": 42,
    "content_id": 1001,
    "platform": "LI",
    "status": "published",
    "title": null,
    "text": "Launch copy for LinkedIn.",
    "scheduled_for": null,
    "published_at": "2026-07-10T16:05:00Z",
    "external_url": "https://www.linkedin.com/posts/example",
    "error": null,
    "created_at": "2026-07-06T22:00:00Z"
  }
}
GET
/posts/{post_id}/status

Read post status

Returns the post status, published URL, and error details when publishing fails.

Required scope: posts:read

Try with curl

curl https://doro.social/api/v1/public/posts/{post_id}/status \
  -H "Authorization: Bearer $DORO_API_TOKEN"

Example response

{
  "post": {
    "id": 789,
    "brand_id": 42,
    "content_id": 1001,
    "platform": "LI",
    "status": "failed",
    "title": null,
    "text": "Launch copy for LinkedIn.",
    "scheduled_for": "2030-07-10T16:00:00Z",
    "published_at": null,
    "external_url": null,
    "error": "Publishing failed. Inspect publish_error for recovery guidance.",
    "created_at": "2026-07-06T22:00:00Z"
  }
}
POST
/media/uploads/multipart/start

Start media upload

Starts a multipart upload session for source media.

Required scope: media:upload

Try with curl

curl https://doro.social/api/v1/public/media/uploads/multipart/start \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "filename": "launch-video.mp4",
  "file_size_bytes": 73400320,
  "content_type": "video/mp4"
}'

Request body

{
  "brand_id": 42,
  "filename": "launch-video.mp4",
  "file_size_bytes": 73400320,
  "content_type": "video/mp4"
}

Example response

{
  "object_key": "users/123/brands/42/masters/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "part_size_bytes": 8388608,
  "max_parts": 9
}
POST
/media/uploads/multipart/sign-parts

Sign upload parts

Returns signed URLs for uploading the selected parts.

Required scope: media:upload

Try with curl

curl https://doro.social/api/v1/public/media/uploads/multipart/sign-parts \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "object_key": "users/123/brands/42/masters/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "part_numbers": [1, 2]
}'

Request body

{
  "object_key": "users/123/brands/42/masters/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "part_numbers": [1, 2]
}

Example response

{
  "urls": {
    "1": "https://storage.example.com/signed-part-1",
    "2": "https://storage.example.com/signed-part-2"
  }
}
POST
/media/uploads/multipart/complete

Complete media upload

Completes the upload and creates or updates the content item.

Required scope: media:upload and content:create; content:update for existing media; transcripts:create for auto_transcribe

Try with curl

curl https://doro.social/api/v1/public/media/uploads/multipart/complete \
  -H "Authorization: Bearer $DORO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_id": 42,
  "object_key": "users/123/brands/42/masters/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "parts": [{ "part_number": 1, "etag": "etag-value" }],
  "title": "Launch video",
  "content_type": "VIDEO",
  "status": "DRAFT"
}'

Request body

{
  "brand_id": 42,
  "object_key": "users/123/brands/42/masters/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "parts": [{ "part_number": 1, "etag": "etag-value" }],
  "title": "Launch video",
  "content_type": "VIDEO",
  "status": "DRAFT"
}

Example response

{
  "content": {
    "id": 1002,
    "brand_id": 42,
    "title": "Launch video",
    "content_type": "VIDEO",
    "status": "DRAFT",
    "created_at": "2026-07-06T22:00:00Z"
  }
}