Skip to main content
Direct sub-accounts receive messages through one authenticated endpoint. Post a message to it and Assistable resolves (or creates) the native contact and conversation, stores the message, and runs the bound assistant to reply.
This endpoint lives at the platform root (not under /v3) and is authenticated by the sub-account’s webhook secret, not your API key — so an external CRM or your own backend can call it directly.

Authentication

Send the webhookSecret from the create-sub-account response as either header:
A bad or missing secret returns 401. The secret is compared in constant time.

Request body

What happens next

1

Ingest

The contact is resolved (by idphoneemail) or created, the conversation is found-or-created, and the message is stored natively.
2

Enrich

Human-takeover and sleep gates are checked, and the conversation is bound to the sub-account’s active assistant.
3

Reply

The assistant runs and the reply is written back as a native message (and emitted on the message.sent webhook). No GoHighLevel is involved.
Re-posting the same externalMessageId for a sub-account within a short window is de-duplicated, so safe retries won’t create duplicate messages.