Deliverables
10 operations. Each REST operation is also an MCP tool of the same name. REST https://tlntconnect.com/api/v1
GET/api/v1/campaigns/{campaign_id}/deliverables
Every deliverable on a campaign the key's member can see (404 otherwise), oldest first: type {id, platform, title}, creator {id, display_name}, status, quantity, draft_due, post_due, posted_at, content_url, draft_url, draft_notes, notes, review_feedback and updated_at (pass it back as expected_updated_at to update). A manager sees only the deliverables of creators assigned to them, as in the app. content_url, draft_url and draft_notes are creator-submitted and labelled untrusted.
list_deliverablescampaigns:read- admin, manager, scout, viewer
- Ignored (read)
- 1
content_urldraft_urldraft_notes
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.Responses
POST/api/v1/campaigns/{campaign_id}/deliverables
Adds deliverables through the app's own service: give creator_id for one deliverable, or creator_ids (1-100) to add the same deliverable to each. Every creator must be on the campaign and in this workspace (404 creator_not_found / campaign_creator_not_found otherwise); deliverable_type_id must be a type from this workspace's catalog (list_deliverable_types). A manager may add only for creators assigned to them (403 role_forbidden). Deliverables carry no money (pay lives on the campaign creator). Answers 201 with the created rows.
create_deliverablescampaigns:write- admin, manager
- optional
- 1
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.content_url bodystring | null — Single deliverable only.creator_id bodystring (uuid) — One creator on the campaign (or use creator_ids).creator_ids bodyarray of string (uuid) — Several creators on the campaign: one deliverable each.deliverable_type_id body, requiredstring (uuid) — A deliverable type from this workspace's catalog.draft_due bodystring | nullnotes bodystring | nullpost_due bodystring | nullquantity bodyinteger — Default 1.status body"not_started" | "draft_pending" | "awaiting_approval" | "scheduled" | "posted" | "completed" | "overdue" — Default not_started.Responses
PATCH/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}
Partial update through the app's own service (the same one the Atlas deliverable.update action runs). expected_updated_at is REQUIRED: the deliverable's updated_at as you read it — missing is 428 expected_updated_at_required, and a deliverable changed since is 409 stale_target (nothing is written). To set an uploaded draft, pass the object_path from create_deliverable_draft_upload_url as draft_url (it must belong to this deliverable). To approve a draft or ask for changes — which notifies the creator — use review_deliverable instead. A manager may update only deliverables of creators assigned to them (403 role_forbidden).
update_deliverablecampaigns:write- admin, manager
- optional
- 1
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.content_url bodystring | nulldeliverable_type_id bodystring (uuid)draft_due bodystring | nulldraft_notes bodystring | nulldraft_url bodystring | null — An uploaded draft's object_path (this deliverable's), an https link, or null.expected_updated_at bodystring — Required: the deliverable's updated_at as you read it (428 when missing, 409 stale_target when it changed).notes bodystring | nullpost_due bodystring | nullquantity bodyintegerstatus body"not_started" | "draft_pending" | "awaiting_approval" | "scheduled" | "posted" | "completed" | "overdue"Responses
POST/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/review
The draft review of the app's review screen, through the same review RPCs: verdict "approve" (the piece moves to scheduled — or completed for a file deliverable — with optional feedback) or "request_changes" (feedback required, plus up to 25 review_changes items and an optional revision_due date; the piece goes back to draft_pending). expected_submission_id is the draft you reviewed (the latest submission, from list_deliverable_submissions); a draft that is no longer awaiting approval — already reviewed, or replaced by a newer one — is 409 stale_target and nothing is written. The creator is notified once per review. An Idempotency-Key is required: a retry with the same key replays the first answer without reviewing or notifying again, and a retry with a new key is refused as stale. A manager may review only deliverables of creators assigned to them (403 role_forbidden).
review_deliverablecampaigns:write- admin, manager
- required
- 1
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.Idempotency-Key header, requiredstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.expected_submission_id body, requiredstring (uuid) — The draft submission you reviewed (the latest one).feedback bodystring — Required for request_changes; optional note on approve.review_changes bodyarray of string — request_changes only: the concrete changes asked for.revision_due bodystring | null — request_changes only: when the revision is due.verdict body, required"approve" | "request_changes"Responses
GET/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/submissions
Every submission the creator made for this deliverable (drafts and posts), newest first: status, a link (a short-lived signed URL for an uploaded draft), the creator's notes, and the review (feedback, requested changes, revision due, who reviewed and when, auto-approval). The newest draft's id is the expected_submission_id review_deliverable needs. url and notes are creator-submitted and labelled untrusted. A deliverable outside the member's view is 404.
list_deliverable_submissionscampaigns:read- admin, manager, scout, viewer
- Ignored (read)
- 1
urlnotes
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.Responses
GET/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/draft-url
A signed URL (valid for an hour) to the draft file uploaded for this deliverable — by the creator or the agency. A deliverable without an uploaded draft (or with an external link, which list_deliverables already returns) is 404. A deliverable outside the member's view is 404.
get_deliverable_draft_urlcampaigns:read- admin, manager, scout, viewer
- Ignored (read)
- 1
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.Responses
POST/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/draft-upload-url
Issues a one-time signed upload URL for a draft file (JPG, PNG, WebP, GIF, MP4, MOV or WebM; up to 200 MB) for this deliverable, as the agency side of the app does. PUT the file to signed_url, then call update_deliverable with draft_url = object_path. Nothing is written to the deliverable until then. Admins and managers of the deliverable's creator only (403 role_forbidden for others); a deliverable outside this workspace is 404.
create_deliverable_draft_upload_urlcampaigns:write- admin, manager
- optional
- 1
Input
campaign_id path, requiredstring (uuid) — Campaign id in this workspace.deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.content_type body, required"video/mp4" | "video/quicktime" | "video/webm" | "image/jpeg" | "image/png" | "image/webp" | "image/gif"file_name body, requiredstringResponses
GET/api/v1/deliverable-types
The workspace's deliverable-type catalog, by platform then sort order (seeded with the defaults the first time it is read, as in the app). active_only=true hides removed types. A type's id is the deliverable_type_id deliverables need.
list_deliverable_typescampaigns:read- admin, manager, scout, viewer
- Ignored (read)
- 1
Input
active_only queryboolean — true: active types only.Responses
POST/api/v1/deliverable-types
Adds a type to the catalog through the app's own service (admins and managers, as in the app). A type with the same platform and title already exists → 409 conflict. Answers 201 with the type.
create_deliverable_typecampaigns:write- admin, manager
- optional
- 1
Input
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.platform body, required"instagram" | "tiktok" | "youtube" | "facebook" | "x" | "linkedin" | "snapchat" | "twitch" | "kick" | "other"title body, requiredstringResponses
PATCH/api/v1/deliverable-types/{deliverable_type_id}
Edits one catalog type through the app's own update: platform, title, sort_order, or is_active (false is the app's Remove — the type is hidden from pickers but historical rate lines keep it). A duplicate platform + title is 409 conflict; a type outside this workspace is 404. Admins and managers, as in the app.
update_deliverable_typecampaigns:write- admin, manager
- optional
- 1
Input
deliverable_type_id path, requiredstring (uuid)Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.is_active bodybooleanplatform body"instagram" | "tiktok" | "youtube" | "facebook" | "x" | "linkedin" | "snapchat" | "twitch" | "kick" | "other"sort_order bodyintegertitle bodystring