Pull live data from your Bubble app's database into a WhatsApp chatbot. Fetch leads, bookings, service requests, or any custom data type you have built in Bubble, and reply to customers in real time using your own app's records.
Before following this guide, read the External API Request step foundation guide. It covers every field in the step interface so this guide can focus on Bubble-specific values.
If you have built an app on Bubble, your entire database is reachable via the Bubble Data API. Common WhatsApp use cases:
| Use case | Bubble data type | WhatsApp flow |
|---|---|---|
| Lead status lookup | Lead | Customer texts their name or ID; bot fetches their lead record and replies with current status and next step. |
| Booking confirmation | Booking | Bot fetches a booking by ID and confirms date, time, service, and assigned agent. |
| Service request update | Service Request | Customer asks 'where is my request?'; bot fetches the record and replies with current stage. |
| Membership check | User (or Member) | Bot looks up the customer's account and confirms plan, expiry, and remaining credits. |
| Custom app data | Any type you built | Whatever data your Bubble app stores, you can now surface it in WhatsApp without any extra backend code. |
The Bubble Data API is built into every Bubble app but must be explicitly enabled. This takes about two minutes.
Bubble lets you select which data types the API can access. Only enable the types needed for your WhatsApp integration. Avoid exposing User records containing passwords or sensitive personal data unless your Privacy Rules in Bubble restrict what the API token can read.
Bubble Data API: manual.bubble.io/core-resources/api/the-bubble-api/the-data-api
You need two things for the endpoint URL: your Bubble app subdomain and the data type name formatted as a slug.
| What you need | Where to find it | Example |
|---|---|---|
| App subdomain | Your Bubble app URL before .bubbleapps.io | yourapp (from yourapp.bubbleapps.io) |
| Custom domain | If you published on a custom domain, use that instead | yourbusiness.com |
| Data type slug | Your type name in lowercase, spaces removed | 'Booking Request' becomes 'bookingrequest' |
| Record ID | The Bubble unique ID for a specific record (shown in URL when you click a record in the Data tab) | 1672396136196x664154886510492300 |
Verify your data type slugs: go to Bubble Settings > API. The slug appears in the example URL shown for each data type.
In your WA.Expert chatbot flow, collect the record ID from the customer and store it as {{record_id}}. Then add an External API Request step:
| Field | Value | Notes |
|---|---|---|
| Select Method | GET | Reading an existing record. |
| Request URL | https://yourapp.bubbleapps.io/api/1.1/obj/booking/{{{record_id}}} | Replace yourapp with your Bubble subdomain. Replace 'booking' with your data type slug. {{{record_id}}} is the variable from the previous chatbot step. |
| Select Auth Type | No Auth | The Bearer token goes in the Authorization header below. |
| Authorization | Bearer YOUR_BUBBLE_API_TOKEN | Include the word 'Bearer' followed by a space, then the token from Step 1. |
| Content-Type | application/json | Standard header for Bubble API requests. |
| Select Body Type | None | GET requests carry no body. |
| Choose Response Type | JSON | Bubble returns structured JSON. |
During development use the version-test URL: https://yourapp.bubbleapps.io/version-test/api/1.1/obj/... This hits your development database. For your live production bot, use the URL without version-test: https://yourapp.bubbleapps.io/api/1.1/obj/...
A Bubble Data API response for a single record looks like this (fields vary depending on what you built in Bubble):
{
"status": "ok",
"response": {
"_id": "1672396136196x664154886510492300",
"Created Date": "2026-06-20T10:30:00.000Z",
"Modified Date": "2026-06-22T09:00:00.000Z",
"name": "Priya Sharma",
"service": "Deep Cleaning",
"booking_date": "2026-06-25T09:00:00.000Z",
"status": "Confirmed",
"assigned_agent": "Ravi Kumar",
"phone": "9820000001"
}
}Bubble wraps every record in a 'response' object. Map your variables using response.fieldname notation: response.name, response.status, response.booking_date. The field names match exactly what you named them in your Bubble data types.
Map these response paths to variables in the External API Request step:
| Variable name | Response path | Example value |
|---|---|---|
| record_id | response._id | 1672396136196x... |
| customer_name | response.name | Priya Sharma |
| service_type | response.service | Deep Cleaning |
| booking_status | response.status | Confirmed |
| booking_date | response.booking_date | 2026-06-25T09:00:00.000Z |
| assigned_agent | response.assigned_agent | Ravi Kumar |
Field names in the response exactly match the names you gave your fields in Bubble's Data tab. If you named a field 'Booking Status', map it as response.booking_status (Bubble lowercases and replaces spaces with underscores in API responses).
If the customer messaged you first within the last 24 hours, your reply is a free service conversation. Use that window to respond. For proactive updates from your Bubble app triggering outbound WhatsApp messages, use an approved Utility template at Rs. 0.115 per message.
If your customer does not know their record ID, you can search by any field value using the list endpoint with constraints:
GET https://yourapp.bubbleapps.io/api/1.1/obj/booking
?constraints=[{"key":"phone","constraint_type":"equals","value":"9820000001"}]
Authorization: Bearer YOUR_BUBBLE_API_TOKEN
Response:
{
"status": "ok",
"response": {
"count": 1,
"results": [
{
"_id": "1672396136196x664154886510492300",
"name": "Priya Sharma",
"status": "Confirmed",
...
}
]
}
}
Map: response.results[0].status, response.results[0].name, etc.Customer sends: "Check my booking"
Bot: "Please send your booking ID. You can find it in your confirmation email."
Customer replies: 1672396136196x664154886510492300
Bot stores as {{record_id}}
External API Request step:
GET https://yourapp.bubbleapps.io/api/1.1/obj/booking/1672396136196x664154886510492300
Authorization: Bearer YOUR_BUBBLE_API_TOKEN
Response mapped:
customer_name = "Priya Sharma"
service_type = "Deep Cleaning"
booking_status = "Confirmed"
booking_date = "2026-06-25T09:00:00.000Z"
assigned_agent = "Ravi Kumar"
Bot replies:
"Hi Priya, here is your booking summary:
Service: Deep Cleaning
Date: 25 June 2026 at 9:00 AM
Status: Confirmed
Agent: Ravi Kumar
Reply RESCHEDULE to change your booking date."| Symptom | Likely cause | Fix |
|---|---|---|
| 401 Unauthorized | Invalid token or Bearer prefix missing | Check the Authorization header reads 'Bearer YOUR_TOKEN'. Regenerate the token in Bubble Settings > API if needed. |
| 404 Not Found | Data API not enabled or data type not exposed | Go to Bubble Settings > API, check 'Enable Data API', and tick the specific data type you are trying to access. |
| Empty response / null fields | Field name mismatch | Bubble lowercases field names and replaces spaces with underscores in the API response. A field named 'Booking Status' becomes 'booking_status'. Check the exact keys in the raw API response. |
| Wrong data returned | Using version-test URL in production | Bubble has separate databases for development and live. Use the URL without 'version-test' for your production bot. |
| Privacy rule blocking access | Bubble Privacy Rules restrict API access | In Bubble Data > Privacy, check the Privacy Rules for the data type. Rules apply to API token requests as well. Add a rule that allows API tokens to read the relevant fields. |
| Record ID format unfamiliar | Bubble IDs are long numeric strings | Bubble record IDs look like 1672396136196x664154886510492300. Include this format in your chatbot's prompt to the customer so they know what to look for. |
WordPress REST API with Application Passwords: read posts, pages, and custom post types.
Read guide →Shopify Admin API order lookup: single X-Shopify-Access-Token header.
Read guide →Master every field in WA.Expert's HTTP action step before building any integration.
Read foundation guide →Free trial, no credit card required. And if you ever get stuck, we are the only platform in India that answers you live on WhatsApp.