Shared shapes
The objects endpoints return — a conversation, a message, a contact… described once, here.
Conversation
A conversation: one person on one channel (WhatsApp), or one email thread.
idstringThe conversation id.
channelIdstringThe channel it lives on.
channelTypestringThe kind of channel.
whatsappemailchannelNamestringThe channel's name in Coplace.
statusstringWhere it stands.
openpendingclosedsubjectstringEmail subject;
nullelsewhere.categorystringThe label key it is filed under, or
null.aiEnabledbooleanWhether the AI collaborator may answer in this conversation.
needsHumanbooleanSomeone was asked to take over.
assignedUserIdstringThe member it is assigned to, or
null.agentNamestringThe collaborator's name on this conversation, or
null.contactobjectWho you are talking to.
Show fields
idstringThe contact id.
displayNamestringTheir name, or
null.identitystringTheir phone number (WhatsApp) or email address.
identityKindstringWhat
identityis.phoneemailexternalblockedbooleanBlocked contacts are kept out of the inbox.
windowobjectThe WhatsApp 24-hour customer service window.
Show fields
appliesbooleanfalseoutside WhatsApp.openbooleanWhether free text can be sent now. Always
truewhen the rule does not apply.expiresAtstringWhen it closes, ISO 8601, or
null.minutesLeftintegerMinutes left,
0when closed,nullwhen the rule does not apply.
unreadCountintegerMessages from the contact not yet read by your team.
lastMessageAtstringISO 8601, or
null.lastInboundAtstringWhen the contact last wrote, ISO 8601. This opens the 24-hour window.
createdAtstringISO 8601.
lastMessageobjectThe latest message, or
null.Show fields
idstringThe message id.
directionstringFrom the contact, or to them.
inboundoutboundtextContentstringIts text.
statusstringIts delivery status.
createdAtstringISO 8601.
{ "id": "…", "channelId": "…", "channelType": "whatsapp", "channelName": "…", "status": "open", "subject": "…", "category": "…", "aiEnabled": true, "needsHuman": true, "assignedUserId": "…", "agentName": "…", "contact": { "id": "…", "displayName": "…", "identity": "…", "identityKind": "phone", "blocked": true }, "window": { "applies": true, "open": true, "expiresAt": "…", "minutesLeft": 0 }, "unreadCount": 0, "lastMessageAt": "…", "lastInboundAt": "…", "createdAt": "…", "lastMessage": { "id": "…", "direction": "inbound", "textContent": "…", "status": "…", "createdAt": "…" }}Message
One message, in either direction.
idstringThe message id.
conversationIdstringIts conversation.
channelTypestringThe kind of channel.
whatsappemaildirectionstringinboundfrom the contact,outboundto them.inboundoutboundsenderstringWho speaks: the contact, the AI collaborator, your side (a person or your software), or Coplace.
contactagent_aiagent_humansystemsenderNamestringThe person's name, or your key's label.
apiKeyIdstringThe key that sent it, when it went through the API.
typestringtext,template,interactive,image,audio,document…textContentstringIts text. For a template, the rendered text.
transcriptstringThe text of a received voice note, when transcribed.
mediaUrlstringWhere to download its file (
GET /inbox/messages/{id}/media), ornull.subjectstringEmail subject, or
null.statusstringDelivery status.
queued: waiting to leave (queue: true).queuedsendingsentdeliveredreadfailedproviderMessageIdstringThe id at the messaging provider (WhatsApp
wamid), ornull.errorstringWhy it failed, as the provider said, or
null.formobjectThe buttons or list sent with it, or
null.replyobjectFor a tapped button or chosen list row:
{ id, title }. Otherwisenull.locationobjectA location the contact sent:
{ latitude, longitude, name, address }, ornull.createdAtstringISO 8601.
{ "id": "…", "conversationId": "…", "channelType": "whatsapp", "direction": "inbound", "sender": "contact", "senderName": "…", "apiKeyId": "…", "type": "…", "textContent": "…", "transcript": "…", "mediaUrl": "…", "subject": "…", "status": "queued", "providerMessageId": "…", "error": "…", "form": {}, "reply": {}, "location": {}, "createdAt": "…"}SendResult
What a send returns.
messageMessageduplicatebooleantruewhen thisidempotencyKeywas already used: the message returned is the first one, nothing was sent again.
{ "message": { "id": "…", "conversationId": "…", "channelType": "whatsapp", "direction": "inbound", "sender": "contact", "senderName": "…", "apiKeyId": "…", "type": "…", "textContent": "…", "transcript": "…", "mediaUrl": "…", "subject": "…", "status": "queued", "providerMessageId": "…", "error": "…", "form": {}, "reply": {}, "location": {}, "createdAt": "…" }, "duplicate": true}Contact
A person you talk to.
idstringThe contact id.
displayNamestringTheir name, or
null.localestringTheir language, e.g.
fr, ornull.phonestringTheir phone number, E.164 digits, or
null.emailstringTheir email address, or
null.externalIdstringYour own id for them, or
null.tagsstring[]Free tags.
attributesobjectCustom field values, by attribute key.
optInAtstringWhen they agreed to receive messages, or
null.optOutAtstringWhen they withdrew — on WhatsApp by tapping "Stop" — or
null. It overridesoptInAt.blockedbooleanBlocked contacts receive nothing.
conversationCountintegerHow many conversations they have.
lastMessageAtstringISO 8601, or
null.createdAtstringISO 8601.
updatedAtstringISO 8601.
{ "id": "…", "displayName": "…", "locale": "…", "phone": "…", "email": "…", "externalId": "…", "tags": [ "…" ], "attributes": {}, "optInAt": "…", "optOutAt": "…", "blocked": true, "conversationCount": 0, "lastMessageAt": "…", "createdAt": "…", "updatedAt": "…"}ContactAttribute
A custom field defined for contacts.
idstringThe attribute id.
keystringThe key used in
attributes.labelstringIts name, in your words.
dataTypestringtext,number,booleanordate.isArchivedbooleanArchived fields keep their values but are no longer shown.
{ "id": "…", "key": "…", "label": "…", "dataType": "…", "isArchived": true}ContactNote
A free-text note about a contact.
idstringThe note id.
bodystringThe note.
authorstringThe person's name or the key's label;
nullwhen the author no longer exists.authorKindstringWho wrote it.
userapi_keycreatedAtstringISO 8601.
{ "id": "…", "body": "…", "author": "…", "authorKind": "user", "createdAt": "…"}Channel
A number or mailbox the workspace speaks from.
idstringThe channel id — the
channelIdyou send from.typestringThe kind of channel.
whatsappemailnamestringIts name in Coplace.
identitystringIts public identity: the business phone number id, or the mailbox address.
isActivebooleanAn inactive channel neither sends nor receives.
qualityRatingstringWhatsApp quality rating:
GREEN,YELLOW,RED, ornull.agentIdstringThe collaborator answering on it;
nullwhen your software answers.messagingLimitstringMeta's sending tier, or
null.
{ "id": "…", "type": "whatsapp", "name": "…", "identity": "…", "isActive": true, "qualityRating": "…", "agentId": "…", "messagingLimit": "…"}Member
A person of the workspace.
idstringThe member id — what
assigntakes.fullNamestringTheir name.
emailstringTheir email address.
rolestringTheir role.
owneradminagentmembercanBeAssignedbooleanWhether a conversation can be assigned to them.
{ "id": "…", "fullName": "…", "email": "…", "role": "owner", "canBeAssigned": true}Template
A WhatsApp message template.
idstringThe template id — the
templateIdyou send.namestringIts name at Meta.
languagestringIts language code, e.g.
fr.categorystringMeta's category. Marketing ones are refused to contacts who opted out.
UTILITYMARKETINGAUTHENTICATIONstatusstringOnly
approvedcan be sent.draftsubmittedapprovedrejectedpauseddisabledbodystringIts text, with
{{1}},{{2}}… placeholders.rejectionReasonstringWhy Meta refused it, or
null.createdAtstringISO 8601.
updatedAtstringISO 8601.
{ "id": "…", "name": "…", "language": "…", "category": "UTILITY", "status": "draft", "body": "…", "rejectionReason": "…", "createdAt": "…", "updatedAt": "…"}WebhookSubscription
An address Coplace calls, and for which events.
idstringThe subscription id.
urlstringThe https address called.
eventsstring[]The events delivered;
*means all.labelstringIts name.
isActivebooleanA paused subscription receives nothing.
lastDeliveredAtstringThe last successful call, ISO 8601, or
null.lastErrorstringWhat went wrong last time, or
null.previousSecretValidUntilstringDuring a rotation: until when the old secret still signs.
nullotherwise.createdAtstringISO 8601.
{ "id": "…", "url": "…", "events": [ "…" ], "label": "…", "isActive": true, "lastDeliveredAt": "…", "lastError": "…", "previousSecretValidUntil": "…", "createdAt": "…"}WebhookDelivery
One event delivered — or to deliver — to one subscription.
idstringThe delivery id, also sent as
X-Coplace-Delivery.subscriptionIdstringThe subscription.
eventstringThe event name.
eventIdstringThe event's own id (
evt_…), the same across redeliveries: deduplicate on it.statusstringfailedafter six attempts.pendingdeliveredfailedattemptsintegerAttempts so far.
responseStatusintegerThe HTTP status your server answered, or
null.lastErrorstringWhat went wrong, or
null.nextAttemptAtstringWhen the next attempt is due, for a pending delivery.
createdAtstringISO 8601.
deliveredAtstringISO 8601, or
null.
{ "id": "…", "subscriptionId": "…", "event": "…", "eventId": "…", "status": "pending", "attempts": 0, "responseStatus": 0, "lastError": "…", "nextAttemptAt": "…", "createdAt": "…", "deliveredAt": "…"}ApiRequest
One call made with an API key.
idstringThe log line id.
apiKeyIdstringThe key used.
keyLabelstringThe key's label.
keyPrefixstringThe key's public prefix,
cop_….methodstringHTTP method.
pathstringThe address called, without its query string.
statusintegerThe HTTP status returned.
errorCodestringThe error
codereturned, ornull.durationMsintegerHow long it took.
requestIdstringThe request id, also returned in errors.
createdAtstringISO 8601.
{ "id": "…", "apiKeyId": "…", "keyLabel": "…", "keyPrefix": "…", "method": "…", "path": "…", "status": 0, "errorCode": "…", "durationMs": 0, "requestId": "…", "createdAt": "…"}Error
Every refusal of `/api/v1`.
errorobjectWhat went wrong.
Show fields
statusintegerThe HTTP status, repeated.
codestringA stable code. Test this, never the text.
messagestringWhat it means, in English.
detailstringThe specific reason, when there is one. May be in French.
requestIdstringQuote it to us if you need help.
dataobjectExtra facts attached to some refusals (e.g.
issues).
{ "error": { "status": 0, "code": "…", "message": "…", "detail": "…", "requestId": "…", "data": {} }}