Skip to main content

Inbound sources

Every call needs Authorization: Bearer <key>. 7 calls:

List inbound sources​

GET /v1/inbound-sources

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.

Response 200

FieldTypeDescription
dataobject[]
data[].allowed_originsstring[]
data[].auth_modeenumOne of: hmac, public_token, google_key, provider.
data[].consent_attested_atstring (date-time) or nullWhen the consent attestation was confirmed. Null if made before it was asked.
data[].consent_attested_bystring or nullWho confirmed it: user:<id> for a member, api_key:<id> for an API key.
data[].consent_fieldstring or null
data[].consent_modeenumOne of: crm_field, web_form, existing_relationship, not_sure.
data[].consent_textstring or null
data[].created_atstring (date-time)ISO 8601 timestamp.
data[].default_labelsstring[]
data[].default_owner_user_idstring (uuid) or null
data[].field_aliasesobject
data[].has_secretbooleanThe HMAC secret or Google key is set. It is never returned.
data[].idstringInbound source id (src_...).
data[].intake_urlstringWhere leads are posted.
data[].kindenumOne of: webhook, form, google_ads_lead_form, meta_lead_ads, calendly, typeform, nexhealth, healthie, mindbody, boulevard, vagaro, zenoti, jane_app, housecall_pro, shopify, stripe_customer.
data[].last_lead_atstring (date-time) or nullISO 8601 timestamp.
data[].namestring
data[].outbound_toolbooleanEvery lead from this source is a cold contact.
data[].public_tokenstring or nullFor public_token sources. Not a secret: it goes in the page with the form.
data[].statusenumOne of: active, paused.
data[].updated_atstring (date-time)ISO 8601 timestamp.
data[].workflow_idstring (uuid) or null

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Create an inbound source​

POST /v1/inbound-sources

A place leads are posted to (intake_url); the dashboard calls these lead sources, and the webhook kind a Lead URL. hmac and google_key sources get a secret, returned once in secret; public_token sources get a token for the form snippet and accept posts only from allowed_origins. consent_attested: true is required (400 without it): the source records who confirmed that everyone the business sends has agreed to receive texts (the user, or the API key), and when, and the confirmation is audited.

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.
idempotency-keystringNoMakes the write safe to retry for 24 hours. 1 to 255 printable characters. Keys starting with outreach:, workflow: or agent: are reserved for messages bubbl3 sends itself and are refused with 400. Up to 255 characters.

Request body

FieldTypeRequiredDescription
allowed_originsstring[]NoSites a public_token source accepts posts from. Up to 20 items.
auth_modeenumNowebhook: hmac (default) or public_token. form: public_token. google_ads_lead_form: google_key. One of: hmac, public_token, google_key.
consent_attestedenumYesRequired: confirms "Everyone we send to bubbl3 has agreed to receive texts from us." bubbl3 records who confirmed it and when. One of: true.
consent_fieldstring or nullNoFor consent_mode crm_field: the payload field that records consent. Up to 200 characters.
consent_modeenumNoA mode other than not_sure also needs the compliance area at full access. One of: crm_field, web_form, existing_relationship, not_sure. Default "not_sure".
consent_textstring or nullNoThe consent wording shown next to the form, kept as evidence with each lead. Up to 2000 characters.
default_labelsstring[]NoLabel names added to every lead. Up to 20 items.
default_owner_user_idstring (uuid) or nullNoA member who owns new leads.
field_aliasesobjectNoPayload field name to contact field, e.g. { "Mobile Number": "phone" }. Default {}.
kindenumYesA Meta Lead Ads source is made by connecting a Meta Page, not here. One of: webhook, form, google_ads_lead_form.
namestringYesUp to 100 characters.
outbound_toolbooleanNoAn outbound tool (Clay, Apollo, Instantly, Smartlead): every lead it sends is a cold contact. Not for public_token sources. Default false.
workflow_idstring (uuid) or nullNoA workflow every lead is enrolled in.

Response 201

FieldTypeDescription
allowed_originsstring[]
auth_modeenumOne of: hmac, public_token, google_key, provider.
consent_attested_atstring (date-time) or nullWhen the consent attestation was confirmed. Null if made before it was asked.
consent_attested_bystring or nullWho confirmed it: user:<id> for a member, api_key:<id> for an API key.
consent_fieldstring or null
consent_modeenumOne of: crm_field, web_form, existing_relationship, not_sure.
consent_textstring or null
created_atstring (date-time)ISO 8601 timestamp.
default_labelsstring[]
default_owner_user_idstring (uuid) or null
field_aliasesobject
has_secretbooleanThe HMAC secret or Google key is set. It is never returned.
idstringInbound source id (src_...).
intake_urlstringWhere leads are posted.
kindenumOne of: webhook, form, google_ads_lead_form, meta_lead_ads, calendly, typeform, nexhealth, healthie, mindbody, boulevard, vagaro, zenoti, jane_app, housecall_pro, shopify, stripe_customer.
last_lead_atstring (date-time) or nullISO 8601 timestamp.
namestring
outbound_toolbooleanEvery lead from this source is a cold contact.
public_tokenstring or nullFor public_token sources. Not a secret: it goes in the page with the form.
secretstring or nullThe HMAC secret or Google key. Shown only in this response: store it now.
statusenumOne of: active, paused.
updated_atstring (date-time)ISO 8601 timestamp.
workflow_idstring (uuid) or null

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Get an inbound source​

GET /v1/inbound-sources/:id

Path parameters

NameTypeRequiredDescription
idstringYesInbound source id (src_...).

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.

Response 200

FieldTypeDescription
allowed_originsstring[]
auth_modeenumOne of: hmac, public_token, google_key, provider.
consent_attested_atstring (date-time) or nullWhen the consent attestation was confirmed. Null if made before it was asked.
consent_attested_bystring or nullWho confirmed it: user:<id> for a member, api_key:<id> for an API key.
consent_fieldstring or null
consent_modeenumOne of: crm_field, web_form, existing_relationship, not_sure.
consent_textstring or null
created_atstring (date-time)ISO 8601 timestamp.
default_labelsstring[]
default_owner_user_idstring (uuid) or null
field_aliasesobject
has_secretbooleanThe HMAC secret or Google key is set. It is never returned.
idstringInbound source id (src_...).
intake_urlstringWhere leads are posted.
kindenumOne of: webhook, form, google_ads_lead_form, meta_lead_ads, calendly, typeform, nexhealth, healthie, mindbody, boulevard, vagaro, zenoti, jane_app, housecall_pro, shopify, stripe_customer.
last_lead_atstring (date-time) or nullISO 8601 timestamp.
namestring
outbound_toolbooleanEvery lead from this source is a cold contact.
public_tokenstring or nullFor public_token sources. Not a secret: it goes in the page with the form.
statusenumOne of: active, paused.
updated_atstring (date-time)ISO 8601 timestamp.
workflow_idstring (uuid) or null

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Update an inbound source​

PATCH /v1/inbound-sources/:id

Kind and auth mode are fixed: make a new source to change them. A public_token source keeps at least one allowed origin. A consent mode other than not_sure, or a consent field, needs the compliance area at full access.

Path parameters

NameTypeRequiredDescription
idstringYesInbound source id (src_...).

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.
idempotency-keystringNoMakes the write safe to retry for 24 hours. 1 to 255 printable characters. Keys starting with outreach:, workflow: or agent: are reserved for messages bubbl3 sends itself and are refused with 400. Up to 255 characters.

Request body

FieldTypeRequiredDescription
allowed_originsstring[]NoUp to 20 items.
consent_fieldstring or nullNoUp to 200 characters.
consent_modeenumNoA mode other than not_sure also needs the compliance area at full access. One of: crm_field, web_form, existing_relationship, not_sure.
consent_textstring or nullNoUp to 2000 characters.
default_labelsstring[]NoUp to 20 items.
default_owner_user_idstring (uuid) or nullNo
field_aliasesobjectNoPayload field name to contact field, e.g. { "Mobile Number": "phone" }.
namestringNoUp to 100 characters.
outbound_toolbooleanNoAn outbound tool (Clay, Apollo, Instantly, Smartlead): every lead it sends is a cold contact. Not for public_token sources.
statusenumNoOne of: active, paused.
workflow_idstring (uuid) or nullNo

Response 200

FieldTypeDescription
allowed_originsstring[]
auth_modeenumOne of: hmac, public_token, google_key, provider.
consent_attested_atstring (date-time) or nullWhen the consent attestation was confirmed. Null if made before it was asked.
consent_attested_bystring or nullWho confirmed it: user:<id> for a member, api_key:<id> for an API key.
consent_fieldstring or null
consent_modeenumOne of: crm_field, web_form, existing_relationship, not_sure.
consent_textstring or null
created_atstring (date-time)ISO 8601 timestamp.
default_labelsstring[]
default_owner_user_idstring (uuid) or null
field_aliasesobject
has_secretbooleanThe HMAC secret or Google key is set. It is never returned.
idstringInbound source id (src_...).
intake_urlstringWhere leads are posted.
kindenumOne of: webhook, form, google_ads_lead_form, meta_lead_ads, calendly, typeform, nexhealth, healthie, mindbody, boulevard, vagaro, zenoti, jane_app, housecall_pro, shopify, stripe_customer.
last_lead_atstring (date-time) or nullISO 8601 timestamp.
namestring
outbound_toolbooleanEvery lead from this source is a cold contact.
public_tokenstring or nullFor public_token sources. Not a secret: it goes in the page with the form.
statusenumOne of: active, paused.
updated_atstring (date-time)ISO 8601 timestamp.
workflow_idstring (uuid) or null

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Delete an inbound source​

DELETE /v1/inbound-sources/:id

Leads posted to it are refused from now on. Contacts it created stay, with their consent evidence. A Meta Lead Ads source goes with its Page connection (409): disconnect the Page instead, or pause the source.

Path parameters

NameTypeRequiredDescription
idstringYesInbound source id (src_...).

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.
idempotency-keystringNoMakes the write safe to retry for 24 hours. 1 to 255 printable characters. Keys starting with outreach:, workflow: or agent: are reserved for messages bubbl3 sends itself and are refused with 400. Up to 255 characters.

Response 200

FieldTypeDescription
deletedenumOne of: true.
idstringInbound source id (src_...).

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Rotate an inbound source secret​

POST /v1/inbound-sources/:id/rotate-secret

Replaces the HMAC secret or Google key (returned once, in secret), or the public token. The old one stops working at once. A Meta Lead Ads source has no secret (409).

Path parameters

NameTypeRequiredDescription
idstringYesInbound source id (src_...).

Headers

NameTypeRequiredDescription
x-workspace-idstringNoWorkspace for session (JWT) callers. API keys carry their own workspace.
idempotency-keystringNoMakes the write safe to retry for 24 hours. 1 to 255 printable characters. Keys starting with outreach:, workflow: or agent: are reserved for messages bubbl3 sends itself and are refused with 400. Up to 255 characters.

Response 200

FieldTypeDescription
allowed_originsstring[]
auth_modeenumOne of: hmac, public_token, google_key, provider.
consent_attested_atstring (date-time) or nullWhen the consent attestation was confirmed. Null if made before it was asked.
consent_attested_bystring or nullWho confirmed it: user:<id> for a member, api_key:<id> for an API key.
consent_fieldstring or null
consent_modeenumOne of: crm_field, web_form, existing_relationship, not_sure.
consent_textstring or null
created_atstring (date-time)ISO 8601 timestamp.
default_labelsstring[]
default_owner_user_idstring (uuid) or null
field_aliasesobject
has_secretbooleanThe HMAC secret or Google key is set. It is never returned.
idstringInbound source id (src_...).
intake_urlstringWhere leads are posted.
kindenumOne of: webhook, form, google_ads_lead_form, meta_lead_ads, calendly, typeform, nexhealth, healthie, mindbody, boulevard, vagaro, zenoti, jane_app, housecall_pro, shopify, stripe_customer.
last_lead_atstring (date-time) or nullISO 8601 timestamp.
namestring
outbound_toolbooleanEvery lead from this source is a cold contact.
public_tokenstring or nullFor public_token sources. Not a secret: it goes in the page with the form.
secretstring or nullThe HMAC secret or Google key. Shown only in this response: store it now.
statusenumOne of: active, paused.
updated_atstring (date-time)ISO 8601 timestamp.
workflow_idstring (uuid) or null

Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500. See errors for the shape and codes.

Send a lead to an inbound source​

POST /v1/inbound/leads/:sourceId

No API key: authenticate with the source's signing secret (bubbl3-signature: t=&lt;unix seconds&gt;,v1=&lt;hex HMAC-SHA256 of "&lt;t&gt;.&lt;raw body&gt;"&gt;), its public token and an allowed Origin, or its Google Ads key. JSON or form-encoded. Send Idempotency-Key or event_id to make retries safe. Every refusal is the same 403.

Path parameters

NameTypeRequiredDescription
sourceIdstringYesUp to 64 characters.

Response 200

FieldTypeDescription
receivedenumOne of: true.

Errors: 400, 403, 413, 429. See errors for the shape and codes.