> ## Documentation Index
> Fetch the complete documentation index at: https://docs.osis.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Send a contact card

> POST /api/v1/comms/contact-cards — text a saveable vCard to a phone.

Send a contact card (vCard) over iMessage or SMS. On iPhone it lands as a tappable contact.

**Scope:** `comms_send`

Pass `agent_id` to send a hosted agent's card (name, line, claim note). Or pass `name` and `phone` for any contact.

## Request

```bash theme={null}
curl -X POST "https://osis.co/api/v1/comms/contact-cards" \
  -H "Authorization: Bearer $COMMS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: card-jane-4242" \
  -d '{
    "to": "+12125550147",
    "name": "Jane Doe",
    "phone": "+16319869528"
  }'
```

Hosted agent card:

```bash theme={null}
curl -X POST "https://osis.co/api/v1/comms/contact-cards" \
  -H "Authorization: Bearer $COMMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "conversation_id": "conv_01HZX…",
    "agent_id": "agent_01HZX…"
  }'
```

### Body parameters

<ParamField body="to" type="string">
  E.164 destination. Required unless `conversation_id` or `contact_id` is set.
</ParamField>

<ParamField body="conversation_id" type="string">
  Existing conversation to continue. Required unless `to` or `contact_id` is set.
</ParamField>

<ParamField body="contact_id" type="string">
  Existing contact. Required unless `to` or `conversation_id` is set.
</ParamField>

<ParamField body="agent_id" type="string">
  Hosted agent whose saved card to send. Fills `name` and `phone` when those are omitted.
</ParamField>

<ParamField body="name" type="string">
  Display name saved on the card. Required unless `agent_id` is set.
</ParamField>

<ParamField body="phone" type="string">
  E.164 number saved on the card. Required unless `agent_id` is set.
</ParamField>

<ParamField body="email" type="string">
  Optional email on the card.
</ParamField>

<ParamField body="organization" type="string">
  Optional organization on the card.
</ParamField>

<ParamField body="note" type="string">
  Optional note (for example a claim handle).
</ParamField>

<ParamField body="photo_url" type="string">
  HTTPS JPEG, PNG, or GIF (max 200KB) shown as the contact photo. Hosted `agent_id` cards default to the agent's photo, then the Comms mark.
</ParamField>

<ParamField body="photo_base64" type="string">
  Same image as raw base64 or a `data:image/...;base64,` URL.
</ParamField>

<ParamField body="caption" type="string">
  Optional text sent with the card. Defaults to the contact name.
</ParamField>

<ParamField body="channel" type="string">
  `sms`, `imessage`, or omit for auto.
</ParamField>

## Response

Same envelope as [Send a message](/messages-api/send-message), plus `contact_card`.

```json theme={null}
{
  "message": {
    "id": "msg_01HZX…",
    "body": "Jane Doe",
    "direction": "outbound"
  },
  "contact_card": {
    "name": "Jane Doe",
    "phone": "+16319869528"
  }
}
```

Hosted Comms agents can also send this with the `send_contact_card` tool — they default the card to their own name, line, and photo.
