API and MCP reference

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}/deliverablesA campaign's deliverables (type, status, due dates, links), oldest first.

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.

MCP tool
list_deliverables
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
content_url draft_url draft_notes

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/deliverablesAdd a deliverable for one campaign creator (creator_id), or the same one for several (creator_ids).

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.

MCP tool
create_deliverables
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
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 | null
notes bodystring | null
post_due bodystring | null
quantity bodyinteger — Default 1.
status body"not_started" | "draft_pending" | "awaiting_approval" | "scheduled" | "posted" | "completed" | "overdue" — Default not_started.

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member) / creator_not_found
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
PATCH/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}Change a deliverable's status, dates, type, quantity, links or notes (send expected_updated_at).

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).

MCP tool
update_deliverable
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
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 | null
deliverable_type_id bodystring (uuid)
draft_due bodystring | null
draft_notes bodystring | null
draft_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 | null
post_due bodystring | null
quantity bodyinteger
status body"not_started" | "draft_pending" | "awaiting_approval" | "scheduled" | "posted" | "completed" | "overdue"

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409stale_target / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
428expected_updated_at_required
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
POST/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/reviewApprove a creator's draft or ask for changes. Notifies the creator; requires an Idempotency-Key.

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).

MCP tool
review_deliverable
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
required
Rate weight
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

200Success
400invalid_input / invalid_json / invalid_id / idempotency_key_required
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409stale_target / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/submissionsThe creator's draft and post submissions for one deliverable, newest first, with review outcomes.

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.

MCP tool
list_deliverable_submissions
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
url notes

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
GET/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/draft-urlA short-lived signed URL to view or download a deliverable's uploaded draft.

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.

MCP tool
get_deliverable_draft_url
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
deliverable_id path, requiredstring (uuid) — Deliverable id on this campaign.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/deliverables/{deliverable_id}/draft-upload-urlA signed URL to upload a draft photo or video for a deliverable; then set draft_url to object_path.

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.

MCP tool
create_deliverable_draft_upload_url
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
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, requiredstring

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/deliverable-typesThis workspace's deliverable-type catalog (platform + title), used when adding deliverables.

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.

MCP tool
list_deliverable_types
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

active_only queryboolean — true: active types only.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/deliverable-typesAdd a deliverable type (platform + title) to this workspace's catalog.

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.

MCP tool
create_deliverable_type
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
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, requiredstring

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
PATCH/api/v1/deliverable-types/{deliverable_type_id}Rename, move, reorder or (is_active: false) remove a deliverable type.

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.

MCP tool
update_deliverable_type
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
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 bodyboolean
platform body"instagram" | "tiktok" | "youtube" | "facebook" | "x" | "linkedin" | "snapchat" | "twitch" | "kick" | "other"
sort_order bodyinteger
title bodystring

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable