Point your existing WhatsApp Cloud API code at WA.cr
Already have code that talks to Meta's WhatsApp Cloud API? Send through WA.cr by changing one thing — the web address — and using a WA.cr API key. We handle your real WhatsApp connection, billing and delivery.
If you already have code built against Meta's WhatsApp Cloud API, you don't have to rewrite it to use WA.cr. Change the web address you send to, swap the Meta token for a WA.cr API key, and your existing calls keep working — now billed, delivered and recorded through your WA.cr account.
The one change
Everywhere your code calls https://graph.facebook.com, use https://api.wa.cr/wa instead — keep the version and the rest of the path exactly as they are:
- https://graph.facebook.com/v25.0/<PHONE_NUMBER_ID>/messages
+ https://api.wa.cr/wa/v25.0/<PHONE_NUMBER_ID>/messages
Then send your WA.cr API key as the bearer token instead of a Meta token:
Authorization: Bearer wacr_live_your_key_here
You never hold or manage a Meta token. WA.cr recognises your key, confirms the number or account in the URL belongs to you, and talks to WhatsApp on your behalf using your real connection.
You can create an API key in the console under Developers. Use a wacr_test_… key while you build and a wacr_live_… key in production.
Send a message
Exactly the body you'd send to Meta:
curl -sS https://api.wa.cr/wa/v25.0/<PHONE_NUMBER_ID>/messages \
-H "Authorization: Bearer wacr_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "919876543210",
"type": "text",
"text": { "body": "Hello from my own code" }
}'
The reply is the same { messaging_product, contacts, messages } shape Meta returns, so your existing code reads it without changes. Errors come back in Meta's { "error": { … } } shape too.
What's different from calling Meta directly
- Every send is billed and saved to your inbox. Messages you send this way appear in your WA.cr conversations, count toward your wallet and plan, and follow the same sending rules (opt-outs, trial limits) as messages sent from the app. A raw Meta client wouldn't see any of that — here it's applied for you.
- Templates stay in sync. Creating, editing or deleting a message template through the proxy updates your WA.cr template list at the same time.
- Some endpoints are blocked on purpose. Anything that would re-wire your underlying WhatsApp connection (registering numbers, webhook subscriptions, sign-up) is refused, so the proxy can only ever do day-to-day messaging work.
What you can call
| What | Path (after https://api.wa.cr/wa/v25.0/) |
|---|---|
| Send a message | <PHONE_NUMBER_ID>/messages |
| Send a marketing message | <PHONE_NUMBER_ID>/marketing_messages |
| Create, list or delete templates | <WABA_ID>/message_templates |
| Edit a template | <TEMPLATE_ID> |
| Upload or fetch media | <PHONE_NUMBER_ID>/media, <MEDIA_ID> |
| Read or update the business profile | <PHONE_NUMBER_ID>/whatsapp_business_profile |
| Block or unblock users | <PHONE_NUMBER_ID>/block_users |
| Manage Flows | <WABA_ID>/flows and the related Flow paths |
Anything not in this list is declined.
Full technical reference
The complete, always-current reference — every endpoint, how ownership is checked, and the exact error shapes — lives at api.wa.cr/wa/docs.
For a WhatsApp-independent way to send across every channel from one endpoint, see the native WA.cr API reference at api.wa.cr/docs.