Skip to content

Put one planned outreach touch (an email, LinkedIn or call step for one contact) on a rep's desk with its why, facts and draft. The rep edits and sends it, or, for a started sequence on an Autopilot lane, the desk sends it at its time once the account check passes. Only an org admin (Admin or Owner) may name another rep in owner_id: an admin's personal key or OAuth connection, an org key an admin created, or an org key with no recorded creator. Any other key may name only its own person and gets 403 owner_not_self for anyone else. Posting the same external_key again updates the open card instead of adding a second one, and the new body replaces the card's context and draft rather than merging, so send the complete context every time. Needs deals:write and a key allowed to see the contact

POST
/desk/cards

Put one planned touch on a rep’s desk, with its why, facts, fields and draft.

201 when the card is made. The same touch posted again (same external_key, else the same list_id + contact_id + touch, else the same rep, contact, channel and due day) while the card is unsent answers 200 with the same card_id and updated: true. An external_key is kept apart per origin.kind, so two integrations may both use “1”; a body with no origin.kind shares one namespace with every other such caller in the org, so its key must be unique across the org. Once the rep has sent or decided it, a re-post makes a new card, except for a sequence touch: a sequence touch that was sent (or is sending) or that the rep skipped or dismissed is 409 already_done with its card_id, so a retry never sends twice. A sequence card that only expired, or a discarded sequence, can be posted again. When the rep edited the open card’s copy, a re-post by the same contact and channel keeps the rep’s draft and answers copy_kept: true.

A re-post REPLACES the card’s context and draft, it does not merge. The card’s channel, persona, facts, fields, draft, sender.mailbox and origin are dropped and the new body’s are written, and its summary line is rebuilt, so a fact, field, persona or draft left out of the re-post is gone from the card. Send the complete context every time. Priority comes from the new body, so a re-post with no priority sets it back to normal.

A re-post can also MOVE the open card. It is found by its key across the whole org, so an org admin’s key naming another rep in owner_id moves it onto that rep’s desk (any other key gets 403 owner_not_self instead, also when the open card sits on another rep’s desk and the key names its own person), and the same external_key with a new contact_id rewrites it onto that contact.

Kept from the open card: its status (a snoozed card stays snoozed), its created and resolved times, the why when the re-post sends no context.why, the due date when it sends no due_at, who first planned it, and anything outside the replaced set that the re-post leaves out, such as list_id, touch, the company when the new contact has none, and any brief the desk wrote.

A card the desk will not make is a 4xx whose detail.reason says why.

WHO MAY NAME ANOTHER REP. Only an org admin (Admin or Owner) may put a card on another rep’s desk: an admin’s personal key or OAuth connection, an org key whose creator is an admin now, or an org key with no recorded creator (it acts as the org Owner). Every other key (a member’s personal key, an org key a member created, an agency or ops key) may name only its own person, its holder or its creator, and gets 403 owner_not_self for anyone else. Naming yourself always works. An admin creates an org key in Settings, Developers, API and webhooks (Create API key), or with POST /api-keys from their own key holding account:write; give it the deals:write scope. The key must be allowed to see the contact (and the account when one is named, else the contact’s own company), checked the way the contacts and deals routes check a record id from a body; one it may not see is 403 contact_not_allowed / account_not_allowed and no card is made.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

object
account_id
Any of:
integer
> 0 <= 9223372036854776000
channel
required

Email, linkedin or call.

string
>= 1 characters <= 32 characters
contact_id
required

The contact the touch is for.

integer
> 0 <= 9223372036854776000
context
Any of:
object
facts

Bullets under what we know. Empty ones are dropped.

Array<string>
<= 20 items
fields

The columns the card was built from, shown as chips.

object
<= 40 properties
key
additional properties
string
persona
Any of:
string
<= 200 characters
why
Any of:
string
<= 1000 characters
draft
Any of:

Shaped by the channel. email: subject, body. linkedin: kind (connect or message), message, a connect note at most 300 characters. call: talking_points, questions, handoff_line.

object
body
Any of:
string
<= 20000 characters
handoff_line
Any of:
string
<= 1000 characters
kind
Any of:
string
<= 32 characters
Allowed values: connect message
message
Any of:
string
<= 8000 characters
questions
Array<string>
<= 20 items
subject
Any of:
string
<= 300 characters
talking_points
Array<string>
<= 20 items
due_at
Any of:
string format: date-time
external_key
Any of:
string
<= 200 characters
list_id
Any of:
integer
> 0 <= 9223372036854776000
origin
Any of:
object
kind
Any of:
string
<= 100 characters
mapping
Any of:
string
<= 300 characters
owner_id
required

Whose desk: a team member’s email, id or user id. Only an org admin (Admin or Owner) may name another rep: an admin’s personal key or OAuth connection, an org key an admin created, or an org key with no recorded creator. Any other key may name only its own person (a personal key’s holder, an org key’s creator); anyone else is 403 owner_not_self.

string
>= 1 characters <= 320 characters
priority

Low, normal, high or urgent.

string
default: normal <= 16 characters
sender
Any of:
object
linkedin_seat_id
Any of:
string
<= 200 characters
mailbox
Any of:
string
<= 320 characters
mailbox_id
Any of:
string
<= 200 characters
sequence
Any of:
string
<= 80 characters
touch
Any of:
integer
>= 1 <= 1000

Responses

201

Successful Response

object
data
required
object
card_id
required
string
copy_kept

True when the rep had edited this card’s copy on the desk: the re-post updated the card’s context but the rep’s draft was kept.

boolean
due_at
Any of:
string
note
Any of:
string
status
Any of:
string
updated

True when this body updated a card already on the desk.

boolean
url
Any of:
string
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
notes
Any of:
Array<string>
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer
total_available
Any of:
integer
total_is_lower_bound
Any of:
boolean

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string