<!-- BusyBot node reference — https://busybot.net/tools/bubble/ -->

> Node: Bubble (`bubble`) · Action · v1
> Category: Development · Credentials: Bubble API (`bubbleApi`)
> Updated: 2026-08-16

# 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

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **Bubble API** credentials.
See the [Credentials Guide](https://busybot.net/credentials/bubble-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Object | `object` |

### Operations

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new object |
| Delete | `delete` | Delete an existing object |
| Get | `get` | Retrieve a single object by ID |
| Get Many | `getAll` | Retrieve multiple objects with optional filtering |
| Update | `update` | Update an existing object |

### Parameters

#### Object: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Type Name | `string` | Yes | — | Name of the Bubble data type. Whitespace is stripped and converted to lowercase automatically (e.g. "My Type" becomes "mytype"). Supports expressions. |
| Properties | `fixedCollection` | No | `{}` | Key-value pairs of fields to set on the new object. |
| — Key | `string` | No | — | Field name to set on the object. Supports expressions. |
| — Value | `string` | No | — | Value to set for the field. Supports expressions like {{ $json.name }}. |

#### Object: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Type Name | `string` | Yes | — | Name of the Bubble data type (whitespace stripped, lowercased). Supports expressions. |
| Object ID | `string` | Yes | — | Unique ID of the object to retrieve or delete. Supports expressions like {{ $json.id }}. |

#### Object: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Type Name | `string` | Yes | — | Name of the Bubble data type (whitespace stripped, lowercased). Supports expressions. |
| Object ID | `string` | Yes | — | Unique ID of the object to retrieve or delete. Supports expressions like {{ $json.id }}. |

#### Object: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Type Name | `string` | Yes | — | Name of the Bubble data type (whitespace stripped, lowercased). Supports expressions. |
| Object ID | `string` | Yes | — | Unique ID of the object to update. Supports expressions like {{ $json.id }}. |
| Properties | `fixedCollection` | No | `{}` | Key-value pairs of fields to update on the object. |
| — Key | `string` | No | — | Field name to update. Supports expressions. |
| — Value | `string` | No | — | New value for the field. Supports expressions like {{ $json.email }}. |

#### Object: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Type Name | `string` | Yes | — | Name of the Bubble data type (whitespace stripped, lowercased). Supports expressions. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `100` | Max number of results to return. _(shown when Return All is `false`)_ |
| JSON Parameters | `boolean` | No | `false` | Whether to specify filter constraints as raw JSON instead of using the UI builder. |
| Options | `collection` | No | `{}` | Additional options for filtering and sorting results. |
| — Filters | `fixedCollection` | No | `{}` | Filter constraints for the query. _(shown when JSON Parameters is `false`)_ |
| — — Key | `string` | No | — | Field name to filter on. |
| — — Constraint | `options` | No | `equals` | The 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) |
| — — Value | `string` | No | — | Value 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) | `json` | No | — | Filter constraints as a JSON array. See Bubble Data API documentation for constraint format. _(shown when JSON Parameters is `true`)_ |
| — Sort | `fixedCollection` | No | `{}` | How to order the returned objects. |
| — — Sort Field | `string` | No | — | Field to sort by. Use "_random_sorting" for random order. |
| — — Descending | `boolean` | No | `false` | Whether to sort in descending order. |
| — — Geo Reference | `string` | No | — | When sorting by a geographic address field, provide the reference address as a string. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `10` | Maximum 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.

| Operation | Output |
|-----------|--------|
| `create` | One item. The Data API's response for the create call is merged onto the item. |
| `get` | One item. The object's own fields are merged onto the item. |
| `getAll` | **Fans 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. |
| `update` | One item, with `success: true` merged onto it. Bubble returns no body for an update. |
| `delete` | One 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:

```json
{
  "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:

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

Update one field on an existing object:

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

Delete an object:

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

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

```json
{
  "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:

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

Combine two constraints and sort ascending:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes 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 value** — `is_empty`, `is_not_empty`, `empty` and `not empty` hide the Value field because Bubble does not use it.