Who this is for
You are building on this API if you run a platform — an ecommerce suite, a booking system, a CRM — with many businesses on it, and you want “turn on AI” to be a switch inside your product rather than a referral to ours. If you are a single business automating your own workspace, you want the platform API instead.How the pieces fit
1
You are a partner
One
WhiteLabelPartner record, created by ImpelLabs when you sign. It owns
a workspace, and every business you provision lands inside it. Nothing
outside that workspace is reachable with your key — see tenant
isolation.2
Each of your merchants is a tenant
A business, addressed by your own id for it. You never store ours.
3
Your product is the system of record
Products, orders, stock, customers — those stay yours. The assistant reaches
them as tools over MCP, at call time. No catalogue is
copied into our database, and nothing has to be kept in sync.
4
You are billed, not your merchants
Tenants run pay-as-you-go against a cap you set. We invoice you monthly.
Your merchants never see a price from us. See usage and
billing.
What a merchant has to do
Nothing, for the website channel. Six server-side calls take a merchant from nothing to a working assistant on their storefront, and the only human step is the one you choose to add — a review screen before going live, if you want one.Start here
The six calls, in order, with real payloads.
1
Read the popup's configuration
GET /api/v1/partner/whatsapp/signup-config/ returns the app id, config id
and graph version. Partner-wide, not per tenant: the Meta app is ours, so
the values are the same for every merchant.Check server_ready before opening anything. It is false when the
deployment has no Meta app configured, and learning that here is better
than from a popup that opens and immediately fails.2
Run Embedded Signup in the merchant's browser
Meta’s popup, with the configuration above. It returns a code.
3
Hand us the code
POST /api/v1/partner/tenants/{external_ref}/channels/whatsapp/ exchanges
it, subscribes the app, resolves the phone number, and stores the
long-lived token against the tenant.This is the one call in the sequence that is not safe to blind-retry.
The code is single-use and short-lived, so replaying a spent one fails at
Meta rather than here. If you lose our reply, GET the same path — it
answers {"configured": false} when the channel is not set up, and the
live channel status when it is.channels:write scope.

