Brands
9 operations. Each REST operation is also an MCP tool of the same name. REST https://tlntconnect.com/api/v1
GET/api/v1/brands
Every brand of the workspace, as every agency member sees the brands page: id, name, website, industry, contact_name, contact_email, notes, logo_url, created_at, updated_at. Sorted by name; filter by industry; paged with page/limit (limit ≤ 100, default 50).
list_brandsbrands:read- admin, manager, scout, viewer
- Ignored (read)
- 1
Input
limit queryinteger — Page size, default 50.page queryinteger — 1-based page, default 1.industry querystring — Exact industry.q querystring — Search in name, website and industry.Responses
POST/api/v1/brands
Creates a brand through the canonical service (createBrandFromInput — one atomic RPC with its contacts and segment memberships, the same as the app and Atlas). segment_ids must be segments of this workspace. Returns 201 with the brand.
create_brandbrands: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.contacts bodyarray of objectindustry bodystring | nullname body, requiredstringnotes bodystring | nullsegment_ids bodyarray of string (uuid)website bodystring | nullResponses
GET/api/v1/brands/{brand_id}
One brand: the list columns plus contacts (id, name, email, title, department, phone, linkedin_url, notes, is_primary, status, updated_at — primary first) and segments (id, name, slug). Contact fields come from outside the agency and are labelled untrusted. Unknown or cross-workspace ids return 404.
get_brandbrands:read- admin, manager, scout, viewer
- Ignored (read)
- 1
contacts
Input
brand_id path, requiredstring (uuid) — Brand id in this workspace.Responses
PATCH/api/v1/brands/{brand_id}
Partial update through the canonical service (updateBrandFromInput, the same versioned RPC as the app). expected_updated_at (the updated_at from GET /brands/{id}) is required: missing is 428 expected_updated_at_required, a brand changed since is 409 stale_target and nothing is written. segment_ids replaces the brand's segments (segments of this workspace).
update_brandbrands:write- admin, manager
- optional
- 1
Input
brand_id path, requiredstring (uuid) — Brand 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.contact_email bodystring | nullcontact_name bodystring | nullexpected_updated_at bodystring — The record's updated_at as you last read it (ISO 8601). Required on updates: a missing one is 428 expected_updated_at_required, an older one 409 stale_target.industry bodystring | nullname bodystringnotes bodystring | nullsegment_ids bodyarray of string (uuid)website bodystring | nullResponses
DELETE/api/v1/brands/{brand_id}
Deletes one brand, exactly as the app does: admin members only; a brand that still has deals is never deleted (409 conflict — reassign or delete the deals first); otherwise its contacts and segment memberships go with it and its invoices, files, casting calls and linked emails are detached, atomically. A `delete`-class action (brands:read + delete): by default it deletes at once (200 { status: "deleted" }) within the credential's daily delete cap. When the credential asks for approval in TLNT for deletes, the call answers 202 { status: "pending_approval", action_id, approval_url } instead and an admin approves or rejects it in TLNT (the Atlas brand.delete action); poll GET /actions/{action_id}. With expected_updated_at, a brand changed since is 409 stale_target.
delete_brandbrands:read+delete- admin
- Runs directly; queued when the credential asks for approval for delete
- required
- 1
Input
brand_id path, requiredstring (uuid) — Brand id in this workspace.expected_updated_at querystring — The record's updated_at as you last read it. Optional: when given, a record changed since then is refused (409 stale_target). In a query string, URL-encode it (+ as %2B).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.Responses
POST/api/v1/brands/{brand_id}/contacts
Adds a contact as the app does: the brand must be in this workspace (404), the email must be an address, is_primary makes it the brand's one primary contact. Returns 201 with the contact.
add_brand_contactbrands:write- admin, manager
- optional
- 1
notes
Input
brand_id path, requiredstring (uuid) — Brand 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.department bodystring | nullemail bodystring | nullis_primary bodybooleanlinkedin_url bodystring | nullname body, requiredstringnotes bodystring | nullphone bodystring | nulltitle bodystring | nullResponses
PATCH/api/v1/brands/{brand_id}/contacts/{contact_id}
Partial update as the app does (email validated, status active | archived, the primary contact moves only by making another contact primary — un-setting the current one is 400). expected_updated_at (the contact's updated_at from GET /brands/{id}) is required: missing is 428, a contact changed since is 409 stale_target and nothing is written.
update_brand_contactbrands:write- admin, manager
- optional
- 1
notes
Input
brand_id path, requiredstring (uuid) — Brand id in this workspace.contact_id path, requiredstring (uuid) — Contact id on this brand.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.department bodystring | nullemail bodystring | nullexpected_updated_at bodystring — The record's updated_at as you last read it (ISO 8601). Required on updates: a missing one is 428 expected_updated_at_required, an older one 409 stale_target.is_primary bodybooleanlinkedin_url bodystring | nullname bodystringnotes bodystring | nullphone bodystring | nullstatus body"active" | "archived"title bodystring | nullResponses
GET/api/v1/brands/segments
Every brand segment of the workspace, sorted by name: id, name, slug, description, parent_id, created_at.
list_brand_segmentsbrands:read- admin, manager, scout, viewer
- Ignored (read)
- 1
Responses
POST/api/v1/brands/segments
Creates a brand segment as the app does (slug derived from the name; parent_id must be a segment of this workspace). Returns 201 with the segment.
create_brand_segmentbrands: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.description bodystring | nullname body, requiredstringparent_id bodystring (uuid) | null