Reference · Tools

Bubble

Perform CRUD operations on objects in a Bubble.io application via the Bubble Data API

Action Development v1

The Bubble node lets you read and write records in any Bubble.io application database directly from a BusyBot workflow. You can create new objects, fetch lists with filters and sorting, update existing records, or delete them — for example, syncing Bubble user records to an external CRM whenever they change. It uses the Bubble Data API and your Bubble API credentials.

Node type
Action
Parameters
15
Outputs
Output, Error
Credentials
Bubble API

Bubble

Perform CRUD operations on Bubble.io objects

Overview

Bubble is a no-code development platform that lets users build web applications without writing code. This tool interacts with the Bubble Data API to create, read, update, and delete objects (database records) in a Bubble application. It supports filtering, sorting, and pagination when retrieving multiple objects. Objects are dynamic in schema, defined by the user in the Bubble editor.

Category: Development
Tool Name: bubble
Version: 1

Appearance: Icon: lucide-Globe | Color: #0D72FF

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Bubble API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Objectobject

Operations

OperationValueDescription
CreatecreateCreate a new object
DeletedeleteDelete an existing object
GetgetRetrieve a single object by ID
Get ManygetAllRetrieve multiple objects with optional filtering
UpdateupdateUpdate an existing object

Parameters

Object: Create

ParameterTypeRequiredDefaultDescription
Type NamestringYesName of the Bubble data type. Whitespace is stripped and converted to lowercase automatically (e.g. “My Type” becomes “mytype”). Supports expressions.
PropertiesfixedCollectionNo{}Key-value pairs of fields to set on the new object.
— KeystringNoField name to set on the object. Supports expressions.
— ValuestringNoValue to set for the field. Supports expressions like {{ $json.name }}.

Object: Get

ParameterTypeRequiredDefaultDescription
Type NamestringYesName of the Bubble data type (whitespace stripped, lowercased). Supports expressions.
Object IDstringYesUnique ID of the object to retrieve or delete. Supports expressions like {{ $json.id }}.

Object: Delete

ParameterTypeRequiredDefaultDescription
Type NamestringYesName of the Bubble data type (whitespace stripped, lowercased). Supports expressions.
Object IDstringYesUnique ID of the object to retrieve or delete. Supports expressions like {{ $json.id }}.

Object: Update

ParameterTypeRequiredDefaultDescription
Type NamestringYesName of the Bubble data type (whitespace stripped, lowercased). Supports expressions.
Object IDstringYesUnique ID of the object to update. Supports expressions like {{ $json.id }}.
PropertiesfixedCollectionNo{}Key-value pairs of fields to update on the object.
— KeystringNoField name to update. Supports expressions.
— ValuestringNoNew value for the field. Supports expressions like {{ $json.email }}.

Object: Get Many

ParameterTypeRequiredDefaultDescription
Type NamestringYesName of the Bubble data type (whitespace stripped, lowercased). Supports expressions.
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo100Max number of results to return. (shown when Return All is false)
JSON ParametersbooleanNofalseWhether to specify filter constraints as raw JSON instead of using the UI builder.
OptionscollectionNo{}Additional options for filtering and sorting results.
— FiltersfixedCollectionNo{}Filter constraints for the query. (shown when JSON Parameters is false)
— — KeystringNoField name to filter on.
— — ConstraintoptionsNoequalsThe comparison to apply to the field.
Options: equals (strict equality, all field types), not equal (strict inequality, all field types), is_empty (field is empty, all field types), is_not_empty (field is not empty, all field types), text contains (text field contains a string), not text contains (text field does not contain a string), greater than (text, number and date fields), less than (text, number and date fields), in (field is in a list, all field types), not in (field is not in a list, all field types), contains (list field contains an entry), not contains (list field does not contain an entry), empty (list field is empty), not empty (list field is not empty), geographic_search (thing is within a radius of a central address — the value must carry an address and range)
— — ValuestringNoValue to compare against. Not required for is_empty, is_not_empty, empty, not empty constraints. (hidden when Constraint is is_empty, is_not_empty, empty, not empty)
— Filters (JSON)jsonNoFilter constraints as a JSON array. See Bubble Data API documentation for constraint format. (shown when JSON Parameters is true)
— SortfixedCollectionNo{}How to order the returned objects.
— — Sort FieldstringNoField to sort by. Use “_random_sorting” for random order.
— — DescendingbooleanNofalseWhether to sort in descending order.
— — Geo ReferencestringNoWhen sorting by a geographic address field, provide the reference address as a string.

All Operations

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo10Maximum number of items to process concurrently.

Output Data

The Bubble response is merged onto the input item’s JSON — incoming fields pass through and stay addressable downstream, and binary data is forwarded unchanged. Object fields returned by Bubble sit at the top level of the item, not under a wrapper property.

OperationOutput
createOne item. The Data API’s response for the create call is merged onto the item.
getOne item. The object’s own fields are merged onto the item.
getAllFans out — one output item per object returned, each with that object’s fields merged onto the input item’s JSON. When nothing matches, a single item is emitted carrying just the unchanged input JSON.
updateOne item, with success: true merged onto it. Bubble returns no body for an update.
deleteOne item, with success: true merged onto it. Bubble returns no body for a delete.

getAll is the only operation that changes the item count, so a node downstream of it sees one item per record rather than one per input item.

Reference the returned fields downstream by expression, e.g. {{ $json._id }} or {{ $json.success }}.

Usage Examples

  • Create a new user object in Bubble
  • Retrieve all products from a Bubble app
  • Update a customer record in Bubble
  • Delete an order object by ID

Example Configuration

Create a new object and set two of its fields:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "create",
    "typeName": "user",
    "properties": {
      "property": [
        { "key": "name", "value": "{{ $json.name }}" },
        { "key": "email", "value": "{{ $json.email }}" }
      ]
    }
  }
}

Fetch a single object by its ID:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "get",
    "typeName": "user",
    "objectId": "{{ $json.userId }}"
  }
}

Update one field on an existing object:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "update",
    "typeName": "user",
    "objectId": "{{ $json.userId }}",
    "properties": {
      "property": [
        { "key": "email", "value": "{{ $json.newEmail }}" }
      ]
    }
  }
}

Delete an object:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "delete",
    "typeName": "user",
    "objectId": "{{ $json.userId }}"
  }
}

List objects with a filter and a sort, capped at 50 results:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "getAll",
    "typeName": "user",
    "returnAll": false,
    "limit": 50,
    "jsonParameters": false,
    "options": {
      "filters": {
        "filter": [
          { "key": "status", "constraint_type": "equals", "value": "active" }
        ]
      },
      "sort": {
        "sortValue": { "sort_field": "created_date", "descending": true }
      }
    }
  }
}

Page through every object of a type:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "getAll",
    "typeName": "product",
    "returnAll": true,
    "jsonParameters": false
  }
}

Combine two constraints and sort ascending:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "getAll",
    "typeName": "product",
    "returnAll": false,
    "limit": 25,
    "jsonParameters": false,
    "options": {
      "filters": {
        "filter": [
          { "key": "category", "constraint_type": "equals", "value": "electronics" },
          { "key": "price", "constraint_type": "greater than", "value": "100" }
        ]
      },
      "sort": {
        "sortValue": { "sort_field": "price", "descending": false }
      }
    }
  }
}

Write filter constraints as raw JSON instead of building them field by field:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "getAll",
    "typeName": "cafe",
    "returnAll": true,
    "jsonParameters": true,
    "options": {
      "filtersJson": "[ { \"key\": \"name\", \"constraint_type\": \"text contains\", \"value\": \"cafe\" } ]"
    }
  }
}

Sync inventory levels from upstream items:

{
  "type": "bubble",
  "parameters": {
    "resource": "object",
    "operation": "update",
    "typeName": "inventory",
    "objectId": "{{ $json.inventoryId }}",
    "properties": {
      "property": [
        { "key": "quantity", "value": "{{ $json.quantity }}" },
        { "key": "last_updated", "value": "{{ $datetime.iso }}" }
      ]
    }
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

Perform CRUD operations on objects in a Bubble.io no-code application database.

Behavior notes

  • Type names are normalised for you. Whitespace is removed and the name is lowercased before the request is sent, so My Type, mytype and My Type all address the same data type.
  • Return All pages through everything. With Return All on, the node keeps requesting pages until Bubble reports no remaining records; the Limit field is ignored in that mode.
  • Filters come from one source at a time. With JSON Parameters off the UI filter rows are used and the JSON field is ignored; with it on only Filters (JSON) is read. Invalid JSON fails the item.
  • Filters (JSON) takes Bubble’s raw constraint array. Every entry needs a key, a constraint_type and a value — for example key of name, constraint_type of text contains, and value of cafe to find cafes by name.
  • Sort takes a single entry, unlike Filters, which accepts many.
  • Constraints that test emptiness need no valueis_empty, is_not_empty, empty and not empty hide the Value field because Bubble does not use it.

Frequently asked questions

What credentials do I need to connect to my Bubble app?

You need a Bubble API credential (credential type: bubbleApi) configured in BusyBot. This means you'll need an API key generated from your Bubble app's Settings → API section. Each credential is scoped to one Bubble application, so if you work with multiple Bubble apps you'll set up a separate credential for each.

How do I fetch every record in a Bubble data type without worrying about pagination?

Enable the Return All option. When it's on, the node automatically requests successive pages from Bubble until there are no remaining records, then returns everything as one collection. The Limit field has no effect in this mode — it's only used when Return All is off and you want a fixed page size.

How do I filter results — do I use the UI rows or write JSON?

The two filter modes are mutually exclusive and controlled by the JSON Parameters toggle. When it's off, you build filters using the UI rows and the Filters (JSON) field is ignored entirely. When it's on, only the Filters (JSON) field is read. Each entry in the JSON array must include a key, a constraint_type, and a value — for example, key: 'name', constraint_type: 'text contains', value: 'cafe'. Passing invalid JSON with JSON Parameters on will fail that item.

Do I need to provide a value when filtering for empty or non-empty fields?

No. Constraint types like is_empty, is_not_empty, empty, and not empty don't require a value, and the Value field is hidden for those options. Bubble's API doesn't use the value for emptiness checks, so you just set the key and the constraint type and leave it at that.

Does the type name I enter have to exactly match what's in my Bubble editor?

Not exactly — the node normalises type names before sending the request by stripping whitespace and lowercasing the string. So 'My Type', 'mytype', and 'My Type' all resolve to the same Bubble data type. That said, the name still needs to refer to a real type in your app; a completely wrong name will return an error from Bubble's API.

Build with the Bubble node

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Bubble API credentials first.

Open BusyBot

Last updated . Spotted something wrong? Tell us.