Skip to main content
Auth. HMAC v1 or bearer token — see Authentication. Status. Live · Idempotent: No.
Builds a vCard from the supplied fields and sends it as a tappable contact bubble in the chat. The recipient sees a normal contact card they can tap to save. Works in both DMs and groups. Wrap the card details in a top-level contact object (or supply raw vcard_text). Include at least one identifying field inside contactfull_name, given_name, family_name, organization, or a non-empty phones / emails. This is independent of the line’s own saved contact card — use share-contact-info to share the line’s “Me” card.

Addressing the recipient

Pick the form that matches your state:
  1. By chat idPOST /api/v1/chats/{id}/send-contact once a chat exists.
  2. By phone — pass to in the request body. Use this on first-touch when no chat exists yet; Chert resolves or creates the chat in-line.
{
  "to": "+14155551234",                  // <- E.164 phone (alternative to {id} in the URL)
  "contact": {
    "full_name": "Sean Franklin",
    "given_name": "Sean",
    "family_name": "Franklin",
    "organization": "Acme Inc",
    "phones": [{ "value": "+14155551234", "label": "mobile" }],
    "emails": [{ "value": "sean@acme.example", "label": "work" }]
  }
}

Request

POST /api/v1/chats/{id}/send-contact
curl -X POST https://console.trychert.com/api/v1/chats/ch_01H.../send-contact \
  -H "x-chert-tenant: $TENANT" \
  -H "x-chert-signature: v1,$TS,$SIG" \
  -H "content-type: application/json" \
  -d '{
    "contact": {
      "full_name": "Sean Franklin",
      "given_name": "Sean",
      "family_name": "Franklin",
      "organization": "Acme Inc",
      "phones": [{ "value": "+14155551234", "label": "mobile" }],
      "emails": [{ "value": "sean@acme.example", "label": "work" }]
    }
  }'

Response

{
  "chat_id": "ch_01H...",
  "status": "sent"
}

Path parameters

id
string
Chat identifier (ch_…). Omit and use body.to for first-touch recipients with no chat yet.

Body

Provide either a contact object (canonical) or a raw vcard_text string.
to
string
Recipient phone in E.164 format. Use instead of the {id} path segment when no chat exists yet. Ignored when {id} is supplied.
contact
object
Canonical contact wrap. Must include at least one identifying field.
{
  "full_name": "Sean Franklin",
  "given_name": "Sean",
  "family_name": "Franklin",
  "organization": "Acme Inc",
  "phones": [{ "value": "+14155551234", "label": "mobile" }],
  "emails": [{ "value": "sean@acme.example", "label": "work" }]
}
FieldTypeNotes
full_namestringFormatted display name.
given_namestringFirst name.
family_namestringLast name.
organizationstringOrg / company name.
phonesobject[]Each { value: <E.164>, label?: string }.
emailsobject[]Each { value, label?: string }.
vcard_text
string
Raw vCard payload (begins with BEGIN:VCARD). Use this when you already produce vCards elsewhere.

Response fields

chat_id
string
The chat the card was sent into.
status
string
Always "sent" on success.

Errors

CodeHTTPWhen
1001400Missing contact and vcard_text (request body needs one of them).
1002400contact has no identifying field, or fields were supplied in an unsupported shape.
1004400Invalid JSON body.
2002404Chat not found. On first-touch with no existing chat, address the call with body.to instead of {id}.
4001502Delivery failed.
4099501No pinned line, or the line does not support contact bubbles.
See the full error code reference.

See also