Migrating Bubble APIs: Keep External Integrations Working
Moving a Bubble app to code can leave its screens working while a customer’s integration quietly breaks. A reporting script expects one response shape. A mobile app stores Bubble record IDs. A partner sends a callback to a URL nobody included in the rebuild scope.
To migrate Bubble APIs safely, preserve the contract those systems depend on, or coordinate an explicit change with each consumer. Rebuilding the database and business logic does not automatically preserve that contract.
This guide focuses on systems calling your Bubble Data API or exposed Workflow API. Outbound calls made through plugins or the API Connector belong in a separate plugin and integration inventory. Both directions matter, but they need different tests.
Start with the callers, not the endpoint count
An endpoint inventory tells you what exists. A consumer inventory tells you what will break. For each system calling Bubble, identify an owner, the business process it supports and the exact requests it makes.
Look beyond integrations visible in the Bubble editor. Check maintained client code, automation tools, provider webhook settings, support documentation and authorized request logs. Include old mobile releases, reporting scripts and customer-built integrations. A quiet endpoint may serve a monthly process rather than an abandoned feature.
Record these fields for every consumer–endpoint pair:
- Consumer and owner: who can change the calling system, and who can validate it?
- Address: full hostname, environment, path, HTTP method and callback destination.
- Inputs and identity: headers, query parameters, body format and the kind of credential used, without copying secrets into the inventory.
- Outputs: status codes, response fields, stored record IDs and pagination behavior the caller actually uses.
- Business effect: what changes, what must never happen twice and what the caller treats as success.
- Migration decision: preserve compatibility, update the consumer, temporarily retain the Bubble endpoint or retire it with the owner’s agreement.
An unknown caller is an unresolved dependency. Do not turn “we have not seen traffic this week” into permission to remove its endpoint.
Decide which URLs you can actually keep
You can recreate a route on infrastructure you control, but you cannot move a Bubble-owned hostname to your own server. Check the hostname before promising that existing clients will need no changes.
Bubble’s Data API endpoint reference describes routes under /api/1.1/obj/. The main development environment includes /version-test; live routes omit that segment. Data type names are normalized for the URL. Capture the actual configured address rather than deriving it from a display label.
For a custom domain you control, a routing or compatibility layer may preserve the existing address. That layer accepts the old request format and translates it into the new application’s internal operations. It still needs its own authentication, monitoring and tests.
For callers using a bubbleapps.io address, plan a consumer configuration change or an explicitly supported temporary bridge while Bubble remains active. A bridge creates an ongoing dependency; give it an owner and a retirement condition. Do not assume that changing the website’s DNS changes every API caller.
Also separate live and development traffic. A successful request against a test database does not prove that the production consumer has the right URL, credentials or records.
Freeze the contract before improving the API
The contract is everything a caller can observe: accepted requests, returned values, errors, permissions and business effects. You can improve the new backend internally without changing that public behavior at the same time.
Save sanitized request-and-response examples as test fixtures. Capture successful requests, empty results and failures. Keep credentials and personal data out of fixtures; use synthetic records that preserve the relevant structure and edge cases.
For the Data API, compare the response wrapper, field spelling, ID fields, status and whether a body is present. Bubble’s technical request reference distinguishes PATCH, which changes selected fields, from PUT, which can clear omitted fields. Replacing both with one generic “update” handler can change customer data without producing an HTTP error.
Test omitted fields, nulls, empty strings and empty lists separately. Check dates, numbers and booleans in the forms existing callers send. Preserve supported behavior deliberately rather than relying on the new framework’s defaults.
Exposed workflows need another pass. Their routes use /api/1.1/wf/workflow_name. The Workflow API reference describes configurable methods, typed parameters, authentication settings and response behavior. A workflow can return structured JSON, text or another content type. Its initialization URL is for detecting sample data, not the ordinary production callback address.
Do not treat documentation alone as proof of your app’s behavior. Compare the current endpoint, its configuration and the consumer’s assertions. Where they disagree, resolve the difference before declaring compatibility.
Keep old IDs useful and test the whole list
A consumer may keep a Bubble ID long after the database moves. The replacement must still resolve that external identifier to the intended record, or the consumer must receive and adopt a documented replacement.
One approach is to retain the legacy ID as an opaque string and map it to the new internal key. Avoid forcing consumers to understand the new database’s primary-key format. Test that an ID saved before migration still works, and that an ID returned by a new create request can be used in the next request.
This is one part of the broader Bubble data migration checklist. Here, the acceptance question is narrower: can an existing caller still address the same business object?
List responses deserve equally careful treatment. Bubble’s Data API guide shows a results envelope with cursor, count and remaining information. A consumer can depend on those fields even if its developer never wrote a formal API specification.
Use a fixed test dataset with no matches, one match, a full page and a partial final page. Walk every page using the real client’s pagination logic, then compare the complete set of IDs, total row count and the number of times each ID appears. Check ordering where the contract requires it. A first-page check will not catch dropped records or repeated pages.
Include the filters and sort combinations clients actually use, ties in sorted values and consumers that omit optional settings. Define expected behavior for changing datasets separately. A static-fixture pass does not establish snapshot consistency while records are being added or deleted.
Preserve access decisions, not insecure shortcuts
Matching a JSON response with an administrator credential proves very little about customer access. Test the replacement using the same categories of caller that exist today, including callers who should be denied.
Bubble’s Data API authentication documentation distinguishes administrative API tokens from user-scoped authentication. Administrative tokens bypass privacy rules. A test suite using only that access can miss missing tenant boundaries or newly exposed fields.
For each endpoint, test an authorized user, another user or tenant, an invalid credential and anonymous access where relevant. Verify both visible records and visible fields. For a denied mutation, confirm that no record or external business action changed.
Workflow endpoints require separate authorization checks. Bubble explains that Data API create, modify and delete permissions do not govern API workflows. Workflow conditions, record visibility and any privacy override must be examined independently.
Preserving an Authorization header format does not make an old Bubble token valid in a different authentication system. Plan credential replacement or a deliberately designed transition. Never “fix” migration failures by giving every integration an administrator key or removing a permission check.
If the old behavior is insecure, treat tightening it as a necessary, explicit change with affected consumers and tests. Compatibility is not a reason to reproduce an access-control flaw.
Treat webhooks as delivery contracts
A webhook migration must preserve verification, acknowledgement and the resulting business action. Accepting the same JSON at a new URL is only one part of that work. Record the subscribed event types, payload or API version and signing configuration for each destination; verify the correct signing secret for the new endpoint and environment.
Check each provider’s own delivery rules. For example, Stripe’s webhook documentation says redirects are failed deliveries, signature verification needs the original request body, events may be duplicated and event order is not guaranteed. These are Stripe-specific rules, not a universal webhook specification.
Point the provider at the final receiver or use an appropriately designed server-side forwarding arrangement. A website-style redirect is not a substitute. If forwarding is used, prove that the bytes and headers required for verification reach the verifier intact.
In a provider sandbox, test a valid event, an invalid signature, a repeated delivery and related events arriving out of order. Check acknowledgement behavior as well as the database result. A success response sent before an event has been safely accepted can hide lost work; a slow response can cause retries.
Keep write ownership and recovery in the wider migration cutover plan. The API acceptance suite should prove that a retry does not turn one business request into two business effects.
Use one compatibility record to make acceptance concrete
The following example is fictional. It illustrates a test record, not a customer migration or a measured result.
Consumer: a nightly reporting script owned by the operations team.
Current dependency: it lists orders through Bubble’s Data API, reads the existing response envelope and stores each order’s legacy ID.
Proposed change: route the consumer to a replacement endpoint while preserving its request format, response fields and external IDs.
Required evidence: the unchanged parser handles empty results and every page of a fixed dataset; the final ID set and row count match the expected orders, with each ID appearing once; a stored ID resolves correctly; another tenant’s credential cannot retrieve those orders.
Deliberate difference: an insecure query previously exposed a private field. The replacement omits it, and the consumer owner updates the report before migration.
Acceptance owner: the person responsible for the report confirms the output, with the technical lead reviewing the negative-access tests.
Repeat this record for the integrations that matter. It makes “API migration complete” mean something more useful than “the endpoints return 200.”
Prove compatibility before moving each consumer
Start with controlled read comparisons and isolated write tests. Run the consumer’s normal sequence, not just individual requests: create, receive an ID, retrieve, update and handle a failure.
Replay writes only in an isolated environment. Disable real outbound email, payments and other side effects, or replace them with test doubles. Sending recorded production requests to two live systems can create duplicate actions while appearing to be a sensible comparison test.
Before moving a consumer, require:
- An owner and a resolved decision for every endpoint it uses
- Passing request, response, ID and pagination tests
- Passing allowed and denied access checks
- Provider-specific webhook checks where applicable
- Monitoring for failures, unexpected responses and business-level mismatches
- A documented recovery action that accounts for any writes already accepted
Move one suitable consumer or bounded group first when the architecture allows it. Agree what evidence and observation period are needed, including infrequent jobs. Retire the old path only after its known consumers have moved or been deliberately retired.
Bubble to Code’s API integration service covers integration inventories, authentication, webhooks and error handling. If external systems depend on your Bubble app, bring a sanitized endpoint list and one representative request to a migration review. Use that conversation to decide what stays compatible, what must change and what evidence will make the transition acceptable.
Frequently asked questions
- Can I keep my existing Bubble API URLs after migrating?
- Possibly for a custom domain you control, with suitable routing and a compatible implementation. You cannot redirect a Bubble-owned hostname to your own infrastructure through your DNS settings. Inventory the addresses consumers actually use before choosing a transition method.
- Do I need to reproduce every Bubble API feature?
- No. Define the supported contract from actual consumers, configuration and agreed requirements. Preserve what those consumers need, coordinate intentional changes and explicitly retire unused behavior. Unknown consumers and untested edge cases remain risks, not proof that a feature is unnecessary.
- Will existing Bubble API tokens work after migration?
- Not automatically. Keeping the same Authorization header format does not transfer token validity to a new backend. Plan and test a credential transition for each machine or user-scoped API consumer, including invalid and revoked credentials. Do not replace restricted access with a shared administrator key.
Sources
- 01Bubble’s Data API endpoint reference · Bubble Docs
- 02Bubble’s technical request reference · Bubble Docs
- 03Workflow API reference · Bubble Docs
- 04Data API guide · Bubble Docs
- 05Bubble’s Data API authentication documentation · Bubble Docs
- 06Data API create, modify and delete permissions do not govern API workflows · Bubble Docs
- 07Stripe’s webhook documentation · Stripe Docs
Keep reading
Bubble to Code is an independent service. Not affiliated with, endorsed by, or sponsored by Bubble Group, Inc.
