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
/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"
  }
}
POST
/posts

Create or schedule a post

Creates a draft post, or schedules it when scheduled_for is present.

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": "2026-07-10T16:00:00Z"
}'

Request body

{
  "brand_id": 42,
  "content_id": 1001,
  "platform": "LI",
  "text": "Launch copy for LinkedIn.",
  "scheduled_for": "2026-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": "2026-07-10T16: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": "2026-07-10T16:00:00Z",
    "published_at": null,
    "external_url": null,
    "error": "The connected account needs to be reconnected.",
    "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/uploads/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "part_size_bytes": 8388608,
  "max_parts": 10000
}
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/uploads/launch-video.mp4",
  "upload_id": "upload-session-id",
  "session_token": "session-token",
  "part_numbers": [1, 2]
}'

Request body

{
  "object_key": "users/123/uploads/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

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/uploads/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/uploads/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"
  }
}