# Chert docs > Chert is the messaging layer between modern go-to-market systems and iMessage. This docs site covers the Messaging API plus Salesforce, HubSpot, and Slack integrations. ## Start here - [Introduction](https://docs.trychert.com/introduction): Choose API, Salesforce, HubSpot, or Slack. - [Quickstart](https://docs.trychert.com/quickstart): Path selector and shortest API smoke test. - [Usage examples](https://docs.trychert.com/api/usage-examples): Copy common API flows. ## Messaging API - [Overview](https://docs.trychert.com/api/overview): API model, stable capabilities, and caveats. - [Quickstart](https://docs.trychert.com/api/quickstart): First API send from the Chert console. - [Authentication](https://docs.trychert.com/api/authentication): Bearer and HMAC request signing. - [Sending](https://docs.trychert.com/api/sending): `POST /api/v1/send` for simple 1:1 text sends. - [Voice notes](https://docs.trychert.com/api/voice-notes): Send native voice notes and retrieve inbound Apple voice memos through attachment content. - [Send a location](https://docs.trychert.com/api/locations): `POST /api/v1/locations` for one-time location pins on enabled sender lines. - [Create a chat](https://docs.trychert.com/api/chats/create): `POST /api/v1/chats`. - [Create a group](https://docs.trychert.com/api/group-chats/create): `POST /api/v1/chats` with 2-31 recipients in `to`. - [Send a message](https://docs.trychert.com/api/chats/send-message): `POST /api/v1/chats/{id}/messages`. - [List messages](https://docs.trychert.com/api/chats/list-messages): `GET /api/v1/chats/{id}/messages`. - [Mark read](https://docs.trychert.com/api/chats/mark-read): `POST /api/v1/chats/{id}/mark-read` with no request body. - [Typing indicator](https://docs.trychert.com/api/chats/typing): `POST /api/v1/chats/{id}/typing`. - [Attachments](https://docs.trychert.com/api/attachments): Upload, then send a `media` part. - [Phone numbers](https://docs.trychert.com/api/phone-numbers): Sender numbers available to your tenant. - [Webhook subscriptions](https://docs.trychert.com/api/webhook-subscriptions): Create, list, update, and delete webhook endpoints. - [Receiving replies](https://docs.trychert.com/api/receiving-replies): `message.received`, signatures, retries, SSE. - [Events](https://docs.trychert.com/api/events): Polling, streaming, replay, and dev inbox. - [React to a message](https://docs.trychert.com/api/messages/react): Standard tapbacks. - [Errors](https://docs.trychert.com/api/errors): Error code reference. ## FaceTime - [Introduction](https://docs.trychert.com/facetime/introduction): Connect your LiveKit agent to FaceTime. - [Quickstart](https://docs.trychert.com/facetime/quickstart): Receive an inbound call or place an outbound audio call. - [Bring Your Own Room](https://docs.trychert.com/facetime/bring-your-own-room): Room credentials, tracks, and inbound acceptance. - [Outbound](https://docs.trychert.com/facetime/outbound): Project authentication, explicit line selection, audio-only creation, answer-gated greeting, and cleanup. - [Calls API](https://docs.trychert.com/facetime/calls-api): Create, observe, and end calls. ## FaceTime CLI (private preview) - [Overview](https://docs.trychert.com/facetime-cli/overview): npm-installed receiver wrapper, workflow selection, and current limits. - [BYOR quickstart](https://docs.trychert.com/facetime-cli/byor): Connect application-owned sessions through TypeScript callbacks. - [Create-room quickstart](https://docs.trychert.com/facetime-cli/create-room): Initialize the optional qualified LiveKit room and dispatch adapter. - [Connect your project](https://docs.trychert.com/facetime-cli/connect): Private-pilot enrollment, explicit activation, and supervision. - [Commands](https://docs.trychert.com/facetime-cli/commands): Command reference, diagnostics, and recovery. ## Integrations - [Salesforce](https://docs.trychert.com/salesforce/overview): Managed 2GP package for Lead, Contact, and Account records. - [HubSpot](https://docs.trychert.com/hubspot/overview): OAuth app for contact sidebar sends, workflow actions, and contact-created automation. - [Slack](https://docs.trychert.com/slack/overview): Reply triage and channel operations. ## Stable public API caveats - Text message parts use `value`, not `text`. - Follow-up chat sends use `{ "message": { "parts": [...] } }`. - Use `/api/v1/chats/{id}/messages` when `{id}` is a chat id; use `/api/v1/messages/{id}/react` when `{id}` is a message id. - Rich-link preview parts use a single public shape: `{ "type": "rich_link", "url": "https://..." }`. Optional fields are `title`, `summary`, `image_url`, and `icon_url`. - Location sharing is one-time only through `POST /api/v1/locations` on enabled sender lines; it is not Find My or ongoing Live Location sharing. - Native voice notes use `POST /api/v1/voice-notes`, then `POST /api/v1/send` with `voice_note` and the same `phone_line_id`; they are not generic attachments. Callers may submit ordinary uncompressed WAV, which Chert converts server-side to a validated mono Opus-in-CAF voice asset. - Inbound Apple voice memos arrive in `message.received` as attachment parts; fetch `GET /api/v1/attachments/{attachment_id}/content` with API authentication. Event MIME and filename metadata may be generic or absent, and no transcript is currently returned. - Group chats are created with a text-only first message through `POST /api/v1/chats`; send media and rich links afterward through `POST /api/v1/chats/{id}/messages`. - Use `parallel_attachments: true` on `POST /api/v1/chats/{id}/messages` for multiple uploaded image attachments in one grouped iMessage; this is documented under Attachments. - `message.received` is the recommended real-time reply event. `lead_reply` remains available for legacy summary notifications. - Inbound images and files arrive as `media` parts in `message.received` payloads; fetch bytes with `GET /api/v1/attachments/{attachment_id}/content`. - Webhook subscription `events` filters are exact strings. Omit `events` or send `[]` for all events. - Verify webhook deliveries with the per-subscription secret over `"."`; do not use the API signing secret. - Replay stored events with `POST /api/v1/events/{id}/replay`; add `?subscription_id=...` to target one subscription.