Agent API

Build integrations that list content, generate social posts, and create drafts for human review before publishing.

Base URL
https://api.content3.app/v1

Authentication

Authenticate requests with an API key.

Pass your API key using either header:

  • Authorization: Bearer c3ak_...
  • x-agent-api-key: c3ak_...

Keys begin with the prefix c3ak_ and are created from your dashboard.

curl https://api.content3.app/v1/me \
  -H "Authorization: Bearer c3ak_live_abc123..."

Scopes

Each API key is granted specific scopes that control access.

content:read

Read content items and social connections

content:write

Create or modify content

social:generate

Generate social media content with AI

social:drafts:read

List draft social posts

social:drafts:write

Create draft social posts for human review

reviews:read

Read reviews

reviews:write

Create reviews and comments

products:read

Read products

products:write

Create or modify products

Endpoints

All endpoints are relative to the base URL.

GET
/v1/me

Returns the authenticated agent context. No scope required.

Response

{
  "userId": "uuid",
  "key": {
    "id": "uuid",
    "name": "my-assistant",
    "prefix": "c3ak_live_abc",
    "scopes": ["content:read", "social:generate"]
  }
}
GET
/v1/content-items
content:read

List content items owned by the authenticated user.

Query parameters

?type=video    # filter by content type
&limit=20      # max 100, default 20
&offset=0      # pagination offset

Response

{
  "items": [
    {
      "id": "uuid",
      "type": "video",
      "title": "Product Launch",
      "description": "...",
      "source_url": "https://...",
      "thumbnail_url": "https://...",
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-01T00:00:00Z"
    }
  ]
}
GET
/v1/social/connections
content:read

List connected social media accounts.

Response

{
  "connections": [
    {
      "id": "uuid",
      "provider": "youtube",
      "provider_account_id": "UC...",
      "metadata": { "channel_name": "My Channel" },
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-01T00:00:00Z"
    }
  ]
}
POST
/v1/social/generate-content
social:generate

Generate AI-written titles, descriptions, and hashtags for a content item.

Request body

{
  "contentItemId": "uuid",
  "platforms": ["youtube", "tiktok", "instagram"],
  "userPrompt": "Focus on the summer sale"  // optional
}

Response

{
  "youtube": {
    "title": "...",
    "description": "...",
    "hashtags": ["..."]
  },
  "tiktok": { ... },
  "instagram": { ... }
}
POST
/v1/social/drafts
social:drafts:write

Create a draft social post for human review. Accepts two payload formats.

Request body (format A — canonical)

{
  "contentItemId": "uuid",
  "title": "Summer Sale Highlight",
  "description": "Check out our biggest sale...",
  "hashtags": ["#summer", "#sale"],
  "platforms": [
    {
      "connectionId": "uuid",
      "platformTitle": "Override title for this platform",
      "platformDescription": "Override description",
      "settings": {}
    }
  ]
}

Request body (format B — shorthand)

{
  "contentItemId": "uuid",
  "title": "Summer Sale Highlight",
  "caption": "Check out our biggest sale...",
  "hashtags": ["#summer", "#sale"],
  "platforms": ["tiktok", "youtube"],
  "connectionIds": ["uuid-1", "uuid-2"]
}

Both formats accepted. caption maps to description. Get connection IDs from GET /v1/social/connections.

Response

{
  "draft": {
    "id": "uuid",
    "status": "draft",
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
POST
/v1/social/drafts/:id/publish
social:drafts:write

Publish a draft social post. Enqueues the post for publishing to all configured platforms. Only drafts with status "draft" can be published. Returns 422 if the post is not a draft or is missing content/platforms.

Response

{
  "postId": "uuid",
  "jobId": "uuid",
  "status": "pending"
}
GET
/v1/social/drafts
social:drafts:read

List draft social posts.

Query parameters

?limit=20   # max 100, default 20
&offset=0   # pagination offset

Response

{
  "drafts": [
    {
      "id": "uuid",
      "title": "Summer Sale Highlight",
      "description": "...",
      "hashtags": ["#summer"],
      "status": "draft",
      "created_at": "2025-01-01T00:00:00Z",
      "content_items": {
        "id": "uuid",
        "title": "Product Launch",
        "type": "video"
      },
      "social_post_platforms": [
        {
          "id": "uuid",
          "status": "pending",
          "social_connections": {
            "id": "uuid",
            "provider": "youtube"
          }
        }
      ]
    }
  ]
}

Short-Form Video Generation

Generate short-form videos from Quora, Reddit, or AI-generated content.

GET
/v1/agents/short-form/options
content:read

Get available voices, content sources, and aspect ratios for video generation.

Response

{
  "agent": {
    "id": "short_form_content",
    "name": "Short-Form Content Agent",
    "description": "Create viral videos from Quora, Reddit, or AI-generated content"
  },
  "sourceOptions": [
    {
      "value": "quora",
      "label": "Quora Answer",
      "description": "...",
      "requiredField": "url"
    }
  ],
  "voiceOptions": [
    { "value": "Kore", "label": "Kore", "description": "..." }
  ],
  "aspectRatioOptions": [
    { "value": "9:16", "label": "9:16 (Vertical)" },
    { "value": "16:9", "label": "16:9 (Horizontal)" }
  ],
  "defaults": {
    "sourceType": "quora",
    "voiceId": "Kore",
    "aspectRatio": "9:16",
    "saveToLibrary": true
  }
}
POST
/v1/agents/short-form/generate
content:read

Generate a short-form video. Returns a job ID for polling status.

Request body

{
  "source": {
    "type": "quora",       // quora | reddit | prompt | text
    "url": "https://..."   // required for quora/reddit
  },
  "voiceId": "Kore",       // optional, default "Kore"
  "aspectRatio": "9:16",   // optional, default "9:16"
  "saveToLibrary": true    // optional, default true
}

Response

{
  "success": true,
  "jobId": "uuid",
  "status": "queued",
  "taskName": "projects/.../tasks/..."
}

Render Jobs

Track the status of video rendering jobs.

GET
/v1/render-jobs
content:read

List render jobs with optional status and type filters.

Query parameters

?status=completed   # filter by job status
&job_type=slideshow # filter by job type
&agent_type=...     # filter by agent type
&limit=50           # max 100, default 50
&offset=0           # pagination offset

Response

{
  "jobs": [
    {
      "id": "uuid",
      "job_type": "slideshow",
      "agent_type": "short_form_content",
      "status": "completed",
      "payload": { ... },
      "pipeline_state": {
        "current_step": null,
        "completed_steps": ["generate", "render"],
        "intermediate_outputs": { ... }
      },
      "error_message": null,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-01T00:00:00Z"
    }
  ],
  "total": 42,
  "limit": 50,
  "offset": 0
}
GET
/v1/render-jobs/:id
content:read

Get a specific render job by ID.

Response

{
  "job": {
    "id": "uuid",
    "job_type": "slideshow",
    "agent_type": "short_form_content",
    "status": "completed",
    "payload": { ... },
    "pipeline_state": { ... },
    "error_message": null,
    "created_at": "2025-01-01T00:00:00Z",
    "updated_at": "2025-01-01T00:00:00Z"
  }
}

Reviews

Submit content for human-in-the-loop review and approval. Generate shareable public links so reviewers can provide feedback without an account.

POST
/v1/reviews
reviews:write

Create a review for human approval.

Request body

{
  "title": "Campaign video for summer sale",
  "contentType": "video",        // pdf | video | image | slides | markdown
  "attachments": [
    { "url": "https://...", "label": "Final cut", "order": 0 }
  ],
  "description": "Review the video before publishing",  // optional
  "metadata": {                                         // optional
    "tags": ["campaign"],
    "prompt": "Original generation prompt",
    "notes": "Extra context"
  }
}

Response

{
  "review": {
    "id": "uuid",
    "title": "Campaign video for summer sale",
    "contentType": "video",
    "status": "pending",
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
GET
/v1/reviews
reviews:read

List reviews with optional status filter.

Query parameters

?status=pending   # filter by review status
&limit=20         # max 100, default 20
&offset=0         # pagination offset

Response

{
  "reviews": [
    {
      "id": "uuid",
      "title": "Campaign video for summer sale",
      "description": "...",
      "contentType": "video",
      "attachments": [
        { "url": "https://...", "label": "Final cut", "order": 0 }
      ],
      "metadata": { ... },
      "status": "pending",
      "createdAt": "2025-01-01T00:00:00Z",
      "updatedAt": "2025-01-01T00:00:00Z"
    }
  ]
}
GET
/v1/reviews/:id
reviews:read

Get a review with its comments.

Response

{
  "review": {
    "id": "uuid",
    "title": "Campaign video for summer sale",
    "description": "...",
    "contentType": "video",
    "attachments": [ ... ],
    "metadata": { ... },
    "status": "pending",
    "createdAt": "2025-01-01T00:00:00Z",
    "updatedAt": "2025-01-01T00:00:00Z"
  },
  "comments": [
    {
      "id": "uuid",
      "body": "Looks good, but adjust the intro",
      "authorType": "human",
      "agentKeyName": null,
      "createdAt": "2025-01-01T00:00:00Z"
    }
  ]
}
POST
/v1/reviews/:id/comments
reviews:write

Add a comment to a review.

Request body

{
  "body": "Updated the intro section as requested"
}

Response

{
  "comment": {
    "id": "uuid",
    "body": "Updated the intro section as requested",
    "authorType": "agent",
    "agentKeyName": "my-assistant",
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
PATCH
/v1/reviews/:id
reviews:write

Update a review's status. Valid transitions: pending → in_review, in_review → approved / rejected / changes_requested, changes_requested → in_review.

Request body

{
  "status": "in_review"
}

Response

{
  "review": {
    "id": "uuid",
    "status": "in_review",
    "updatedAt": "2025-01-01T00:00:00Z"
  }
}
POST
/v1/reviews/:id/revisions
reviews:write

Submit a new revision with updated attachments. Automatically seeds the original as v1 if no revisions exist. Updates the review's attachments to the latest version.

Request body

{
  "attachments": [
    { "url": "https://...", "label": "Updated version" }
  ],
  "note": "Fixed the background color"  // optional
}

Response

{
  "revision": {
    "revisionNumber": 2,
    "note": "Fixed the background color",
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
GET
/v1/reviews/:id/revisions
reviews:read

List all revisions for a review, ordered by revision number.

Response

{
  "revisions": [
    {
      "revisionNumber": 1,
      "attachments": [
        { "url": "https://...", "label": "Original" }
      ],
      "note": "Original",
      "agentKeyName": "my-assistant",
      "createdAt": "2025-01-01T00:00:00Z"
    }
  ]
}
POST
/v1/reviews/:id/share
reviews:write

Generate a shareable public link for a review. Anyone with the link can view the content, change the review status, and leave comments without logging in. If a share link already exists, returns the existing link and enables it.

Response

{
  "shareToken": "base64url-token",
  "shareUrl": "https://content3.app/review/base64url-token",
  "shareEnabled": true
}
POST
/v1/reviews/:id/promote
reviews:read
content:write

Promote an approved review to a content item. Idempotent — returns the existing content item if already promoted. Returns 422 if the review is not approved.

Request body (all fields optional)

{
  "title": "Override title",       // optional
  "description": "Override desc"   // optional
}

Response

{
  "contentItem": {
    "id": "uuid",
    "type": "video",
    "title": "Campaign video for summer sale",
    "sourceUrl": "https://...",
    "status": "ready",
    "reviewId": "uuid",
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
PATCH
/v1/reviews/:id/share
reviews:write

Toggle a share link on or off. When disabled, the public link shows a "not found" page.

Request body

{
  "enabled": false   // true to re-enable
}

Response

{
  "shareToken": "base64url-token",
  "shareUrl": "https://content3.app/review/base64url-token",
  "shareEnabled": false
}

Products

Manage products that can be referenced in content generation.

POST
/v1/products
products:write

Create a product.

Request body

{
  "name": "Summer Collection Hoodie",
  "description": "Lightweight hoodie for summer",
  "url": "https://shop.example.com/hoodie",  // optional
  "hooks": ["trending", "sale"]               // optional
}

Response

{
  "product": {
    "id": "uuid",
    "name": "Summer Collection Hoodie",
    "description": "Lightweight hoodie for summer",
    "url": "https://shop.example.com/hoodie",
    "hooks": ["trending", "sale"],
    "createdAt": "2025-01-01T00:00:00Z"
  }
}
GET
/v1/products
products:read

List products.

Query parameters

?limit=20   # max 100, default 20
&offset=0   # pagination offset

Response

{
  "products": [
    {
      "id": "uuid",
      "name": "Summer Collection Hoodie",
      "description": "Lightweight hoodie for summer",
      "url": "https://shop.example.com/hoodie",
      "hooks": ["trending", "sale"],
      "createdAt": "2025-01-01T00:00:00Z",
      "updatedAt": "2025-01-01T00:00:00Z"
    }
  ]
}

Workflows

Common end-to-end flows for building with the API.

Draft-Review-Publish

Every post goes through human review before publishing.

1

Discover content

Call GET /v1/content-items to find available content.

2

Generate copy

Call POST /v1/social/generate-content to get AI-written titles, descriptions, and hashtags.

3

Find connections

Call GET /v1/social/connections to list connected social platforms.

4

Create draft

Call POST /v1/social/drafts to submit a draft for review.

5

Human reviews

A human approves or rejects the draft in the studio.

6

Publish draft

Call POST /v1/social/drafts/:id/publish to enqueue the draft for publishing to all platforms.

Video Generation Flow

Generate a short-form video and route it through review.

1

Get options

Call GET /v1/agents/short-form/options to discover available voices, sources, and aspect ratios.

2

Generate video

Call POST /v1/agents/short-form/generate with your chosen source and settings.

3

Poll render job

Call GET /v1/render-jobs/:id to track rendering progress until status is completed.

4

Submit for review

Call POST /v1/reviews to create a review with the rendered video for human approval.

5

Share for feedback

Call POST /v1/reviews/:id/share to generate a public link. Send the shareUrl to a human for on-demand feedback.

6

Promote to content

Once approved, call POST /v1/reviews/:id/promote to create a content item from the review.

7

Create social draft

Call POST /v1/social/drafts with the content item ID from step 6.

8

Publish draft

Call POST /v1/social/drafts/:id/publish to enqueue the draft for publishing to all platforms.

Get Started

Create an API key to start building with the Content3 Agent API.

Create API Key