RaabtaHQ for developers: REST API, webhooks and MCP
Connect your website, forms and back-office tools to RaabtaHQ. A versioned REST API with scoped keys, signed webhooks when something happens, custom tools the AI assistant can call, and an MCP server so a team member can connect Claude with exactly their own permissions.
- OpenAPI 3.1
- Keys shown once and stored hashed
- HMAC-SHA256 signed webhooks
The secret is shown once, beside this first call.
How it fits together
A deal is won at 15:42, and your server knows a moment later
Events from across the account.
Messages, conversations, contacts, deals, broadcasts and bookings.
Every delivery is signed.
HMAC-SHA256 over a timestamp and the raw body.
Verify with the secret shown once.
It appears when you create the endpoint and again when you rotate it.
Retries, redelivery and an automatic switch-off.
Failed deliveries retry with backoff; a dead endpoint is switched off with the reason shown.
API keys with scopes, expiry and an IP allowlist.
Your website can book and submit enquiries through the API.
MCP connections that act as the member who made them.
Claude reads what Sara can read, and no more.
REST API
A versioned API with keys that do one job
The API lives under /api/v1, with an OpenAPI 3.1 document and public docs at /docs. The docs, the OpenAPI file and the API itself come from one definition, and tests fail if they disagree. Each resource page has curl, Node and Python samples.
Keys and scopes.
Admins and owners create keys in Settings with a name, a description and an explicit set of scopes, chosen from grouped checkboxes. A key's power comes from its scopes only, never from the role of whoever made it. A write scope includes the reads it needs, and GET /me reports the granted and effective scopes. Send it as Authorization: Bearer; a key acts on exactly one account.
Expiry, IP allowlist, regenerate, revoke.
Keys expire after 30, 90, 180 or 365 days or never (90 by default), and admins get a notice a week before. Add IPv4 or IPv6 ranges to an allowlist. Regenerate in place (the old secret stops working on the next request) or revoke with a reason; revoked keys stay listed. Unknown, revoked and expired keys look the same to a caller.
Rate limits.
Per key, per minute, 60 requests by default. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and X-Request-Id; a 429 adds Retry-After. You can give a key a lower limit; a higher one is set by our team.
Idempotency.
Send Idempotency-Key on any creating POST. The first response is stored for 24 hours and replayed exactly, marked Idempotent-Replayed: true. The same key with a different body is rejected, and a request still in progress answers 409.
Pagination and errors.
Cursor pagination on every list, limit from 1 to 100. One response envelope, with stable error codes such as validation_error (with per-field details), rate_limited, plan_limit_reached and channel_not_connected.
Usage you can see.
Each key shows requests and errors over 24 hours, 7 and 30 days, average latency, top endpoints, and every refused attempt.
What you can do
- Contacts.
- List, search, create (a duplicate phone returns 409 with the existing id), update, tags, custom fields, notes.
- Website enquiries.
- Submit a form enquiry from your own backend, with up to thirty extra fields; list, triage, notes.
- Saved lists.
- List, create, rename, delete, and add up to 100 contacts at a time.
- Bookings.
- Read booking types and free slots, book, reschedule, reassign, confirm, complete, mark no-show, cancel. Only offered slots can be booked; a lost race returns 409 slot_taken.
- Reviews.
- Send a review request; read requests, reviews, forms and platform links.
- Business hours.
- Read and set the timezone and weekly hours, and ask whether you are open now.
- Conversations and messages.
- List and read, assign, change status, mark read, hand over to a person or back to the assistant. Send text, a template or media into a thread or to a phone number, and read delivery status.
- Templates and broadcasts.
- Read WhatsApp templates synced from Meta. Create a template campaign for numbers, contacts, tags, a saved list or everyone, with per-recipient variables, optionally scheduled; follow its counters; cancel it while scheduled.
- Pipelines and deals.
- List pipelines; create, update, move, close won or lost, reopen and delete deals. Ad-tracking reports fire just as they do in the app.
Webhooks
Signed webhooks when something happens in the account
Add up to ten HTTPS endpoints per account and pick the events each one receives. Every delivery carries an HMAC-SHA256 signature over a timestamp and the raw body, plus event, delivery and attempt headers. The signing secret is shown once when you create the endpoint and again when you rotate it.
Event families.
Messages received, sent and status updates. Conversations created, status changes, assignment and handoff. Contacts created, updated and tag changes. Deals created, stage changes, won and lost. Broadcasts completed. Bookings created, cancelled and completed.
Retries, then a switch-off.
Failed deliveries retry with exponential backoff over six attempts. An endpoint that fails ten deliveries in a row is switched off, with the reason shown. Turn it back on and waiting deliveries resume in order.
A drawer for every delivery.
Status, attempts, response code and payload, with one-click redelivery. Send test posts a ping event.
Safe addresses only.
Endpoints pointing at private or internal ranges are refused, and redirects are never followed. Internal notes on website enquiries are never sent to a webhook.
The other direction.
Another system, such as Zapier or a form backend, can start an AI trigger through that trigger's own web address. The address is shown once, starts only that one trigger, and can be replaced to stop the old one at once.
Failed twice, delivered on the third try.
Bring your developer
Show us the system you want to connect. We'll walk through the API calls and webhooks it needs.
We reply in under an hour.
Custom tools
Let the assistant call your own systems
Describe an HTTPS endpoint once: the method, a URL with placeholders, how it signs in, and what inputs it takes. Then switch it on for the assistants that should use it. It can check stock, look up an order, or read anything else your systems already know.
Your secrets stay secret.
Connection secrets are stored encrypted.
HTTPS only.
Private network addresses are blocked and redirects are not followed.
Approval if you want it.
Mark a custom tool as needing approval, and the assistant asks before each call.
Off without deleting.
Turn a tool off for one assistant, or for all of them, and keep its setup.
Claude and MCP
Connect Claude to your account, as yourself
A team member creates a connection in Settings and pastes the link into Claude, Claude Code or any MCP client. The connection acts as that member and can never do more than they can in the app: an owner gets owner reach, a front-desk agent front-desk reach, a doctor only their own patients, a viewer reads only.
Read-only to start.
New connections have read tools on, writing tools off and sensitive data off. Switch each tool on its own. Tools above your role show as disabled, with the reason.
Never available.
Deleting the account, transferring ownership, changing members or roles, and managing credentials (API keys, MCP connections, AI keys, channel setup).
Links that expire.
The link is shown once. Expiry is required: 90 days by default, a year at most. Regenerate stops the old link at once. Members manage their own connections; admins can see and revoke all of them.
A log without contents.
Each call records the connection, the person, the tool and the outcome. Message text, phone numbers, emails and clinical values are never stored.
Clinics.
Three read-only clinical tools exist only over MCP, are off by default, and every clinical read is logged.
Setup help.
Guides for Claude on the web and desktop, Claude Code and MCP Inspector.
Reliability
Built so an interruption never doubles an action
Nothing done twice.
After an interruption, actions already done, such as a booking or a call to your own system, are not repeated. If it can't know whether an action happened, the assistant is told to check before trying again.
One reply per customer.
Two copies of the assistant can never both answer the same customer.
A live chat is never left silent.
If a step ends without a reply, the assistant sends one closing message saying what it did.
A backup model.
Each assistant can have a backup that answers if the main model is down, retired, has no key, or gives no answer within 90 seconds. A backup never takes over part-way through a task.
Silence is never approval.
A question the assistant asks your team has a deadline; if nobody answers, the action doesn't happen.
Big jobs split safely.
An assistant can hand parts of a big job to helpers with fewer tools. Helpers never message customers, and one spend limit covers the whole job.
Runs you can restart.
A stuck or failed run can be resumed or retried by hand, and a retried trigger can't act on the same person twice.
The honest part
Not in the API yet
Deleting contacts.
Contacts can be created, updated, tagged and noted, but not deleted.
Setup screens.
Booking setup (types, availability), review setup and bulk review sends, template management, members, invitations, channels and keys.
Industry edition data.
Clinic, study abroad and business setup records. The booking API is refused (422 bookings_unavailable) on accounts whose edition has its own scheduling, such as clinics.
Some message features.
Reactions, media upload and reply-to.
Filling a saved list from a filter.
That stays in the app.
OAuth for MCP.
Connections use a link with a token instead, and tool changes show after the client reconnects.
Questions
Can our website form send enquiries straight to RaabtaHQ?
Yes, through your own backend. The form posts to your server, Zapier or n8n, which calls the API with a key that has the enquiries scope. There is no anonymous form endpoint, so the key never sits in a web page.
Can our website book appointments through the API?
Yes, on accounts that use the core bookings. Read free slots, then book one; only offered slots can be booked, and the API can't book outside working hours.
Do plan limits apply to the API?
Yes. Limits such as contacts and monthly broadcasts apply the same way through the API, and a request over the limit returns plan_limit_reached.
Can I raise the rate limit?
Ask us. The limit per business is set by our team. A key can be given a lower limit, never a higher one.
Does a message sent through the API count as an answer?
Yes. It counts as answered, and you can hand a conversation to a person or back to the assistant through the API too.
Book a demo
Plan your integration with us
A 30-minute call. We create a test key with the scopes you need, send a webhook to your endpoint, and connect Claude to a demo account.
- A first API call
- A signed webhook arriving
- Claude reading the account as one team member
We reply in under an hour.