Banger API reference

Use the Banger API to work with mailboxes, send email, manage contacts, and run campaigns and journeys in your workspace.

Connect to your workspace

Base URL: https://api.bangermail.com

Download OpenAPI (OpenAPI 3.1 JSON with the same operations as this page), for code generators, API clients, and AI agents.

In the Banger app, open Settings → Developers → Manage API keys. Choose Create API key, enter a name, select the scopes your application needs, and choose Create key. Copy the key now: it is shown once and cannot be recovered.

Workspace keys have the format bgr_<12-character prefix>_<secret>. Set your key as BANGER_API_KEY in your environment, and authenticate workspace requests with:

Authorization: Bearer <workspace API key>

The public signup-form routes below do not require authentication. Each operation states whether it requires a Bearer token. Replace path placeholders such as {workspaceId} with your resource IDs before running examples.

Requests and responses

JSON responses generally wrap results in { data } and errors in { error: { code, message } }. Some endpoints return other formats or no content; use the response definition for the operation.

Send Idempotency-Key where listed in the header parameters, reusing the same key when retrying the same request. The contract defines different length constraints for different operations; follow the parameter table.

Pagination is endpoint-specific. Where the shared cursor and limit parameters appear, the cursor is a string (up to 1,024 characters), and the limit defaults to 50 with a range of 1–100. Other endpoints define their own parameters and response fields, such as next_cursor; follow those schemas.

Examples are generated from the contract's examples, defaults, enums, and schema types. Replace illustrative values with your own data. Where a body or response schema is missing, it is marked below.

These capabilities are also available to AI assistants through the Banger MCP server.

Products

GET/v1/workspaces/{workspaceId}/products

List workspace products

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • namestringrequired
  • slugstringrequired
  • kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | nullrequired
  • domainsarrayrequired
  • Each itemstring
  • descriptionstringrequired
  • contextobjectrequired
  • Additional propertyAny value
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstringrequired

    deleting: deleted by a person; restorable until delete_after, then removed for good.

    enum: "active", "archived", "deleting"

  • delete_afterstring | null

    When a deleting product is removed for good.

    format: "date-time"

  • is_defaultbooleanrequired
  • route_readybooleanrequired
  • setuparrayrequired
  • Each itemobject
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/products

Create a product

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 160

  • kindstring

    default: "product" · enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | null

    maxLength: 2000

  • descriptionstring

    maxLength: 4000

  • contextobject
  • Additional propertyAny value
  • domainsarray

    maxItems: 20

  • Each itemstring

    maxLength: 253

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • namestringrequired
  • slugstringrequired
  • kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | nullrequired
  • domainsarrayrequired
  • Each itemstring
  • descriptionstringrequired
  • contextobjectrequired
  • Additional propertyAny value
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstringrequired

    deleting: deleted by a person; restorable until delete_after, then removed for good.

    enum: "active", "archived", "deleting"

  • delete_afterstring | null

    When a deleting product is removed for good.

    format: "date-time"

  • is_defaultbooleanrequired
  • route_readybooleanrequired
  • setuparrayrequired
  • Each itemobject
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "kind": "product",
  "website_url": "example",
  "description": "example",
  "context": {},
  "domains": [
    "example"
  ]
}'
GET/v1/workspaces/{workspaceId}/products/{productId}

Get a product

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • namestringrequired
  • slugstringrequired
  • kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | nullrequired
  • domainsarrayrequired
  • Each itemstring
  • descriptionstringrequired
  • contextobjectrequired
  • Additional propertyAny value
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstringrequired

    deleting: deleted by a person; restorable until delete_after, then removed for good.

    enum: "active", "archived", "deleting"

  • delete_afterstring | null

    When a deleting product is removed for good.

    format: "date-time"

  • is_defaultbooleanrequired
  • route_readybooleanrequired
  • setuparrayrequired
  • Each itemobject
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/products/{productId}

Update a product

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 160

  • kindstring

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | null

    maxLength: 2000

  • descriptionstring

    maxLength: 4000

  • contextobject
  • Additional propertyAny value
  • brandobject
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstring

    enum: "active", "archived"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • namestringrequired
  • slugstringrequired
  • kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | nullrequired
  • domainsarrayrequired
  • Each itemstring
  • descriptionstringrequired
  • contextobjectrequired
  • Additional propertyAny value
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstringrequired

    deleting: deleted by a person; restorable until delete_after, then removed for good.

    enum: "active", "archived", "deleting"

  • delete_afterstring | null

    When a deleting product is removed for good.

    format: "date-time"

  • is_defaultbooleanrequired
  • route_readybooleanrequired
  • setuparrayrequired
  • Each itemobject
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "kind": "product",
  "website_url": "example",
  "description": "example",
  "context": {},
  "brand": {
    "company_name": "example",
    "logo_url": "example",
    "wordmark_url": "example",
    "website_url": "example",
    "primary_color": "example",
    "accent_color": "example",
    "background_color": "example",
    "surface_color": "example",
    "text_color": "example",
    "muted_text_color": "example",
    "heading_font_family": "example",
    "body_font_family": "example",
    "tone": "example",
    "footer_address": "example",
    "email_style": "example"
  },
  "status": "active"
}'
DELETE/v1/workspaces/{workspaceId}/products/{productId}

Delete one product (a project in the app) after reviewing its deletion preview. It leaves use at once (its sending stops) and stays restorable for 24 hours; then Banger removes its sending domains and every row it owns. The workspace's last active product cannot be deleted. Requires workspace admin and a signed-in session; API keys and OAuth grants are refused.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • confirm_namestringrequired

    The exact product name.

    minLength: 1 · maxLength: 160

  • preview_tokenstringrequired

    minLength: 64 · maxLength: 64

Success response 202

The product is out of use and is deleted for good at delete_after unless restored first. An idempotent replay returns the same result.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired

    enum: "deleting"

  • delete_afterstringrequired

    When the product is deleted for good; until then it can be restored.

    format: "date-time"

  • next_product_idstringrequired

    The workspace's default product now.

    format: "uuid"

  • replayedboolean

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "confirm_name": "example",
  "preview_token": "examplexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'
GET/v1/workspaces/{workspaceId}/products/{productId}/deletion-preview

Preview deleting one product and everything it owns, without deleting anything. Requires workspace admin, signed in or through user-authorized OAuth.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

What deleting the product removes and stops.

application/json

  • valueobject
  • dataobjectrequired
  • productobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • is_defaultbooleanrequired
  • next_default_productunspecifiedrequired

    The product that becomes the workspace default when the default is deleted.

  • oneOf 1null
  • oneOf 2object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • last_productbooleanrequired

    The only active product cannot be deleted.

  • mailboxesarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • domainsarrayrequired

    Sending domains Banger removes once the restore window has passed.

  • Each itemobject
  • idstringrequired

    format: "uuid"

  • domainstringrequired
  • journeysintegerrequired
  • broadcastsintegerrequired
  • signup_formsintegerrequired
  • contactsintegerrequired
  • api_keysintegerrequired
  • webhooksintegerrequired
  • pending_sendsintegerrequired
  • impactarrayrequired
  • Each itemstring
  • preview_tokenstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}/deletion-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/products/{productId}/restore

Restore a deleted product before its delete_after. Its mailboxes, Journeys, signup forms, webhooks and integrations are switched back on; Broadcasts stay paused. Requires workspace admin, signed in or through user-authorized OAuth.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The product is active again.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired

    enum: "active"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}/restore' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/products/{productId}/setup/{key}

Update a product setup item

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

key
path · required
  • valuestring

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

Request body required

application/json

  • valueobject
  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring

    default: "person" · enum: "system", "person", "agent"

  • notestring

    maxLength: 1000

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}/setup/{key}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "status": "todo",
  "completion_source": "person",
  "note": "example"
}'
POST/v1/workspaces/{workspaceId}/products/{productId}/domains

Associate a domain with a product

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

productId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • domainstringrequired

    minLength: 3 · maxLength: 253

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • namestringrequired
  • slugstringrequired
  • kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • website_urlstring | nullrequired
  • domainsarrayrequired
  • Each itemstring
  • descriptionstringrequired
  • contextobjectrequired
  • Additional propertyAny value
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • statusstringrequired

    deleting: deleted by a person; restorable until delete_after, then removed for good.

    enum: "active", "archived", "deleting"

  • delete_afterstring | null

    When a deleting product is removed for good.

    format: "date-time"

  • is_defaultbooleanrequired
  • route_readybooleanrequired
  • setuparrayrequired
  • Each itemobject
  • keystringrequired

    enum: "context", "domain", "mailboxes", "journeys", "broadcasts", "compliance"

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • completion_sourcestring | nullrequired

    enum: "system", "person", "agent", null

  • notestringrequired
  • updated_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/products/{productId}/domains' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example"
}'

Mailboxes

GET/v1/workspaces/{workspaceId}/mailboxes

listMailboxes

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Mailboxes visible to the actor.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/mailboxes

Create a Banger-native work mailbox on a workspace sending domain.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • local_partstringrequired

    minLength: 1 · maxLength: 64

  • display_namestring

    maxLength: 200

Success response 200

Idempotent replay of a native mailbox creation.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain_id": "00000000-0000-4000-8000-000000000001",
  "local_part": "example",
  "display_name": "example"
}'
POST/v1/workspaces/{workspaceId}/mailboxes/sms

Add an SMS inbox for a number on the company's own Twilio account. Banger checks the account owns the number, points its incoming texts at the inbox, and keeps the Auth Token encrypted. A workspace admin signed in to the web app does this; it needs the customers workspace feature.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • account_sidstringrequired

    pattern: "^AC[0-9a-f]{32}$"

  • auth_tokenstringrequired

    minLength: 16 · maxLength: 128

  • phone_numberstringrequired

    The Twilio number in E.164.

  • display_namestring

    maxLength: 200

Success response 201

The SMS inbox.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/sms' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "account_sid": "example",
  "auth_token": "examplexxxxxxxxx",
  "phone_number": "example",
  "display_name": "example"
}'
GET/v1/workspaces/{workspaceId}/mailboxes/whatsapp/signup

What the web app needs to open Meta's Embedded Signup for a WhatsApp inbox (Banger is a Tech Provider under Twilio). A workspace admin in the web app; needs the customers workspace feature and a paid plan.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Banger's Meta app and its Embedded Signup configuration.

application/json

  • valueobject
  • dataobjectrequired
  • app_idstringrequired
  • config_idstringrequired
  • solution_idstringrequired

    Twilio's Partner Solution id for Banger's Meta app.

  • graph_versionstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/whatsapp/signup' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/mailboxes/whatsapp

Finish connecting a WhatsApp number as an inbox, with the WhatsApp Business account Meta's Embedded Signup returned. Banger registers the number as a WhatsApp sender in the workspace's Twilio sub-account; the inbox is pending until the sender is ONLINE.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • waba_idstringrequired
  • phone_numberstringrequired

    The number the business chose in the signup

  • display_namestring

    The name WhatsApp shows; required for a number from Banger.

    maxLength: 200

Success response 201

The WhatsApp inbox.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/whatsapp' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "waba_id": "example",
  "phone_number": "example",
  "display_name": "example"
}'
GET/v1/workspaces/{workspaceId}/mailboxes/sms/available-numbers

Toll-free numbers Banger can buy for this workspace, which text phones in the US and Canada. Needs the customers workspace feature and a paid plan.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Numbers to pick from.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • phone_numberstringrequired
  • kindstringrequired

    enum: "toll_free"

  • reachesarrayrequired
  • Each itemstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/sms/available-numbers' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/mailboxes/sms/numbers

Buy a toll-free number as an SMS inbox and ask carriers to approve it with the business's details. It receives texts at once and sends once carriers approve, usually within a few days. It texts the US and Canada only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • phone_numberstringrequired
  • display_namestring

    maxLength: 200

  • businessobjectrequired
  • legal_namestringrequired

    maxLength: 200

  • websitestringrequired

    maxLength: 500

  • typestringrequired

    enum: "private_profit", "public_profit", "sole_proprietor", "non_profit", "government"

  • registration_numberstring

    EIN in the US

    maxLength: 64

  • countrystringrequired

    enum: "US", "CA"

  • streetstringrequired

    maxLength: 200

  • street2string

    maxLength: 200

  • citystringrequired

    maxLength: 100

  • regionstringrequired

    maxLength: 100

  • postal_codestringrequired

    maxLength: 20

  • contact_first_namestringrequired

    maxLength: 100

  • contact_last_namestringrequired

    maxLength: 100

  • contact_emailstringrequired

    maxLength: 320

  • contact_phonestringrequired

    maxLength: 32

  • opt_in_urlstringrequired

    The page where customers find this number.

    maxLength: 500

  • use_case_summarystring

    maxLength: 1000

  • message_samplestring

    maxLength: 1000

Success response 201

The SMS inbox, pending until carriers approve the number.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/sms/numbers' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "phone_number": "example",
  "display_name": "example",
  "business": {
    "legal_name": "example",
    "website": "example",
    "type": "private_profit",
    "registration_number": "example",
    "country": "US",
    "street": "example",
    "street2": "example",
    "city": "example",
    "region": "example",
    "postal_code": "example",
    "contact_first_name": "example",
    "contact_last_name": "example",
    "contact_email": "example",
    "contact_phone": "example",
    "opt_in_url": "example",
    "use_case_summary": "example",
    "message_sample": "example"
  }
}'
GET/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}/deletion-preview

Preview permanent mailbox deletion and dependent sending flows. Requires workspace admin and product scope.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailboxId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Exact mailbox and current deletion impact, without deleting anything.

application/json

  • valueobject
  • dataobjectrequired
  • mailboxobjectrequired
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • providerstringrequired
  • domain_idstring | nullrequired

    format: "uuid"

  • provider_connection_idstring | nullrequired

    format: "uuid"

  • messagesintegerrequired
  • draftsintegerrequired
  • pending_sendsintegerrequired
  • broadcastsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • journeysarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • signup_formsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • impactarrayrequired
  • Each itemstring
  • preview_tokenstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}/deletion-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}

Set the sender name recipients see on mail from one Banger mailbox ("Name <address>"). Gmail mailboxes keep the name set in Gmail. Requires workspace admin.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailboxId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • display_namestringrequired

    One line. Empty sends the bare address.

    maxLength: 200

Success response 200

The mailbox with its sender name.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "display_name": "example"
}'
DELETE/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}

Permanently delete one mailbox, keeping its domain and other mailboxes. Requires workspace admin and product scope.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailboxId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • confirm_addressstringrequired

    minLength: 3 · maxLength: 320

  • preview_tokenstringrequired

    minLength: 64 · maxLength: 64

Success response 200

Deleted or idempotent replay. Stored files are queued for permanent cleanup.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • deletedbooleanrequired
  • replayedboolean

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "confirm_address": "example",
  "preview_token": "examplexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'
POST/v1/workspaces/{workspaceId}/mailboxes/starter

Create a hosted mailbox restricted to same-product hosted inboxes and the workspace signup recipient.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • create_newboolean

    Create an additional hosted mailbox instead of resuming the initial one.

  • local_partstring

    Name before @bangermail.com. Without it the mailbox gets a word name such as quiet-maple-harbor.

    minLength: 3 · maxLength: 40

  • display_namestring

    maxLength: 200

Success response 200

Idempotent replay of starter identity creation.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/starter' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "create_new": true,
  "local_part": "example",
  "display_name": "example"
}'
POST/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}/reactivate

Resume the sender-reputation pause holding one mailbox, under the self-serve resume rules of resumeSending.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailboxId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • acknowledge_recipient_complaintbooleanrequired

    const: true

  • reasonstring

    Why sending is being restored; recorded in the audit log.

    maxLength: 500

Success response 200

Mailbox reactivated, or already active after a prior successful request.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailboxes/{mailboxId}/reactivate' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "acknowledge_recipient_complaint": true,
  "reason": "example"
}'

Drafts

GET/v1/workspaces/{workspaceId}/drafts

listDrafts

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring | nullrequired

    format: "uuid"

  • versionintegerrequired
  • toarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • ccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • bccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • subjectstringrequired
  • body_textstringrequired
  • statusstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • attachmentsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sha256string
  • created_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts?mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/drafts

createDraft

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • toarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • ccarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • bccarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring | nullrequired

    format: "uuid"

  • versionintegerrequired
  • toarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • ccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • bccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • subjectstringrequired
  • body_textstringrequired
  • statusstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • attachmentsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sha256string
  • created_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "thread_id": "00000000-0000-4000-8000-000000000001",
  "to": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "cc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "bcc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "subject": "example",
  "body_text": "example",
  "body_html": "example"
}'
GET/v1/workspaces/{workspaceId}/drafts/{draftId}

getDraft

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical deliverability performance, health, and incidents.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring | nullrequired

    format: "uuid"

  • versionintegerrequired
  • toarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • ccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • bccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • subjectstringrequired
  • body_textstringrequired
  • statusstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • attachmentsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sha256string
  • created_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/drafts/{draftId}

updateDraft

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueunspecified
  • allOf 1object

    No additional properties

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • toarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • ccarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • bccarray

    maxItems: 500

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

  • allOf 2object
  • versionintegerrequired

    minimum: 1

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstring | nullrequired

    format: "uuid"

  • versionintegerrequired
  • toarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • ccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • bccarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring
  • subjectstringrequired
  • body_textstringrequired
  • statusstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • attachmentsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sha256string
  • created_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "thread_id": "00000000-0000-4000-8000-000000000001",
  "to": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "cc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "bcc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "subject": "example",
  "body_text": "example",
  "body_html": "example",
  "version": 1
}'
DELETE/v1/workspaces/{workspaceId}/drafts/{draftId}

deleteDraft

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Draft and referenced objects scheduled for deletion.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/drafts/{draftId}/send

sendDraft

Sends the draft from its mailbox, which must be one the caller reaches. A caller whose sends need approval gets a pending approval instead; a person who could send the draft directly decides it.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body

No request body is specified in the contract.

Success response 202

The send is queued, or waits for approval.

application/json

  • valueobject
  • dataunspecifiedrequired
  • oneOf 1object
  • idstringrequired

    format: "uuid"

  • typestringrequired
  • statusstringrequired

    enum: "accepted", "executing", "succeeded", "failed"

  • workspace_revisionintegerrequired

    format: "int64"

  • created_atstringrequired

    format: "date-time"

  • oneOf 2object

    No additional properties

  • approvalobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring

    Further nesting omitted

  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

    Further nesting omitted

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring

    Further nesting omitted

  • checksarrayrequired
  • Each itemstring

    Further nesting omitted

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}/send' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx'
POST/v1/workspaces/{workspaceId}/drafts/{draftId}/attachments

uploadDraftAttachment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

X-Banger-Filename
header · required
  • valuestring

    minLength: 1 · maxLength: 500

Request body required

application/octet-stream

  • valuestring

    format: "binary" · maxLength: 26214400

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sha256string
  • created_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}/attachments' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Filename: example' \
  --header 'Content-Type: application/octet-stream' \
  --data-binary @request-body
DELETE/v1/workspaces/{workspaceId}/drafts/{draftId}/attachments/{attachmentId}

deleteDraftAttachment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

attachmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Attachment scheduled for version-aware B2 deletion.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}/attachments/{attachmentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/drafts/{draftId}/html

Read a draft HTML body

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

draftId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Draft HTML.

text/html

  • valuestring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/drafts/{draftId}/html' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Sending

GET/v1/workspaces/{workspaceId}/send-intents

listSendIntents

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

Request body

No request body is specified in the contract.

Success response 200

Recent canonical sends and their provider state.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "accepted", "scheduled", "queued", "executing", "partially_succeeded", "succeeded", "failed", "canceled"

  • traffic_classstringrequired

    enum: "mailbox", "product", "broadcast"

  • recipient_countintegerrequired

    minimum: 1

  • provider_keystringrequired
  • provider_statestringrequired

    enum: "pending", "leased", "submitted", "accepted", "ambiguous", "reconciling", "succeeded", "failed", "canceled"

  • provider_message_idstring | null
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/send-intents?limit=50' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/send-intents/{sendIntentId}

getSendIntent

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendIntentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical asynchronous send status.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "accepted", "scheduled", "queued", "executing", "partially_succeeded", "succeeded", "failed", "canceled"

  • traffic_classstringrequired

    enum: "mailbox", "product", "broadcast"

  • recipient_countintegerrequired

    minimum: 1

  • provider_keystringrequired
  • provider_statestringrequired

    enum: "pending", "leased", "submitted", "accepted", "ambiguous", "reconciling", "succeeded", "failed", "canceled"

  • provider_message_idstring | null
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/send-intents/{sendIntentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Transactional sending

GET/v1/workspaces/{workspaceId}/transactional-sends

listTransactionalSends

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 500 · default: 200

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • command_idstring | nullrequired

    format: "uuid"

  • statusstringrequired
  • command_statusstring | nullrequired
  • subjectstring
  • recipientsarray
  • Each itemobject
  • emailstringrequired
  • namestring
  • recipient_countintegerrequired
  • error_codestring | null
  • send_intent_idstring

    format: "uuid"

  • providerstring | null
  • route_kindstring | null
  • sourcestring
  • from_addressstring
  • recipient_statesobject
  • Additional propertyinteger
  • provider_message_idstring | null
  • languageunspecified

    The language this email went out in; null when it was not translated.

  • anyOf 1object

    The language a person got an email in. Only translated (managed-content) emails have one.

  • localestringrequired

    BCP 47 tag of the language the email was written in.

  • requested_localestring

    Present only on an older send that went out in another language: the language the person should have got.

  • fallback_reasonstring

    enum: "translation_missing", "translation_pending", "translation_review_required", "translation_failed", "translation_timeout"

  • anyOf 2null
  • journeyobject | null

    The Journey step and enrollment that sent this email; null for other sends.

  • journey_idstringrequired

    format: "uuid"

  • step_idstringrequired

    format: "uuid"

  • enrollment_idstringrequired

    format: "uuid"

  • experimentobject | null

    The experiment variant this email was; null when none applied.

  • experiment_idstringrequired

    format: "uuid"

  • variant_keystringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • template_idstring | null

    format: "uuid"

  • template_versioninteger | null
  • workspace_revisioninteger | null
  • command_resultobject
  • Additional propertyAny value
  • command_started_atstring | null

    format: "date-time"

  • command_completed_atstring | null

    format: "date-time"

  • body_textstring
  • body_htmlstring
  • reply_toarray
  • Each itemobject
  • emailstringrequired
  • namestring
  • headersobject
  • Additional propertystring
  • tagsarray
  • Each itemobject
  • namestringrequired
  • valuestringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/transactional-sends?limit=200' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/transactional-sends

createTransactionalSend

One recipient per Journey send. To takes one recipient in any RecipientInput shape ("a@example.com", "Pat <a@example.com>", { email, name }, or a one-element list); Cc and Bcc must be empty. reply_to defaults to the Journey's mailbox (an empty list also means the default); Product email needs exactly one. A new API Journey defaults to managed source content; legacy code Journeys retain complete-content sends. A refusal (4xx) leaves nothing frozen for the recipient, so a corrected call with a new idempotency key sends.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject
  • journeystring

    Key of the Journey this email belongs to, such as welcome. A key Banger has not seen yet records a new Journey from this email and sends it; claim that Journey later to manage its content. The key of a Journey you created sends once that Journey is approved and on. Without a key the send is refused with 422 journey_key_required, unless the workspace accepts sends without one. POST /journeys/{journeyKey}/send is the same send with the key in the path.

    minLength: 1 · maxLength: 100

  • mailbox_idstring

    Sender mailbox. Optional when the named Journey has one, which then sends.

    format: "uuid"

  • tounspecifiedrequired

    Recipients for to, cc, bcc and reply_to: an address ("a@example.com" or "Pat <a@example.com>"), an { email, name } object, or a list mixing both. Banger stores them as { email, name } objects with the email lowercased. The idempotency hash covers the body as sent, so retry with the same shape.

  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • oneOf 3array

    maxItems: 500

  • Each itemunspecified
  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • ccarray

    maxItems: 0

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • bccarray

    maxItems: 0

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • subjectstring

    maxLength: 10000

  • expires_atstring

    Discard a deferred Journey send after this instant; at most seven days from the original request.

    format: "date-time"

  • expires_after_secondsinteger

    minimum: 1 · maximum: 604800

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

  • reply_tounspecified

    Recipients for to, cc, bcc and reply_to: an address ("a@example.com" or "Pat <a@example.com>"), an { email, name } object, or a list mixing both. Banger stores them as { email, name } objects with the email lowercased. The idempotency hash covers the body as sent, so retry with the same shape.

  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • oneOf 3array

    maxItems: 500

  • Each itemunspecified
  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • headersobject
  • Additional propertystring

    maxLength: 5000

  • tagsarray

    maxItems: 49

  • Each itemobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 256

  • valuestringrequired

    minLength: 1 · maxLength: 256

  • attachmentsarray

    Files sent with the email, in managed and code Journeys alike. Their base64 content may total 10 MiB (about 7.5 MiB of files).

    maxItems: 20

  • Each itemobject

    No additional properties

  • filenamestringrequired

    Name the recipient sees, on one line.

    minLength: 1 · maxLength: 500

  • contentstringrequired

    The file encoded as base64; whitespace is ignored.

    minLength: 4

  • content_typestring

    Media type such as application/pdf, without parameters. Defaults to application/octet-stream.

    maxLength: 255

  • content_idstring

    Content-ID an HTML body can reference as cid:<content_id>.

    minLength: 1 · maxLength: 500

Success response 202

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • action_kindstringrequired

    enum: "transactional.send"

  • idstring

    format: "uuid"

  • send_intent_idstring

    format: "uuid"

  • provider_attempt_idstring

    format: "uuid"

  • statusstringrequired

    sent/queued states from delivery, or for a frozen request: deferred (scheduled by policy or a translation wait), processing (being sent), discarded.

  • replayedboolean
  • journeyunspecifiedrequired
  • anyOf 1object
  • journey_idstringrequired

    format: "uuid"

  • enrollment_idstringrequired

    format: "uuid"

  • step_idstringrequired

    format: "uuid"

  • step_positionintegerrequired
  • originstring

    enum: "journey"

  • journey_identitystring
  • anyOf 2null
  • ignored_variablesarrayrequired
  • Each itemstring
  • scheduled_atstring

    format: "date-time"

  • reasonstring
  • communication_reservation_idstring

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/transactional-sends' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "journey": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "to": "example",
  "cc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "bcc": [
    {
      "name": "example",
      "email": "person@example.com"
    }
  ],
  "subject": "example",
  "expires_at": "2026-01-01T00:00:00Z",
  "expires_after_seconds": 1,
  "body_text": "example",
  "body_html": "example",
  "reply_to": "example",
  "headers": {},
  "tags": [
    {
      "name": "example",
      "value": "example"
    }
  ],
  "attachments": [
    {
      "filename": "example",
      "content": "example",
      "content_type": "example",
      "content_id": "example"
    }
  ]
}'
GET/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}

getTransactionalSend

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

transactionalSendId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • command_idstring | nullrequired

    format: "uuid"

  • statusstringrequired
  • command_statusstring | nullrequired
  • subjectstring
  • recipientsarray
  • Each itemobject
  • emailstringrequired
  • namestring
  • recipient_countintegerrequired
  • error_codestring | null
  • send_intent_idstring

    format: "uuid"

  • providerstring | null
  • route_kindstring | null
  • sourcestring
  • from_addressstring
  • recipient_statesobject
  • Additional propertyinteger
  • provider_message_idstring | null
  • languageunspecified

    The language this email went out in; null when it was not translated.

  • anyOf 1object

    The language a person got an email in. Only translated (managed-content) emails have one.

  • localestringrequired

    BCP 47 tag of the language the email was written in.

  • requested_localestring

    Present only on an older send that went out in another language: the language the person should have got.

  • fallback_reasonstring

    enum: "translation_missing", "translation_pending", "translation_review_required", "translation_failed", "translation_timeout"

  • anyOf 2null
  • journeyobject | null

    The Journey step and enrollment that sent this email; null for other sends.

  • journey_idstringrequired

    format: "uuid"

  • step_idstringrequired

    format: "uuid"

  • enrollment_idstringrequired

    format: "uuid"

  • experimentobject | null

    The experiment variant this email was; null when none applied.

  • experiment_idstringrequired

    format: "uuid"

  • variant_keystringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • template_idstring | null

    format: "uuid"

  • template_versioninteger | null
  • workspace_revisioninteger | null
  • command_resultobject
  • Additional propertyAny value
  • command_started_atstring | null

    format: "date-time"

  • command_completed_atstring | null

    format: "date-time"

  • body_textstring
  • body_htmlstring
  • reply_toarray
  • Each itemobject
  • emailstringrequired
  • namestring
  • headersobject
  • Additional propertystring
  • tagsarray
  • Each itemobject
  • namestringrequired
  • valuestringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}/timeline

listTransactionalSendTimeline

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

transactionalSendId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Ordered acceptance, provider-attempt, and recipient-event timeline.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • occurred_atstringrequired

    format: "date-time"

  • event_typestringrequired
  • labelstringrequired
  • providerstring | null
  • recipient_domainstring | null
  • error_codestring | null

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}/timeline' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}/retry

retryTransactionalSend

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

transactionalSendId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body

No request body is specified in the contract.

Success response 202

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • action_kindstringrequired

    enum: "transactional.send"

  • idstringrequired

    format: "uuid"

  • send_intent_idstringrequired

    format: "uuid"

  • provider_attempt_idstringrequired

    format: "uuid"

  • statusstringrequired
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/transactional-sends/{transactionalSendId}/retry' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx'

Threads

GET/v1/workspaces/{workspaceId}/threads

listThreads

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

mailbox_id
query
  • valuestring

    format: "uuid"

label_id
query

Return only threads carrying this mailbox label.

  • valuestring

    format: "uuid"

view
query
  • valuestring

    default: "inbox" · enum: "inbox", "sent", "drafts", "archive", "trash", "spam", "all"

Request body

No request body is specified in the contract.

Success response 200

Keyset-paginated workspace threads.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • snippetstringrequired
  • last_message_atstringrequired

    format: "date-time"

  • message_countintegerrequired
  • unread_countintegerrequired
  • is_archivedbooleanrequired
  • is_trashbooleanrequired
  • is_spambooleanrequired
  • is_starredbooleanrequired
  • is_sentbooleanrequired
  • has_attachmentsbooleanrequired
  • sender_unverifiedboolean

    True when the latest message's sender passed neither SPF nor DKIM for its From domain, so its From address may be forged.

  • labelsarrayrequired
  • Each itemstring
  • participantsarray
  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • recipientsarray

    The To list of the mailbox's latest sent message in this thread; empty when the mailbox sent none. Sent views show these instead of the sender.

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/threads?cursor=example&limit=50&mailbox_id=00000000-0000-4000-8000-000000000001&label_id=00000000-0000-4000-8000-000000000001&view=inbox' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/threads/{threadId}

getThread

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

threadId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Thread and ordered messages.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • snippetstringrequired
  • last_message_atstringrequired

    format: "date-time"

  • message_countintegerrequired
  • unread_countintegerrequired
  • is_archivedbooleanrequired
  • is_trashbooleanrequired
  • is_spambooleanrequired
  • is_starredbooleanrequired
  • is_sentbooleanrequired
  • has_attachmentsbooleanrequired
  • sender_unverifiedboolean

    True when the latest message's sender passed neither SPF nor DKIM for its From domain, so its From address may be forged.

  • labelsarrayrequired
  • Each itemstring
  • participantsarray
  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • recipientsarray

    The To list of the mailbox's latest sent message in this thread; empty when the mailbox sent none. Sent views show these instead of the sender.

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • allOf 2object
  • messagesarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstringrequired

    format: "uuid"

  • sent_atstringrequired

    format: "date-time"

  • received_atstring

    format: "date-time"

  • envelope_recipientsarray

    Original SMTP envelope recipients, case-folded by the SMTP edge, before receive-only alias routing. Empty for older messages or non-SMTP sources. Independent of visible To/Cc headers.

  • Each itemstring

    format: "email"

    Further nesting omitted

  • fromobjectrequired
  • namestring

    Further nesting omitted

  • emailstringrequired

    format: "email"

    Further nesting omitted

  • toarrayrequired
  • Each itemobject

    Further nesting omitted

  • ccarray
  • Each itemobject

    Further nesting omitted

  • reply_toarray
  • Each itemobject

    Further nesting omitted

  • is_sentboolean

    Whether this message was sent by the mailbox, including from an alias.

  • provider_statusstring | null

    An SMS or WhatsApp reply's delivery as the provider last reported it (read is WhatsApp only). Null for email.

    enum: "queued", "sent", "delivered", "read", "undelivered", "failed", null

  • body_textstring
  • body_html_urlstring

    format: "uri"

  • reply_originobject
  • send_intent_idstringrequired

    format: "uuid"

    Further nesting omitted

  • sourcestringrequired

    enum: "gateway", "transactional", "marketing", "mailbox", "agent"

    Further nesting omitted

  • source_idstring

    format: "uuid"

    Further nesting omitted

  • traffic_classstringrequired

    enum: "transactional", "marketing", "mailbox"

    Further nesting omitted

  • kindstringrequired

    enum: "campaign", "sequence", "transactional", "mailbox", "agent"

    Further nesting omitted

  • namestring

    Further nesting omitted

  • sender_verifiedboolean

    Present and false when the sender passed neither SPF nor DKIM for its From domain. Banger accepted it because that domain's DMARC policy is not reject, so the From address may be forged. Absent when the sender was verified or not checked.

  • has_attachmentsbooleanrequired
  • attachmentsarray
  • Each itemobject

    Further nesting omitted

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/threads/{threadId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Messages

GET/v1/workspaces/{workspaceId}/messages/{messageId}/html

getMessageHtml

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

messageId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Authenticated, sandbox-constrained HTML message body.

text/html

  • valuestring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/messages/{messageId}/html' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Attachments

GET/v1/workspaces/{workspaceId}/attachments/{attachmentId}/content

downloadAttachment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

attachmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Authenticated attachment stream.

application/octet-stream

  • valuestring

    format: "binary"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/attachments/{attachmentId}/content' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/search

searchMail

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

q
query · required
  • valuestring

    minLength: 1 · maxLength: 512

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

mailbox_id
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Workspace-wide search results.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • snippetstringrequired
  • last_message_atstringrequired

    format: "date-time"

  • message_countintegerrequired
  • unread_countintegerrequired
  • is_archivedbooleanrequired
  • is_trashbooleanrequired
  • is_spambooleanrequired
  • is_starredbooleanrequired
  • is_sentbooleanrequired
  • has_attachmentsbooleanrequired
  • sender_unverifiedboolean

    True when the latest message's sender passed neither SPF nor DKIM for its From domain, so its From address may be forged.

  • labelsarrayrequired
  • Each itemstring
  • participantsarray
  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • recipientsarray

    The To list of the mailbox's latest sent message in this thread; empty when the mailbox sent none. Sent views show these instead of the sender.

  • Each itemobject
  • namestring
  • emailstringrequired

    format: "email"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/search?q=example&cursor=example&limit=50&mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Contacts

GET/v1/workspaces/{workspaceId}/contacts

listContacts

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

q
query
  • valuestring

    maxLength: 512

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired

    format: "email"

  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts?cursor=example&limit=50&q=example' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contacts

upsertContact

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • emailstringrequired

    format: "email"

  • display_namestring

    maxLength: 1000

  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • consent_confirmedboolean

    Required when newly subscribing an address.

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • emailstringrequired

    format: "email"

  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "email": "person@example.com",
  "display_name": "example",
  "status": "subscribed",
  "attributes": {},
  "consent_confirmed": true
}'
GET/v1/workspaces/{workspaceId}/contacts/{contactId}

getContact

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

contactId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • emailstringrequired

    format: "email"

  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • suppressedbooleanrequired
  • suppression_reasonstring | nullrequired
  • sourcesarrayrequired
  • Each itemobject
  • kindstringrequired
  • referencestringrequired
  • connection_idstring | nullrequired

    format: "uuid"

  • metadataobjectrequired
  • Additional propertyAny value
  • first_seen_atstringrequired

    format: "date-time"

  • last_seen_atstringrequired

    format: "date-time"

  • listsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • subscription_statusstringrequired
  • consent_evidencearrayrequired
  • Each itemobject
  • kindstringrequired
  • referencestringrequired
  • connection_idstring | nullrequired

    format: "uuid"

  • metadataobjectrequired
  • Additional propertyAny value
  • first_seen_atstringrequired

    format: "date-time"

  • last_seen_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/{contactId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
DELETE/v1/workspaces/{workspaceId}/contacts/{contactId}

deleteContact

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

contactId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Contact deleted.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/{contactId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/contacts/imports

listContactImports

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstring

    format: "uuid"

  • filenamestring
  • list_idstring | null

    format: "uuid"

  • list_namestring | null
  • statusstring
  • total_rowsinteger
  • imported_rowsinteger
  • invalid_rowsinteger
  • error_summaryarray
  • Each itemstring
  • consent_confirmedboolean
  • consent_confirmed_atstring | null

    format: "date-time"

  • processed_rowsinteger
  • attempt_countinteger
  • last_error_codestring | null
  • created_atstring

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/imports' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contacts/imports

importContacts

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • filenamestringrequired

    minLength: 1 · maxLength: 500

  • list_idstring

    format: "uuid"

  • consent_confirmedboolean

    Required when any imported row with an email is subscribed.

  • phone_channelsarray

    The channels the rows' phone numbers are subscribed on. Required when any row has a phone. Banger takes an imported number as consented and keeps no proof, so no import or send is refused for lack of a consent record: the importer needs each person's consent before texting them. The number of a row marked unsubscribed is not subscribed, and numbers that opted out stay opted out.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_countrystring

    Two-letter country code of the phone numbers written without a country code.

    minLength: 2 · maxLength: 2

  • rowsarrayrequired

    minItems: 1 · maxItems: 5000

  • Each itemobject

    A person by email, by phone, or both.

  • emailstring

    format: "email"

  • phonestring

    Mobile number, with its country code (+5511999998888) or as a number of phone_country.

    maxLength: 60

  • display_namestring

    maxLength: 1000

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "queued"

  • total_rowsintegerrequired
  • imported_rowsintegerrequired
  • invalid_rowsintegerrequired
  • list_idstring | nullrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/imports' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "filename": "example",
  "list_id": "00000000-0000-4000-8000-000000000001",
  "consent_confirmed": true,
  "phone_channels": [
    "sms"
  ],
  "phone_country": "ex",
  "rows": [
    {
      "email": "person@example.com",
      "phone": "example",
      "display_name": "example",
      "status": "subscribed",
      "attributes": {}
    }
  ]
}'
PATCH/v1/workspaces/{workspaceId}/contacts/{contactId}/attributes

Merge typed attributes without changing subscription or consent

Requires contacts:write and contacts:read. Updates an existing contact only. Omitted attributes are preserved, explicit false is stored, and null removes a field. Supply verified source facts; absent data is not false. Subscription, suppression, identity and source history are unchanged.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contactId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • attributesobjectrequired
  • Additional propertyAny value

Success response 200

Current contact read-back; replayed is true when this mutation was already applied.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • attributesobjectrequired
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • replayedbooleanrequired
  • Additional propertyAny value

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/{contactId}/attributes' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "attributes": {}
}'
POST/v1/workspaces/{workspaceId}/contacts/upsert

upsertProductContact

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • emailstringrequired

    format: "email" · maxLength: 320

  • display_namestring

    minLength: 0 · maxLength: 1000

  • attributesobject
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • consent_evidenceobject

    No additional properties

  • sourcestring

    minLength: 1 · maxLength: 2000

  • referencestring

    minLength: 1 · maxLength: 2000

  • observed_atstring

    format: "date-time"

  • statementstring

    minLength: 1 · maxLength: 2000

  • consent_confirmedboolean

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • emailstringrequired

    format: "email"

  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • statusstringrequired

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • suppressedbooleanrequired
  • suppression_reasonstring | nullrequired
  • sourcesarrayrequired
  • Each itemobject
  • kindstringrequired
  • referencestringrequired
  • connection_idstring | nullrequired

    format: "uuid"

  • metadataobjectrequired
  • Additional propertyAny value
  • first_seen_atstringrequired

    format: "date-time"

  • last_seen_atstringrequired

    format: "date-time"

  • listsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • subscription_statusstringrequired
  • consent_evidencearrayrequired
  • Each itemobject
  • kindstringrequired
  • referencestringrequired
  • connection_idstring | nullrequired

    format: "uuid"

  • metadataobjectrequired
  • Additional propertyAny value
  • first_seen_atstringrequired

    format: "date-time"

  • last_seen_atstringrequired

    format: "date-time"

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/upsert' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "email": "person@example.com",
  "display_name": "example",
  "attributes": {},
  "status": "subscribed",
  "consent_evidence": {
    "source": "example",
    "reference": "example",
    "observed_at": "2026-01-01T00:00:00Z",
    "statement": "example"
  },
  "consent_confirmed": true
}'
POST/v1/workspaces/{workspaceId}/contacts/import-validation

validateProductContactImport

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • rowsarrayrequired

    minItems: 1 · maxItems: 5000

  • Each itemobject

    A person by email (with its status), by phone, or both.

    No additional properties

  • emailstring

    format: "email" · maxLength: 320

  • phonestring

    Mobile number, with its country code (+5511999998888) or as a number of phone_country. A row with only a phone needs no consent confirmation and no status: it is subscribed unless its status says unsubscribed, and a number brought so is not subscribed by a later import.

    maxLength: 60

  • display_namestring

    minLength: 0 · maxLength: 1000

  • attributesobject
  • Additional propertyAny value
  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • consent_evidenceobject

    No additional properties

  • sourcestring

    minLength: 1 · maxLength: 2000

  • referencestring

    minLength: 1 · maxLength: 2000

  • observed_atstring

    format: "date-time"

  • statementstring

    minLength: 1 · maxLength: 2000

  • consent_confirmedboolean
  • phone_channelsarray

    The channels the rows' phone numbers are subscribed on. Required when any row has a phone. Banger takes an imported number as consented and keeps no proof, so no import or send is refused for lack of a consent record: the importer needs each person's consent before texting them. The number of a row marked unsubscribed is not subscribed, and numbers that opted out stay opted out.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_countrystring

    Two-letter country code of the phone numbers written without a country code.

    minLength: 2 · maxLength: 2

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • validbooleanrequired
  • total_rowsintegerrequired
  • valid_rowsintegerrequired
  • errorsarrayrequired
  • Each itemobject
  • rowintegerrequired
  • codestringrequired
  • messagestringrequired
  • phone_rowsinteger

    Valid rows that bring a phone number. Present when there is one.

  • phone_channelsarray
  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_consent_noticestring

    What to tell the importer about consent for the numbers. Present when a row brings one.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/import-validation' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "rows": [
    {
      "email": "person@example.com",
      "phone": "example",
      "display_name": "example",
      "attributes": {},
      "status": "subscribed",
      "consent_evidence": {
        "source": "example",
        "reference": "example",
        "observed_at": "2026-01-01T00:00:00Z",
        "statement": "example"
      }
    }
  ],
  "consent_confirmed": true,
  "phone_channels": [
    "sms"
  ],
  "phone_country": "ex"
}'
GET/v1/workspaces/{workspaceId}/contacts/imports/{importId}

getProductContactImport

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

importId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • idstring

    format: "uuid"

  • filenamestring
  • list_idstring | null

    format: "uuid"

  • list_namestring | null
  • statusstring
  • total_rowsinteger
  • imported_rowsinteger
  • invalid_rowsinteger
  • error_summaryarray
  • Each itemstring
  • consent_confirmedboolean
  • consent_confirmed_atstring | null

    format: "date-time"

  • processed_rowsinteger
  • attempt_countinteger
  • last_error_codestring | null
  • created_atstring

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/imports/{importId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/contacts/fields

List stored contact attribute keys

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/fields' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contacts/import-mapping

Propose contact import column mappings

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • filenamestring

    maxLength: 500

  • columnsarrayrequired

    minItems: 1 · maxItems: 100

  • Each itemobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • samplesarray

    maxItems: 8

  • Each itemstring

    maxLength: 120

  • filledinteger

    minimum: 0

  • rowsinteger

    minimum: 0

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • mappingobjectrequired
  • columnsarrayrequired
  • Each itemobject
  • columnstringrequired
  • targetstringrequired

    enum: "email", "phone", "display_name", "first_name", "last_name", "locale", "time_zone", "status", "unsubscribed_flag", "subscribed_flag", "field", "ignore"

  • field_keystring
  • field_typestring

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • confidencenumberrequired
  • sourcestringrequired

    enum: "saved", "ai", "rules", "person"

  • alternativesarray
  • Each itemobject

    Further nesting omitted

  • locale_valuesobjectrequired
  • Additional propertystring | null
  • phone_channelsarray

    The channels a phone column's numbers are for, chosen by the importer. A column is matched to phone only in a workspace whose contacts hold numbers.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_countrystring

    Two-letter country code of the numbers written without a country code.

    minLength: 2 · maxLength: 2

  • reviewobjectrequired
  • neededbooleanrequired
  • reasonsarrayrequired
  • Each itemstring
  • columnsarrayrequired
  • Each itemstring
  • sourcestringrequired

    enum: "saved", "ai", "rules"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/import-mapping' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "filename": "example",
  "columns": [
    {
      "name": "example",
      "samples": [
        "example"
      ],
      "filled": 0,
      "rows": 0
    }
  ]
}'

Contact lists

GET/v1/workspaces/{workspaceId}/contact-lists

listContactLists

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • member_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contact-lists

createContactList

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • member_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example"
}'
GET/v1/workspaces/{workspaceId}/contact-lists/{listId}

getContactList

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • membersarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • statusstringrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists/{listId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
DELETE/v1/workspaces/{workspaceId}/contact-lists/{listId}

deleteContactList

Delete this list and contacts exclusive to it. Contacts belonging to other lists are preserved. Requires contacts:write.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Counts of exclusive contacts deleted (or to delete) and shared contacts kept.

application/json

  • valueobject
  • dataobjectrequired
  • deleted_contactsintegerrequired

    minimum: 0

  • kept_contactsintegerrequired

    minimum: 0

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists/{listId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/contact-lists/{listId}/deletion-preview

previewContactListDeletion

Preview list deletion counts. Memberships are rechecked when deleting. Requires contacts:read.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Counts of exclusive contacts deleted (or to delete) and shared contacts kept.

application/json

  • valueobject
  • dataobjectrequired
  • deleted_contactsintegerrequired

    minimum: 0

  • kept_contactsintegerrequired

    minimum: 0

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists/{listId}/deletion-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contact-lists/{listId}/members

addContactListMembers

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • contact_idsarrayrequired

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 204

List membership updated.

No response body.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists/{listId}/members' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "contact_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'
DELETE/v1/workspaces/{workspaceId}/contact-lists/{listId}/members

removeContactListMembers

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • contact_idsarrayrequired

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 204

List membership updated.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-lists/{listId}/members' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "contact_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'

Contact fields

GET/v1/workspaces/{workspaceId}/contact-fields

The product's contact fields (built-in, declared and discovered) with type, choices, source, how many contacts have a value, and the segment operators each supports.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    maxLength: 80

  • descriptionstringrequired

    maxLength: 500

  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • optionsarrayrequired

    maxItems: 50

  • Each itemstring
  • originstringrequired

    enum: "system", "person", "agent", "form", "import", "api", "event", "discovered"

  • statusstringrequired

    enum: "active", "hidden"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • operatorsarray
  • Each itemstring
  • contacts_with_valueinteger

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-fields' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/contact-fields

Declare a contact field: label, type (text, number, boolean, date, choice, choices), optional key, options and description.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • descriptionstring

    maxLength: 500

  • typestring

    default: "text" · enum: "text", "number", "boolean", "date", "choice", "choices"

  • optionsarray

    maxItems: 50

  • Each itemstring

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • keystringrequired

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    maxLength: 80

  • descriptionstringrequired

    maxLength: 500

  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • optionsarrayrequired

    maxItems: 50

  • Each itemstring
  • originstringrequired

    enum: "system", "person", "agent", "form", "import", "api", "event", "discovered"

  • statusstringrequired

    enum: "active", "hidden"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • operatorsarray
  • Each itemstring
  • contacts_with_valueinteger

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-fields' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "key": "example",
  "label": "example",
  "description": "example",
  "type": "text",
  "options": [
    "example"
  ]
}'
PATCH/v1/workspaces/{workspaceId}/contact-fields/{key}

Rename, describe, retype (converting stored values, or 409 with an example that doesn't fit), change choices, or hide a field.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

key
path · required
  • valuestring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

Request body required

application/json

  • valueobject
  • labelstring

    maxLength: 80

  • descriptionstring

    maxLength: 500

  • typestring

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • optionsarray

    maxItems: 50

  • Each itemstring
  • statusstring

    enum: "active", "hidden"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • keystringrequired

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    maxLength: 80

  • descriptionstringrequired

    maxLength: 500

  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • optionsarrayrequired

    maxItems: 50

  • Each itemstring
  • originstringrequired

    enum: "system", "person", "agent", "form", "import", "api", "event", "discovered"

  • statusstringrequired

    enum: "active", "hidden"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • operatorsarray
  • Each itemstring
  • contacts_with_valueinteger

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/contact-fields/{key}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "label": "example",
  "description": "example",
  "type": "text",
  "options": [
    "example"
  ],
  "status": "active"
}'

Segments

GET/v1/workspaces/{workspaceId}/segments

listSegments

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • filterobjectrequired

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject
  • fieldstringrequired

    Further nesting omitted

  • opstringrequired

    enum: "is", "is_not", "contains", "set", "not_set", "gt", "gte", "lt", "lte", "within_days", "any_of", "includes"

    Further nesting omitted

  • valueunspecified

    Further nesting omitted

  • matchstring

    enum: "all", "any"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/segments' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/segments

createSegment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • filterobject

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject
  • fieldstringrequired
  • opstringrequired

    enum: "is", "is_not", "contains", "set", "not_set", "gt", "gte", "lt", "lte", "within_days", "any_of", "includes"

  • valueunspecified
  • anyOf 1string
  • anyOf 2number
  • anyOf 3boolean
  • anyOf 4array
  • Each itemstring

    Further nesting omitted

  • matchstring

    enum: "all", "any"

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • filterobjectrequired

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject
  • fieldstringrequired
  • opstringrequired

    enum: "is", "is_not", "contains", "set", "not_set", "gt", "gte", "lt", "lte", "within_days", "any_of", "includes"

  • valueunspecified
  • anyOf 1string

    Further nesting omitted

  • anyOf 2number

    Further nesting omitted

  • anyOf 3boolean

    Further nesting omitted

  • anyOf 4array

    Further nesting omitted

  • matchstring

    enum: "all", "any"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/segments' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "filter": {
    "status": "subscribed",
    "attributes": {},
    "conditions": [
      {
        "field": "example",
        "op": "is",
        "value": "example"
      }
    ],
    "match": "all"
  }
}'
GET/v1/workspaces/{workspaceId}/segments/{segmentId}/preview

previewSegment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

segmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • filterobjectrequired

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject
  • fieldstringrequired

    Further nesting omitted

  • opstringrequired

    enum: "is", "is_not", "contains", "set", "not_set", "gt", "gte", "lt", "lte", "within_days", "any_of", "includes"

    Further nesting omitted

  • valueunspecified

    Further nesting omitted

  • matchstring

    enum: "all", "any"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/segments/{segmentId}/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY"
DELETE/v1/workspaces/{workspaceId}/segments/{segmentId}

Delete a segment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

segmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • deletedbooleanrequired

    const: true

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/segments/{segmentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Audience

POST/v1/workspaces/{workspaceId}/audience/lists

createProductContactList

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    minLength: 0 · maxLength: 2000

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • membersarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • statusstringrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/lists' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example"
}'
GET/v1/workspaces/{workspaceId}/audience/lists/{listId}

getProductContactList

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • membersarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • statusstringrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/lists/{listId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/audience/lists/{listId}/members

addProductContactListMembers

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • contact_idsarrayrequired

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • membersarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • statusstringrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/lists/{listId}/members' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "contact_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'
DELETE/v1/workspaces/{workspaceId}/audience/lists/{listId}/members

removeProductContactListMembers

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

listId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • contact_idsarrayrequired

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • descriptionstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • membersarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • statusstringrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/lists/{listId}/members' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "contact_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'
POST/v1/workspaces/{workspaceId}/audience/segments

createProductSegment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • filterobjectrequired

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1unspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • filterobjectrequired

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject

    Further nesting omitted

  • matchstring

    enum: "all", "any"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • emailstringrequired

    Further nesting omitted

  • display_namestring | nullrequired

    Further nesting omitted

  • attributesobjectrequired

    Further nesting omitted

  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired
  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/segments' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "filter": {
    "status": "subscribed",
    "attributes": {}
  }
}'
GET/v1/workspaces/{workspaceId}/audience/segments/{segmentId}/preview

previewProductSegment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

segmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • filterobjectrequired

    Conditions must reference declared contact fields and use operators supported by their type. set and not_set omit value; within_days uses 1–3650 days.

    No additional properties

  • statusstring

    enum: "subscribed", "unsubscribed", "bounced", "complained"

  • attributesobject
  • Additional propertyAny value
  • conditionsarray

    maxItems: 20

  • Each itemobject
  • fieldstringrequired

    Further nesting omitted

  • opstringrequired

    enum: "is", "is_not", "contains", "set", "not_set", "gt", "gte", "lt", "lte", "within_days", "any_of", "includes"

    Further nesting omitted

  • valueunspecified

    Further nesting omitted

  • matchstring

    enum: "all", "any"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/segments/{segmentId}/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/audience/approvals

listProductApprovalEvidence

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

status
query
  • valuestring

    enum: "pending", "approved", "rejected", "cancelled", "expired", "undecided"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemunspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring

    Further nesting omitted

  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

    Further nesting omitted

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring

    Further nesting omitted

  • checksarrayrequired
  • Each itemstring

    Further nesting omitted

  • allOf 2object
  • approval_idstringrequired

    format: "uuid"

  • broadcast_idstring | nullrequired

    format: "uuid"

  • import_idstring | nullrequired

    format: "uuid"

  • blockersarrayrequired
  • Each itemobject
  • codestringrequired

    Further nesting omitted

  • messagestringrequired

    Further nesting omitted

  • executionsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • resultobjectrequired

    Further nesting omitted

  • error_codestring | nullrequired

    Further nesting omitted

  • execution_job_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • execution_statusstringrequired

    enum: "completed", "failed", "queued", "awaiting_review", "not_queued"

  • human_review_urlstring | nullrequired
  • human_review_instructionstring | nullrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/approvals?status=pending' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/audience/approvals/{approvalId}

getProductApprovalEvidence

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring
  • allOf 2object
  • approval_idstringrequired

    format: "uuid"

  • broadcast_idstring | nullrequired

    format: "uuid"

  • import_idstring | nullrequired

    format: "uuid"

  • blockersarrayrequired
  • Each itemobject
  • codestringrequired
  • messagestringrequired
  • executionsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • statusstringrequired
  • resultobjectrequired
  • Additional propertyAny value
  • error_codestring | nullrequired
  • execution_job_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • execution_statusstringrequired

    enum: "completed", "failed", "queued", "awaiting_review", "not_queued"

  • human_review_urlstring | nullrequired
  • human_review_instructionstring | nullrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/audience/approvals/{approvalId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'

Signup forms

GET/v1/workspaces/{workspaceId}/signup-forms

The product's signup forms with embed code, hosted link, views, signups, confirmations, subscribers and conversion rate.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

include_archived
query
  • valueboolean

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • public_idstringrequired

    pattern: "^f_[a-z0-9]{16}$"

  • namestringrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstringrequired

    format: "uuid"

  • list_namestringrequired
  • mailbox_idstring | nullrequired

    format: "uuid"

  • double_opt_inbooleanrequired
  • configobjectrequired

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

    Further nesting omitted

  • labelstringrequired

    minLength: 1 · maxLength: 80

    Further nesting omitted

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

    Further nesting omitted

  • requiredboolean

    default: false

    Further nesting omitted

  • placeholderstring

    maxLength: 80

    Further nesting omitted

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

    Further nesting omitted

  • statusstringrequired

    enum: "active", "paused", "archived"

  • viewsintegerrequired
  • submissionsintegerrequired
  • confirmationsintegerrequired
  • subscribersintegerrequired
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • hosted_urlstringrequired
  • embed_codestringrequired
  • embed_slotstringrequired
  • open_buttonstringrequired
  • conversion_ratenumberrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms?include_archived=true' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/signup-forms

Create a form: kind (inline, popup, bar, slide_in, page), list_id or list_name, optional mailbox_id, double_opt_in (default true) and partial config.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 200

  • kindstring

    default: "inline" · enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstring

    format: "uuid"

  • list_namestring

    maxLength: 200

  • mailbox_idstring | null

    format: "uuid"

  • double_opt_inboolean

    default: true

  • configobject

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstring

    format: "uuid"

  • product_idstring

    format: "uuid"

  • public_idstring

    pattern: "^f_[a-z0-9]{16}$"

  • namestring
  • kindstring

    enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstring

    format: "uuid"

  • list_namestring
  • mailbox_idstring | null

    format: "uuid"

  • double_opt_inboolean
  • configobject

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

    Further nesting omitted

  • statusstring

    enum: "active", "paused", "archived"

  • viewsinteger
  • submissionsinteger
  • confirmationsinteger
  • subscribersinteger
  • versioninteger
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • hosted_urlstring
  • embed_codestring
  • embed_slotstring
  • open_buttonstring
  • conversion_ratenumber
  • replayedboolean

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "kind": "inline",
  "list_id": "00000000-0000-4000-8000-000000000001",
  "list_name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "double_opt_in": true,
  "config": {
    "eyebrow": "example",
    "headline": "example",
    "body": "example",
    "button_label": "example",
    "email_placeholder": "example",
    "name_placeholder": "example",
    "fine_print": "example",
    "incentive": "example",
    "success_headline": "example",
    "success_body": "example",
    "redirect_url": "example",
    "image_url": "example",
    "art": "arcs",
    "style": "",
    "count_noun": "example",
    "confirm_promise": "example",
    "text_channels": [
      "sms"
    ],
    "phone_placeholder": "example",
    "text_consent_wording": "example",
    "sms_consent_label": "example",
    "whatsapp_consent_label": "example",
    "locale": "example",
    "collect_name": true,
    "show_logo": true,
    "show_count": true,
    "exit_intent": true,
    "delay_seconds": 0,
    "scroll_percent": 0,
    "frequency_days": 0,
    "image": "none",
    "layout": "stacked",
    "theme": "light",
    "position": "bottom",
    "fields": [
      {
        "key": "example",
        "label": "example",
        "type": "text",
        "required": false,
        "placeholder": "example",
        "options": [
          "example"
        ]
      }
    ]
  }
}'
GET/v1/workspaces/{workspaceId}/signup-forms/readiness

Whether this product can turn forms on (its product lane sends from a verified domain).

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • forms_enabledbooleanrequired
  • reasonstring

    enum: "verified_domain_required"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms/readiness' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/signup-forms/preview

Render unsaved form settings as a complete HTML page on a sketched website.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • kindstring

    enum: "inline", "popup", "bar", "slide_in", "page"

  • configobject

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

  • double_opt_inboolean
  • statestring

    enum: "form", "success"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • statestringrequired

    enum: "form", "success"

  • htmlstringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "kind": "inline",
  "config": {
    "eyebrow": "example",
    "headline": "example",
    "body": "example",
    "button_label": "example",
    "email_placeholder": "example",
    "name_placeholder": "example",
    "fine_print": "example",
    "incentive": "example",
    "success_headline": "example",
    "success_body": "example",
    "redirect_url": "example",
    "image_url": "example",
    "art": "arcs",
    "style": "",
    "count_noun": "example",
    "confirm_promise": "example",
    "text_channels": [
      "sms"
    ],
    "phone_placeholder": "example",
    "text_consent_wording": "example",
    "sms_consent_label": "example",
    "whatsapp_consent_label": "example",
    "locale": "example",
    "collect_name": true,
    "show_logo": true,
    "show_count": true,
    "exit_intent": true,
    "delay_seconds": 0,
    "scroll_percent": 0,
    "frequency_days": 0,
    "image": "none",
    "layout": "stacked",
    "theme": "light",
    "position": "bottom",
    "fields": [
      {
        "key": "example",
        "label": "example",
        "type": "text",
        "required": false,
        "placeholder": "example",
        "options": [
          "example"
        ]
      }
    ]
  },
  "double_opt_in": true,
  "state": "form"
}'
GET/v1/workspaces/{workspaceId}/signup-forms/{formId}

getSignupForm

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

formId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • public_idstringrequired

    pattern: "^f_[a-z0-9]{16}$"

  • namestringrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstringrequired

    format: "uuid"

  • list_namestringrequired
  • mailbox_idstring | nullrequired

    format: "uuid"

  • double_opt_inbooleanrequired
  • configobjectrequired

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

    Further nesting omitted

  • statusstringrequired

    enum: "active", "paused", "archived"

  • viewsintegerrequired
  • submissionsintegerrequired
  • confirmationsintegerrequired
  • subscribersintegerrequired
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • hosted_urlstringrequired
  • embed_codestringrequired
  • embed_slotstringrequired
  • open_buttonstringrequired
  • conversion_ratenumberrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms/{formId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/signup-forms/{formId}

Partial update; config merges into the saved settings; status active, paused or archived; expected_version guards concurrent edits.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

formId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 200

  • kindstring

    default: "inline" · enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstring

    format: "uuid"

  • list_namestring

    maxLength: 200

  • mailbox_idstring | null

    format: "uuid"

  • double_opt_inboolean

    default: true

  • configobject

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

  • statusstring

    enum: "active", "paused", "archived"

  • expected_versioninteger

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • public_idstringrequired

    pattern: "^f_[a-z0-9]{16}$"

  • namestringrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • list_idstringrequired

    format: "uuid"

  • list_namestringrequired
  • mailbox_idstring | nullrequired

    format: "uuid"

  • double_opt_inbooleanrequired
  • configobjectrequired

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

    Further nesting omitted

  • statusstringrequired

    enum: "active", "paused", "archived"

  • viewsintegerrequired
  • submissionsintegerrequired
  • confirmationsintegerrequired
  • subscribersintegerrequired
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • hosted_urlstringrequired
  • embed_codestringrequired
  • embed_slotstringrequired
  • open_buttonstringrequired
  • conversion_ratenumberrequired
  • replayedbooleanrequired

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms/{formId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "kind": "inline",
  "list_id": "00000000-0000-4000-8000-000000000001",
  "list_name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "double_opt_in": true,
  "config": {
    "eyebrow": "example",
    "headline": "example",
    "body": "example",
    "button_label": "example",
    "email_placeholder": "example",
    "name_placeholder": "example",
    "fine_print": "example",
    "incentive": "example",
    "success_headline": "example",
    "success_body": "example",
    "redirect_url": "example",
    "image_url": "example",
    "art": "arcs",
    "style": "",
    "count_noun": "example",
    "confirm_promise": "example",
    "text_channels": [
      "sms"
    ],
    "phone_placeholder": "example",
    "text_consent_wording": "example",
    "sms_consent_label": "example",
    "whatsapp_consent_label": "example",
    "locale": "example",
    "collect_name": true,
    "show_logo": true,
    "show_count": true,
    "exit_intent": true,
    "delay_seconds": 0,
    "scroll_percent": 0,
    "frequency_days": 0,
    "image": "none",
    "layout": "stacked",
    "theme": "light",
    "position": "bottom",
    "fields": [
      {
        "key": "example",
        "label": "example",
        "type": "text",
        "required": false,
        "placeholder": "example",
        "options": [
          "example"
        ]
      }
    ]
  },
  "status": "active",
  "expected_version": 1
}'
POST/v1/workspaces/{workspaceId}/signup-forms/{formId}/preview

Render a saved form, optionally with unsaved changes, in the form or success state.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

formId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • kindstring

    enum: "inline", "popup", "bar", "slide_in", "page"

  • configobject

    No additional properties

  • eyebrowstring

    maxLength: 60

  • headlinestring

    minLength: 1 · maxLength: 140

  • bodystring

    maxLength: 400

  • button_labelstring

    minLength: 1 · maxLength: 40

  • email_placeholderstring

    maxLength: 80

  • name_placeholderstring

    maxLength: 60

  • fine_printstring

    maxLength: 160

  • incentivestring

    maxLength: 160

  • success_headlinestring

    maxLength: 120

  • success_bodystring

    maxLength: 400

  • redirect_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • image_urlstring

    maxLength: 2000 · pattern: "^(|https://[^\\s\"'<>]+)$"

  • artstring

    enum: "arcs", "blocks", "horizon", "confetti", "frame", "bands", "dots"

  • stylestring

    enum: "", "brand", "material", "clarity", "editorial", "bold", "luxe", "playful", "plain"

  • count_nounstring

    maxLength: 30

  • confirm_promisestring

    maxLength: 200

  • text_channelsarray

    Texts (needs the customers feature): the channels the form asks consent for. The form then asks for a mobile number and shows one unticked box per channel under text_consent_wording. A ticked box makes the number the contact's subscribed address on that channel, kept with what the form showed, and a new SMS subscriber gets one confirmation text from the product's SMS inbox. Empty (the default) asks for no number. Not shown on bars.

    maxItems: 2 · uniqueItems: true

  • Each itemstring

    enum: "sms", "whatsapp"

  • phone_placeholderstring

    maxLength: 60

  • text_consent_wordingstring

    What ticking a box agrees to, shown above the consent boxes and kept with each consent as it was shown. {company} in it becomes the brand's company name.

    maxLength: 600

  • sms_consent_labelstring

    maxLength: 120

  • whatsapp_consent_labelstring

    maxLength: 120

  • localestring
  • collect_nameboolean
  • show_logoboolean
  • show_countboolean
  • exit_intentboolean
  • delay_secondsinteger

    minimum: 0 · maximum: 600

  • scroll_percentinteger

    minimum: 0 · maximum: 100

  • frequency_daysinteger

    minimum: 0 · maximum: 365

  • imagestring

    enum: "none", "photo", "art"

  • layoutstring

    enum: "stacked", "split"

  • themestring

    enum: "light", "dark", "brand", "auto"

  • positionstring

    enum: "bottom", "top", "right", "left"

  • fieldsarray

    maxItems: 6

  • Each itemobject

    Select questions require options. Other question types do not accept options. Keys must be unique and cannot use reserved form fields; omitted keys are derived from labels.

    No additional properties

  • keystring

    pattern: "^[a-z][a-z0-9_]{0,39}$"

  • labelstringrequired

    minLength: 1 · maxLength: 80

  • typestring

    default: "text" · enum: "text", "select", "checkbox"

  • requiredboolean

    default: false

  • placeholderstring

    maxLength: 80

  • optionsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 80

  • double_opt_inboolean
  • statestring

    enum: "form", "success"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • statestringrequired

    enum: "form", "success"

  • htmlstringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/signup-forms/{formId}/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "kind": "inline",
  "config": {
    "eyebrow": "example",
    "headline": "example",
    "body": "example",
    "button_label": "example",
    "email_placeholder": "example",
    "name_placeholder": "example",
    "fine_print": "example",
    "incentive": "example",
    "success_headline": "example",
    "success_body": "example",
    "redirect_url": "example",
    "image_url": "example",
    "art": "arcs",
    "style": "",
    "count_noun": "example",
    "confirm_promise": "example",
    "text_channels": [
      "sms"
    ],
    "phone_placeholder": "example",
    "text_consent_wording": "example",
    "sms_consent_label": "example",
    "whatsapp_consent_label": "example",
    "locale": "example",
    "collect_name": true,
    "show_logo": true,
    "show_count": true,
    "exit_intent": true,
    "delay_seconds": 0,
    "scroll_percent": 0,
    "frequency_days": 0,
    "image": "none",
    "layout": "stacked",
    "theme": "light",
    "position": "bottom",
    "fields": [
      {
        "key": "example",
        "label": "example",
        "type": "text",
        "required": false,
        "placeholder": "example",
        "options": [
          "example"
        ]
      }
    ]
  },
  "double_opt_in": true,
  "state": "form"
}'

Public signup forms

OPTIONS/v1/forms/embed.js

Read public signup CORS policy

Public endpoint: no authentication required.

Parameters

No parameters are specified.

Request body

No request body is specified in the contract.

Success response 204

Successful response.

No response body.

curl example

curl --request OPTIONS --globoff 'https://api.bangermail.com/v1/forms/embed.js'
HEAD/v1/forms/embed.js

Read embed script headers

Public endpoint: no authentication required.

Parameters

No parameters are specified.

Request body

No request body is specified in the contract.

Success response 200

Successful response.

No response schema is specified in the contract.

curl example

curl --request HEAD --globoff 'https://api.bangermail.com/v1/forms/embed.js'
GET/v1/forms/{publicId}/widget

A live form's rendered widget (html, css, font link) and popup behavior. Public, CORS open, cached for a minute.

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    pattern: "^f_[a-z0-9]{16}$"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • kindstringrequired

    enum: "inline", "popup", "bar", "slide_in", "page"

  • langstringrequired
  • htmlstringrequired
  • cssstringrequired
  • font_hrefstringrequired
  • redirect_urlstringrequired
  • behaviorobjectrequired
  • delay_secondsnumberrequired
  • scroll_percentnumberrequired
  • exit_intentbooleanrequired
  • frequency_daysnumberrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/forms/{publicId}/widget'
OPTIONS/v1/forms/{publicId}/widget

Read public signup CORS policy

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Successful response.

No response body.

curl example

curl --request OPTIONS --globoff 'https://api.bangermail.com/v1/forms/{publicId}/widget'
POST/v1/forms/{publicId}/subscribe

A visitor signs up. Form-encoded (email, name, page, optional lang) so browsers skip the preflight; JSON is also accepted. Messages and the confirmation email follow the form's language, else lang, else Accept-Language. With double opt-in a confirmation email is sent and the person joins the list after confirming.

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    pattern: "^f_[a-z0-9]{16}$"

Request body required

application/x-www-form-urlencoded

  • valueobject

    Custom answers use x_<field key> (or the unprefixed key). Required answers depend on the form configuration. The handler reads the first 8000 characters of the body.

  • emailstringrequired

    format: "email" · maxLength: 320

  • namestring

    maxLength: 100

  • pagestring

    maxLength: 2000

  • elapsednumber | string

    Milliseconds elapsed since displaying the form.

  • langstring

    maxLength: 35

  • localestring

    maxLength: 35

  • websitestring

    Honeypot; leave empty.

    maxLength: 200

  • phonestring

    A mobile number in international format (+ and the country code), on a form that asks for one. Needed only with a consent box; without one it is not kept.

    maxLength: 40

  • sms_consentstring

    The visitor ticked the SMS box: the number becomes their subscribed SMS address, with what the form showed.

    enum: "yes"

  • whatsapp_consentstring

    The visitor ticked the WhatsApp box: the number becomes their subscribed WhatsApp address, with what the form showed.

    enum: "yes"

  • Additional propertystring | number

application/json

  • valueobject

    Custom answers use x_<field key> (or the unprefixed key). Required answers depend on the form configuration. The handler reads the first 8000 characters of the body.

  • emailstringrequired

    format: "email" · maxLength: 320

  • namestring

    maxLength: 100

  • pagestring

    maxLength: 2000

  • elapsednumber | string

    Milliseconds elapsed since displaying the form.

  • langstring

    maxLength: 35

  • localestring

    maxLength: 35

  • websitestring

    Honeypot; leave empty.

    maxLength: 200

  • phonestring

    A mobile number in international format (+ and the country code), on a form that asks for one. Needed only with a consent box; without one it is not kept.

    maxLength: 40

  • sms_consentstring

    The visitor ticked the SMS box: the number becomes their subscribed SMS address, with what the form showed.

    enum: "yes"

  • whatsapp_consentstring

    The visitor ticked the WhatsApp box: the number becomes their subscribed WhatsApp address, with what the form showed.

    enum: "yes"

  • Additional propertystring | number

Success response 200

Signup accepted.

application/json

  • valueobject
  • okbooleanrequired

    const: true

  • statusstringrequired

    enum: "pending_confirmation", "subscribed", "already_subscribed"

  • redirect_urlstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/forms/{publicId}/subscribe' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "email": "person@example.com",
  "name": "example",
  "page": "example",
  "elapsed": 1,
  "lang": "example",
  "locale": "example",
  "website": "example",
  "phone": "example",
  "sms_consent": "yes",
  "whatsapp_consent": "yes"
}'
OPTIONS/v1/forms/{publicId}/subscribe

Read public signup CORS policy

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Successful response.

No response body.

curl example

curl --request OPTIONS --globoff 'https://api.bangermail.com/v1/forms/{publicId}/subscribe'
POST/v1/forms/{publicId}/view

Counts one display of a widget.

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    pattern: "^f_[a-z0-9]{16}$"

Request body

No request body is specified in the contract.

Success response 204

Counted.

No response body.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/forms/{publicId}/view'
OPTIONS/v1/forms/{publicId}/view

Read public signup CORS policy

Public endpoint: no authentication required.

Parameters

Name / locationSchema
publicId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Successful response.

No response body.

curl example

curl --request OPTIONS --globoff 'https://api.bangermail.com/v1/forms/{publicId}/view'

Templates

GET/v1/workspaces/{workspaceId}/templates

listTemplates

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • body_textstringrequired
  • contentobjectrequired
  • Additional propertystring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstringrequired

    enum: "active", "archived"

  • originstringrequired

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/templates

createTemplate

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

  • contentobject
  • Additional propertystring
  • slotsarray
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • originstring

    enum: "person", "agent", "starter", "import"

  • message_kindstring
  • starter_idstring

    maxLength: 80

  • starter_versioninteger

    minimum: 1

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • body_textstringrequired
  • contentobjectrequired
  • Additional propertystring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstringrequired

    enum: "active", "archived"

  • originstringrequired

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "subject": "example",
  "body_text": "example",
  "body_html": "example",
  "content": {},
  "slots": [
    {
      "key": "example",
      "label": "example",
      "type": "text",
      "help": "example"
    }
  ],
  "origin": "person",
  "message_kind": "example",
  "starter_id": "example",
  "starter_version": 1
}'
POST/v1/workspaces/{workspaceId}/templates/preview

previewDesign

Render unsaved design input with sample or audience values and report placeholder gaps.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

  • contentobject
  • Additional propertystring
  • audienceobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • sample_emailstring

    An existing contact email. Unknown addresses return sample_recipient_not_found. Omit to use sample or audience values.

    maxLength: 320

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • subjectstringrequired
  • body_textstringrequired
  • body_htmlstring
  • font_renderingarrayrequired
  • Each itemobject
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

  • sample_recipientunspecifiedrequired
  • anyOf 1object
  • emailstringrequired
  • display_namestring | nullrequired
  • anyOf 2null
  • required_variablesarrayrequired
  • Each itemstring
  • effective_slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • audience_countinteger
  • gapsarray
  • Each itemobject
  • variablestringrequired
  • missing_countintegerrequired
  • sample_emailsarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "subject": "example",
  "body_text": "example",
  "body_html": "example",
  "content": {},
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "sample_email": "example"
}'
GET/v1/workspaces/{workspaceId}/templates/{templateId}

getTemplate

One design with its inline HTML, fill-in content, and effective slots.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

templateId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • body_textstringrequired
  • contentobjectrequired
  • Additional propertystring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstringrequired

    enum: "active", "archived"

  • originstringrequired

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/{templateId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/templates/{templateId}

updateTemplate

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

templateId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 200

  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    minLength: 1 · maxLength: 2000000

  • contentobject
  • Additional propertystring

    maxLength: 20000

  • slotsarray

    maxItems: 100

  • Each itemobject
  • keystringrequired

    maxLength: 200

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstring

    enum: "active", "archived"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • body_textstringrequired
  • contentobjectrequired
  • Additional propertystring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstringrequired

    enum: "active", "archived"

  • originstringrequired

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/{templateId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "subject": "example",
  "body_text": "example",
  "body_html": "example",
  "content": {},
  "slots": [
    {
      "key": "example",
      "label": "example",
      "type": "text",
      "help": "example"
    }
  ],
  "status": "active"
}'
POST/v1/workspaces/{workspaceId}/templates/{templateId}/duplicate

duplicateTemplate

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

templateId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 200

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • body_textstringrequired
  • contentobjectrequired
  • Additional propertystring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • statusstringrequired

    enum: "active", "archived"

  • originstringrequired

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versionintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • body_html_urlstring

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/{templateId}/duplicate' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example"
}'
POST/v1/workspaces/{workspaceId}/templates/{templateId}/preview

previewTemplate

Render a saved design with sample or audience values and report placeholder gaps.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

templateId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • contentobject
  • Additional propertystring
  • audienceobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • sample_emailstring

    An existing contact email. Unknown addresses return sample_recipient_not_found. Omit to use sample or audience values.

    maxLength: 320

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • subjectstringrequired
  • body_textstringrequired
  • body_htmlstring
  • font_renderingarrayrequired
  • Each itemobject
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

  • sample_recipientunspecifiedrequired
  • anyOf 1object
  • emailstringrequired
  • display_namestring | nullrequired
  • anyOf 2null
  • required_variablesarrayrequired
  • Each itemstring
  • effective_slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • audience_countinteger
  • gapsarray
  • Each itemobject
  • variablestringrequired
  • missing_countintegerrequired
  • sample_emailsarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/{templateId}/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "content": {},
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "sample_email": "example"
}'
GET/v1/workspaces/{workspaceId}/templates/{templateId}/html

getTemplateHtml

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

templateId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Scriptless HTML email template body.

text/html

  • valuestring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/templates/{templateId}/html' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Campaigns

POST/v1/workspaces/{workspaceId}/campaigns/coverage-preview

previewCampaignCoverage

Required placeholders an audience cannot fill, before any Broadcast is saved.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • body_htmlstring

    maxLength: 2000000

  • contentobject
  • Additional propertystring
  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • sample_emailstring

    maxLength: 320

  • template_idstring

    format: "uuid"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • required_variablesarrayrequired
  • Each itemstring
  • audience_countintegerrequired
  • gapsarrayrequired
  • Each itemobject
  • variablestringrequired
  • missing_countintegerrequired
  • sample_emailsarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/coverage-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "subject": "example",
  "body_text": "example",
  "body_html": "example",
  "content": {},
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "sample_email": "example",
  "template_id": "00000000-0000-4000-8000-000000000001"
}'
GET/v1/workspaces/{workspaceId}/campaigns

listCampaigns

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstringrequired
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns

createCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    maxLength: 200

  • mailbox_idstring

    format: "uuid"

  • template_idstringrequired

    format: "uuid"

  • subject_variantsarray

    maxItems: 8

  • Each itemstring

    minLength: 1 · maxLength: 998

  • selected_subject_variantinteger

    minimum: 0

  • audienceobjectrequired
  • all_subscribedboolean

    default: false

  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstringrequired
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "template_id": "00000000-0000-4000-8000-000000000001",
  "subject_variants": [
    "example"
  ],
  "selected_subject_variant": 0,
  "audience": {
    "all_subscribed": false,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  }
}'
POST/v1/workspaces/{workspaceId}/campaigns/audience-preview

previewCampaignAudience

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/audience-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  }
}'
GET/v1/workspaces/{workspaceId}/campaigns/{campaignId}

getCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstringrequired
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/campaigns/{campaignId}

updateCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    maxLength: 200

  • mailbox_idstringrequired

    format: "uuid"

  • template_idstring

    format: "uuid"

  • subject_variantsarray

    maxItems: 8

  • Each itemstring

    minLength: 1 · maxLength: 998

  • selected_subject_variantinteger

    minimum: 0

  • audienceobjectrequired

    Properties not specified in the contract

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstringrequired
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "template_id": "00000000-0000-4000-8000-000000000001",
  "subject_variants": [
    "example"
  ],
  "selected_subject_variant": 0,
  "audience": {}
}'
DELETE/v1/workspaces/{workspaceId}/campaigns/{campaignId}

Delete an unsent campaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • deletedbooleanrequired

    const: true

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/campaigns/{campaignId}/recipients

listCampaignRecipients

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

status
query
  • valuestring

    enum: "pending", "queued", "sent", "failed", "skipped", "delivered", "deferred", "bounced", "complained", "unsubscribed"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • contact_idstring | null

    format: "uuid"

  • recipient_emailstring
  • recipient_namestring | null
  • recipient_hashstring
  • variant_keystring | null

    Persisted Broadcast experiment arm, or holdback before a winner is chosen. Null for a Broadcast without an experiment.

  • statusstring
  • dispatch_statusstring
  • command_idstring | null

    format: "uuid"

  • error_codestring | null
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • delivery_statestring | null
  • provider_message_keystring | null
  • last_event_atstring | null

    format: "date-time"

  • first_delivered_atstring | null

    format: "date-time"

  • first_opened_atstring | null

    format: "date-time"

  • first_clicked_atstring | null

    format: "date-time"

  • first_human_likely_opened_atstring | null

    format: "date-time"

  • first_human_likely_clicked_atstring | null

    format: "date-time"

  • first_replied_atstring | null

    format: "date-time"

  • machine_open_countinteger
  • machine_click_countinteger
  • privacy_proxy_open_countinteger
  • unknown_open_countinteger
  • unknown_click_countinteger
  • first_unsubscribed_atstring | null

    format: "date-time"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/recipients?cursor=example&limit=50&status=pending' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/campaigns/{campaignId}/timeline

listCampaignTimeline

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired
  • typestringrequired
  • occurred_atstringrequired

    format: "date-time"

  • actor_idstring | nullrequired
  • detailobjectrequired
  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/timeline' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/pause

pauseCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstringrequired

    format: "uuid"

  • template_idstring | nullrequired

    format: "uuid"

  • statusstringrequired
  • audience_queryobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • scheduled_atstring | nullrequired

    format: "date-time"

  • started_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/pause' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/resume

resumeCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstringrequired

    format: "uuid"

  • template_idstring | nullrequired

    format: "uuid"

  • statusstringrequired
  • audience_queryobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • scheduled_atstring | nullrequired

    format: "date-time"

  • started_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/resume' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/cancel

cancelCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstringrequired

    format: "uuid"

  • template_idstring | nullrequired

    format: "uuid"

  • statusstringrequired
  • audience_queryobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • scheduled_atstring | nullrequired

    format: "date-time"

  • started_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/cancel' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/schedule

scheduleCampaign

Deprecated

Deprecated direct scheduling boundary. Always returns governed_review_required; use the campaign review endpoint so the workspace recipient threshold is enforced.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response

No success response is specified in the contract.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/schedule' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/test

testCampaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject
  • tostringrequired

    minLength: 3 · maxLength: 320

  • data_modestring

    default: "contact" · enum: "sample", "fallback", "contact"

  • contact_emailstring

    maxLength: 320

  • variant_keystring

    maxLength: 80

  • localestring

Success response 202

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • action_kindstringrequired

    enum: "transactional.send"

  • idstringrequired

    format: "uuid"

  • send_intent_idstringrequired

    format: "uuid"

  • provider_attempt_idstringrequired

    format: "uuid"

  • statusstringrequired
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/test' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "to": "example",
  "data_mode": "contact",
  "contact_email": "example",
  "variant_key": "example",
  "locale": "example"
}'
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/review

requestCampaignReview

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versioninteger

    minimum: 1

  • expected_design_versioninteger

    minimum: 1

  • recipient_selectionobject

    No additional properties

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • scheduled_atstring

    format: "date-time"

  • send_nowboolean

    const: true

  • approve_as_launcherboolean

    A person pressing Send approves this exact request when the review policy needs a person. Ignored for API keys and agents, which wait in Approvals.

  • oneOf 1unspecified
  • oneOf 2unspecified

Success response 201

Campaign scheduling approval created.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/review' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '"example"'
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/archive

Archive a campaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • archived_atstring | nullrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/archive' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/campaigns/{campaignId}/unarchive

Unarchive a campaign

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • archived_atstring | nullrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/unarchive' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/campaigns/{campaignId}/design-test

Save one to four campaign email designs

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

campaignId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • mailbox_idstringrequired

    format: "uuid"

  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • automatic_translationboolean
  • variantsarrayrequired

    minItems: 1 · maxItems: 4

  • Each itemobject
  • body_htmlstringrequired

    minLength: 1 · maxLength: 2000000

  • subjectstring

    maxLength: 10000

  • body_textstring

    maxLength: 2000000

  • contentobject
  • Additional propertystring

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstringrequired
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value
  • design_template_idstringrequired

    format: "uuid"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/campaigns/{campaignId}/design-test' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "automatic_translation": true,
  "variants": [
    {
      "body_html": "example",
      "subject": "example",
      "body_text": "example",
      "content": {}
    }
  ]
}'

Broadcasts

POST/v1/workspaces/{workspaceId}/broadcasts

createBroadcast

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • mailbox_idstring

    Existing sender address. Omit to use the onboarding sender, then an active custom mailbox, then hosted.

    format: "uuid"

  • template_idstring

    format: "uuid"

  • audienceobject

    No additional properties

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • subject_variantsarray

    maxItems: 8

  • Each itemstring

    minLength: 1 · maxLength: 998

  • selected_subject_variantinteger

    minimum: 0 · maximum: 7

  • expires_after_secondsinteger

    Discard unsent recipients after this many seconds from the scheduled time; defaults to seven days.

    minimum: 1 · maximum: 604800

  • content_overridesobject
  • Additional propertystring

    maxLength: 20000

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1unspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstring
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value
  • broadcast_idstringrequired

    format: "uuid"

  • sender_addressstring | nullrequired
  • sending_blockerunspecifiedrequired
  • anyOf 1object
  • codestringrequired

    Further nesting omitted

  • messagestringrequired

    Further nesting omitted

  • anyOf 2null
  • designunspecifiedrequired
  • anyOf 1object
  • idstring

    format: "uuid"

    Further nesting omitted

  • product_idstring

    format: "uuid"

    Further nesting omitted

  • namestring

    Further nesting omitted

  • subjectstring

    Further nesting omitted

  • body_textstring

    Further nesting omitted

  • contentobject

    Further nesting omitted

  • slotsarray

    Further nesting omitted

  • statusstring

    enum: "active", "archived"

    Further nesting omitted

  • originstring

    enum: "person", "agent", "starter", "import"

    Further nesting omitted

  • created_by_actor_idstring | null

    Further nesting omitted

  • campaign_idstring | null

    format: "uuid"

    Further nesting omitted

  • message_kindstring

    Further nesting omitted

  • starter_idstring | null

    Further nesting omitted

  • starter_versioninteger | null

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • created_atstring

    format: "date-time"

    Further nesting omitted

  • updated_atstring

    format: "date-time"

    Further nesting omitted

  • body_html_urlstring

    format: "uri"

    Further nesting omitted

  • body_htmlstring | null

    Further nesting omitted

  • body_html_b2_keystring | null

    Further nesting omitted

  • anyOf 2null
  • managed_contentunspecifiedrequired
  • anyOf 1unspecified
  • allOf 1object

    Further nesting omitted

  • allOf 2object

    Further nesting omitted

  • anyOf 2null
  • subjectstring | nullrequired
  • sender_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • addressstringrequired

    Further nesting omitted

  • display_namestringrequired

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • anyOf 2null
  • reply_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • addressstringrequired

    Further nesting omitted

  • display_namestringrequired

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • anyOf 2null
  • design_versioninteger | nullrequired
  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • allOf 2object
  • replayedbooleanrequired
  • allOf 2object
  • previewobject
  • subjectstringrequired
  • preheaderstring
  • htmlstringrequired
  • textstringrequired
  • localestringrequired
  • directionstringrequired

    enum: "ltr", "rtl"

  • warningsarray
  • Each itemstring
  • Additional propertyAny value
  • translation_jobsarrayrequired
  • Each itemstring

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "template_id": "00000000-0000-4000-8000-000000000001",
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "subject_variants": [
    "example"
  ],
  "selected_subject_variant": 0,
  "expires_after_seconds": 1,
  "content_overrides": {}
}'
GET/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}

getBroadcast

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstring
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value
  • broadcast_idstringrequired

    format: "uuid"

  • sender_addressstring | nullrequired
  • sending_blockerunspecifiedrequired
  • anyOf 1object
  • codestringrequired
  • messagestringrequired
  • anyOf 2null
  • designunspecifiedrequired
  • anyOf 1object
  • idstring

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestring
  • subjectstring
  • body_textstring
  • contentobject
  • Additional propertystring
  • slotsarray
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

    Further nesting omitted

  • labelstring

    maxLength: 120

    Further nesting omitted

  • typestring

    enum: "text", "paragraph", "url", "image"

    Further nesting omitted

  • helpstring

    maxLength: 300

    Further nesting omitted

  • statusstring

    enum: "active", "archived"

  • originstring

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versioninteger
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

  • body_htmlstring | null
  • body_html_b2_keystring | null
  • anyOf 2null
  • managed_contentunspecifiedrequired
  • anyOf 1unspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject

    Further nesting omitted

  • translation_jobsarray
  • Each itemobject

    Further nesting omitted

  • allOf 2object
  • source_revisionunspecifiedrequired
  • anyOf 1object

    Further nesting omitted

  • anyOf 2null

    Further nesting omitted

  • published_source_revisionunspecifiedrequired
  • anyOf 1object

    Further nesting omitted

  • anyOf 2null

    Further nesting omitted

  • translationsarrayrequired
  • Each itemobject

    Further nesting omitted

  • anyOf 2null
  • subjectstring | nullrequired
  • sender_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • display_namestringrequired
  • statusstringrequired
  • anyOf 2null
  • reply_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • display_namestringrequired
  • statusstringrequired
  • anyOf 2null
  • design_versioninteger | nullrequired
  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
PATCH/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}

updateBroadcast

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestring

    minLength: 1 · maxLength: 200

  • mailbox_idstring

    format: "uuid"

  • template_idstring

    format: "uuid"

  • audienceobject

    No additional properties

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • subject_variantsarray

    maxItems: 8

  • Each itemstring

    minLength: 1 · maxLength: 998

  • selected_subject_variantinteger

    minimum: 0 · maximum: 7

  • expires_after_secondsinteger

    Discard unsent recipients after this many seconds from the scheduled time.

    minimum: 1 · maximum: 604800

  • content_overridesobject
  • Additional propertystring

    maxLength: 20000

  • expected_versionintegerrequired

    minimum: 1

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • mailbox_idstring

    format: "uuid"

  • template_idstring | null

    format: "uuid"

  • managed_content_idstring | null

    format: "uuid"

  • managed_source_revision_idstring | null

    format: "uuid"

  • managed_publication_idstring | null

    format: "uuid"

  • managed_locales_snapshotarray
  • Each itemstring
  • expires_after_secondsinteger | null
  • statusstring
  • versionintegerrequired
  • subject_variantsarray
  • Each itemstring
  • selected_subject_variantinteger
  • content_overridesobject
  • Additional propertystring
  • audience_queryobject

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • audience_frozen_atstring | null

    format: "date-time"

  • audience_recipient_countinteger | null
  • audience_snapshot_sha256string | null
  • audience_snapshot_campaign_versioninteger | null
  • scheduled_atstring | null

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • archived_atstring | null

    format: "date-time"

  • statsobject
  • Additional propertyAny value
  • broadcast_idstringrequired

    format: "uuid"

  • sender_addressstring | nullrequired
  • sending_blockerunspecifiedrequired
  • anyOf 1object
  • codestringrequired
  • messagestringrequired
  • anyOf 2null
  • designunspecifiedrequired
  • anyOf 1object
  • idstring

    format: "uuid"

  • product_idstring

    format: "uuid"

  • namestring
  • subjectstring
  • body_textstring
  • contentobject
  • Additional propertystring

    Further nesting omitted

  • slotsarray
  • Each itemobject

    Further nesting omitted

  • statusstring

    enum: "active", "archived"

  • originstring

    enum: "person", "agent", "starter", "import"

  • created_by_actor_idstring | null
  • campaign_idstring | null

    format: "uuid"

  • message_kindstring
  • starter_idstring | null
  • starter_versioninteger | null
  • versioninteger
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • body_html_urlstring

    format: "uri"

  • body_htmlstring | null
  • body_html_b2_keystring | null
  • anyOf 2null
  • managed_contentunspecifiedrequired
  • anyOf 1unspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • versionintegerrequired

    minimum: 1

    Further nesting omitted

  • review_requiredbooleanrequired

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • submitted_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • approved_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revisionobject

    Further nesting omitted

  • translationsarray

    Further nesting omitted

  • translation_jobsarray

    Further nesting omitted

  • allOf 2object
  • source_revisionunspecifiedrequired

    Further nesting omitted

  • published_source_revisionunspecifiedrequired

    Further nesting omitted

  • translationsarrayrequired

    Further nesting omitted

  • anyOf 2null
  • subjectstring | nullrequired
  • sender_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • display_namestringrequired
  • statusstringrequired
  • anyOf 2null
  • reply_mailboxunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

  • addressstringrequired
  • display_namestringrequired
  • statusstringrequired
  • anyOf 2null
  • design_versioninteger | nullrequired
  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "template_id": "00000000-0000-4000-8000-000000000001",
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "subject_variants": [
    "example"
  ],
  "selected_subject_variant": 0,
  "expires_after_seconds": 1,
  "content_overrides": {},
  "expected_version": 1
}'
POST/v1/workspaces/{workspaceId}/broadcasts/audience-preview

previewBroadcastAudience

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • audienceobjectrequired

    No additional properties

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • template_idstring

    format: "uuid"

  • subjectstring

    minLength: 0 · maxLength: 10000

  • content_overridesobject
  • Additional propertystring

    maxLength: 20000

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired
  • allOf 2object
  • eligible_countintegerrequired
  • required_variablesarrayrequired
  • Each itemstring
  • missing_personalization_fieldsarrayrequired
  • Each itemobject
  • variablestringrequired
  • missingCountintegerrequired
  • sampleEmailsarrayrequired
  • Each itemstring

    Further nesting omitted

  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/audience-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  },
  "template_id": "00000000-0000-4000-8000-000000000001",
  "subject": "example",
  "content_overrides": {}
}'
POST/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/audience-preview

previewSavedBroadcastAudience

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • audienceobject

    No additional properties

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • attributesobjectrequired
  • Additional propertyAny value
  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired
  • allOf 2object
  • eligible_countintegerrequired
  • required_variablesarrayrequired
  • Each itemstring
  • missing_personalization_fieldsarrayrequired
  • Each itemobject
  • variablestringrequired
  • missingCountintegerrequired
  • sampleEmailsarrayrequired
  • Each itemstring

    Further nesting omitted

  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/audience-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "audience": {
    "all_subscribed": true,
    "contact_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "list_ids": [
      "00000000-0000-4000-8000-000000000001"
    ],
    "segment_ids": [
      "00000000-0000-4000-8000-000000000001"
    ]
  }
}'
GET/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/readiness

checkBroadcastReadiness

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • broadcast_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • readybooleanrequired
  • blockersarrayrequired
  • Each itemobject
  • codestringrequired
  • messagestringrequired
  • audienceunspecifiedrequired
  • allOf 1object
  • countintegerrequired
  • missing_consent_evidence_countintegerrequired
  • samplearrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • emailstringrequired

    Further nesting omitted

  • display_namestring | nullrequired

    Further nesting omitted

  • attributesobjectrequired

    Further nesting omitted

  • excludedobjectrequired
  • suppressedintegerrequired
  • not_subscribedintegerrequired
  • missing_recipient_hashintegerrequired
  • missing_consent_evidenceintegerrequired
  • allOf 2object
  • eligible_countintegerrequired
  • required_variablesarrayrequired
  • Each itemstring
  • missing_personalization_fieldsarrayrequired
  • Each itemobject
  • variablestringrequired

    Further nesting omitted

  • missingCountintegerrequired

    Further nesting omitted

  • sampleEmailsarrayrequired

    Further nesting omitted

  • audienceobjectrequired

    Select all subscribed contacts or at least one nonempty contact_ids, list_ids, or segment_ids list.

  • all_subscribedboolean
  • contact_idsarray

    maxItems: 10000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • list_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • segment_idsarray

    maxItems: 1000

  • Each itemstring

    format: "uuid"

    Further nesting omitted

  • campaign_versionintegerrequired
  • design_versioninteger | nullrequired
  • languagesunspecifiedrequired
  • anyOf 1object

    Audience languages still translating never hold the Broadcast. Their readers get it once their translation is ready, and are skipped (translation_failed, translation_awaiting_review or translation_still_preparing) if it is not ready within a day of sending.

  • requestedarrayrequired
  • Each itemobject
  • localestringrequired

    Further nesting omitted

  • countintegerrequired

    Further nesting omitted

  • pending_localesarrayrequired
  • Each itemstring
  • waiting_localesarrayrequired
  • Each itemstring
  • anyOf 2null
  • sendingobjectrequired
  • route_kindstring | null
  • sending_stream_idstring | null

    format: "uuid"

  • banger_send_limitinteger | string | null
  • daily_send_limitinteger | string | null
  • usedinteger | string | null
  • daily_usedinteger | string | null
  • delivery_paceunspecifiedrequired
  • anyOf 1object
  • daysintegerrequired
  • daily_limitintegerrequired
  • messagestringrequired
  • anyOf 2null
  • approval_requirementsobjectrequired
  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired
  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring
  • footerobjectrequired
  • identity_presentbooleanrequired
  • address_presentbooleanrequired
  • checks_are_advisorybooleanrequired

    const: true

  • next_actionstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/readiness' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/recipients

listBroadcastRecipients

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    minLength: 0 · maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100

status
query
  • valuestring

    enum: "pending", "queued", "sent", "delivered", "failed", "skipped", "bounced", "complained"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • contact_idstring | null

    format: "uuid"

  • recipient_emailstring
  • recipient_namestring | null
  • recipient_hashstring
  • variant_keystring | null

    Persisted Broadcast experiment arm, or holdback before a winner is chosen. Null for a Broadcast without an experiment.

  • statusstring
  • dispatch_statusstring
  • command_idstring | null

    format: "uuid"

  • error_codestring | null
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • delivery_statestring | null
  • provider_message_keystring | null
  • last_event_atstring | null

    format: "date-time"

  • first_delivered_atstring | null

    format: "date-time"

  • first_opened_atstring | null

    format: "date-time"

  • first_clicked_atstring | null

    format: "date-time"

  • first_human_likely_opened_atstring | null

    format: "date-time"

  • first_human_likely_clicked_atstring | null

    format: "date-time"

  • first_replied_atstring | null

    format: "date-time"

  • machine_open_countinteger
  • machine_click_countinteger
  • privacy_proxy_open_countinteger
  • unknown_open_countinteger
  • unknown_click_countinteger
  • first_unsubscribed_atstring | null

    format: "date-time"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired
  • delivery_semanticsstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/recipients?cursor=example&limit=1&status=pending' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/timeline

listBroadcastTimeline

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

broadcastId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired
  • typestringrequired
  • occurred_atstringrequired

    format: "date-time"

  • actor_idstring | nullrequired
  • detailobjectrequired
  • Additional propertyAny value
  • delivery_semanticsstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/broadcasts/{broadcastId}/timeline' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'

Journeys

GET/v1/workspaces/{workspaceId}/journeys

listJourneys

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

status
query
  • valuestring

    enum: "draft", "discovered", "active", "paused", "archived"

trigger_kind
query
  • valuestring
testing
query
  • valuestring

    enum: "1"

q
query
  • valuestring

    maxLength: 200

Request body

No request body is specified in the contract.

Success response 200

Product Journeys.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemunspecified
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring

    Further nesting omitted

  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

    Further nesting omitted

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

    Further nesting omitted

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

    Further nesting omitted

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

    Further nesting omitted

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

    Further nesting omitted

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

    Further nesting omitted

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject

    Further nesting omitted

  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring

    Further nesting omitted

  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

    Further nesting omitted

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

    Further nesting omitted

  • preheaderstring

    maxLength: 100000

    Further nesting omitted

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

    Further nesting omitted

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

    Further nesting omitted

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

    Further nesting omitted

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

    Further nesting omitted

  • variablesobjectrequired

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject

    Further nesting omitted

  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

    Further nesting omitted

  • positioninteger

    minimum: 1 · maximum: 100

    Further nesting omitted

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

    Further nesting omitted

  • namestringrequired

    minLength: 1 · maxLength: 200

    Further nesting omitted

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

    Further nesting omitted

  • armsarray

    minItems: 2 · maxItems: 4

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys?status=draft&trigger_kind=example&testing=1&q=example' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/journeys

createJourney

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • body_textstring

    maxLength: 100000

  • layoutstring

    maxLength: 100000

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

  • oneOf 1object

    No additional properties

  • typestringrequired

    enum: "string", "text", "url", "image_url", "html", "date", "datetime", "number", "boolean", "money"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultunspecified

    Must match the field type.

    Further nesting omitted

  • oneOf 2object

    No additional properties

  • typeunspecifiedrequired

    const: "object"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultobject

    Further nesting omitted

  • propertiesobjectrequired

    Further nesting omitted

  • oneOf 3object

    No additional properties

  • typeunspecifiedrequired

    const: "list"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultarray

    Further nesting omitted

  • itemsunspecifiedrequired

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring
  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

  • versioninteger
  • draft_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revision_idstring | null

    format: "uuid"

  • layout_revision_idstring | null

    format: "uuid"

  • published_layout_revision_idstring | null

    format: "uuid"

  • source_localestring | null
  • configured_localesarray
  • Each itemstring
  • variablesobject
  • Additional propertyAny value
  • published_variablesobject
  • Additional propertyAny value
  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

  • keystringrequired

    enum: "A", "B", "C", "D"

  • labelstringrequired

    maxLength: 120

  • allocationnumberrequired

    minimum: 0 · maximum: 100

  • stepsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

Success response 201

Journey created.

application/json

  • valueobject
  • dataunspecified
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "from_local_part": "example",
  "trigger": {
    "kind": "manual",
    "connection_id": "00000000-0000-4000-8000-000000000001",
    "config": {
      "event": "example",
      "every": 1,
      "unit": "weeks",
      "time": "09:00",
      "timezone": "UTC",
      "once_per_person": true,
      "reentry_days": 1
    },
    "conditions": [
      {}
    ]
  },
  "audience": {},
  "goal": {
    "kind": "none",
    "connection_id": "00000000-0000-4000-8000-000000000001",
    "config": {}
  },
  "exit": {
    "on_reply": true,
    "on_unsubscribe": true,
    "on_suppression": true,
    "event": "example"
  },
  "approval_mode": "policy",
  "api": {
    "key": "example",
    "content_mode": "code",
    "identity": "example"
  },
  "managed_content": {
    "source_locale": "example",
    "configured_locales": [
      "example"
    ],
    "fallback_locale": "example",
    "layout_id": "00000000-0000-4000-8000-000000000001",
    "localization_policy": {
      "manual_review": false
    },
    "source": {
      "subject": "example",
      "preheader": "example",
      "body_text": "example",
      "body_html": "example",
      "layout": "example",
      "variants": {},
      "variables": {}
    },
    "samples": {},
    "translations": {}
  },
  "steps": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "position": 1,
      "kind": "email",
      "name": "example",
      "config": {},
      "arms": [
        {
          "key": "A",
          "label": "example",
          "allocation": 0,
          "steps": [
            {
              "id": null,
              "position": null,
              "kind": null,
              "name": null,
              "config": null,
              "arms": null
            }
          ]
        }
      ]
    }
  ]
}'
GET/v1/workspaces/{workspaceId}/journeys/{journeyId}

getJourney

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Journey definition, enrollment activity, and tests.

application/json

  • valueobject
  • dataunspecified
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/journeys/{journeyId}

updateJourney

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • body_textstring

    maxLength: 100000

  • layoutstring

    maxLength: 100000

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

  • oneOf 1object

    No additional properties

  • typestringrequired

    enum: "string", "text", "url", "image_url", "html", "date", "datetime", "number", "boolean", "money"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultunspecified

    Must match the field type.

    Further nesting omitted

  • oneOf 2object

    No additional properties

  • typeunspecifiedrequired

    const: "object"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultobject

    Further nesting omitted

  • propertiesobjectrequired

    Further nesting omitted

  • oneOf 3object

    No additional properties

  • typeunspecifiedrequired

    const: "list"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultarray

    Further nesting omitted

  • itemsunspecifiedrequired

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring
  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

  • versioninteger
  • draft_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revision_idstring | null

    format: "uuid"

  • layout_revision_idstring | null

    format: "uuid"

  • published_layout_revision_idstring | null

    format: "uuid"

  • source_localestring | null
  • configured_localesarray
  • Each itemstring
  • variablesobject
  • Additional propertyAny value
  • published_variablesobject
  • Additional propertyAny value
  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

  • keystringrequired

    enum: "A", "B", "C", "D"

  • labelstringrequired

    maxLength: 120

  • allocationnumberrequired

    minimum: 0 · maximum: 100

  • stepsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

Success response 200

Journey updated.

application/json

  • valueobject
  • dataunspecified
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "from_local_part": "example",
  "trigger": {
    "kind": "manual",
    "connection_id": "00000000-0000-4000-8000-000000000001",
    "config": {
      "event": "example",
      "every": 1,
      "unit": "weeks",
      "time": "09:00",
      "timezone": "UTC",
      "once_per_person": true,
      "reentry_days": 1
    },
    "conditions": [
      {}
    ]
  },
  "audience": {},
  "goal": {
    "kind": "none",
    "connection_id": "00000000-0000-4000-8000-000000000001",
    "config": {}
  },
  "exit": {
    "on_reply": true,
    "on_unsubscribe": true,
    "on_suppression": true,
    "event": "example"
  },
  "approval_mode": "policy",
  "api": {
    "key": "example",
    "content_mode": "code",
    "identity": "example"
  },
  "managed_content": {
    "source_locale": "example",
    "configured_locales": [
      "example"
    ],
    "fallback_locale": "example",
    "layout_id": "00000000-0000-4000-8000-000000000001",
    "localization_policy": {
      "manual_review": false
    },
    "source": {
      "subject": "example",
      "preheader": "example",
      "body_text": "example",
      "body_html": "example",
      "layout": "example",
      "variants": {},
      "variables": {}
    },
    "samples": {},
    "translations": {}
  },
  "steps": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "position": 1,
      "kind": "email",
      "name": "example",
      "config": {},
      "arms": [
        {
          "key": "A",
          "label": "example",
          "allocation": 0,
          "steps": [
            {
              "id": null,
              "position": null,
              "kind": null,
              "name": null,
              "config": null,
              "arms": null
            }
          ]
        }
      ]
    }
  ]
}'
PATCH/v1/workspaces/{workspaceId}/journeys/{journeyId}

Update selected Journey fields while preserving its other definition fields.

Supports name, description, mailbox_id, from_local_part, trigger, audience, goal, exit, approval_mode, api, and steps. Trigger, goal, api, and exit objects merge one level; steps replace the supplied tree. Include expected_version to reject a stale edit.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versioninteger

    minimum: 1

  • namestring
  • descriptionstring
  • mailbox_idstring

    format: "uuid"

  • from_local_partstring
  • triggerobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject
  • Additional propertyAny value
  • exitobject
  • Additional propertyAny value
  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • Additional propertyAny value
  • stepsarray
  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

  • versioninteger
  • draft_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revision_idstring | null

    format: "uuid"

  • layout_revision_idstring | null

    format: "uuid"

  • published_layout_revision_idstring | null

    format: "uuid"

  • source_localestring | null
  • configured_localesarray
  • Each itemstring
  • variablesobject
  • Additional propertyAny value
  • published_variablesobject
  • Additional propertyAny value
  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

  • keystringrequired

    enum: "A", "B", "C", "D"

  • labelstringrequired

    maxLength: 120

  • allocationnumberrequired

    minimum: 0 · maximum: 100

  • stepsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

Success response 200

Journey updated.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "expected_version": 1,
  "name": "example",
  "description": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "from_local_part": "example",
  "trigger": {},
  "audience": {},
  "goal": {},
  "exit": {},
  "approval_mode": "policy",
  "api": {},
  "steps": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "position": 1,
      "kind": "email",
      "name": "example",
      "config": {},
      "arms": [
        {
          "key": "A",
          "label": "example",
          "allocation": 0,
          "steps": [
            {
              "id": null,
              "position": null,
              "kind": null,
              "name": null,
              "config": null,
              "arms": null
            }
          ]
        }
      ]
    }
  ]
}'
DELETE/v1/workspaces/{workspaceId}/journeys/{journeyId}

deleteJourney

Removes the journey from the default list and stops active enrollments by archiving it. Sending history is retained.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Journey removed.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/convert-managed

Convert a paused or draft legacy Journey to prepared managed content.

One-way conversion. For a Journey with one email step, supply contract. For multiple emails, including split arms, supply step_contents with exactly one saved step_id and prepared HTML/Liquid contract per email. The conversion is atomic and changes the Journey to draft. Every new managed content revision receives its own governed publication review; no email is sent or published during conversion. Banger never imports or executes source code.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versionintegerrequired

    minimum: 1

  • contractobject

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • body_textstring

    maxLength: 100000

  • layoutstring

    maxLength: 100000

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

  • oneOf 1object

    No additional properties

  • typestringrequired

    enum: "string", "text", "url", "image_url", "html", "date", "datetime", "number", "boolean", "money"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultunspecified

    Must match the field type.

    Further nesting omitted

  • oneOf 2object

    No additional properties

  • typeunspecifiedrequired

    const: "object"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultobject

    Further nesting omitted

  • propertiesobjectrequired

    Further nesting omitted

  • oneOf 3object

    No additional properties

  • typeunspecifiedrequired

    const: "list"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultarray

    Further nesting omitted

  • itemsunspecifiedrequired

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring
  • step_contentsarray

    minItems: 1

  • Each itemobject

    No additional properties

  • step_idstringrequired

    format: "uuid"

  • contractobjectrequired

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • oneOf 1unspecified
  • oneOf 2unspecified

Success response 200

Idempotent replay of the same conversion.

application/json

  • valueobject
  • dataobjectrequired
  • journey_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft"

  • review_requiredbooleanrequired

    const: true

  • managed_content_stepsarrayrequired
  • Each itemobject
  • step_idstringrequired

    format: "uuid"

  • managed_content_idstringrequired

    format: "uuid"

  • content_versionintegerrequired
  • source_revision_idstring | nullrequired

    format: "uuid"

  • previewobjectrequired
  • subjectstringrequired
  • preheaderstring
  • htmlstringrequired
  • textstringrequired
  • localestringrequired
  • directionstringrequired

    enum: "ltr", "rtl"

  • warningsarray
  • Each itemstring

    Further nesting omitted

  • Additional propertyAny value
  • translation_jobsarrayrequired
  • Each itemstring

    format: "uuid"

  • managed_content_idstring

    format: "uuid"

  • content_versioninteger
  • source_revision_idstring | null

    format: "uuid"

  • previewobject
  • subjectstringrequired
  • preheaderstring
  • htmlstringrequired
  • textstringrequired
  • localestringrequired
  • directionstringrequired

    enum: "ltr", "rtl"

  • warningsarray
  • Each itemstring
  • Additional propertyAny value
  • replayedbooleanrequired
  • approvalsarrayrequired
  • Each itemobject
  • step_idstringrequired

    format: "uuid"

  • approvalobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring

    Further nesting omitted

  • resource_scopeobjectrequired
  • Additional propertyarray

    Further nesting omitted

  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

    Further nesting omitted

  • authorization_referencestring

    Further nesting omitted

  • run_idstring

    Further nesting omitted

  • operation_keystring

    Further nesting omitted

  • recipientsarray

    Further nesting omitted

  • approval_sha256string

    Further nesting omitted

  • resource_sha256string

    Further nesting omitted

  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

    Further nesting omitted

  • recipient_countinteger | nullrequired

    minimum: 0

    Further nesting omitted

  • reasonsarrayrequired

    Further nesting omitted

  • checksarrayrequired

    Further nesting omitted

  • approvalobject
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/convert-managed' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '"example"'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/render

Render one saved Journey email step without sending.

Specify step_id when the Journey has multiple email steps, including split branches. Uses the selected draft or published immutable content revision.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • step_idstring

    format: "uuid"

  • content_statestring

    default: "draft" · enum: "draft", "published"

  • localestring
  • timezonestring
  • sample_setstring
  • variablesobject
  • Additional propertyAny value

Success response 200

Rendered subject, HTML, plain text, locale, revision identifiers, and extraction warnings.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • subjectstringrequired
  • preheaderstring
  • htmlstringrequired
  • textstringrequired
  • localestringrequired
  • directionstringrequired

    enum: "ltr", "rtl"

  • warningsarray
  • Each itemstring
  • Additional propertyAny value
  • allOf 2object
  • source_revision_idstringrequired

    format: "uuid"

  • layout_revision_idstring | nullrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/render' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "step_id": "00000000-0000-4000-8000-000000000001",
  "content_state": "draft",
  "locale": "example",
  "timezone": "example",
  "sample_set": "example",
  "variables": {}
}'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/status

setJourneyStatus

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • statusstringrequired

    enum: "draft", "active", "paused", "archived"

Success response 200

Journey status updated.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/status' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "status": "draft"
}'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/preview

previewJourney

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Journey audience and readiness preview.

application/json

  • valueobject
  • dataobjectrequired
  • sequence_idstringrequired

    format: "uuid"

  • recipient_countintegerrequired
  • sample_recipientsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestring | nullrequired
  • stepsarrayrequired
  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

  • versioninteger
  • draft_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revision_idstring | null

    format: "uuid"

  • layout_revision_idstring | null

    format: "uuid"

  • published_layout_revision_idstring | null

    format: "uuid"

  • source_localestring | null
  • configured_localesarray
  • Each itemstring

    Further nesting omitted

  • variablesobject
  • Additional propertyAny value
  • published_variablesobject
  • Additional propertyAny value
  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

  • keystringrequired

    enum: "A", "B", "C", "D"

    Further nesting omitted

  • labelstringrequired

    maxLength: 120

    Further nesting omitted

  • allocationnumberrequired

    minimum: 0 · maximum: 100

    Further nesting omitted

  • stepsarrayrequired

    Further nesting omitted

  • readybooleanrequired
  • exit_configobjectrequired

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • emailsarrayrequired
  • Each itemobject
  • step_idstring | nullrequired

    format: "uuid"

  • namestringrequired
  • armobject
  • split_step_idstring

    format: "uuid"

  • keystringrequired
  • labelstringrequired
  • sourcestringrequired

    enum: "managed", "design", "inline", "empty"

  • template_idstring

    format: "uuid"

  • managed_content_idstring

    format: "uuid"

  • subjectstringrequired
  • previewstringrequired
  • blockersarrayrequired
  • Each itemobject
  • codestringrequired

    Further nesting omitted

  • messagestringrequired

    Further nesting omitted

  • blockersarrayrequired
  • Each itemobject
  • codestringrequired
  • messagestringrequired
  • step_idstring | nullrequired

    format: "uuid"

  • step_namestringrequired
  • armstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/enroll

Enroll explicit contacts in a Journey through a governed approval.

Alias of POST /approvals with action_kind sequence.enroll and payload {sequence_id, contact_ids, sequence_version?, sequence_definition_sha256?}. It uses the same Idempotency-Key, so the same key returns the same approval from either route. Requires campaigns:send and a product.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • contact_idsarrayrequired

    minItems: 1 · maxItems: 2000

  • Each itemstring

    format: "uuid"

  • sequence_versioninteger

    minimum: 1

  • sequence_definition_sha256string

    pattern: "^[a-f0-9]{64}$"

Success response 200

The same Idempotency-Key replayed an existing approval.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/enroll' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "contact_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "sequence_version": 1,
  "sequence_definition_sha256": "example"
}'
GET/v1/workspaces/{workspaceId}/journeys/{journeyId}/executions

listJourneyExecutions

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Journey step executions.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • enrollment_idstringrequired

    format: "uuid"

  • step_idstringrequired

    format: "uuid"

  • positionintegerrequired
  • kindstringrequired
  • namestringrequired
  • statusstringrequired
  • attempt_countintegerrequired
  • send_intent_idstring | nullrequired

    format: "uuid"

  • error_codestring | nullrequired
  • started_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/executions' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/journeys/{journeyId}/people

listJourneyPeople

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 200 · default: 50

state
query
  • valuestring

    enum: "in_progress", "finished", "goal_reached", "exited", "failed"

query
query
  • valuestring

    maxLength: 320

step_id
query
  • valuestring

    format: "uuid"

at
query
  • valuestring

    default: "now" · enum: "now", "received"

Request body

No request body is specified in the contract.

Success response 200

The people in the Journey, newest entry first, with each email step's outcome.

application/json

  • valueobject
  • dataobjectrequired
  • stepsobjectrequired

    Keyed by step id, for every step anyone has reached.

  • Additional propertyobject
  • receivedintegerrequired
  • skippedintegerrequired
  • failedintegerrequired
  • nowintegerrequired
  • emailsarrayrequired
  • Each itemobject
  • step_idstringrequired

    format: "uuid"

  • namestringrequired
  • subjectstringrequired
  • split_step_idstring

    format: "uuid"

  • arm_keystring
  • countsobjectrequired
  • allintegerrequired
  • in_progressintegerrequired
  • finishedintegerrequired
  • goal_reachedintegerrequired
  • exitedintegerrequired
  • failedintegerrequired
  • peoplearrayrequired
  • Each itemobject
  • enrollment_idstringrequired

    format: "uuid"

  • contact_idstringrequired

    format: "uuid"

  • emailstringrequired
  • display_namestringrequired
  • statestringrequired

    enum: "in_progress", "finished", "goal_reached", "exited", "failed"

  • stop_reasonstring
  • error_codestring
  • current_stepobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • kindstringrequired
  • next_action_atstring

    format: "date-time"

  • enrolled_atstringrequired

    format: "date-time"

  • completed_atstring

    format: "date-time"

  • pathsobjectrequired
  • Additional propertystring
  • emailsobjectrequired

    Keyed by email step id. A step with no entry has not been reached.

  • Additional propertyobject
  • statestringrequired

    translating means the email waits for the person's translation. skipped carries error_code translation_failed, translation_awaiting_review or translation_still_preparing (why the translation was not ready in time), and none when the milestone was reached first.

    enum: "pending", "translating", "skipped", "failed", "queued", "sent", "delivered", "opened", "clicked", "replied", "bounced", "complained"

    Further nesting omitted

  • atstringrequired

    format: "date-time"

    Further nesting omitted

  • send_intent_idstring

    Read the exact message this person received with GET /transactional-sends/{send_intent_id}.

    format: "uuid"

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • languageunspecified

    The language the person got this email in, or, while translating, the one it waits for.

    Further nesting omitted

  • variant_keystring

    The experiment variant of this email the person got, when the step runs an experiment.

    Further nesting omitted

  • pageobjectrequired
  • has_morebooleanrequired
  • next_cursorstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/people?cursor=example&limit=50&state=in_progress&query=example&step_id=00000000-0000-4000-8000-000000000001&at=now' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/journeys/{journeyKey}/send

sendJourney

Sends one email through the Journey. A key Banger has not seen yet records a new Journey from this email and sends it; the key of a Journey you created sends once that Journey is approved and on. reply_to defaults to the Journey's mailbox; an empty list also means the default. A refusal (4xx) leaves nothing frozen for the recipient, so a corrected call with a new idempotency key sends.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyKey
path · required
  • valuestring

    minLength: 1 · maxLength: 100

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject
  • tounspecified

    Recipients for to, cc, bcc and reply_to: an address ("a@example.com" or "Pat <a@example.com>"), an { email, name } object, or a list mixing both. Banger stores them as { email, name } objects with the email lowercased. The idempotency hash covers the body as sent, so retry with the same shape.

  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • oneOf 3array

    maxItems: 500

  • Each itemunspecified
  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • reply_tounspecified

    Recipients for to, cc, bcc and reply_to: an address ("a@example.com" or "Pat <a@example.com>"), an { email, name } object, or a list mixing both. Banger stores them as { email, name } objects with the email lowercased. The idempotency hash covers the body as sent, so retry with the same shape.

  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • oneOf 3array

    maxItems: 500

  • Each itemunspecified
  • oneOf 1string

    minLength: 3 · maxLength: 1000

  • oneOf 2object
  • namestring
  • emailstringrequired

    format: "email"

  • expires_atstring

    format: "date-time"

  • expires_after_secondsinteger

    minimum: 1 · maximum: 604800

  • attachmentsarray

    Files sent with the email; their base64 content may total 10 MiB.

    maxItems: 20

  • Each itemobject

    No additional properties

  • filenamestringrequired

    Name the recipient sees, on one line.

    minLength: 1 · maxLength: 500

  • contentstringrequired

    The file encoded as base64; whitespace is ignored.

    minLength: 4

  • content_typestring

    Media type such as application/pdf, without parameters. Defaults to application/octet-stream.

    maxLength: 255

  • content_idstring

    Content-ID an HTML body can reference as cid:<content_id>.

    minLength: 1 · maxLength: 500

  • Additional propertyAny value

Success response 202

Journey email accepted.

application/json

  • valueobject
  • dataobjectrequired
  • action_kindstringrequired

    enum: "transactional.send"

  • idstring

    format: "uuid"

  • send_intent_idstring

    format: "uuid"

  • provider_attempt_idstring

    format: "uuid"

  • statusstringrequired

    sent/queued states from delivery, or for a frozen request: deferred (scheduled by policy or a translation wait), processing (being sent), discarded.

  • replayedboolean
  • journeyunspecifiedrequired
  • anyOf 1object
  • journey_idstringrequired

    format: "uuid"

  • enrollment_idstringrequired

    format: "uuid"

  • step_idstringrequired

    format: "uuid"

  • step_positionintegerrequired
  • originstring

    enum: "journey"

  • journey_identitystring
  • anyOf 2null
  • ignored_variablesarrayrequired
  • Each itemstring
  • scheduled_atstring

    format: "date-time"

  • reasonstring
  • communication_reservation_idstring

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyKey}/send' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "to": "example",
  "reply_to": "example",
  "expires_at": "2026-01-01T00:00:00Z",
  "expires_after_seconds": 1,
  "attachments": [
    {
      "filename": "example",
      "content": "example",
      "content_type": "example",
      "content_id": "example"
    }
  ]
}'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/claim

claimJourney

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • mailbox_idstringrequired

    format: "uuid"

  • delivery_classstringrequired

    enum: "product", "broadcast"

  • content_modestringrequired

    enum: "code", "managed"

  • template_idstring

    format: "uuid"

  • from_sampleboolean
  • variablesarray

    maxItems: 50

  • Each itemobject
  • literalstringrequired

    minLength: 1 · maxLength: 10000

  • namestringrequired

    pattern: "^[a-z][a-z0-9_]{0,63}$"

  • activateboolean

Success response 200

Discovered Journey claimed.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/claim' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "delivery_class": "product",
  "content_mode": "code",
  "template_id": "00000000-0000-4000-8000-000000000001",
  "from_sample": true,
  "variables": [
    {
      "literal": "example",
      "name": "example"
    }
  ],
  "activate": true
}'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/merge

mergeJourneys

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • loser_idstringrequired

    format: "uuid"

Success response 200

Journeys merged.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/merge' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "loser_id": "00000000-0000-4000-8000-000000000001"
}'
POST/v1/workspaces/{workspaceId}/journeys/{journeyId}/splits/{stepId}/decide

decideJourneySplit

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

stepId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • arm_keystringrequired

Success response 200

Winning arm promoted.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • descriptionstring

    maxLength: 2000

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

  • triggerobjectrequired
  • kindstringrequired

    enum: "manual", "contact_created", "audience_joined", "event", "schedule", "inbound_email", "email_replied", "api"

  • connection_idstring

    format: "uuid"

  • configobject
  • eventstring
  • everyinteger

    For schedule triggers, calendar interval from the activation-local date.

    minimum: 1 · maximum: 366 · default: 1

  • unitstring

    For schedule triggers. Months clamp to the last day without changing the original anchor day.

    default: "weeks" · enum: "days", "weeks", "months"

  • timestring

    Schedule wall-clock time. The first occurrence is strictly after activation; DST gaps are skipped and repeated wall times run once.

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" · default: "09:00"

  • timezonestring

    IANA zone for schedule triggers. Only the latest due occurrence is recovered after downtime; times missed while paused are skipped. Trigger conditions must be empty; select contacts with audience. Normal review, suppression and re-entry rules still apply.

    default: "UTC"

  • once_per_personboolean

    Each person enters once. Set false to let people re-enter after they finish.

    default: true

  • reentry_daysinteger

    With once_per_person false, days after a person's last entry before they may enter again.

    minimum: 1 · maximum: 365

  • Additional propertyAny value
  • conditionsarray
  • Each itemobject
  • Additional propertyAny value
  • audienceobject
  • Additional propertyAny value
  • goalobject

    No additional properties

  • kindstringrequired

    enum: "none", "event", "reply", "conversion"

  • connection_idstring

    format: "uuid"

  • configobjectrequired
  • Additional propertyAny value
  • exitobject

    No additional properties

  • on_replyboolean

    default: true

  • on_unsubscribeboolean

    default: true

  • on_suppressionboolean

    default: true

  • eventstring

    maxLength: 200

  • approval_modestring

    enum: "policy", "required"

  • apiobject
  • keystring

    maxLength: 100

  • content_modestring

    enum: "code", "managed"

  • identitystring

    maxLength: 300

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

  • Each itemobject

    No additional properties

  • idstring

    format: "uuid"

  • positioninteger

    minimum: 1 · maximum: 100

  • kindstringrequired

    enum: "email", "wait", "condition", "action", "split"

  • namestringrequired

    minLength: 1 · maxLength: 200

  • managed_contentobject

    Typed source contract and draft/published revision identity for an email step.

  • idstring

    format: "uuid"

    Further nesting omitted

  • versioninteger

    Further nesting omitted

  • draft_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_publication_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • published_layout_revision_idstring | null

    format: "uuid"

    Further nesting omitted

  • source_localestring | null

    Further nesting omitted

  • configured_localesarray

    Further nesting omitted

  • variablesobject

    Further nesting omitted

  • published_variablesobject

    Further nesting omitted

  • configobjectrequired

    Wait steps optionally accept until with name, path, operator (equals, not_equals, contains, or exists), and value, plus required on_met (continue or end_journey). continue skips the following reminder email; end_journey completes the Journey. A reminder email must immediately follow in the same branch. The wait checks current customer data every minute up to amount/unit. Missing fields are unknown and hold the reminder. Ordinary waits and standalone conditions retain their existing behavior. Name checks with verified customer milestones. Managed email steps reference the published content through managed_content_id; activation rejects an unpublished reference. Every email step sets delivery_class: product (transactional email, such as receipts and account mail) or broadcast (marketing, which carries an unsubscribe link and needs the product Brand's company name and mailing address); a step without it is refused with 400 journey_delivery_class_required. Email steps may set expires_after_seconds (1-604800) to discard a deferred send after that interval from its original start; the default is seven days.

  • Additional propertyAny value
  • armsarray

    minItems: 2 · maxItems: 4

  • Each itemobject

    No additional properties

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

  • api_keystring | null
  • content_modestring | null

    enum: "code", "managed", null

  • identitystring | null
  • identity_aliasesarray
  • Each itemstring
  • samplesarray
  • Each itemobject
  • Additional propertyAny value
  • versionintegerrequired

    minimum: 1

  • statsobjectrequired
  • Additional propertyAny value
  • stepStatsarray
  • Each itemobject
  • Additional propertyAny value
  • armStatsarray
  • Each itemobject
  • Additional propertyAny value
  • healthobjectrequired
  • Additional propertyAny value
  • indicatorobjectrequired
  • Additional propertyAny value
  • sparklinearrayrequired
  • Each itemnumber
  • activated_atstring | null

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • last_activity_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/splits/{stepId}/decide' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "arm_key": "example"
}'
GET/v1/workspaces/{workspaceId}/journeys/{journeyId}/splits/recommend

recommendJourneyArms

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

journeyId
path · required
  • valuestring

    format: "uuid"

position
query
  • valueinteger

    minimum: 1 · maximum: 100

Request body

No request body is specified in the contract.

Success response 200

Recommended test arm count and decision time.

application/json

  • valueobject
  • dataobjectrequired
  • arms_maxintegerrequired
  • weekly_arrivalsintegerrequired
  • per_arm_eta_daysobjectrequired
  • Additional propertynumber

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/splits/recommend?position=1' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Approvals

GET/v1/workspaces/{workspaceId}/approvals/{approvalId}/managed-layout-preview/{contentId}

Read full source-locale before/after renders for content bound to one layout approval.

Rebuilds from immutable revisions and verifies both source hashes against the approval snapshot. No locale override is accepted.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

sample
query
  • valuestring

Request body

No request body is specified in the contract.

Success response 200

Full hash-verified before and after subject, HTML, and plain text.

application/json

  • valueobject
  • dataobjectrequired
  • content_idstringrequired

    format: "uuid"

  • sample_namestring | nullrequired
  • localestringrequired
  • old_source_hashstringrequired
  • new_source_hashstringrequired
  • beforeobjectrequired
  • subjectstringrequired
  • htmlstringrequired
  • textstringrequired
  • afterobjectrequired
  • subjectstringrequired
  • htmlstringrequired
  • textstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/managed-layout-preview/{contentId}?sample=example' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/approvals/{approvalId}/journey-preview

Render every email of a Journey activation or enrollment approval from its bound review snapshot.

Emails render with sample personalization from the exact reviewed definition (saved designs by their immutable HTML key, pinned managed revisions), never the live Journey. Also names the audience lists, segments and trigger/goal connections the snapshot references.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Rendered emails keyed by step position (arm steps as parent.arm.position), plus audience and connection names.

application/json

  • valueobject
  • dataobjectrequired
  • approval_idstringrequired

    format: "uuid"

  • sequence_idstring | null

    format: "uuid"

  • emailsarrayrequired
  • Each itemobject
  • keystringrequired
  • positionintegerrequired
  • parent_positioninteger | nullrequired
  • arm_keystring | nullrequired
  • sourcestringrequired

    enum: "managed", "design", "inline", "empty"

  • subjectstringrequired
  • preview_textstringrequired
  • body_htmlstring
  • body_textstringrequired
  • publishedboolean
  • errorstring
  • listsarrayrequired
  • Each itemobject
  • idstringrequired
  • namestringrequired
  • member_countintegerrequired
  • segmentsarrayrequired
  • Each itemobject
  • idstringrequired
  • namestringrequired
  • connectionsarrayrequired
  • Each itemobject
  • idstringrequired
  • namestringrequired
  • image_assetsobjectrequired
  • Additional propertystring
  • sample_valuesbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/journey-preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/approvals

listApprovalRequests

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

status
query
  • valuestring

    enum: "undecided", "pending", "approved", "rejected", "cancelled", "expired"

Request body

No request body is specified in the contract.

Success response 200

Automatic and human review audit inbox for the workspace.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals?status=undecided' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/approvals

createApprovalRequest

For canonical Banger actions, Banger derives exact scopes, applies the workspace review policy, records an immutable audit request, and automatically queues actions within the configured limit. To publish managed email source, use action_kind managed_email.publish and payload {content_id, expected_version}; Banger binds the source revision/hash and enforces human review when required. Generic approval kinds always remain pending and must provide summary, capabilities, and resources. In mail.draft and transactional.send payloads, to, cc, bcc and reply_to accept any RecipientInput shape and are stored as { email, name } objects.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header

Required for recognized Banger actions; custom approval requests do not consume this header.

  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • action_kindstringrequired

    minLength: 1 · maxLength: 100

  • summarystring

    minLength: 1 · maxLength: 500

  • capabilitiesarray

    minItems: 1 · maxItems: 50

  • Each itemstring

    maxLength: 100

  • resourcesobject
  • Additional propertyarray

    maxItems: 500

  • Each itemstring

    maxLength: 200

  • payloadobjectrequired
  • Additional propertyAny value
  • expires_in_secondsinteger

    minimum: 60 · maximum: 86400 · default: 3600

  • approve_as_launcherboolean

    For sequence.activate: a person pressing Turn on approves this exact request when the review policy needs a person. Ignored for API keys and agents, which wait in Approvals.

Success response 201

Governed request created; it may already be automatically approved and queued.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "action_kind": "example",
  "summary": "example",
  "capabilities": [
    "example"
  ],
  "resources": {},
  "payload": {},
  "expires_in_seconds": 3600,
  "approve_as_launcher": true
}'
GET/v1/workspaces/{workspaceId}/approvals/count

Count approvals that are waiting or were missed before a decision.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Product-scoped undecided approval counts.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • pendingintegerrequired

    minimum: 0

  • missedintegerrequired

    minimum: 0

  • totalintegerrequired

    minimum: 0

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/count' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/approvals/{approvalId}

getApprovalRequest

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Exact approval request and bound action payload.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/approvals/{approvalId}/decision

decideApprovalRequest

Human browser sessions only. Workspace API keys cannot decide approvals.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • decisionstringrequired

    enum: "approved", "rejected"

  • reasonstring

    maxLength: 500

  • expected_payload_sha256string

    Hash of the exact approval payload displayed to the reviewer; a mismatch returns 409.

    pattern: "^[a-f0-9]{64}$"

Success response 200

Approval decision recorded.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/decision' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "decision": "approved",
  "reason": "example",
  "expected_payload_sha256": "example"
}'
POST/v1/workspaces/{workspaceId}/approvals/{approvalId}/cancel

cancelApprovalRequest

Cancel a still-pending approval without executing it. Human browser sessions only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • reasonstring

    maxLength: 500

Success response 200

Approval cancelled and any waiting agent run resumed without the action.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/cancel' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "reason": "example"
}'
POST/v1/workspaces/{workspaceId}/approvals/{approvalId}/dismiss

dismissApprovalRequest

Dismiss an approval whose decision window was missed. Human browser sessions only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Missed approval dismissed and recorded as cancelled.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/dismiss' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/approvals/{approvalId}/rerequest

rerequestApprovalRequest

Clone a missed approval with a fresh decision window and cancel the old request. Human browser sessions only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 201

Fresh approval request created.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/rerequest' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/approvals/{approvalId}/revise

reviseApprovalRequest

Replace a pending governed Banger action with a newly canonicalized approval. The previous request remains in history as cancelled.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • payloadobjectrequired
  • Additional propertyAny value

Success response 201

Replacement approval created for human review.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/approvals/{approvalId}/revise' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "payload": {}
}'

Agent runs

GET/v1/workspaces/{workspaceId}/agent-runs

List recent internal-agent runs for the workspace.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

Request body

No request body is specified in the contract.

Success response 200

Recent runs in reverse chronological order.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • execution_job_idstring

    format: "uuid"

  • requested_by_actor_idstringrequired
  • taskstringrequired
  • modelstringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "running", "waiting_approval", "waiting_external", "succeeded", "failed", "cancelled"

  • max_stepsintegerrequired
  • max_runtime_secondsintegerrequired
  • current_generationintegerrequired
  • latest_checkpointobject | null
  • Additional propertyAny value
  • latest_checkpoint_sequenceintegerrequired
  • resultobject | null
  • Additional propertyAny value
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired
  • stepsarray
  • Each itemobject
  • sequenceintegerrequired

    minimum: 1

  • attempt_generationintegerrequired

    minimum: 1

  • kindstringrequired

    enum: "model", "tool", "checkpoint", "approval", "output", "system"

  • statusstringrequired

    enum: "started", "succeeded", "failed", "waiting_approval", "waiting_external"

  • namestring | null
  • inputunspecified
  • outputunspecified
  • error_codestring | null
  • input_tokensinteger | null

    minimum: 0

  • output_tokensinteger | null

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agent-runs?limit=50' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/agent-runs

Start an isolated Banger internal-agent run.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • taskstringrequired

    minLength: 1 · maxLength: 32000

  • modelstring

    minLength: 1 · maxLength: 200

  • max_stepsinteger

    minimum: 1 · maximum: 50 · default: 12

  • max_runtime_secondsinteger

    minimum: 30 · maximum: 3600 · default: 900

  • connection_toolsarray

    maxItems: 20

  • Each itemobject

    No additional properties

  • connection_idstringrequired

    format: "uuid"

  • adapter_keystringrequired

    minLength: 1 · maxLength: 63

  • operationsarrayrequired

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    minLength: 1 · maxLength: 100

  • action_toolsarray

    maxItems: 6 · uniqueItems: true

  • Each itemstring

    enum: "mailbox.create", "mail.draft", "transactional.send", "template.update", "campaign.draft", "campaign.schedule"

Success response 200

Idempotent replay of the existing run.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • execution_job_idstring

    format: "uuid"

  • requested_by_actor_idstringrequired
  • taskstringrequired
  • modelstringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "running", "waiting_approval", "waiting_external", "succeeded", "failed", "cancelled"

  • max_stepsintegerrequired
  • max_runtime_secondsintegerrequired
  • current_generationintegerrequired
  • latest_checkpointobject | null
  • Additional propertyAny value
  • latest_checkpoint_sequenceintegerrequired
  • resultobject | null
  • Additional propertyAny value
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired
  • stepsarray
  • Each itemobject
  • sequenceintegerrequired

    minimum: 1

  • attempt_generationintegerrequired

    minimum: 1

  • kindstringrequired

    enum: "model", "tool", "checkpoint", "approval", "output", "system"

  • statusstringrequired

    enum: "started", "succeeded", "failed", "waiting_approval", "waiting_external"

  • namestring | null
  • inputunspecified
  • outputunspecified
  • error_codestring | null
  • input_tokensinteger | null

    minimum: 0

  • output_tokensinteger | null

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agent-runs' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "task": "example",
  "model": "example",
  "max_steps": 12,
  "max_runtime_seconds": 900,
  "connection_tools": [
    {
      "connection_id": "00000000-0000-4000-8000-000000000001",
      "adapter_key": "example",
      "operations": [
        "example"
      ]
    }
  ],
  "action_tools": [
    "mailbox.create"
  ]
}'
GET/v1/workspaces/{workspaceId}/agent-runs/{runId}

getAgentRun

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

runId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical run, checkpoint, terminal result, and ordered steps.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • execution_job_idstring

    format: "uuid"

  • requested_by_actor_idstringrequired
  • taskstringrequired
  • modelstringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "running", "waiting_approval", "waiting_external", "succeeded", "failed", "cancelled"

  • max_stepsintegerrequired
  • max_runtime_secondsintegerrequired
  • current_generationintegerrequired
  • latest_checkpointobject | null
  • Additional propertyAny value
  • latest_checkpoint_sequenceintegerrequired
  • resultobject | null
  • Additional propertyAny value
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired
  • stepsarray
  • Each itemobject
  • sequenceintegerrequired

    minimum: 1

  • attempt_generationintegerrequired

    minimum: 1

  • kindstringrequired

    enum: "model", "tool", "checkpoint", "approval", "output", "system"

  • statusstringrequired

    enum: "started", "succeeded", "failed", "waiting_approval", "waiting_external"

  • namestring | null
  • inputunspecified
  • outputunspecified
  • error_codestring | null
  • input_tokensinteger | null

    minimum: 0

  • output_tokensinteger | null

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agent-runs/{runId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/agent-runs/{runId}/cancel

cancelAgentRun

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

runId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Agent run cancelled.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • execution_job_idstring

    format: "uuid"

  • requested_by_actor_idstringrequired
  • taskstringrequired
  • modelstringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "running", "waiting_approval", "waiting_external", "succeeded", "failed", "cancelled"

  • max_stepsintegerrequired
  • max_runtime_secondsintegerrequired
  • current_generationintegerrequired
  • latest_checkpointobject | null
  • Additional propertyAny value
  • latest_checkpoint_sequenceintegerrequired
  • resultobject | null
  • Additional propertyAny value
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • started_atstring | null

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired
  • stepsarray
  • Each itemobject
  • sequenceintegerrequired

    minimum: 1

  • attempt_generationintegerrequired

    minimum: 1

  • kindstringrequired

    enum: "model", "tool", "checkpoint", "approval", "output", "system"

  • statusstringrequired

    enum: "started", "succeeded", "failed", "waiting_approval", "waiting_external"

  • namestring | null
  • inputunspecified
  • outputunspecified
  • error_codestring | null
  • input_tokensinteger | null

    minimum: 0

  • output_tokensinteger | null

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agent-runs/{runId}/cancel' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Agents

GET/v1/workspaces/{workspaceId}/agents

List the AI agents (MCP clients) that can act for this workspace.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Active agent connections, newest first.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • client_namestringrequired
  • client_surfacestringrequired

    The agent platform behind an OAuth connection, from the client's name and redirect URIs.

    enum: "codex", "chatgpt", "claude", "grok", "gemini", "other_agent"

  • scopesarrayrequired
  • Each itemstring
  • connected_atstringrequired

    format: "date-time"

  • last_active_atstringrequired

    format: "date-time"

  • connected_by_youbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agents' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/agents/{agentId}/revoke

Revoke one agent's access. It stops working within about 30 seconds.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

agentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Agent access revoked.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • revokedbooleanrequired

    const: true

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/agents/{agentId}/revoke' \
  --header "Authorization: Bearer $BANGER_API_KEY"

AI commands

POST/v1/workspaces/{workspaceId}/ai/command-runs

Start a mail assistant command with reads and confirmation-only proposals

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

X-Banger-Product-Id
header
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • commandTextstringrequired

    minLength: 1 · maxLength: 8000

Success response 200

Read requests, an answer, or actions requiring confirmation

application/json

  • valueobject
  • runIdstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "requires_tool_results", "completed", "requires_confirmation"

  • assistantMessagestringrequired
  • toolCallsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • toolNamestringrequired
  • argumentsobjectrequired
  • Additional propertyAny value
  • reasonstringrequired
  • proposedActionsarrayrequired
  • Each itemunspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • toolNamestringrequired
  • argumentsobjectrequired
  • Additional propertyAny value
  • reasonstringrequired
  • allOf 2object
  • confirmationRequiredbooleanrequired

    const: true

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/ai/command-runs' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "commandText": "example"
}'
POST/v1/workspaces/{workspaceId}/ai/command-runs/{runId}/tool-results

Continue an actor-owned command in its original product scope

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

runId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • toolResultsarrayrequired

    minItems: 1 · maxItems: 8

  • Each itemobject
  • toolCallIdstringrequired

    format: "uuid"

  • toolNamestringrequired

    enum: "list_mailboxes", "search_mail", "list_unread", "list_work_items", "get_thread"

  • okbooleanrequired
  • resultunspecified
  • errorstring

Success response 200

Next command response; repeated results replay without another inference call

application/json

  • valueobject
  • runIdstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "requires_tool_results", "completed", "requires_confirmation"

  • assistantMessagestringrequired
  • toolCallsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • toolNamestringrequired
  • argumentsobjectrequired
  • Additional propertyAny value
  • reasonstringrequired
  • proposedActionsarrayrequired
  • Each itemunspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • toolNamestringrequired
  • argumentsobjectrequired
  • Additional propertyAny value
  • reasonstringrequired
  • allOf 2object
  • confirmationRequiredbooleanrequired

    const: true

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/ai/command-runs/{runId}/tool-results' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "toolResults": [
    {
      "toolCallId": "00000000-0000-4000-8000-000000000001",
      "toolName": "list_mailboxes",
      "ok": true,
      "result": "example",
      "error": "example"
    }
  ]
}'
POST/v1/workspaces/{workspaceId}/ai/email/revise

Generate a reviewable email revision without saving or sending it.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • connection_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "openai", "anthropic"

  • modelstring

    maxLength: 200

  • instructionstringrequired

    minLength: 1 · maxLength: 40000

  • currentobjectrequired

    No additional properties

  • subjectstringrequired

    maxLength: 998

  • body_textstringrequired

    maxLength: 100000

  • body_htmlstringrequired

    maxLength: 200000

Success response 200

Structured revision proposal from the selected customer-owned AI connection.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • dataobjectrequired

    No additional properties

  • subjectstringrequired
  • subject_optionsarrayrequired
  • Each itemstring
  • body_textstringrequired
  • body_htmlstringrequired
  • change_summarystringrequired
  • provider_response_idstring
  • modelstringrequired
  • usageobject
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/ai/email/revise' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "connection_id": "00000000-0000-4000-8000-000000000001",
  "provider": "openai",
  "model": "example",
  "instruction": "example",
  "current": {
    "subject": "example",
    "body_text": "example",
    "body_html": "example"
  }
}'
GET/v1/workspaces/{workspaceId}/ai/email/capabilities

getAiEmailCapabilities

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • categorizationobjectrequired
  • availablebooleanrequired

    const: false

  • enabledbooleanrequired

    const: false

  • reasonstringrequired

    enum: "not_configured"

  • managedunspecifiedrequired
  • oneOf 1object
  • availablebooleanrequired

    const: false

  • oneOf 2object
  • availablebooleanrequired

    const: true

  • providerstringrequired

    enum: "openai", "anthropic"

  • modelstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/ai/email/capabilities' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/ai/email/generate

generateEmailWithAi

Generate a complete on-brand email design from a brief. Proposal only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject
  • briefstringrequired

    minLength: 1 · maxLength: 40000

  • audiencestring

    maxLength: 4000

  • starterobject
  • subjectstring

    maxLength: 998

  • body_textstring

    maxLength: 100000

  • body_htmlstring

    maxLength: 200000

  • connection_idstring

    format: "uuid"

  • providerstring

    enum: "openai", "anthropic"

  • modelstring

    maxLength: 200

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • dataobjectrequired
  • subjectstringrequired
  • subject_optionsarrayrequired
  • Each itemstring
  • body_textstringrequired
  • body_htmlstringrequired
  • change_summarystringrequired
  • provider_response_idstring
  • modelstringrequired
  • usageobject
  • Additional propertyAny value
  • managedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/ai/email/generate' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "brief": "example",
  "audience": "example",
  "starter": {
    "subject": "example",
    "body_text": "example",
    "body_html": "example"
  },
  "connection_id": "00000000-0000-4000-8000-000000000001",
  "provider": "openai",
  "model": "example"
}'

Analytics

POST/v1/workspaces/{workspaceId}/analytics/visitor

Link a website visit to the signed-in person

Requires a signed-in human session; API keys are rejected.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • visitor_idstringrequired

    pattern: "^[A-Za-z0-9-]{8,64}$"

Success response 204

Successful response.

No response body.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/analytics/visitor' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "visitor_id": "example"
}'
POST/v1/workspaces/{workspaceId}/analytics/ad-click

Report the ad click the signed-in person arrived with

The web app hands over the ad click IDs a person arrived with, once, after sign-in. The first click is stored on the account; when the account is new, its signup is reported to Google Ads and Meta. Requires a signed-in human session; API keys are rejected.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • gclidstring

    maxLength: 500

  • gbraidstring

    maxLength: 500

  • wbraidstring

    maxLength: 500

  • fbclidstring

    maxLength: 500

  • fbcstring

    Meta click cookie value, fb.1.<ms>.<fbclid>.

    maxLength: 600

  • fbpstring

    Meta browser cookie value, fb.1.<ms>.<random>.

    maxLength: 100

  • utm_sourcestring

    maxLength: 100

  • utm_mediumstring

    maxLength: 100

  • utm_campaignstring

    maxLength: 100

  • utm_termstring

    maxLength: 100

  • utm_contentstring

    maxLength: 100

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "reported", "recorded", "already_recorded"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/analytics/ad-click' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "gclid": "example",
  "gbraid": "example",
  "wbraid": "example",
  "fbclid": "example",
  "fbc": "example",
  "fbp": "example",
  "utm_source": "example",
  "utm_medium": "example",
  "utm_campaign": "example",
  "utm_term": "example",
  "utm_content": "example"
}'

Answer agents

GET/v1/workspaces/{workspaceId}/answer-agents

listAnswerAgents

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Workspace answer agents.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • identityIdstringrequired

    format: "uuid"

  • workspaceIdstringrequired

    format: "uuid"

  • originstringrequired

    const: "internal"

  • namestringrequired
  • systemPromptstring
  • enabledbooleanrequired
  • sendPolicystringrequired

    enum: "draft_only", "reviewed_send", "direct_send"

  • mailboxIdsarrayrequired
  • Each itemstring

    format: "uuid"

  • createdAtstringrequired

    format: "date-time"

  • updatedAtstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/answer-agents' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/answer-agents

createAnswerAgent

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 100

  • system_promptstring

    maxLength: 32000

  • enabledboolean

    default: true

  • send_policystring

    default: "draft_only" · enum: "draft_only", "reviewed_send", "direct_send"

  • mailbox_idsarray

    maxItems: 250

  • Each itemstring

    format: "uuid"

Success response 201

Answer agent created.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • identityIdstringrequired

    format: "uuid"

  • workspaceIdstringrequired

    format: "uuid"

  • originstringrequired

    const: "internal"

  • namestringrequired
  • systemPromptstring
  • enabledbooleanrequired
  • sendPolicystringrequired

    enum: "draft_only", "reviewed_send", "direct_send"

  • mailboxIdsarrayrequired
  • Each itemstring

    format: "uuid"

  • createdAtstringrequired

    format: "date-time"

  • updatedAtstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/answer-agents' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "system_prompt": "example",
  "enabled": true,
  "send_policy": "draft_only",
  "mailbox_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'

Assets

GET/v1/workspaces/{workspaceId}/assets

List product email images and their immutable public URLs.

Needs mail:read or campaigns:read.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Up to 100 newest product email images.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • filenamestringrequired
  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp"

  • size_bytesintegerrequired

    minimum: 1 · maximum: 2097152

  • sha256stringrequired

    pattern: "^[a-f0-9]{64}$"

  • created_atstringrequired

    format: "date-time"

  • public_urlstringrequired

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/assets' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/assets

Store an immutable image for managed email content.

Send raw PNG, JPEG, GIF or WebP bytes with the matching Content-Type and optional X-File-Name, or JSON with base64, mime_type and filename. Both forms allow up to 2 MiB decoded image bytes. The response URL can be used directly in HTML; no localized destination registry is created. Needs mail:write or campaigns:write.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

image/png

  • valuestring

    format: "binary"

image/jpeg

  • valuestring

    format: "binary"

image/gif

  • valuestring

    format: "binary"

image/webp

  • valuestring

    format: "binary"

application/json

  • valueobject

    No additional properties

  • base64stringrequired

    Image bytes

  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp"

  • filenamestring

    maxLength: 200

Success response 201

Registered image with immutable public URL.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • filenamestringrequired
  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp"

  • size_bytesintegerrequired

    minimum: 1 · maximum: 2097152

  • sha256stringrequired

    pattern: "^[a-f0-9]{64}$"

  • created_atstringrequired

    format: "date-time"

  • public_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/assets' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "base64": "example",
  "mime_type": "image/png",
  "filename": "example"
}'
GET/v1/workspaces/{workspaceId}/assets/{assetId}

Read one product email image's metadata and public URL.

Needs mail:read or campaigns:read.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

assetId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Product image metadata.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • filenamestringrequired
  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp"

  • size_bytesintegerrequired

    minimum: 1 · maximum: 2097152

  • sha256stringrequired

    pattern: "^[a-f0-9]{64}$"

  • created_atstringrequired

    format: "date-time"

  • public_urlstringrequired

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/assets/{assetId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'

Automation

POST/v1/workspaces/{workspaceId}/automation/jobs

createExecutionJob

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • kindstringrequired

    minLength: 1 · maxLength: 100

  • approval_idstring

    format: "uuid"

  • capabilitiesarrayrequired

    API keys may delegate only capabilities already present on that key.

    minItems: 1 · maxItems: 50

  • Each itemstring

    maxLength: 100

  • resourcesobjectrequired
  • Additional propertyarray

    maxItems: 500

  • Each itemstring

    maxLength: 200

  • inputobjectrequired
  • Additional propertyAny value

Success response 200

Idempotent replay of an existing isolated execution job.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • placement_idstringrequired

    format: "uuid"

  • placement_generationintegerrequired

    format: "int64"

  • kindstringrequired
  • requested_by_actor_idstringrequired
  • approval_idstring | null

    format: "uuid"

  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "leased", "succeeded", "failed", "cancelled"

  • attempt_countintegerrequired
  • resultunspecified
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/automation/jobs' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "kind": "example",
  "approval_id": "00000000-0000-4000-8000-000000000001",
  "capabilities": [
    "example"
  ],
  "resources": {},
  "input": {}
}'
GET/v1/workspaces/{workspaceId}/automation/jobs/{jobId}

getExecutionJob

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

jobId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current canonical execution state.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • placement_idstringrequired

    format: "uuid"

  • placement_generationintegerrequired

    format: "int64"

  • kindstringrequired
  • requested_by_actor_idstringrequired
  • approval_idstring | null

    format: "uuid"

  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • statusstringrequired

    enum: "queued", "leased", "succeeded", "failed", "cancelled"

  • attempt_countintegerrequired
  • resultunspecified
  • error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • completed_atstring | null

    format: "date-time"

  • replayedbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/automation/jobs/{jobId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Brand

POST/v1/workspaces/{workspaceId}/brand/discover

discoverProductBrand

Read the product website and save discovered brand suggestions without overwriting explicit brand values. Requires campaigns write scope.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

product_id
query · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • sourcesobjectrequired
  • Additional propertystring

    enum: "product", "discovery", "default"

  • discovery_domainstring | nullrequired
  • missingarrayrequired
  • Each itemstring
  • product_kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • discovery_statusstring | null
  • product_idstringrequired

    format: "uuid"

  • product_domainstring | nullrequired
  • reviewed_atstring | null

    format: "date-time"

  • discovery_attempted_atstring | null

    format: "date-time"

  • logo_candidatesarray

    Logo images discovery found on the product's site (header, footer, declared logos), for one-click swaps.

  • Each itemstring
  • mediaobjectrequired
  • art_base_urlstringrequired
  • hero_image_urlstring
  • email_fontsobjectrequired
  • headingobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

  • bodyobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/brand/discover?product_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/brand

getBrand

The resolved product brand kit with per-field sources.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • sourcesobjectrequired
  • Additional propertystring

    enum: "product", "discovery", "default"

  • discovery_domainstring | nullrequired
  • missingarrayrequired
  • Each itemstring
  • product_kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • discovery_statusstring | null
  • product_idstringrequired

    format: "uuid"

  • product_domainstring | nullrequired
  • reviewed_atstring | null

    format: "date-time"

  • discovery_attempted_atstring | null

    format: "date-time"

  • logo_candidatesarray

    Logo images discovery found on the product's site (header, footer, declared logos), for one-click swaps.

  • Each itemstring
  • mediaobjectrequired
  • art_base_urlstringrequired
  • hero_image_urlstring
  • email_fontsobjectrequired
  • headingobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

  • bodyobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/brand' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/brand

updateBrand

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueunspecified
  • anyOf 1object
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • anyOf 2object
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • sourcesobjectrequired
  • Additional propertystring

    enum: "product", "discovery", "default"

  • discovery_domainstring | nullrequired
  • missingarrayrequired
  • Each itemstring
  • product_kindstringrequired

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • discovery_statusstring | null
  • product_idstringrequired

    format: "uuid"

  • product_domainstring | nullrequired
  • reviewed_atstring | null

    format: "date-time"

  • discovery_attempted_atstring | null

    format: "date-time"

  • logo_candidatesarray

    Logo images discovery found on the product's site (header, footer, declared logos), for one-click swaps.

  • Each itemstring
  • mediaobjectrequired
  • art_base_urlstringrequired
  • hero_image_urlstring
  • email_fontsobjectrequired
  • headingobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

  • bodyobjectrequired
  • stackstringrequired
  • fontstringrequired
  • web_fontbooleanrequired
  • clientsarrayrequired
  • Each itemobject
  • clientstringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • fontstringrequired

    Further nesting omitted

  • web_fontbooleanrequired

    Further nesting omitted

  • fallbackbooleanrequired

    Further nesting omitted

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/brand' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "company_name": "example",
  "logo_url": "example",
  "wordmark_url": "example",
  "website_url": "example",
  "primary_color": "example",
  "accent_color": "example",
  "background_color": "example",
  "surface_color": "example",
  "text_color": "example",
  "muted_text_color": "example",
  "heading_font_family": "example",
  "body_font_family": "example",
  "tone": "example",
  "footer_address": "example",
  "email_style": "example"
}'
PATCH/v1/workspaces/{workspaceId}/brand/patch

patchProductBrandFooter

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • brandobjectrequired

    No additional properties

  • company_namestring

    minLength: 0 · maxLength: 2000

  • logo_urlstring

    minLength: 0 · maxLength: 2000

  • wordmark_urlstring

    minLength: 0 · maxLength: 2000

  • website_urlstring

    minLength: 0 · maxLength: 2000

  • primary_colorstring

    minLength: 0 · maxLength: 2000

  • accent_colorstring

    minLength: 0 · maxLength: 2000

  • background_colorstring

    minLength: 0 · maxLength: 2000

  • surface_colorstring

    minLength: 0 · maxLength: 2000

  • text_colorstring

    minLength: 0 · maxLength: 2000

  • muted_text_colorstring

    minLength: 0 · maxLength: 2000

  • heading_font_familystring

    minLength: 0 · maxLength: 2000

  • body_font_familystring

    minLength: 0 · maxLength: 2000

  • tonestring

    minLength: 0 · maxLength: 2000

  • footer_addressstring

    minLength: 0 · maxLength: 2000

Success response 200

Canonical read-back or idempotent receipt. Provider acceptance is sent; delivered requires a delivery event and does not prove inbox placement.

application/json

  • valueobject
  • dataobjectrequired
  • brandobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • sourcesobjectrequired
  • Additional propertystring

    enum: "product", "discovery", "default"

  • discovery_domainstring | nullrequired
  • missingarrayrequired
  • Each itemstring
  • product_kindstring

    enum: "product", "store", "brand", "newsletter", "company", "other"

  • discovery_statusstring | null
  • product_idstringrequired

    format: "uuid"

  • product_domainstring | null
  • reviewed_atstring | null

    format: "date-time"

  • discovery_attempted_atstring | null

    format: "date-time"

  • hero_image_urlstring | null
  • replayedbooleanrequired

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/brand/patch' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "brand": {
    "company_name": "example",
    "logo_url": "example",
    "wordmark_url": "example",
    "website_url": "example",
    "primary_color": "example",
    "accent_color": "example",
    "background_color": "example",
    "surface_color": "example",
    "text_color": "example",
    "muted_text_color": "example",
    "heading_font_family": "example",
    "body_font_family": "example",
    "tone": "example",
    "footer_address": "example"
  }
}'

Changes

GET/v1/workspaces/{workspaceId}/changes

listChanges

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

after_revision
query · required
  • valueinteger

    format: "int64" · minimum: 0

limit
query
  • valueinteger

    minimum: 1 · maximum: 500 · default: 200

Request body

No request body is specified in the contract.

Success response 200

Ordered invalidations after a client revision.

application/json

  • valueobject
  • dataobjectrequired
  • current_revisionintegerrequired

    format: "int64"

  • changesarrayrequired
  • Each itemobject
  • revisionintegerrequired

    format: "int64"

  • topicsarrayrequired
  • Each itemstring

    enum: "mailboxes", "threads", "messages", "work", "drafts", "contacts", "campaigns", "deliverability"

  • mailbox_idsarray
  • Each itemstring

    format: "uuid"

  • created_atstringrequired

    format: "date-time"

  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/changes?after_revision=0&limit=200' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Commands

POST/v1/workspaces/{workspaceId}/commands

createCommand

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject
  • typestringrequired

    enum: "mark_read", "mark_unread", "archive", "unarchive", "trash", "restore", "spam", "not_spam", "star", "unstar", "add_label", "remove_label", "move", "assign", "set_work_status"

  • targetobjectrequired
  • thread_idstringrequired

    format: "uuid"

  • parametersobject
  • Additional propertyAny value

Success response 202

Command committed and queued for provider execution.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • typestringrequired
  • statusstringrequired

    enum: "accepted", "executing", "succeeded", "failed"

  • workspace_revisionintegerrequired

    format: "int64"

  • created_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/commands' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "type": "mark_read",
  "target": {
    "thread_id": "00000000-0000-4000-8000-000000000001"
  },
  "parameters": {}
}'
GET/v1/workspaces/{workspaceId}/commands/{commandId}

getCommand

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

commandId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Durable provider-command status.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • typestringrequired
  • statusstringrequired

    enum: "accepted", "executing", "succeeded", "failed"

  • workspace_revisionintegerrequired

    format: "int64"

  • created_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/commands/{commandId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Communication policy

GET/v1/workspaces/{workspaceId}/communication-policy

Read product-wide recipient conflict, frequency, and delivery-window policy.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Versioned communication policy.

application/json

  • valueobject
  • dataobjectrequired
  • versionintegerrequired
  • policyobjectrequired

    No additional properties

  • conflictstringrequired

    enum: "defer", "discard"

  • minimumIntervalSecondsinteger

    minimum: 0 · maximum: 604800

  • capsarray

    maxItems: 8

  • Each itemobject

    No additional properties

  • countintegerrequired

    minimum: 1

  • windowSecondsintegerrequired

    minimum: 1 · maximum: 2592000

  • windowobject

    No additional properties

  • startstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • endstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • timeZonestringrequired
  • weekdaysarray

    maxItems: 7

  • Each iteminteger

    minimum: 0 · maximum: 6

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/communication-policy' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
PUT/v1/workspaces/{workspaceId}/communication-policy

Save the product communication policy with optimistic version check.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versionintegerrequired

    minimum: 1

  • policyobjectrequired

    No additional properties

  • conflictstringrequired

    enum: "defer", "discard"

  • minimumIntervalSecondsinteger

    minimum: 0 · maximum: 604800

  • capsarray

    maxItems: 8

  • Each itemobject

    No additional properties

  • countintegerrequired

    minimum: 1

  • windowSecondsintegerrequired

    minimum: 1 · maximum: 2592000

  • windowobject

    No additional properties

  • startstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • endstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • timeZonestringrequired
  • weekdaysarray

    maxItems: 7

  • Each iteminteger

    minimum: 0 · maximum: 6

Success response 200

Updated versioned policy.

application/json

  • valueobject
  • dataobjectrequired
  • versionintegerrequired
  • policyobjectrequired

    No additional properties

  • conflictstringrequired

    enum: "defer", "discard"

  • minimumIntervalSecondsinteger

    minimum: 0 · maximum: 604800

  • capsarray

    maxItems: 8

  • Each itemobject

    No additional properties

  • countintegerrequired

    minimum: 1

  • windowSecondsintegerrequired

    minimum: 1 · maximum: 2592000

  • windowobject

    No additional properties

  • startstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • endstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • timeZonestringrequired
  • weekdaysarray

    maxItems: 7

  • Each iteminteger

    minimum: 0 · maximum: 6

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/communication-policy' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "expected_version": 1,
  "policy": {
    "conflict": "defer",
    "minimumIntervalSeconds": 0,
    "caps": [
      {
        "count": 1,
        "windowSeconds": 1
      }
    ],
    "window": {
      "start": "example",
      "end": "example",
      "timeZone": "example",
      "weekdays": [
        0
      ]
    }
  }
}'
POST/v1/workspaces/{workspaceId}/communication-policy/simulate

Read-only policy simulation for fixed send requests to one recipient.

Does not change reservations or move dependent Journey steps.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • policyobject

    No additional properties

  • conflictstringrequired

    enum: "defer", "discard"

  • minimumIntervalSecondsinteger

    minimum: 0 · maximum: 604800

  • capsarray

    maxItems: 8

  • Each itemobject

    No additional properties

  • countintegerrequired

    minimum: 1

  • windowSecondsintegerrequired

    minimum: 1 · maximum: 2592000

  • windowobject

    No additional properties

  • startstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • endstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • timeZonestringrequired
  • weekdaysarray

    maxItems: 7

  • Each iteminteger

    minimum: 0 · maximum: 6

  • historyarray

    maxItems: 10000

  • Each itemstring

    format: "date-time"

  • requestsarrayrequired

    maxItems: 1000

  • Each itemobject
  • idstringrequired
  • atstringrequired

    format: "date-time"

  • categorystringrequired

    enum: "urgent", "product", "promotional"

  • source_kindstringrequired

    enum: "journey", "broadcast"

  • expiresAtstring

    format: "date-time"

  • deliveryBlockedboolean

Success response 200

Per-request send, defer, or discard decision timeline with reasons.

application/json

  • valueobject
  • dataobjectrequired
  • policyobjectrequired

    No additional properties

  • conflictstringrequired

    enum: "defer", "discard"

  • minimumIntervalSecondsinteger

    minimum: 0 · maximum: 604800

  • capsarray

    maxItems: 8

  • Each itemobject

    No additional properties

  • countintegerrequired

    minimum: 1

  • windowSecondsintegerrequired

    minimum: 1 · maximum: 2592000

  • windowobject

    No additional properties

  • startstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • endstringrequired

    pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$"

  • timeZonestringrequired
  • weekdaysarray

    maxItems: 7

  • Each iteminteger

    minimum: 0 · maximum: 6

  • policy_versioninteger | nullrequired
  • timelinearrayrequired
  • Each itemobject
  • idstringrequired
  • source_kindstringrequired

    enum: "journey", "broadcast"

  • requested_atstringrequired

    format: "date-time"

  • actionstringrequired

    enum: "send", "defer", "discard"

  • atstringrequired

    format: "date-time"

  • reasonstringrequired
  • scopestringrequired

    enum: "one_recipient_fixed_send_requests"

  • warningsarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/communication-policy/simulate' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "policy": {
    "conflict": "defer",
    "minimumIntervalSeconds": 0,
    "caps": [
      {
        "count": 1,
        "windowSeconds": 1
      }
    ],
    "window": {
      "start": "example",
      "end": "example",
      "timeZone": "example",
      "weekdays": [
        0
      ]
    }
  },
  "history": [
    "2026-01-01T00:00:00Z"
  ],
  "requests": [
    {
      "id": "example",
      "at": "2026-01-01T00:00:00Z",
      "category": "urgent",
      "source_kind": "journey",
      "expiresAt": "2026-01-01T00:00:00Z",
      "deliveryBlocked": true
    }
  ]
}'

Content settings

GET/v1/workspaces/{workspaceId}/content-settings

Read product-level locale, fallback, timezone, glossary, and review settings.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current content settings.

application/json

  • valueobject
  • dataobjectrequired
  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • fallback_chainarrayrequired
  • Each itemstring
  • timezonestringrequired
  • glossaryobjectrequired
  • Additional propertystring
  • manual_translation_reviewbooleanrequired
  • versionintegerrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/content-settings' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
PUT/v1/workspaces/{workspaceId}/content-settings

Save product-level content settings with optimistic version check.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • fallback_chainarrayrequired
  • Each itemstring
  • timezonestringrequired
  • glossaryobjectrequired
  • Additional propertystring
  • manual_translation_reviewbooleanrequired
  • expected_versionintegerrequired

    minimum: 0

Success response 200

Saved content settings.

application/json

  • valueobject
  • dataobjectrequired
  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • fallback_chainarrayrequired
  • Each itemstring
  • timezonestringrequired
  • glossaryobjectrequired
  • Additional propertystring
  • manual_translation_reviewbooleanrequired
  • versionintegerrequired

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/content-settings' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "source_locale": "example",
  "configured_locales": [
    "example"
  ],
  "fallback_chain": [
    "example"
  ],
  "timezone": "example",
  "glossary": {},
  "manual_translation_review": true,
  "expected_version": 0
}'

Daily summary

GET/v1/workspaces/{workspaceId}/daily-summary

Read your daily summary email settings for the selected product.

The daily summary is one email each morning to your sign-in address with yesterday's day summary from Home and any approvals or alerts to act on. It is on unless you turn it off; a day with no new mail sends nothing. Settings are your own.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Your settings, with defaults for anything never changed.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • enabledbooleanrequired
  • send_hourintegerrequired

    Local hour it goes out at.

    minimum: 0 · maximum: 23

  • time_zonestringrequired

    The zone it follows: the one chosen, else your browser's, else UTC.

  • time_zone_sourcestringrequired

    enum: "chosen", "browser", "default"

  • weekdays_onlybooleanrequired
  • include_unlabeledbooleanrequired
  • excluded_labelsarrayrequired

    Label names left out of the email.

  • Each itemstring
  • send_tostring | nullrequired

    Your sign-in address.

  • last_sent_onstring | nullrequired

    format: "date"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/daily-summary' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'
PUT/v1/workspaces/{workspaceId}/daily-summary

Change your daily summary email settings.

Changes only the fields given. A null time_zone follows your browser again.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • enabledboolean
  • send_hourinteger

    minimum: 0 · maximum: 23

  • time_zonestring | null

    IANA zone such as Europe/Lisbon; null follows your browser.

    maxLength: 64

  • weekdays_onlyboolean
  • include_unlabeledboolean
  • excluded_labelsarray

    maxItems: 200

  • Each itemstring

    minLength: 1 · maxLength: 200

Success response 200

Your settings after the change.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • enabledbooleanrequired
  • send_hourintegerrequired

    Local hour it goes out at.

    minimum: 0 · maximum: 23

  • time_zonestringrequired

    The zone it follows: the one chosen, else your browser's, else UTC.

  • time_zone_sourcestringrequired

    enum: "chosen", "browser", "default"

  • weekdays_onlybooleanrequired
  • include_unlabeledbooleanrequired
  • excluded_labelsarrayrequired

    Label names left out of the email.

  • Each itemstring
  • send_tostring | nullrequired

    Your sign-in address.

  • last_sent_onstring | nullrequired

    format: "date"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/daily-summary' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "enabled": true,
  "send_hour": 0,
  "time_zone": "example",
  "weekdays_only": true,
  "include_unlabeled": true,
  "excluded_labels": [
    "example"
  ]
}'
POST/v1/workspaces/{workspaceId}/daily-summary/send

Send yourself yesterday's daily summary now.

Sends the summary of yesterday, in your time zone, to your sign-in address, even on a quiet day and even when the daily email is off. The morning email still goes as usual.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

What happened.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • outcomestringrequired

    enum: "sent", "quiet", "already_sent", "unavailable", "skipped_test_address"

  • sent_tostringrequired
  • daystringrequired

    format: "date"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/daily-summary/send' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'

Deliverability

GET/v1/workspaces/{workspaceId}/deliverability

getDeliverabilitySummary

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

since
query
  • valuestring

    format: "date-time"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • counting_basisstring

    enum: "recipients", "events"

  • simulator_eventsinteger
  • sincestringrequired

    format: "date-time"

  • generated_atstringrequired

    format: "date-time"

  • totalsobjectrequired
  • sent_countinteger

    format: "int64"

  • delivered_countinteger

    format: "int64"

  • deferred_countinteger

    format: "int64"

  • bounced_countinteger

    format: "int64"

  • complained_countinteger

    format: "int64"

  • opened_countinteger

    format: "int64"

  • clicked_countinteger

    format: "int64"

  • unsubscribed_countinteger

    format: "int64"

  • failed_countinteger

    format: "int64"

  • suppressed_countinteger

    format: "int64"

  • last_event_atstring | null

    format: "date-time"

  • Additional propertyAny value
  • time_seriesarrayrequired
  • Each itemunspecified
  • allOf 1object
  • sent_countinteger

    format: "int64"

  • delivered_countinteger

    format: "int64"

  • deferred_countinteger

    format: "int64"

  • bounced_countinteger

    format: "int64"

  • complained_countinteger

    format: "int64"

  • opened_countinteger

    format: "int64"

  • clicked_countinteger

    format: "int64"

  • unsubscribed_countinteger

    format: "int64"

  • failed_countinteger

    format: "int64"

  • suppressed_countinteger

    format: "int64"

  • last_event_atstring | null

    format: "date-time"

  • Additional propertyAny value
  • allOf 2object
  • bucketstringrequired

    format: "date"

  • providersarrayrequired
  • Each itemunspecified
  • allOf 1object
  • sent_countinteger

    format: "int64"

  • delivered_countinteger

    format: "int64"

  • deferred_countinteger

    format: "int64"

  • bounced_countinteger

    format: "int64"

  • complained_countinteger

    format: "int64"

  • opened_countinteger

    format: "int64"

  • clicked_countinteger

    format: "int64"

  • unsubscribed_countinteger

    format: "int64"

  • failed_countinteger

    format: "int64"

  • suppressed_countinteger

    format: "int64"

  • last_event_atstring | null

    format: "date-time"

  • Additional propertyAny value
  • allOf 2object
  • provider_connection_idstring | null

    format: "uuid"

  • providerstringrequired
  • display_namestringrequired
  • ownershipstringrequired
  • statusstringrequired
  • recipient_domainsarrayrequired
  • Each itemunspecified
  • allOf 1object
  • sent_countinteger

    format: "int64"

  • delivered_countinteger

    format: "int64"

  • deferred_countinteger

    format: "int64"

  • bounced_countinteger

    format: "int64"

  • complained_countinteger

    format: "int64"

  • opened_countinteger

    format: "int64"

  • clicked_countinteger

    format: "int64"

  • unsubscribed_countinteger

    format: "int64"

  • failed_countinteger

    format: "int64"

  • suppressed_countinteger

    format: "int64"

  • last_event_atstring | null

    format: "date-time"

  • Additional propertyAny value
  • allOf 2object
  • recipient_domainstringrequired
  • sending_streamsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • domainstringrequired
  • stream_kindstringrequired
  • display_namestringrequired
  • statusstringrequired
  • status_reasonstring | null
  • provider_statusstring | null
  • required_recordsintegerrequired

    format: "int64"

  • verified_recordsintegerrequired

    format: "int64"

  • pending_recordsintegerrequired

    format: "int64"

  • error_recordsintegerrequired

    format: "int64"

  • last_checked_atstring | null

    format: "date-time"

  • feedback_pipelineobjectrequired

    No additional properties

  • statusstringrequired

    enum: "healthy", "degraded", "unproven"

  • eligible_attemptsintegerrequired

    format: "int64"

  • unmatched_attemptsintegerrequired

    format: "int64"

  • last_receipt_atstring | null

    format: "date-time"

  • issuesarrayrequired
  • Each itemobject
  • severitystringrequired

    enum: "warning", "critical"

  • codestringrequired
  • titlestringrequired
  • detailstringrequired
  • resource_kindstringrequired
  • resource_idstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/deliverability?since=2026-01-01T00%3A00%3A00Z' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/deliverability/bounces

listDeliverabilityBounces

Recipients who bounced or reported spam among sends created since `since`, newest first, up to 100. `email` is null when Banger cannot name the address; the domain is always present. `suppressed` means future sends already skip the address.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

since
query
  • valuestring

    format: "date-time"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • send_intent_idstringrequired

    format: "uuid"

  • emailstring | nullrequired
  • recipient_domainstringrequired
  • outcomestringrequired

    enum: "hard_bounce", "soft_bounce", "complaint"

  • occurred_atstringrequired

    format: "date-time"

  • subjectstringrequired
  • origin_namestring | nullrequired
  • suppressedbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/deliverability/bounces?since=2026-01-01T00%3A00%3A00Z' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/deliverability/resolutions

listDeliverabilityResolutions

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

since
query
  • valuestring

    format: "date-time"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired
  • reasonstringrequired

    enum: "complaint", "hard_bounce"

  • countintegerrequired
  • domainsarrayrequired
  • Each itemstring
  • statusstringrequired
  • decidedAtstring | null

    format: "date-time"

  • titlestringrequired
  • explanationstringrequired
  • impactstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/deliverability/resolutions?since=2026-01-01T00%3A00%3A00Z' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/deliverability/resolutions

decideDeliverabilityResolution

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

since
query
  • valuestring

    format: "date-time"

Request body required

application/json

  • valueobject
  • idstringrequired

    minLength: 64 · maxLength: 64

  • decisionstringrequired

    enum: "approved", "rejected"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "approved", "rejected"

  • approvalIdstringrequired

    format: "uuid"

  • replayedboolean
  • countinteger

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/deliverability/resolutions?since=2026-01-01T00%3A00%3A00Z' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "id": "examplexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "decision": "approved"
}'

Documents

GET/v1/workspaces/{workspaceId}/documents

listDocuments

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

mailbox_id
query
  • valuestring

    format: "uuid"

q
query
  • valuestring

    maxLength: 512

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • message_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstringrequired

    format: "uuid"

  • filenamestringrequired
  • content_typestringrequired
  • size_bytesintegerrequired
  • sent_atstringrequired

    format: "date-time"

  • subjectstringrequired
  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/documents?cursor=example&limit=50&mailbox_id=00000000-0000-4000-8000-000000000001&q=example' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Email preview

GET/v1/workspaces/{workspaceId}/email-preview

Render saved emails for visual iteration without sending

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

kind
query · required
  • valuestring

    enum: "template", "broadcast", "journey"

id
query · required
  • valuestring

    format: "uuid"

locale
query

Optional BCP 47 locale for a managed Broadcast preview.

  • valuestring

    maxLength: 64

variant
query

Optional managed Broadcast experiment variant key.

  • valuestring

    maxLength: 40

x-banger-product-id
header · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Saved email content and Journey sequence

application/json

  • valueobject
  • dataobjectrequired
  • resource_kindstringrequired

    enum: "template", "broadcast", "journey"

  • resource_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired
  • selected_email_keystring
  • itemsarrayrequired
  • Each itemobject
  • keystringrequired
  • step_idstring

    The Journey step this item shows, as steps[].id in the saved Journey.

    format: "uuid"

  • kindstringrequired
  • namestringrequired
  • subjectstring
  • preview_textstring
  • body_htmlstring
  • body_textstring
  • detailstring
  • revision_idstring

    Exact managed Broadcast source revision rendered.

    format: "uuid"

  • revision_statusstring

    Whether the rendered revision is unpublished saved content or published content.

    enum: "draft", "published"

  • sample_valuesbooleanrequired
  • image_assetsobject
  • Additional propertystring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/email-preview?kind=template&id=00000000-0000-4000-8000-000000000001&locale=example&variant=example' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'

Events

POST/v1/workspaces/{workspaceId}/events

Send a custom event into the product's Journeys.

Requires automation:execute. The event arrives on the product's implicit "Banger API events" incoming webhook, created on the first event and listed with the other webhooks so Journeys can name its connection_id, or on connection_id, another active incoming webhook of the same product. From there it is processed exactly like an event posted to that webhook's URL: active Journeys whose trigger names the event type and connection enroll the person at email (or their configured audience), and Journeys whose goal names it stop that person's runs. Events can start already-approved Journeys, which send email. The event id makes the call idempotent: repeating it with the same body returns duplicate true; reusing it for a different body returns 409 webhook_event_id_reused.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Required in a workspace with several active products unless the API key already binds the product.

  • valuestring

    format: "uuid"

Idempotency-Key
header

The event id when the body has no id. One of the two is required.

  • valuestring

    minLength: 1 · maxLength: 500

Request body required

application/json

  • valueobject

    No additional properties

  • typestringrequired

    Event name that Journey triggers and goals match, such as signup.

    pattern: "^[A-Za-z0-9_.:-]{1,120}$"

  • idunspecified

    Stable identifier of the event in the calling system. Without it, the Idempotency-Key header is the id.

  • oneOf 1string

    minLength: 1 · maxLength: 500

  • oneOf 2number
  • emailstring

    The person the event is about.

    format: "email" · maxLength: 320

  • namestring

    The person's display name.

    maxLength: 200

  • occurred_atstring

    When the event happened. Defaults to when Banger receives it.

    format: "date-time"

  • attributesobject

    Values Journey conditions and email content can read. Text values hold at most 500 characters.

  • Additional propertyunspecified
  • oneOf 1string

    maxLength: 500

  • oneOf 2number
  • oneOf 3boolean
  • connection_idstring

    An active incoming webhook connection of the same product. Defaults to the Banger API events webhook.

    format: "uuid"

Success response 202

Event accepted, or already accepted under this id.

application/json

  • valueobject
  • dataobjectrequired
  • acceptedbooleanrequired

    const: true

  • duplicatebooleanrequired

    True when this id was already accepted; nothing ran again.

  • connection_idstringrequired

    The connection the event arrived on.

    format: "uuid"

  • sequence_enrollments_createdintegerrequired

    minimum: 0

  • sequence_enrollments_stoppedintegerrequired

    Runs stopped by a Journey goal.

    minimum: 0

  • sequence_matches_ignoredintegerrequired

    Matching Journeys that could not use the event, such as one that enrolls a person when the event names no email.

    minimum: 0

  • sequence_goals_predating_enrollmentintegerrequired

    Goals that happened before the run they would stop had started.

    minimum: 0

  • sequence_enrollments_rejectedarray

    Journeys that did not enroll this person because the event's data cannot fill their emails.

  • Each itemobject
  • journey_idstringrequired

    format: "uuid"

  • journey_namestringrequired
  • fieldsarrayrequired
  • Each itemobject
  • namestringrequired

    The contact field the email needs.

    Further nesting omitted

  • problemstringrequired

    enum: "missing", "not_https"

    Further nesting omitted

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/events' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "type": "example",
  "id": "example",
  "email": "person@example.com",
  "name": "example",
  "occurred_at": "2026-01-01T00:00:00Z",
  "attributes": {},
  "connection_id": "00000000-0000-4000-8000-000000000001"
}'

Experiments

GET/v1/workspaces/{workspaceId}/experiments

listExperiments

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring

    Further nesting omitted

  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • statusstringrequired

    enum: "running", "decided", "stopped"

  • winner_keystring | null
  • decided_bystring | null
  • decision_basisstring | null

    enum: "confident", "deadline", "guardrail", "manual", null

  • decision_confidencenumber | null
  • decision_reasonstring | null
  • started_atstring

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/experiments' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/experiments

createExperiment

Start an A/B test on a Broadcast, journey step, or automation rule.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    Variant payload must match dimension: subject, template_id (design), content, or from_name. Keys must be unique and cannot be holdback. Allocation must have one percentage per variant and sum to 100; omitted allocation splits evenly.

  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring
  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring
  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • statusstringrequired

    enum: "running", "decided", "stopped"

  • winner_keystring | null
  • decided_bystring | null
  • decision_basisstring | null

    enum: "confident", "deadline", "guardrail", "manual", null

  • decision_confidencenumber | null
  • decision_reasonstring | null
  • started_atstring

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/experiments' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "subject_kind": "campaign",
  "subject_id": "example",
  "dimension": "subject",
  "variants": [
    {
      "key": "example",
      "label": "example",
      "subject": "example",
      "template_id": "00000000-0000-4000-8000-000000000001",
      "content": {},
      "from_name": "example"
    }
  ],
  "allocation": [
    1
  ],
  "sample_percent": 100,
  "primary_metric": "human_click",
  "min_sample_per_arm": 100,
  "decision": {
    "mode": "manual",
    "after_hours": 1,
    "confidence": 0.8
  },
  "guardrails": {
    "max_complaint_rate": 1,
    "max_unsubscribe_rate": 1
  }
}'
GET/v1/workspaces/{workspaceId}/experiments/{experimentId}

getExperiment

The experiment with per-variant results and a suggested winner.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

experimentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring

    Further nesting omitted

  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • statusstringrequired

    enum: "running", "decided", "stopped"

  • winner_keystring | null
  • decided_bystring | null
  • decision_basisstring | null

    enum: "confident", "deadline", "guardrail", "manual", null

  • decision_confidencenumber | null
  • decision_reasonstring | null
  • started_atstring

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

  • allOf 2object
  • resultsarrayrequired
  • Each itemobject
  • keystring
  • labelstring
  • sendsinteger
  • deliveredinteger
  • human_opensinteger
  • human_clicksinteger
  • repliesinteger
  • conversionsinteger
  • unsubscribesinteger
  • complaintsinteger
  • ratenumber
  • lift_vs_firstnumber | null
  • confidence_vs_firstnumber | null
  • sample_okboolean
  • guardrail_trippedboolean
  • suggested_winnerobject
  • keystringrequired
  • reasonstringrequired
  • basisstringrequired

    enum: "confident", "deadline", "guardrail"

  • confidencenumber | nullrequired
  • sample_okbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/experiments/{experimentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/experiments/{experimentId}/decide

decideExperiment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

experimentId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • winner_keystringrequired

    minLength: 1 · maxLength: 40

  • reasonstring

    maxLength: 500

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring
  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • statusstringrequired

    enum: "running", "decided", "stopped"

  • winner_keystring | null
  • decided_bystring | null
  • decision_basisstring | null

    enum: "confident", "deadline", "guardrail", "manual", null

  • decision_confidencenumber | null
  • decision_reasonstring | null
  • started_atstring

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/experiments/{experimentId}/decide' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "winner_key": "example",
  "reason": "example"
}'
POST/v1/workspaces/{workspaceId}/experiments/{experimentId}/stop

stopExperiment

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

experimentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • namestringrequired

    minLength: 1 · maxLength: 200

  • subject_kindstringrequired

    enum: "campaign", "sequence_step", "automation_rule"

  • subject_idstringrequired

    minLength: 1 · maxLength: 200

  • dimensionstringrequired

    enum: "subject", "design", "content", "from_name"

  • variantsarrayrequired

    minItems: 2 · maxItems: 4

  • Each itemobject
  • keystring

    pattern: "^[a-z0-9][a-z0-9_-]{0,39}$"

  • labelstring

    maxLength: 120

  • subjectstring

    minLength: 1 · maxLength: 998

  • template_idstring

    format: "uuid"

  • contentobject
  • Additional propertystring
  • from_namestring

    minLength: 1 · maxLength: 200

  • allocationarray
  • Each iteminteger

    minimum: 1 · maximum: 100

  • sample_percentinteger

    minimum: 5 · maximum: 100 · default: 100

  • primary_metricstring

    default: "human_click" · enum: "human_open", "human_click", "reply", "conversion"

  • min_sample_per_arminteger

    minimum: 10 · maximum: 100000 · default: 100

  • decisionobject
  • modestring

    enum: "manual", "auto"

  • after_hoursinteger

    minimum: 1 · maximum: 336

  • confidencenumber

    minimum: 0.8 · maximum: 0.99

  • guardrailsobject
  • max_complaint_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • max_unsubscribe_ratenumber

    maximum: 1 · exclusiveMinimum: 0

  • idstringrequired

    format: "uuid"

  • product_idstring

    format: "uuid"

  • statusstringrequired

    enum: "running", "decided", "stopped"

  • winner_keystring | null
  • decided_bystring | null
  • decision_basisstring | null

    enum: "confident", "deadline", "guardrail", "manual", null

  • decision_confidencenumber | null
  • decision_reasonstring | null
  • started_atstring

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • updated_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/experiments/{experimentId}/stop' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Feedback

GET/v1/workspaces/{workspaceId}/feedback

Check whether customer feedback delivery is available

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Feedback availability for the authenticated workspace.

application/json

  • valueobject
  • dataobject
  • availablebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/feedback' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/feedback

Report a bug, send feedback, or suggest a feature

Creates one internal Linear issue and sends a Slack team alert. Retry an interrupted submission with the same submission_id.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • kindstringrequired

    enum: "bug", "feedback", "feature"

  • titlestringrequired

    minLength: 1 · maxLength: 160

  • descriptionstringrequired

    minLength: 1 · maxLength: 10000

  • submission_idstringrequired

    format: "uuid"

  • attachment_idsarray

    Completed private uploads owned by this reporter and workspace. Unsubmitted uploads expire after 24 hours; files can belong to only one report.

    maxItems: 5 · uniqueItems: true

  • Each itemstring

    format: "uuid"

Success response 201

Linear issue and Slack alert completed, including an idempotent replay.

application/json

  • valueobject
  • dataobject
  • idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "submitted"

  • linearIssueIdentifierstring | null
  • linearIssueUrlstring | null

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/feedback' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "kind": "bug",
  "title": "example",
  "description": "example",
  "submission_id": "00000000-0000-4000-8000-000000000001",
  "attachment_ids": [
    "00000000-0000-4000-8000-000000000001"
  ]
}'
POST/v1/workspaces/{workspaceId}/feedback/attachments

Upload a screenshot or video to private Linear storage

Binary uploads support up to 25 MiB. JSON base64 uploads support up to 2 MiB. Reuse attachment_id when retrying the same file. Requires automation:execute for API keys.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

attachment_id
query

Required for binary uploads; UUID per file.

  • valuestring

    format: "uuid"

x-banger-filename
header

URI-encoded filename, required for binary uploads.

  • valuestring

Request body required

image/png

  • valuestring

    format: "binary"

image/jpeg

  • valuestring

    format: "binary"

image/gif

  • valuestring

    format: "binary"

image/webp

  • valuestring

    format: "binary"

video/mp4

  • valuestring

    format: "binary"

video/webm

  • valuestring

    format: "binary"

video/quicktime

  • valuestring

    format: "binary"

application/json

  • valueobject
  • attachment_idstringrequired

    format: "uuid"

  • filenamestringrequired

    minLength: 1 · maxLength: 200

  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp", "video/mp4", "video/webm", "video/quicktime"

  • base64stringrequired

    minLength: 4 · maxLength: 2796204

Success response 200

Existing completed attachment.

application/json

  • valueobject
  • dataobjectrequired
  • attachment_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "ready"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/feedback/attachments?attachment_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-filename: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "attachment_id": "00000000-0000-4000-8000-000000000001",
  "filename": "example",
  "mime_type": "image/png",
  "base64": "example"
}'
POST/v1/workspaces/{workspaceId}/feedback/attachments/prepare

Prepare a direct agent or server media upload

Returns a temporary signed PUT URL and required upload headers. Send file bytes with those headers, without Banger credentials, then complete the upload. Do not upload directly from browsers; use the authenticated binary proxy. Up to 30 uploads and 250 MiB per reporter per day.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • attachment_idstringrequired

    format: "uuid"

  • filenamestringrequired

    minLength: 1 · maxLength: 200

  • mime_typestringrequired

    enum: "image/png", "image/jpeg", "image/gif", "image/webp", "video/mp4", "video/webm", "video/quicktime"

  • size_bytesintegerrequired

    minimum: 1 · maximum: 26214400

Success response 201

data contains attachment_id, status, and upload with signed url, method PUT, and headers when uploading. If ready, no upload is needed.

application/json

  • valueobject
  • dataobjectrequired
  • attachment_idstringrequired

    format: "uuid"

  • filenamestringrequired
  • mime_typestringrequired
  • size_bytesintegerrequired
  • statusstringrequired

    enum: "ready", "uploading"

  • uploadobject
  • urlstringrequired
  • methodstringrequired

    enum: "PUT"

  • headersobjectrequired
  • Additional propertystring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/feedback/attachments/prepare' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "attachment_id": "00000000-0000-4000-8000-000000000001",
  "filename": "example",
  "mime_type": "image/png",
  "size_bytes": 1
}'
POST/v1/workspaces/{workspaceId}/feedback/attachments/{attachmentId}/complete

Verify a direct media upload before attaching it to feedback

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

attachmentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

data contains attachment_id and status ready. Completion is idempotent.

application/json

  • valueobject
  • dataobjectrequired
  • attachment_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "ready"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/feedback/attachments/{attachmentId}/complete' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Home

GET/v1/workspaces/{workspaceId}/home

Load the setup or operating Home for the selected product.

Membership, product validity, setup projection, operating summaries, and recent activity are read in one tenant-isolated database statement.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The selected product's Home surface.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • setupobjectrequired

    No additional properties

  • stagestringrequired

    enum: "domain", "mailboxes", "journeys", "broadcast", "complete"

  • domainobjectrequired

    No additional properties

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • detailstringrequired
  • mailboxesobjectrequired

    No additional properties

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • detailstringrequired
  • journeysobjectrequired

    No additional properties

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • detailstringrequired
  • broadcastobjectrequired

    No additional properties

  • statusstringrequired

    enum: "todo", "in_progress", "complete", "not_relevant"

  • detailstringrequired
  • needsYouobjectrequired

    No additional properties

  • undecidedApprovalsintegerrequired

    minimum: 0

  • oldestApprovalsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • summarystringrequired
  • actionKindstringrequired
  • createdAtstringrequired

    format: "date-time"

  • failedSteps24harrayrequired
  • Each itemobject
  • journeyIdstringrequired

    format: "uuid"

  • journeyNamestringrequired
  • countintegerrequired

    minimum: 0

  • deliverabilityAlertsarrayrequired
  • Each itemobject
  • kindstringrequired

    enum: "bounce_rate", "complaint_rate", "dns_drift", "lane_paused"

  • detailstringrequired
  • destinationstringrequired

    enum: "deliverability", "domains"

  • unreadInboundarrayrequired
  • Each itemobject
  • mailboxIdstringrequired

    format: "uuid"

  • addressstringrequired
  • countintegerrequired

    minimum: 0

  • splitsReadyToDecidearrayrequired
  • Each itemobject
  • journeyIdstringrequired

    format: "uuid"

  • journeyNamestringrequired
  • unclaimedJourneysintegerrequired

    minimum: 0

  • journeysobjectrequired

    No additional properties

  • activeintegerrequired

    minimum: 0

  • entered30dintegerrequired

    minimum: 0

  • sent30dintegerrequired

    minimum: 0

  • toparrayrequired
  • Each itemunspecified
  • allOf 1object

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • mailbox_idstring

    Existing sender. Omit to prefer the onboarding sender then an active custom mailbox then hosted. Saved and explicit senders remain unchanged.

    format: "uuid"

    Further nesting omitted

  • from_local_partstring

    maxLength: 64 · pattern: "^[a-z0-9][a-z0-9._+-]{0,62}$"

    Further nesting omitted

  • triggerobjectrequired

    Further nesting omitted

  • audienceobject

    Further nesting omitted

  • goalobject

    No additional properties

    Further nesting omitted

  • exitobject

    No additional properties

    Further nesting omitted

  • approval_modestring

    enum: "policy", "required"

    Further nesting omitted

  • apiobject

    Further nesting omitted

  • managed_contentobject

    Create-only shortcut: atomically save a source-managed email draft and a Journey whose email step references it. Missing target languages queue for free translation; this does not publish or activate the Journey.

    No additional properties

    Further nesting omitted

  • stepsarrayrequired

    maxItems: 100

    Further nesting omitted

  • allOf 2object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • statusstringrequired

    enum: "draft", "discovered", "active", "paused", "archived"

    Further nesting omitted

  • api_keystring | null

    Further nesting omitted

  • content_modestring | null

    enum: "code", "managed", null

    Further nesting omitted

  • identitystring | null

    Further nesting omitted

  • identity_aliasesarray

    Further nesting omitted

  • samplesarray

    Further nesting omitted

  • versionintegerrequired

    minimum: 1

    Further nesting omitted

  • statsobjectrequired

    Further nesting omitted

  • stepStatsarray

    Further nesting omitted

  • armStatsarray

    Further nesting omitted

  • healthobjectrequired

    Further nesting omitted

  • indicatorobjectrequired

    Further nesting omitted

  • sparklinearrayrequired

    Further nesting omitted

  • activated_atstring | null

    format: "date-time"

    Further nesting omitted

  • updated_atstring

    format: "date-time"

    Further nesting omitted

  • last_activity_atstring | null

    format: "date-time"

    Further nesting omitted

  • broadcastobjectrequired

    No additional properties

  • nextobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • scheduledAtstringrequired

    format: "date-time"

  • recipientsintegerrequired

    minimum: 0

  • lastobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • sentAtstringrequired

    format: "date-time"

  • deliveredintegerrequired

    minimum: 0

  • humanOpenedintegerrequired

    minimum: 0

  • repliedintegerrequired

    minimum: 0

  • recentLogsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • directionstringrequired

    enum: "out", "in"

  • atstringrequired

    format: "date-time"

  • mailbox_idstring | nullrequired

    Null for sends that leave through no mailbox, such as the API and SMTP.

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • send_intent_idstring

    format: "uuid"

  • traffic_classstring

    enum: "mailbox", "product", "broadcast"

  • fromstringrequired
  • toarrayrequired
  • Each itemstring
  • recipient_countintegerrequired

    minimum: 0

  • subjectstringrequired
  • originobjectrequired

    No additional properties

  • kindstringrequired

    enum: "journey", "broadcast", "mailbox", "api", "agent", "smtp"

  • idstring
  • namestring
  • statusstringrequired

    enum: "queued", "sent", "delivered", "bounced", "complained", "opened", "clicked", "replied", "received", "failed", "rejected"

  • rejectionobject

    Why Banger refused an SMTP attempt, and the reply the client received.

  • refstringrequired

    pattern: "^smtp_[0-9a-z]{16}$"

  • kindstringrequired

    enum: "login_failed", "recipient_refused", "message_rejected"

  • replystringrequired

    The full SMTP reply, e.g. `550 5.7.1 ...`.

  • reply_codeintegerrequired

    minimum: 400 · maximum: 599

  • enhanced_codestringrequired
  • reasonstringrequired
  • messagestringrequired
  • key_prefixstringrequired

    The public `bgr_` prefix of the API key the client used.

  • client_ipstring
  • portinteger
  • tlsstring
  • attemptsintegerrequired

    Failed logins on one key collapse into one row per ten minutes.

    minimum: 1

  • last_atstringrequired

    format: "date-time"

  • detailobject
  • Additional propertyAny value
  • volumeobjectrequired
  • sentPeriodintegerrequired

    minimum: 0

  • limitintegerrequired

    minimum: 0

  • deliveredRatenumber

    minimum: 0 · maximum: 1

  • mailboxesintegerrequired

    minimum: 0

  • verifiedDomainsintegerrequired

    minimum: 0

  • Additional propertyAny value
  • agentobjectrequired

    No additional properties

  • connectedbooleanrequired
  • clientNamestring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/home' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/home/feed

Read Home as a feed of the reader's days.

What came into the product's mailboxes on each of the reader's local days, grouped by label, with receipts and newsletters counted apart, and what went out. Only mailboxes the reader can open are counted.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

time_zone
query

IANA time zone that defines the reader's days. Unknown zones read as UTC.

  • valuestring

    maxLength: 64

days
query
  • valueinteger

    minimum: 1 · maximum: 14 · default: 7

Request body

No request body is specified in the contract.

Success response 200

The reader's feed.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • timeZonestringrequired
  • seenThroughstring

    The last day whose summary the reader has seen; absent before their first.

    format: "date"

  • daysarrayrequired
  • Each itemobject

    No additional properties

  • datestringrequired

    The reader's local date.

    format: "date"

  • inboundintegerrequired
  • unreadintegerrequired
  • mailboxesintegerrequired
  • labelsarrayrequired
  • Each itemobject

    No additional properties

  • labelstring

    The label's name; absent for mail without a label.

    Further nesting omitted

  • colorstring

    Further nesting omitted

  • countintegerrequired

    Further nesting omitted

  • unreadintegerrequired

    Further nesting omitted

  • mailboxesarrayrequired

    Further nesting omitted

  • recentarrayrequired

    maxItems: 3

    Further nesting omitted

  • unlabeledobject

    No additional properties

  • labelstring

    The label's name; absent for mail without a label.

  • colorstring
  • countintegerrequired
  • unreadintegerrequired
  • mailboxesarrayrequired
  • Each itemstring

    Further nesting omitted

  • recentarrayrequired

    maxItems: 3

  • Each itemobject

    No additional properties

    Further nesting omitted

  • routineintegerrequired

    Receipts, newsletters and notifications, counted and not listed.

  • sendingobject

    Every email the product sent that day and how it landed; absent when nothing went out.

    No additional properties

  • sentintegerrequired
  • deliveredintegerrequired
  • bouncedintegerrequired
  • complainedintegerrequired
  • broadcastsarrayrequired

    Broadcasts that went out that day.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • atstringrequired

    format: "date-time"

    Further nesting omitted

  • deliveredintegerrequired

    Further nesting omitted

  • openedintegerrequired

    Further nesting omitted

  • repliedintegerrequired

    Further nesting omitted

  • journeysarrayrequired

    Journeys that moved that day; people who started, emails sent, and replies to them.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • enteredintegerrequired

    Further nesting omitted

  • sentintegerrequired

    Further nesting omitted

  • repliedintegerrequired

    Further nesting omitted

  • signupsintegerrequired

    People who confirmed a signup form that day.

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/home/feed?time_zone=example&days=7' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/home/seen

Record the last day summary the reader has seen in Home.

Home opens on the first day after this one and folds the days up to it. The place never moves back. Mail read state is unchanged.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • seen_throughstringrequired

    A past day in the reader's time zone.

    format: "date"

Success response 200

The reader's place after the move.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • seen_throughstringrequired

    format: "date"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/home/seen' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "seen_through": "2026-01-01"
}'

Label suggestions

GET/v1/workspaces/{workspaceId}/label-suggestions

listLabelSuggestions

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired
  • namestringrequired
  • emojistringrequired
  • colorstringrequired
  • descriptionstringrequired
  • already_addedbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/label-suggestions?mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Labels

GET/v1/workspaces/{workspaceId}/labels

listLabels

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • colorstring | nullrequired
  • kindstringrequired
  • emojistring | nullrequired
  • descriptionstring | nullrequired
  • suggestion_idstring | nullrequired
  • sourcestringrequired

    enum: "banger", "provider"

  • updated_atstringrequired

    format: "date-time"

  • auto_setunspecifiedrequired
  • anyOf 1object
  • rule_idstringrequired

    format: "uuid"

  • enabledbooleanrequired
  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

    Further nesting omitted

  • toarray

    maxItems: 50

    Further nesting omitted

  • subject_containsarray

    maxItems: 50

    Further nesting omitted

  • has_wordsarray

    maxItems: 50

    Further nesting omitted

  • excludes_wordsarray

    maxItems: 50

    Further nesting omitted

  • has_attachmentboolean

    Further nesting omitted

  • anyOf 2null
  • applied_by_rule_countintegerrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/labels?mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/labels

createLabel

Create a Banger label in one mailbox. Pass suggestion_id to create a suggested label; an existing name returns the existing label (200). Banger labels never sync to Gmail.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header

Optional retry key, applied when a product is selected.

  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject
  • mailbox_idstringrequired

    format: "uuid"

  • namestring

    maxLength: 120

  • colorstring

    maxLength: 32

  • emojistring

    One emoji shown before the name.

    maxLength: 16

  • descriptionstring

    maxLength: 2000

  • suggestion_idstring

    maxLength: 64

  • auto_setobject
  • enabledbooleanrequired
  • descriptionstring | null

    maxLength: 2000

  • exact_conditionsobject

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • colorstring | nullrequired
  • kindstringrequired
  • emojistring | nullrequired
  • descriptionstring | nullrequired
  • suggestion_idstring | nullrequired
  • sourcestringrequired

    enum: "banger", "provider"

  • updated_atstringrequired

    format: "date-time"

  • auto_setunspecifiedrequired
  • anyOf 1object
  • rule_idstringrequired

    format: "uuid"

  • enabledbooleanrequired
  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • has_attachmentboolean
  • anyOf 2null
  • applied_by_rule_countintegerrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/labels' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "name": "example",
  "color": "example",
  "emoji": "example",
  "description": "example",
  "suggestion_id": "example",
  "auto_set": {
    "enabled": true,
    "description": "example",
    "exact_conditions": {
      "from": [
        "example"
      ],
      "to": [
        "example"
      ],
      "subject_contains": [
        "example"
      ],
      "has_words": [
        "example"
      ],
      "excludes_words": [
        "example"
      ],
      "has_attachment": true
    }
  }
}'
PATCH/v1/workspaces/{workspaceId}/labels/{labelId}

updateLabel

Rename a Banger label, change color, emoji or description, or turn its auto-set rule on or off. Gmail and system labels are read-only.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

labelId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header

Optional retry key, applied when a product is selected.

  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 120

  • colorstring | null

    maxLength: 32

  • emojistring | null

    maxLength: 16

  • descriptionstring | null

    maxLength: 2000

  • auto_setobject
  • enabledbooleanrequired
  • descriptionstring | null

    maxLength: 2000

  • exact_conditionsobject

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • colorstring | nullrequired
  • kindstringrequired
  • emojistring | nullrequired
  • descriptionstring | nullrequired
  • suggestion_idstring | nullrequired
  • sourcestringrequired

    enum: "banger", "provider"

  • updated_atstringrequired

    format: "date-time"

  • auto_setunspecifiedrequired
  • anyOf 1object
  • rule_idstringrequired

    format: "uuid"

  • enabledbooleanrequired
  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

    Further nesting omitted

  • has_attachmentboolean
  • anyOf 2null
  • applied_by_rule_countintegerrequired

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/labels/{labelId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "color": "example",
  "emoji": "example",
  "description": "example",
  "auto_set": {
    "enabled": true,
    "description": "example",
    "exact_conditions": {
      "from": [
        "example"
      ],
      "to": [
        "example"
      ],
      "subject_contains": [
        "example"
      ],
      "has_words": [
        "example"
      ],
      "excludes_words": [
        "example"
      ],
      "has_attachment": true
    }
  }
}'
DELETE/v1/workspaces/{workspaceId}/labels/{labelId}

deleteLabel

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

labelId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Label deleted.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/labels/{labelId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Logs

GET/v1/workspaces/{workspaceId}/logs

listLogs

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

direction
query
  • valuestring

    enum: "all", "out", "in"

origin
query
  • valuestring

    enum: "journey", "broadcast", "mailbox", "api", "agent", "smtp"

mailbox_id
query
  • valuestring

    format: "uuid"

status
query
  • valuestring

    enum: "queued", "sent", "delivered", "bounced", "complained", "opened", "clicked", "replied", "received", "failed", "rejected"

from
query
  • valuestring

    format: "date"

to
query
  • valuestring

    format: "date"

query
query
  • valuestring

    maxLength: 512

Request body

No request body is specified in the contract.

Success response 200

Cursor page from the merged sent and received timeline, with SMTP attempts Banger refused as `rejected` rows. `query` also finds a refusal by its `smtp_` reference or the `bgr_` key prefix it used.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • directionstringrequired

    enum: "out", "in"

  • atstringrequired

    format: "date-time"

  • mailbox_idstring | nullrequired

    Null for sends that leave through no mailbox, such as the API and SMTP.

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • send_intent_idstring

    format: "uuid"

  • traffic_classstring

    enum: "mailbox", "product", "broadcast"

  • fromstringrequired
  • toarrayrequired
  • Each itemstring
  • recipient_countintegerrequired

    minimum: 0

  • subjectstringrequired
  • originobjectrequired

    No additional properties

  • kindstringrequired

    enum: "journey", "broadcast", "mailbox", "api", "agent", "smtp"

  • idstring
  • namestring
  • statusstringrequired

    enum: "queued", "sent", "delivered", "bounced", "complained", "opened", "clicked", "replied", "received", "failed", "rejected"

  • rejectionobject

    Why Banger refused an SMTP attempt, and the reply the client received.

  • refstringrequired

    pattern: "^smtp_[0-9a-z]{16}$"

  • kindstringrequired

    enum: "login_failed", "recipient_refused", "message_rejected"

  • replystringrequired

    The full SMTP reply, e.g. `550 5.7.1 ...`.

  • reply_codeintegerrequired

    minimum: 400 · maximum: 599

  • enhanced_codestringrequired
  • reasonstringrequired
  • messagestringrequired
  • key_prefixstringrequired

    The public `bgr_` prefix of the API key the client used.

  • client_ipstring
  • portinteger
  • tlsstring
  • attemptsintegerrequired

    Failed logins on one key collapse into one row per ten minutes.

    minimum: 1

  • last_atstringrequired

    format: "date-time"

  • detailobject
  • Additional propertyAny value
  • pageobjectrequired

    No additional properties

  • has_morebooleanrequired
  • next_cursorstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/logs?cursor=example&limit=50&direction=all&origin=journey&mailbox_id=00000000-0000-4000-8000-000000000001&status=queued&from=2026-01-01&to=2026-01-01&query=example' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/logs/{entryId}

getLogEntry

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

entryId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • directionstringrequired

    enum: "out", "in"

  • atstringrequired

    format: "date-time"

  • mailbox_idstring | nullrequired

    Null for sends that leave through no mailbox, such as the API and SMTP.

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • send_intent_idstring

    format: "uuid"

  • traffic_classstring

    enum: "mailbox", "product", "broadcast"

  • fromstringrequired
  • toarrayrequired
  • Each itemstring
  • recipient_countintegerrequired

    minimum: 0

  • subjectstringrequired
  • originobjectrequired

    No additional properties

  • kindstringrequired

    enum: "journey", "broadcast", "mailbox", "api", "agent", "smtp"

  • idstring
  • namestring
  • statusstringrequired

    enum: "queued", "sent", "delivered", "bounced", "complained", "opened", "clicked", "replied", "received", "failed", "rejected"

  • rejectionobject

    Why Banger refused an SMTP attempt, and the reply the client received.

  • refstringrequired

    pattern: "^smtp_[0-9a-z]{16}$"

  • kindstringrequired

    enum: "login_failed", "recipient_refused", "message_rejected"

  • replystringrequired

    The full SMTP reply, e.g. `550 5.7.1 ...`.

  • reply_codeintegerrequired

    minimum: 400 · maximum: 599

  • enhanced_codestringrequired
  • reasonstringrequired
  • messagestringrequired
  • key_prefixstringrequired

    The public `bgr_` prefix of the API key the client used.

  • client_ipstring
  • portinteger
  • tlsstring
  • attemptsintegerrequired

    Failed logins on one key collapse into one row per ten minutes.

    minimum: 1

  • last_atstringrequired

    format: "date-time"

  • detailobject
  • Additional propertyAny value
  • allOf 2object
  • detailunspecifiedrequired
  • oneOf 1object
  • kindstringrequired

    enum: "inbound"

  • threadunspecifiedrequired
  • allOf 1object

    Further nesting omitted

  • allOf 2object

    Further nesting omitted

  • oneOf 2object
  • kindstringrequired

    enum: "broadcast", "outbound"

  • sendobjectrequired
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstring | nullrequired

    format: "uuid"

    Further nesting omitted

  • command_idstring | nullrequired

    format: "uuid"

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • command_statusstring | nullrequired

    Further nesting omitted

  • subjectstring

    Further nesting omitted

  • recipientsarray

    Further nesting omitted

  • recipient_countintegerrequired

    Further nesting omitted

  • error_codestring | null

    Further nesting omitted

  • send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • providerstring | null

    Further nesting omitted

  • route_kindstring | null

    Further nesting omitted

  • sourcestring

    Further nesting omitted

  • from_addressstring

    Further nesting omitted

  • recipient_statesobject

    Further nesting omitted

  • provider_message_idstring | null

    Further nesting omitted

  • languageunspecified

    The language this email went out in; null when it was not translated.

    Further nesting omitted

  • journeyobject | null

    The Journey step and enrollment that sent this email; null for other sends.

    Further nesting omitted

  • experimentobject | null

    The experiment variant this email was; null when none applied.

    Further nesting omitted

  • created_atstringrequired

    format: "date-time"

    Further nesting omitted

  • updated_atstringrequired

    format: "date-time"

    Further nesting omitted

  • completed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • template_idstring | null

    format: "uuid"

    Further nesting omitted

  • template_versioninteger | null

    Further nesting omitted

  • workspace_revisioninteger | null

    Further nesting omitted

  • command_resultobject

    Further nesting omitted

  • command_started_atstring | null

    format: "date-time"

    Further nesting omitted

  • command_completed_atstring | null

    format: "date-time"

    Further nesting omitted

  • body_textstring

    Further nesting omitted

  • body_htmlstring

    Further nesting omitted

  • reply_toarray

    Further nesting omitted

  • headersobject

    Further nesting omitted

  • tagsarray

    Further nesting omitted

  • timelinearrayrequired
  • Each itemobject

    Further nesting omitted

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/logs/{entryId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Mail page

GET/v1/workspaces/{workspaceId}/mail-page

getMailPage

Returns the complete first-paint mail payload in one request: visible mailboxes, the selected mailbox, labels, mailbox counts, workspace revision, and the selected mailbox's first thread page.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

mailbox_id
query

Preferred mailbox. Falls back to the first visible mailbox.

  • valuestring

    format: "uuid"

label_id
query

Return only selected-mailbox threads carrying this label.

  • valuestring

    format: "uuid"

view
query
  • valuestring

    default: "inbox" · enum: "inbox", "sent", "drafts", "archive", "trash", "spam", "all"

Request body

No request body is specified in the contract.

Success response 200

First-paint mail data for the workspace.

application/json

  • valueobject
  • dataobjectrequired
  • mailboxesarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

  • domainsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • namestringrequired
  • statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • selected_mailbox_idstring

    format: "uuid"

  • labelsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • colorstring | null
  • kindstringrequired
  • updated_atstringrequired

    format: "date-time"

  • threadsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • snippetstringrequired
  • last_message_atstringrequired

    format: "date-time"

  • message_countintegerrequired
  • unread_countintegerrequired
  • is_archivedbooleanrequired
  • is_trashbooleanrequired
  • is_spambooleanrequired
  • is_starredbooleanrequired
  • is_sentbooleanrequired
  • has_attachmentsbooleanrequired
  • sender_unverifiedboolean

    True when the latest message's sender passed neither SPF nor DKIM for its From domain, so its From address may be forged.

  • labelsarrayrequired
  • Each itemstring
  • participantsarray
  • Each itemobject
  • namestring

    Further nesting omitted

  • emailstringrequired

    format: "email"

    Further nesting omitted

  • recipientsarray

    The To list of the mailbox's latest sent message in this thread; empty when the mailbox sent none. Sent views show these instead of the sender.

  • Each itemobject
  • namestring

    Further nesting omitted

  • emailstringrequired

    format: "email"

    Further nesting omitted

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired
  • mailbox_thread_countsobjectrequired
  • Additional propertyinteger
  • revisionintegerrequired

    format: "int64"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mail-page?limit=50&mailbox_id=00000000-0000-4000-8000-000000000001&label_id=00000000-0000-4000-8000-000000000001&view=inbox' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Mailchimp migration

GET/v1/workspaces/{workspaceId}/mailchimp-migration

Read the progress and report of the move from Mailchimp.

Poll it to show live progress. Reads the move of a connection whose key stopped working (phase needs_new_key) or that was disconnected (phase disconnected) too, so what already came over can be shown. Without connection_id: the product's one active-or-error Mailchimp connection, else its most recently moved disconnected one.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connection_id
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The move's current report.

application/json

  • valueobject
  • dataobjectrequired

    The move from one Mailchimp connection into a product. Poll GET /mailchimp-migration for live progress: `phase` says where it is; `counts`, `audiences`, `segments`, `templates` and `campaigns` grow as it goes.

  • migration_idstringrequired

    format: "uuid"

  • connection_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "importing", "completed"

  • phasestringrequired

    importing (reading Mailchimp), copying_designs (templates and campaigns), finishing, completed, needs_new_key (Mailchimp rejected the API key; the move is paused until a new key is saved with rotateConnectionCredential), or disconnected (the connection was removed; everything already moved stays in Banger and the counts stay readable).

    enum: "importing", "copying_designs", "finishing", "completed", "needs_new_key", "disconnected"

  • started_atstringrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • connectionobjectrequired
  • display_namestringrequired
  • account_namestring | nullrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • last_error_codestring | nullrequired
  • needs_new_keybooleanrequired
  • messagestring

    Present when needs_new_key or disconnected, ready to show.

  • progressobjectrequired
  • import_streamsintegerrequired
  • import_streams_doneintegerrequired
  • failing_streamsarrayrequired
  • Each itemobject
  • streamstringrequired
  • refstringrequired
  • error_codestring | nullrequired
  • designs_waitingintegerrequired
  • notestringrequired
  • countsobjectrequired
  • contactsintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • contact_listsintegerrequired
  • contact_fieldsintegerrequired
  • segments_convertedintegerrequired
  • segments_kept_as_listsintegerrequired
  • templates_importedintegerrequired
  • templates_to_rebuildintegerrequired
  • campaigns_imported_as_designsintegerrequired
  • automations_importedintegerrequired
  • audiencesarrayrequired
  • Each itemobject
  • mailchimp_idstringrequired
  • namestringrequired
  • list_idstring | nullrequired

    format: "uuid"

  • list_namestring | nullrequired
  • members_in_bangerintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • members_in_mailchimpintegerrequired
  • contact_fieldsarrayrequired
  • Each itemobject
  • mailchimp_tagstringrequired
  • namestringrequired
  • field_keystringrequired
  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • consentstringrequired
  • segmentsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • templatesarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • campaignsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • automationsobjectrequired
  • importedbooleanrequired

    const: false

  • whystringrequired
  • next_stepsarrayrequired
  • Each itemstring
  • help_call_urlstringrequired

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailchimp-migration?connection_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/mailchimp-migration

Start, or run again, the move from Mailchimp into this product.

Connecting Mailchimp already starts it; running again re-syncs and adds only what is new. Needs contacts:write and campaigns:write; a signed-in person must be an owner or admin. No connection grant is needed.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • connection_idstring

    format: "uuid"

  • recent_campaignsinteger

    minimum: 0 · maximum: 50 · default: 10

Success response 202

The move is running in the background.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object

    The move from one Mailchimp connection into a product. Poll GET /mailchimp-migration for live progress: `phase` says where it is; `counts`, `audiences`, `segments`, `templates` and `campaigns` grow as it goes.

  • migration_idstringrequired

    format: "uuid"

  • connection_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "importing", "completed"

  • phasestringrequired

    importing (reading Mailchimp), copying_designs (templates and campaigns), finishing, completed, needs_new_key (Mailchimp rejected the API key; the move is paused until a new key is saved with rotateConnectionCredential), or disconnected (the connection was removed; everything already moved stays in Banger and the counts stay readable).

    enum: "importing", "copying_designs", "finishing", "completed", "needs_new_key", "disconnected"

  • started_atstringrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • connectionobjectrequired
  • display_namestringrequired
  • account_namestring | nullrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • last_error_codestring | nullrequired
  • needs_new_keybooleanrequired
  • messagestring

    Present when needs_new_key or disconnected, ready to show.

  • progressobjectrequired
  • import_streamsintegerrequired
  • import_streams_doneintegerrequired
  • failing_streamsarrayrequired
  • Each itemobject
  • streamstringrequired

    Further nesting omitted

  • refstringrequired

    Further nesting omitted

  • error_codestring | nullrequired

    Further nesting omitted

  • designs_waitingintegerrequired
  • notestringrequired
  • countsobjectrequired
  • contactsintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • contact_listsintegerrequired
  • contact_fieldsintegerrequired
  • segments_convertedintegerrequired
  • segments_kept_as_listsintegerrequired
  • templates_importedintegerrequired
  • templates_to_rebuildintegerrequired
  • campaigns_imported_as_designsintegerrequired
  • automations_importedintegerrequired
  • audiencesarrayrequired
  • Each itemobject
  • mailchimp_idstringrequired
  • namestringrequired
  • list_idstring | nullrequired

    format: "uuid"

  • list_namestring | nullrequired
  • members_in_bangerintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • members_in_mailchimpintegerrequired
  • contact_fieldsarrayrequired
  • Each itemobject
  • mailchimp_tagstringrequired
  • namestringrequired
  • field_keystringrequired
  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • consentstringrequired
  • segmentsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring

    Further nesting omitted

  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring

    Further nesting omitted

  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • templatesarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring

    Further nesting omitted

  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring

    Further nesting omitted

  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • campaignsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring

    Further nesting omitted

  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring

    Further nesting omitted

  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • automationsobjectrequired
  • importedbooleanrequired

    const: false

  • whystringrequired
  • next_stepsarrayrequired
  • Each itemstring
  • help_call_urlstringrequired

    format: "uri"

  • allOf 2object
  • messagestring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/mailchimp-migration' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "connection_id": "00000000-0000-4000-8000-000000000001",
  "recent_campaigns": 10
}'

Managed content

GET/v1/workspaces/{workspaceId}/managed-content

List product managed email content in stable newest-id order.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

cursor
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Product content inventory and optional next cursor.

application/json

  • valueobject
  • dataobjectrequired
  • itemsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value
  • next_cursorstring | nullrequired

    format: "uuid"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content?limit=50&cursor=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/managed-content

Save a source-locale email draft and queue missing target translations.

Does not send or publish. Translation preparation has no per-language charge.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • contractobjectrequired

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • body_textstring

    maxLength: 100000

  • layoutstring

    maxLength: 100000

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

  • oneOf 1object

    No additional properties

  • typestringrequired

    enum: "string", "text", "url", "image_url", "html", "date", "datetime", "number", "boolean", "money"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultunspecified

    Must match the field type.

    Further nesting omitted

  • oneOf 2object

    No additional properties

  • typeunspecifiedrequired

    const: "object"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultobject

    Further nesting omitted

  • propertiesobjectrequired

    Further nesting omitted

  • oneOf 3object

    No additional properties

  • typeunspecifiedrequired

    const: "list"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultarray

    Further nesting omitted

  • itemsunspecifiedrequired

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

Success response 201

Draft source and queued translation jobs.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "contract": {
    "source_locale": "example",
    "configured_locales": [
      "example"
    ],
    "fallback_locale": "example",
    "layout_id": "00000000-0000-4000-8000-000000000001",
    "localization_policy": {
      "manual_review": false
    },
    "source": {
      "subject": "example",
      "preheader": "example",
      "body_text": "example",
      "body_html": "example",
      "layout": "example",
      "variants": {},
      "variables": {}
    },
    "samples": {},
    "translations": {}
  }
}'
GET/v1/workspaces/{workspaceId}/managed-content/{contentId}

Read the draft revision, translations, and preparation status.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current content state.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value
  • allOf 2object
  • source_revisionobjectrequired
  • idstringrequired

    format: "uuid"

  • content_idstringrequired

    format: "uuid"

  • revisionintegerrequired
  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • fallback_localestring | nullrequired
  • localization_policyobjectrequired

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • source_messagesobjectrequired
  • Additional propertystring
  • layout_idstring | nullrequired

    format: "uuid"

  • layout_revision_idstring | nullrequired

    format: "uuid"

  • samplesobjectrequired
  • Additional propertyobject
  • Additional propertyAny value
  • restored_from_revision_idstring | nullrequired

    format: "uuid"

  • translationsarrayrequired
  • Each itemunspecified
  • allOf 1object
  • source_revision_idstringrequired

    format: "uuid"

    Further nesting omitted

  • localestringrequired

    Further nesting omitted

  • stringsobjectrequired

    Further nesting omitted

  • provenancestringrequired

    enum: "supplied", "generated", "reviewed"

    Further nesting omitted

  • statusstringrequired

    enum: "ready", "needs_review"

    Further nesting omitted

  • allOf 2object
  • strings_sha256stringrequired

    Further nesting omitted

  • translation_jobsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • source_revision_idstringrequired

    format: "uuid"

  • localestringrequired
  • statusstringrequired
  • attempt_countintegerrequired
  • error_codestring | nullrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
PATCH/v1/workspaces/{workspaceId}/managed-content/{contentId}

Save a new source draft revision without changing production publication.

A breaking variable change cannot publish over this content ID. Create and publish new managed content, change each Journey or draft Broadcast reference to the new ID, then review/activate the Journey or schedule the Broadcast. Existing accepted sends and scheduled Broadcast recipients retain their pinned revisions.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versionintegerrequired

    minimum: 1

  • contractobjectrequired

    No additional properties

  • source_localestring

    Canonical BCP 47 source locale; inherits product settings when omitted.

  • configured_localesarray

    Source plus target locales; omitted source is added by the server.

    maxItems: 100 · uniqueItems: true

  • Each itemstring
  • fallback_localestring
  • layout_idstring

    Selected reusable layout; the server snapshots its published revision into this content revision.

    format: "uuid"

  • localization_policyobject

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • body_textstring

    maxLength: 100000

  • layoutstring

    maxLength: 100000

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

  • oneOf 1object

    No additional properties

  • typestringrequired

    enum: "string", "text", "url", "image_url", "html", "date", "datetime", "number", "boolean", "money"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultunspecified

    Must match the field type.

    Further nesting omitted

  • oneOf 2object

    No additional properties

  • typeunspecifiedrequired

    const: "object"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultobject

    Further nesting omitted

  • propertiesobjectrequired

    Further nesting omitted

  • oneOf 3object

    No additional properties

  • typeunspecifiedrequired

    const: "list"

    Further nesting omitted

  • requiredboolean

    Further nesting omitted

  • descriptionstring

    maxLength: 2000

    Further nesting omitted

  • defaultarray

    Further nesting omitted

  • itemsunspecifiedrequired

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • samplesobject

    Named sample value sets for preview and source validation.

  • Additional propertyobject
  • Additional propertyAny value
  • translationsobject

    Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

  • Additional propertyobject
  • Additional propertystring

Success response 200

New draft revision and queued translation jobs.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "expected_version": 1,
  "contract": {
    "source_locale": "example",
    "configured_locales": [
      "example"
    ],
    "fallback_locale": "example",
    "layout_id": "00000000-0000-4000-8000-000000000001",
    "localization_policy": {
      "manual_review": false
    },
    "source": {
      "subject": "example",
      "preheader": "example",
      "body_text": "example",
      "body_html": "example",
      "layout": "example",
      "variants": {},
      "variables": {}
    },
    "samples": {},
    "translations": {}
  }
}'
POST/v1/workspaces/{workspaceId}/managed-content/{contentId}/render

Preview a saved source revision and one ready locale without sending.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    Use either sample_set or variables, never both. Defaults to the first named sample.

    No additional properties

  • source_revision_idstring

    format: "uuid"

  • variantstring

    Source A/B version key.

  • localestring
  • timezonestring

    IANA timezone; defaults to UTC.

  • sample_setstring
  • variablesobject
  • Additional propertyAny value

Success response 200

Deterministic subject, preheader, HTML, derived plain text, locale, and direction.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • subjectstringrequired
  • preheaderstring
  • htmlstringrequired
  • textstringrequired
  • localestringrequired
  • directionstringrequired

    enum: "ltr", "rtl"

  • warningsarray
  • Each itemstring
  • Additional propertyAny value
  • allOf 2object
  • source_revision_idstringrequired

    format: "uuid"

  • layout_revision_idstring | nullrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/render' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "source_revision_id": "00000000-0000-4000-8000-000000000001",
  "variant": "example",
  "locale": "example",
  "timezone": "example",
  "sample_set": "example",
  "variables": {}
}'
POST/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations/{locale}/retry

Retry a failed automatic translation of the current source draft.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

locale
path · required
  • valuestring

Request body

No request body is specified in the contract.

Success response 200

Translation retry queued.

application/json

  • valueobject
  • databooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations/{locale}/retry' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations

Read translation catalogs and preparation jobs for the draft revision.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current content state including translations and jobs.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value
  • allOf 2object
  • source_revisionobjectrequired
  • idstringrequired

    format: "uuid"

  • content_idstringrequired

    format: "uuid"

  • revisionintegerrequired
  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • fallback_localestring | nullrequired
  • localization_policyobjectrequired

    A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.

    No additional properties

  • manual_reviewboolean

    default: false

  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • source_messagesobjectrequired
  • Additional propertystring
  • layout_idstring | nullrequired

    format: "uuid"

  • layout_revision_idstring | nullrequired

    format: "uuid"

  • samplesobjectrequired
  • Additional propertyobject
  • Additional propertyAny value
  • restored_from_revision_idstring | nullrequired

    format: "uuid"

  • translationsarrayrequired
  • Each itemunspecified
  • allOf 1object
  • source_revision_idstringrequired

    format: "uuid"

    Further nesting omitted

  • localestringrequired

    Further nesting omitted

  • stringsobjectrequired

    Further nesting omitted

  • provenancestringrequired

    enum: "supplied", "generated", "reviewed"

    Further nesting omitted

  • statusstringrequired

    enum: "ready", "needs_review"

    Further nesting omitted

  • allOf 2object
  • strings_sha256stringrequired

    Further nesting omitted

  • translation_jobsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • source_revision_idstringrequired

    format: "uuid"

  • localestringrequired
  • statusstringrequired
  • attempt_countintegerrequired
  • error_codestring | nullrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations/{locale}/review

Review the exact pending translation catalog for one source revision.

Requires the catalog SHA-256 from current readback. Corrected strings are optional; the source is not published by this operation.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

locale
path · required
  • valuestring

Request body required

application/json

  • valueobject

    No additional properties

  • source_revision_idstringrequired

    format: "uuid"

  • expected_translation_sha256stringrequired

    pattern: "^[a-f0-9]{64}$"

  • stringsobject
  • Additional propertystring

Success response 200

Reviewed catalog and its new SHA-256.

application/json

  • valueobject
  • dataobjectrequired
  • source_revision_idstringrequired

    format: "uuid"

  • localestringrequired
  • stringsobjectrequired
  • Additional propertystring
  • provenancestringrequired

    enum: "reviewed"

  • statusstringrequired

    enum: "ready"

  • strings_sha256stringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/translations/{locale}/review' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "source_revision_id": "00000000-0000-4000-8000-000000000001",
  "expected_translation_sha256": "example",
  "strings": {}
}'
GET/v1/workspaces/{workspaceId}/managed-content/{contentId}/versions

List immutable publication history.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Publication records.

application/json

  • valueobject
  • dataobjectrequired
  • versionsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • revisionintegerrequired
  • source_localestringrequired
  • configured_localesarrayrequired
  • Each itemstring
  • sourceobjectrequired

    No additional properties

  • subjectstringrequired

    minLength: 1 · maxLength: 100000

  • preheaderstring

    maxLength: 100000

  • body_textstring

    Accepted for source compatibility; rendered plain text derives from final HTML.

    maxLength: 100000

  • body_htmlstringrequired

    minLength: 1 · maxLength: 100000

  • layoutstring

    Must contain one {{ content }} slot.

    maxLength: 100000

  • variantsobject

    Optional source versions. Every version is translated automatically in the same revision.

  • Additional propertyobject

    No additional properties

    Further nesting omitted

  • variablesobjectrequired
  • Additional propertyunspecified

    Recursive typed variable. Money values use {amount_cents: integer, currency: ISO 4217 code}; date values are ISO calendar dates and datetime values are ISO timestamps with offsets.

    Further nesting omitted

  • source_messagesobjectrequired
  • Additional propertystring
  • samplesobjectrequired
  • Additional propertyobject
  • Additional propertyAny value
  • restored_from_revision_idstring | nullrequired

    format: "uuid"

  • created_by_actor_idstringrequired
  • created_atstringrequired

    format: "date-time"

  • publicationsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • source_revision_idstringrequired

    format: "uuid"

  • approval_idstring | nullrequired

    format: "uuid"

  • published_by_actor_idstringrequired
  • published_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/versions' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/managed-content/{contentId}/restore

Copy an earlier source revision into a new draft, without publishing it.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

contentId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • source_revision_idstringrequired

    format: "uuid"

  • expected_versionintegerrequired

    minimum: 1

Success response 200

Restored draft state.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired

    minimum: 1

  • review_requiredbooleanrequired
  • draft_revision_idstring | null

    format: "uuid"

  • submitted_revision_idstring | null

    format: "uuid"

  • approved_revision_idstring | null

    format: "uuid"

  • published_revision_idstring | null

    format: "uuid"

  • published_publication_idstring | null

    format: "uuid"

  • source_revisionobject
  • Additional propertyAny value
  • translationsarray
  • Each itemobject
  • Additional propertyAny value
  • translation_jobsarray
  • Each itemobject
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-content/{contentId}/restore' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "source_revision_id": "00000000-0000-4000-8000-000000000001",
  "expected_version": 1
}'

Managed layouts

GET/v1/workspaces/{workspaceId}/managed-layouts

List reusable product email layouts.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Product layouts.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired
  • draft_revision_idstring | nullrequired

    format: "uuid"

  • published_revision_idstring | nullrequired

    format: "uuid"

  • published_publication_idstring | nullrequired

    format: "uuid"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/managed-layouts

Create a draft layout from validated HTML or a brand-seeded default.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

  • htmlstring

    Must contain exactly one content slot.

  • source_localestring
  • source_messagesobject
  • Additional propertystring
  • translationsobject
  • Additional propertyobject
  • Additional propertystring

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired
  • draft_revision_idstring | nullrequired

    format: "uuid"

  • published_revision_idstring | nullrequired

    format: "uuid"

  • published_publication_idstring | nullrequired

    format: "uuid"

  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "html": "example",
  "source_locale": "example",
  "source_messages": {},
  "translations": {}
}'
GET/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}

Read a layout and its current draft revision.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

layoutId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Layout and draft revision.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired
  • draft_revision_idstring | nullrequired

    format: "uuid"

  • published_revision_idstring | nullrequired

    format: "uuid"

  • published_publication_idstring | nullrequired

    format: "uuid"

  • draft_revisionunspecifiedrequired
  • anyOf 1object
  • idstringrequired

    format: "uuid"

  • layout_idstring

    format: "uuid"

  • revisionintegerrequired
  • htmlstringrequired
  • brand_snapshotobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • source_localestringrequired
  • source_messagesobjectrequired
  • Additional propertystring
  • translationsobjectrequired
  • Additional propertyobject
  • Additional propertystring

    Further nesting omitted

  • restored_from_revision_idstring | nullrequired

    format: "uuid"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

  • anyOf 2null

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
PATCH/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}

Save a validated draft layout revision.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

layoutId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • expected_versionintegerrequired

    minimum: 1

  • htmlstringrequired

    Must contain exactly one content slot.

  • source_localestring
  • source_messagesobject
  • Additional propertystring
  • translationsobject
  • Additional propertyobject
  • Additional propertystring

Success response 200

New draft revision.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired
  • draft_revision_idstring | nullrequired

    format: "uuid"

  • published_revision_idstring | nullrequired

    format: "uuid"

  • published_publication_idstring | nullrequired

    format: "uuid"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "expected_version": 1,
  "html": "example",
  "source_locale": "example",
  "source_messages": {},
  "translations": {}
}'
GET/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/versions

List immutable layout revisions.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

layoutId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Layout revisions.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • layout_idstring

    format: "uuid"

  • revisionintegerrequired
  • htmlstringrequired
  • brand_snapshotobjectrequired
  • company_namestring

    maxLength: 160

  • logo_urlstring

    The icon: the mark on its own, used small (email footer, slide-in forms) and as the header when there is no wordmark.

    maxLength: 2000

  • wordmark_urlstring

    The wordmark: the company name as drawn, shown alone at the top of every email.

    maxLength: 2000

  • wordmark_inkstring

    The color the wordmark is drawn in, measured from the image on save. A header the mark wouldn't read on gets a plate behind it. Absent for opaque images.

    maxLength: 7

  • logo_inkstring

    The color the icon is drawn in, measured from the image on save.

    maxLength: 7

  • website_urlstring

    maxLength: 2000

  • primary_colorstring

    maxLength: 7

  • accent_colorstring

    maxLength: 7

  • background_colorstring

    maxLength: 7

  • surface_colorstring

    maxLength: 7

  • text_colorstring

    maxLength: 7

  • muted_text_colorstring

    maxLength: 7

  • heading_font_familystring

    maxLength: 200

  • body_font_familystring

    maxLength: 200

  • tonestring

    maxLength: 1000

  • footer_addressstring

    maxLength: 500

  • email_stylestring

    maxLength: 20

  • source_localestringrequired
  • source_messagesobjectrequired
  • Additional propertystring
  • translationsobjectrequired
  • Additional propertyobject
  • Additional propertystring
  • restored_from_revision_idstring | nullrequired

    format: "uuid"

  • created_by_actor_idstring
  • created_atstring

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/versions' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/impact

Describe content drafts and publications depending on this layout.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

layoutId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Layout dependency impact.

application/json

  • valueobject
  • dataobjectrequired
  • layout_idstringrequired

    format: "uuid"

  • layout_revision_idstringrequired

    format: "uuid"

  • layout_versionintegerrequired
  • affected_contentsarrayrequired
  • Each itemobject
  • content_idstringrequired

    format: "uuid"

  • versionintegerrequired
  • published_revision_idstringrequired

    format: "uuid"

  • active_journeysarrayrequired
  • Each itemobject
  • journey_idstringrequired

    format: "uuid"

  • versionintegerrequired
  • definition_sha256stringrequired
  • manifest_sha256stringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/impact' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/restore

Copy an immutable layout revision into a new draft.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

layoutId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • layout_revision_idstringrequired

    format: "uuid"

  • expected_versionintegerrequired

    minimum: 1

Success response 200

Restored draft revision.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • versionintegerrequired
  • draft_revision_idstring | nullrequired

    format: "uuid"

  • published_revision_idstring | nullrequired

    format: "uuid"

  • published_publication_idstring | nullrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/managed-layouts/{layoutId}/restore' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "layout_revision_id": "00000000-0000-4000-8000-000000000001",
  "expected_version": 1
}'

Members

PATCH/v1/workspaces/{workspaceId}/members/{memberId}

Change another member's role.

Owners and admins set admin, member or viewer on another member. A person signed in, or an agent acting through their OAuth grant, must make the change; a standalone API key cannot. Nobody changes their own role and the owner's role is not changeable. Setting the current role changes nothing. A partner (a Banger Partners collaborator) keeps the partner role: the owner removes partners in Settings → Partners, and only their mailboxes can be narrowed here.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

memberId
path · required

The member's identity id, as `id` in the workspace directory.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • rolestringrequired

    enum: "admin", "member", "viewer"

Success response 200

The member with their new role and the role they had before.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • userIdstringrequired
  • emailstring

    format: "email"

  • displayNamestring
  • kindstringrequired

    const: "user"

  • rolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

  • statusstringrequired

    enum: "active", "suspended"

  • allOf 2object
  • previousRolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/members/{memberId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "role": "admin"
}'

Oauth

POST/v1/workspaces/{workspaceId}/oauth/setup-ticket

Create an agent connection setup ticket

Requires a signed-in human session. API keys and agent credentials cannot authorize this operation.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • entry_surfacestringrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent"

  • client_namestringrequired

    minLength: 1 · maxLength: 100

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • mcp_urlstringrequired
  • expires_atstringrequired

    format: "date-time"

  • scopesarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth/setup-ticket' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "entry_surface": "codex",
  "client_name": "example"
}'
POST/v1/workspaces/{workspaceId}/oauth/setup-ticket/connection-code

Email an agent connection code

Requires a signed-in human session. API keys and agent credentials cannot authorize this operation.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • mcp_urlstringrequired

    minLength: 8 · maxLength: 8000

  • reuse_pendingboolean

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "code_sent"

  • messagestring
  • expires_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth/setup-ticket/connection-code' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mcp_url": "examplex",
  "reuse_pending": true
}'
DELETE/v1/workspaces/{workspaceId}/oauth/setup-ticket/connection-code

Cancel a pending agent connection code

Requires a signed-in human session. API keys and agent credentials cannot authorize this operation.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • mcp_urlstringrequired

    minLength: 8 · maxLength: 8000

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "cancelled"

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth/setup-ticket/connection-code' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mcp_url": "examplex"
}'

Oauth clients

GET/v1/workspaces/{workspaceId}/oauth-clients

List the workspace's OAuth clients for agent platforms that connect with a client ID and secret, such as Gemini Enterprise.

Owners and admins only. Secrets are never returned.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Active OAuth clients, newest first.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • client_idstringrequired
  • namestringrequired
  • presetstringrequired

    enum: "gemini_enterprise", "custom"

  • client_surfacestringrequired

    The agent platform behind an OAuth connection, from the client's name and redirect URIs.

    enum: "codex", "chatgpt", "claude", "grok", "gemini", "other_agent"

  • redirect_urisarrayrequired
  • Each itemstring

    format: "uri"

  • connectionsintegerrequired

    Active connections made through this client.

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • created_by_youbooleanrequired
  • setupobjectrequired

    The values to enter in the agent platform's custom MCP server form.

  • server_urlstringrequired

    format: "uri"

  • authorization_urlstringrequired

    format: "uri"

  • token_urlstringrequired

    format: "uri"

  • scopesstringrequired

    Space-separated. offline_access asks for a refresh token, which every connection has.

  • token_endpoint_auth_methodsarrayrequired
  • Each itemstring

    enum: "client_secret_basic", "client_secret_post"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth-clients' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/oauth-clients

Create a confidential OAuth client (client ID and secret) for an agent platform.

Owners and admins only. Each member who connects through the client signs in to Banger, approves access, and acts with their own role in this workspace.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • namestring

    Shown in Connected apps. Defaults to "Gemini Enterprise" for that preset.

    minLength: 1 · maxLength: 100

  • presetstring

    gemini_enterprise uses Google's redirect URI; custom requires redirect_uris.

    default: "gemini_enterprise" · enum: "gemini_enterprise", "custom"

  • redirect_urisarray

    Custom preset only. HTTPS redirect URIs, fixed at creation.

    minItems: 1 · maxItems: 10

  • Each itemstring

    format: "uri"

Success response 201

OAuth client created. The client secret is returned only once.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • client_idstringrequired
  • namestringrequired
  • presetstringrequired

    enum: "gemini_enterprise", "custom"

  • client_surfacestringrequired

    The agent platform behind an OAuth connection, from the client's name and redirect URIs.

    enum: "codex", "chatgpt", "claude", "grok", "gemini", "other_agent"

  • redirect_urisarrayrequired
  • Each itemstring

    format: "uri"

  • connectionsintegerrequired

    Active connections made through this client.

    minimum: 0

  • created_atstringrequired

    format: "date-time"

  • created_by_youbooleanrequired
  • setupobjectrequired

    The values to enter in the agent platform's custom MCP server form.

  • server_urlstringrequired

    format: "uri"

  • authorization_urlstringrequired

    format: "uri"

  • token_urlstringrequired

    format: "uri"

  • scopesstringrequired

    Space-separated. offline_access asks for a refresh token, which every connection has.

  • token_endpoint_auth_methodsarrayrequired
  • Each itemstring

    enum: "client_secret_basic", "client_secret_post"

  • allOf 2object
  • client_secretstringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth-clients' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "preset": "gemini_enterprise",
  "redirect_uris": [
    "https://example.com"
  ]
}'
POST/v1/workspaces/{workspaceId}/oauth-clients/{clientId}/revoke

Revoke an OAuth client. Its secret stops working and every connection made through it loses access within about 30 seconds.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

clientId
path · required
  • valuestring

    maxLength: 200

Request body

No request body is specified in the contract.

Success response 200

OAuth client revoked.

application/json

  • valueobject
  • dataobjectrequired
  • client_idstringrequired
  • revokedbooleanrequired

    const: true

  • revoked_connectionsintegerrequired

    minimum: 0

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/oauth-clients/{clientId}/revoke' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Qa

POST/v1/workspaces/{workspaceId}/qa/approvals/{approvalId}/decision

decideDedicatedQaApproval

Explicit automated approval, never human review. Only the reserved production QA owner session in its isolated test workspace can decide the exact managed publication, Journey activation or dispatcher email within a single bounded daily run. Customer approvals and launcher approval rules are unchanged. A repeated or changed decision is refused.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

approvalId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueunspecified
  • allOf 1object
  • run_idstringrequired
  • occurrencestringrequired

    The normal consumed daily-full occurrence in America/Sao_Paulo.

  • started_atstringrequired

    format: "date-time"

  • deadlinestringrequired

    At most 55 minutes after the immutable run start

    format: "date-time"

  • domainstringrequired

    Exact server-derived run domain under send.qa.snappile.com.

  • allOf 2object
  • decisionstringrequired

    enum: "approved"

  • operation_keystringrequired
  • expected_payload_sha256stringrequired

    pattern: "^[a-f0-9]{64}$"

  • recipientsarrayrequired
  • Each itemstring

    format: "email"

Success response 200

Explicit automation provenance and the existing execution job or resumed enrollment.

application/json

  • valueobject
  • dataobject
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/qa/approvals/{approvalId}/decision' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "run_id": "example",
  "occurrence": "example",
  "started_at": "2026-01-01T00:00:00Z",
  "deadline": "2026-01-01T00:00:00Z",
  "domain": "example",
  "decision": "approved",
  "operation_key": "example",
  "expected_payload_sha256": "example",
  "recipients": [
    "person@example.com"
  ]
}'
POST/v1/workspaces/{workspaceId}/qa/approval-runs/revoke

revokeDedicatedQaApprovalRun

Permanently close the exact QA run's approval scope, including an uncertain first decision. Cleanup is allowed after the work deadline. Reopening or extending a run is unsupported.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • run_idstringrequired
  • occurrencestringrequired

    The normal consumed daily-full occurrence in America/Sao_Paulo.

  • started_atstringrequired

    format: "date-time"

  • deadlinestringrequired

    At most 55 minutes after the immutable run start

    format: "date-time"

  • domainstringrequired

    Exact server-derived run domain under send.qa.snappile.com.

Success response 200

Run scope revoked.

No response schema is specified in the contract.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/qa/approval-runs/revoke' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "run_id": "example",
  "occurrence": "example",
  "started_at": "2026-01-01T00:00:00Z",
  "deadline": "2026-01-01T00:00:00Z",
  "domain": "example"
}'

Realtime ticket

POST/v1/workspaces/{workspaceId}/realtime-ticket

createRealtimeTicket

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • device_idstringrequired

    minLength: 8 · maxLength: 128

Success response 200

Short-lived ticket scoped to the actor and workspace.

application/json

  • valueobject
  • dataobjectrequired
  • ticketstringrequired
  • websocket_urlstringrequired

    format: "uri"

  • expires_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/realtime-ticket' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "device_id": "examplex"
}'

Recipient suggestions

GET/v1/workspaces/{workspaceId}/recipient-suggestions

listRecipientSuggestions

Addresses the workspace's mailboxes sent mail to (To, Cc and Bcc of Sent mail), most written-to first. Broadcasts, Journeys, product email and Outreach are not included. q matches the start of the address, its domain, or any word of the name.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

q
query
  • valuestring

    maxLength: 320

limit
query
  • valueinteger

    minimum: 1 · maximum: 50 · default: 8

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • emailstringrequired
  • namestring | nullrequired
  • send_countintegerrequired
  • last_sent_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/recipient-suggestions?q=example&limit=8' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Review policy

GET/v1/workspaces/{workspaceId}/review-policy

getActionReviewPolicy

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Workspace automatic-review policy.

application/json

  • valueobject
  • dataobjectrequired
  • policy_versionintegerrequired

    enum: 1, 2

  • automatic_review_enabledbooleanrequired
  • manual_send_review_enabledbooleanrequired

    False by default for direct requests; saved stricter limits remain enabled.

  • manual_send_recipient_thresholdintegerrequired

    minimum: 1 · maximum: 1000000

  • updated_by_actor_idstringrequired
  • created_atstring | null

    format: "date-time"

  • updated_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/review-policy' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/review-policy

updateActionReviewPolicy

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • automatic_review_enabledbooleanrequired
  • manual_send_recipient_thresholdintegerrequired

    minimum: 1 · maximum: 1000000

  • manual_send_review_enabledboolean

    Enable the optional human review limit; explicit legacy threshold updates keep it enabled.

Success response 200

Updated automatic-review policy.

application/json

  • valueobject
  • dataobjectrequired
  • policy_versionintegerrequired

    enum: 1, 2

  • automatic_review_enabledbooleanrequired
  • manual_send_review_enabledbooleanrequired

    False by default for direct requests; saved stricter limits remain enabled.

  • manual_send_recipient_thresholdintegerrequired

    minimum: 1 · maximum: 1000000

  • updated_by_actor_idstringrequired
  • created_atstring | null

    format: "date-time"

  • updated_atstring | null

    format: "date-time"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/review-policy' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "automatic_review_enabled": true,
  "manual_send_recipient_threshold": 1,
  "manual_send_review_enabled": true
}'

Select

POST/v1/workspaces/{workspaceId}/select

Make a workspace the signed-in person's current workspace.

Browser sessions only; API keys and OAuth grants are pinned to the workspace they were authorized for and receive 403 credential_workspace_pinned. Requires an active membership. The app then opens this workspace with its products and onboarding. The person's onboarding journey is not reset. Idempotent.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The workspace is selected.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • selected_workspace_idstringrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/select' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Sender avatar

GET/v1/workspaces/{workspaceId}/sender-avatar

getSenderAvatar

Resolves an exact sender avatar first, then discovers and caches the sender domain icon in the private workspace B2 prefix. A sender with no picture answers 204, and so does an address that is not a sender in this workspace, which is never looked up.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

email
query · required
  • valuestring

    format: "email" · maxLength: 320

Request body

No request body is specified in the contract.

Success response 200

Authenticated sender or domain avatar image.

image/png

  • valuestring

    format: "binary"

image/jpeg

  • valuestring

    format: "binary"

image/webp

  • valuestring

    format: "binary"

image/svg+xml

  • valuestring

    format: "binary"

image/x-icon

  • valuestring

    format: "binary"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sender-avatar?email=person%40example.com' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Sending health

GET/v1/workspaces/{workspaceId}/sending-health

Read sender-reputation enforcement state, lane rates, pauses and the enforced thresholds.

Every lane (Mailbox, Product, Broadcast) of every sending domain with its trailing 24-hour hard bounce and complaint rates and state (active, warning, paused), any domain pause, paused mailboxes, and whether the workspace is frozen. Each pause lists its top bounce and complaint sources and whether a workspace admin may resume it. Thresholds are documented in docs/product/sending-reputation-enforcement.md.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Sending health.

application/json

  • valueobject
  • dataobjectrequired
  • workspaceobjectrequired
  • statestringrequired

    enum: "active", "frozen"

  • holdunspecifiedrequired
  • oneOf 1object
  • idstringrequired

    format: "uuid"

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

  • statestringrequired

    enum: "warning", "paused", "frozen"

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

  • started_atstringrequired

    format: "date-time"

  • review_requiredbooleanrequired
  • evidenceobjectrequired
  • Additional propertyAny value
  • resumeobjectrequired
  • self_servebooleanrequired

    Further nesting omitted

  • blocked_reasonstring | nullrequired

    Further nesting omitted

  • resumable_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • top_sourcesarray
  • Each itemobject

    Further nesting omitted

  • top_recipient_domainsarray
  • Each itemobject

    Further nesting omitted

  • oneOf 2null
  • domainsarrayrequired
  • Each itemobject
  • domain_idstringrequired

    format: "uuid"

  • domainstringrequired
  • product_idstring | nullrequired

    format: "uuid"

  • statestringrequired

    enum: "active", "paused"

  • holdunspecifiedrequired
  • oneOf 1object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

    Further nesting omitted

  • statestringrequired

    enum: "warning", "paused", "frozen"

    Further nesting omitted

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

    Further nesting omitted

  • started_atstringrequired

    format: "date-time"

    Further nesting omitted

  • review_requiredbooleanrequired

    Further nesting omitted

  • evidenceobjectrequired

    Further nesting omitted

  • resumeobjectrequired

    Further nesting omitted

  • top_sourcesarray

    Further nesting omitted

  • top_recipient_domainsarray

    Further nesting omitted

  • oneOf 2null
  • lanesarrayrequired
  • Each itemobject
  • lane_kindstringrequired

    enum: "mailbox", "product", "broadcast"

    Further nesting omitted

  • sending_stream_idstringrequired

    format: "uuid"

    Further nesting omitted

  • from_domainstringrequired

    Further nesting omitted

  • statestringrequired

    enum: "active", "warning", "paused"

    Further nesting omitted

  • probation_untilstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • ratesobjectrequired

    Further nesting omitted

  • holdunspecifiedrequired

    Further nesting omitted

  • mailboxesarrayrequired
  • Each itemobject
  • mailbox_idstringrequired

    format: "uuid"

  • addressstringrequired
  • product_idstring | nullrequired

    format: "uuid"

  • statestringrequired

    enum: "paused"

  • holdobjectrequired
  • idstringrequired

    format: "uuid"

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

  • statestringrequired

    enum: "warning", "paused", "frozen"

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

  • started_atstringrequired

    format: "date-time"

  • review_requiredbooleanrequired
  • evidenceobjectrequired
  • Additional propertyAny value
  • resumeobjectrequired
  • self_servebooleanrequired

    Further nesting omitted

  • blocked_reasonstring | nullrequired

    Further nesting omitted

  • resumable_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • top_sourcesarray
  • Each itemobject

    Further nesting omitted

  • top_recipient_domainsarray
  • Each itemobject

    Further nesting omitted

  • thresholdsobjectrequired

    The enforced thresholds (src/sending/reputation-policy.ts).

  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-health' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/sending-health/resume

Resume one lane, domain or mailbox pause after reviewing its rates and sources.

Workspace admin only. Allowed 24 hours after a lane or domain pause and once per 30 days per domain. A repeat pause within 30 days or a frozen workspace needs Banger review and is refused with 423. After a resume the lane sends in smaller batches for 24 hours; held Broadcasts and Journeys continue automatically.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • hold_idstringrequired

    The pause (hold.id) from getSendingHealth.

    format: "uuid"

  • acknowledge_reputation_riskbooleanrequired

    const: true

  • reasonstring

    What was fixed; recorded in the audit log.

    maxLength: 500

Success response 200

The pause was released.

application/json

  • valueobject
  • dataobjectrequired
  • resumedobjectrequired
  • idstringrequired

    format: "uuid"

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

  • statestringrequired

    enum: "warning", "paused", "frozen"

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

  • started_atstringrequired

    format: "date-time"

  • review_requiredbooleanrequired
  • evidenceobjectrequired
  • Additional propertyAny value
  • resumeobjectrequired
  • self_servebooleanrequired
  • blocked_reasonstring | nullrequired
  • resumable_atstring | nullrequired

    format: "date-time"

  • top_sourcesarray
  • Each itemobject
  • signalstringrequired

    enum: "hard_bounce", "complaint"

  • sourcestringrequired
  • source_idstring | nullrequired
  • countintegerrequired
  • top_recipient_domainsarray
  • Each itemobject
  • signalstringrequired

    enum: "hard_bounce", "complaint"

  • recipient_domainstringrequired
  • countintegerrequired
  • probation_untilstring | nullrequired

    format: "date-time"

  • healthobjectrequired
  • workspaceobjectrequired
  • statestringrequired

    enum: "active", "frozen"

  • holdunspecifiedrequired
  • oneOf 1object
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

    Further nesting omitted

  • statestringrequired

    enum: "warning", "paused", "frozen"

    Further nesting omitted

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

    Further nesting omitted

  • started_atstringrequired

    format: "date-time"

    Further nesting omitted

  • review_requiredbooleanrequired

    Further nesting omitted

  • evidenceobjectrequired

    Further nesting omitted

  • resumeobjectrequired

    Further nesting omitted

  • top_sourcesarray

    Further nesting omitted

  • top_recipient_domainsarray

    Further nesting omitted

  • oneOf 2null
  • domainsarrayrequired
  • Each itemobject
  • domain_idstringrequired

    format: "uuid"

  • domainstringrequired
  • product_idstring | nullrequired

    format: "uuid"

  • statestringrequired

    enum: "active", "paused"

  • holdunspecifiedrequired
  • oneOf 1object

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • lanesarrayrequired
  • Each itemobject

    Further nesting omitted

  • mailboxesarrayrequired
  • Each itemobject
  • mailbox_idstringrequired

    format: "uuid"

  • addressstringrequired
  • product_idstring | nullrequired

    format: "uuid"

  • statestringrequired

    enum: "paused"

  • holdobjectrequired
  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • scopestringrequired

    enum: "mailbox", "lane", "domain", "workspace"

    Further nesting omitted

  • statestringrequired

    enum: "warning", "paused", "frozen"

    Further nesting omitted

  • reasonstringrequired

    bounce_rate, complaint_rate, core_lane_paused, multiple_lanes_paused, repeat_lane_pause, multiple_domains_paused, complaint_burst or operator_review.

    Further nesting omitted

  • started_atstringrequired

    format: "date-time"

    Further nesting omitted

  • review_requiredbooleanrequired

    Further nesting omitted

  • evidenceobjectrequired

    Further nesting omitted

  • resumeobjectrequired

    Further nesting omitted

  • top_sourcesarray

    Further nesting omitted

  • top_recipient_domainsarray

    Further nesting omitted

  • thresholdsobjectrequired

    The enforced thresholds (src/sending/reputation-policy.ts).

  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-health/resume' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "hold_id": "00000000-0000-4000-8000-000000000001",
  "acknowledge_reputation_risk": true,
  "reason": "example"
}'

Sending lanes

GET/v1/workspaces/{workspaceId}/sending-lanes

listEmailLanes

Configured lanes and effective routing for the default sender. Product and Broadcast inherit the default Mail connection until a dedicated lane is active. Pending lanes do not replace the working route.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Canonical lanes, inherited routes, and the existing default sender.

application/json

  • valueobject
  • dataobjectrequired
  • domainsarrayrequired
  • Each itemobject

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • created_atstring

    format: "date-time"

    Further nesting omitted

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

    Further nesting omitted

  • display_namestringrequired

    Further nesting omitted

  • from_domainstringrequired

    Further nesting omitted

  • mail_from_domainstring | nullrequired

    Further nesting omitted

  • inbound_domainstring | nullrequired

    Further nesting omitted

  • route_providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

    Further nesting omitted

  • inbound_providerstring | nullrequired

    enum: "banger", null

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

    Further nesting omitted

  • status_reasonstring | nullrequired

    Further nesting omitted

  • desired_revisionintegerrequired

    minimum: 1

    Further nesting omitted

  • observed_revisionintegerrequired

    minimum: 0

    Further nesting omitted

  • dns_readybooleanrequired

    Further nesting omitted

  • provider_readybooleanrequired

    Further nesting omitted

  • inbound_readybooleanrequired

    Further nesting omitted

  • outbound_readybooleanrequired

    Further nesting omitted

  • banger_transport_readybooleanrequired

    Further nesting omitted

  • banger_mail_from_domainstring | nullrequired

    Further nesting omitted

  • provisioning_job_idstring | nullrequired

    format: "uuid"

    Further nesting omitted

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

    Further nesting omitted

  • provisioning_error_codestring | null

    Further nesting omitted

  • provisioning_next_attempt_atstring | null

    Further nesting omitted

  • provisioning_last_checked_atstring | null

    Further nesting omitted

  • provider_identity_statusstring | null

    Further nesting omitted

  • provider_dkim_statusstring | null

    Further nesting omitted

  • dns_recordsarrayrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

    Further nesting omitted

  • routingobjectrequired
  • mailboxobjectrequired
  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • lane_idstring | nullrequired
  • domain_idstring | nullrequired
  • from_domainstring | nullrequired
  • sourcestringrequired

    enum: "dedicated", "default_mail", "unavailable"

  • readybooleanrequired
  • pending_lanesarrayrequired
  • Each itemobject
  • idstringrequired

    Further nesting omitted

  • from_domainstringrequired

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • productobjectrequired
  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • lane_idstring | nullrequired
  • domain_idstring | nullrequired
  • from_domainstring | nullrequired
  • sourcestringrequired

    enum: "dedicated", "default_mail", "unavailable"

  • readybooleanrequired
  • pending_lanesarrayrequired
  • Each itemobject
  • idstringrequired

    Further nesting omitted

  • from_domainstringrequired

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • broadcastobjectrequired
  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • lane_idstring | nullrequired
  • domain_idstring | nullrequired
  • from_domainstring | nullrequired
  • sourcestringrequired

    enum: "dedicated", "default_mail", "unavailable"

  • readybooleanrequired
  • pending_lanesarrayrequired
  • Each itemobject
  • idstringrequired

    Further nesting omitted

  • from_domainstringrequired

    Further nesting omitted

  • statusstringrequired

    Further nesting omitted

  • default_senderunspecifiedrequired
  • oneOf 1object
  • idstringrequired

    format: "uuid"

  • workspace_idstringrequired

    format: "uuid"

  • product_idstring | null

    The product (project) the mailbox belongs to. Clients group mailboxes and build web-app links with it.

    format: "uuid"

  • domain_idstring | null

    format: "uuid"

  • addressstringrequired

    The email address, or for an SMS inbox its phone number in E.164 (+15551234567).

  • display_namestringrequired
  • providerstringrequired

    enum: "gmail", "smtp", "twilio"

  • channelstring

    email; sms for an SMS inbox on Twilio; whatsapp for a WhatsApp inbox, a WhatsApp sender on Twilio for the business's WhatsApp Business account.

    enum: "email", "sms", "whatsapp"

  • sms_verificationobject | null

    A number from Banger, carriers' answer on its toll-free verification. It sends once approved; null for every other mailbox.

  • statusstring

    enum: "pending_review", "in_review", "approved", "rejected"

  • reasonstring | null

    Carriers' reason when rejected.

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • status_reasonstring | null
  • suspended_atstring | null
  • mailbox_kindstringrequired

    enum: "domain", "starter"

  • oneOf 2null

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-lanes' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/sending-lanes

createEmailLane

Prepare only the requested lane at its exact hostname. Rechecks DNS conflicts under the infrastructure lock. Existing identical lanes are reused; occupied hostnames are never overwritten. No DNS changes or extra lanes are created.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    Parent company domain, such as example.com.

    minLength: 3 · maxLength: 253

  • from_domainstringrequired

    Exact root or subdomain to configure, such as example.com or news.example.com.

    minLength: 3 · maxLength: 253

  • lanestringrequired

    Mail is mailbox. It sends and receives; Product and Broadcast are optional dedicated sending lanes.

    enum: "mailbox", "product", "broadcast"

  • root_dmarc_confirmedboolean

    Legacy compatibility field; setup preserves existing email policies and requires no confirmation.

  • route_providersobject
  • productstring

    enum: "banger", "resend"

  • broadcaststring

    enum: "banger", "resend"

  • route_domainsobject
  • productstring
  • broadcaststring

Success response 200

The same configured lane returned idempotently.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-lanes' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "from_domain": "example",
  "lane": "mailbox",
  "root_dmarc_confirmed": true,
  "route_providers": {
    "product": "banger",
    "broadcast": "banger"
  },
  "route_domains": {
    "product": "example",
    "broadcast": "example"
  }
}'
POST/v1/workspaces/{workspaceId}/sending-lanes/plan

planEmailLane

Read-only availability and DNS preflight. It creates no resources. Website records alone do not occupy an email hostname. Returns existing setup and conflicts at names Banger must change. Existing sending authentication and DMARC policies are preserved.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    Parent company domain, such as example.com.

    minLength: 3 · maxLength: 253

  • from_domainstringrequired

    Exact root or subdomain to configure, such as example.com or news.example.com.

    minLength: 3 · maxLength: 253

  • lanestringrequired

    Mail is mailbox. It sends and receives; Product and Broadcast are optional dedicated sending lanes.

    enum: "mailbox", "product", "broadcast"

  • root_dmarc_confirmedboolean

    Legacy compatibility field; setup preserves existing email policies and requires no confirmation.

  • route_providersobject
  • productstring

    enum: "banger", "resend"

  • broadcaststring

    enum: "banger", "resend"

  • route_domainsobject
  • productstring
  • broadcaststring

Success response 200

Lane setup plan.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "available", "existing", "occupied", "migration_required"

  • from_domainstringrequired
  • lanestringrequired

    enum: "mailbox", "product", "broadcast"

  • domain_idstring | nullrequired
  • lane_idstring | nullrequired
  • messagestringrequired
  • requires_root_confirmationbooleanrequired

    Always false; existing email policies are preserved.

  • existing_dnsarrayrequired
  • Each itemobject
  • namestringrequired
  • typestringrequired
  • valuestringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-lanes/plan' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "from_domain": "example",
  "lane": "mailbox",
  "root_dmarc_confirmed": true,
  "route_providers": {
    "product": "banger",
    "broadcast": "banger"
  },
  "route_domains": {
    "product": "example",
    "broadcast": "example"
  }
}'
POST/v1/workspaces/{workspaceId}/sending-lanes/migrations

requestEmailLaneMigration

Request the existing human migration review for only this lane. Only a signed-in administrator can authorize it in Approvals.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

X-Banger-Product-Id
header · required

Explicit operating product; must match product-scoped OAuth credentials.

  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    Parent company domain, such as example.com.

    minLength: 3 · maxLength: 253

  • from_domainstringrequired

    Exact root or subdomain to configure, such as example.com or news.example.com.

    minLength: 3 · maxLength: 253

  • lanestringrequired

    Mail is mailbox. It sends and receives; Product and Broadcast are optional dedicated sending lanes.

    enum: "mailbox", "product", "broadcast"

  • root_dmarc_confirmedboolean

    Legacy compatibility field; setup preserves existing email policies and requires no confirmation.

  • route_providersobject
  • productstring

    enum: "banger", "resend"

  • broadcaststring

    enum: "banger", "resend"

  • route_domainsobject
  • productstring
  • broadcaststring

Success response 200

Existing migration review returned.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-lanes/migrations' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'X-Banger-Product-Id: 00000000-0000-4000-8000-000000000001' \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "from_domain": "example",
  "lane": "mailbox",
  "root_dmarc_confirmed": true,
  "route_providers": {
    "product": "banger",
    "broadcast": "banger"
  },
  "route_domains": {
    "product": "example",
    "broadcast": "example"
  }
}'

Starters

GET/v1/workspaces/{workspaceId}/starters

listStarters

Starter layouts rendered in the product brand, each with a brief (job, when to send, metric, mechanic, subject lines to test), slots and default content. Listings are compact and default to the product's kind of business; request one starter by id for its body_html.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

id
query

One starter; includes body_html.

  • valuestring
business
query
  • valuestring

    enum: "all", "saas", "shop", "creator", "services", "local", "community"

stage
query
  • valuestring

    enum: "onboarding", "activation", "revenue", "retention", "publish", "account"

category
query
  • valuestring

    enum: "product", "lifecycle", "broadcast"

include_html
query
  • valueboolean
style
query

Visual style; defaults to the brand's email_style.

  • valuestring

    enum: "brand", "clarity", "editorial", "luxe", "material", "playful", "bold", "plain"

locale
query

Language for built-in copy and gallery labels; defaults to en-US.

  • valuestring

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired
  • versionintegerrequired
  • categorystringrequired
  • message_kindstringrequired
  • familystringrequired
  • stagestringrequired
  • businessesarrayrequired
  • Each itemstring
  • namestringrequired
  • descriptionstringrequired
  • subjectstringrequired
  • body_textstringrequired
  • briefobjectrequired
  • jobstringrequired
  • send_whenstringrequired
  • metricstringrequired
  • mechanicstringrequired
  • subject_variantsarrayrequired
  • Each itemstring
  • keeparray
  • Each itemstring
  • avoidarray
  • Each itemstring
  • imageryobject
  • defaultstringrequired
  • slotstring
  • photo_ideastring
  • slotsarrayrequired
  • Each itemobject
  • keystringrequired

    pattern: "^[A-Za-z0-9_$.-]{1,200}$"

  • labelstring

    maxLength: 120

  • typestring

    enum: "text", "paragraph", "url", "image"

  • helpstring

    maxLength: 300

  • contentobjectrequired
  • Additional propertystring
  • body_htmlstring
  • businessstringrequired
  • stylestringrequired
  • businessesarrayrequired
  • Each itemobject
  • keystring
  • labelstring
  • hintstring
  • stagesarrayrequired
  • Each itemobject
  • keystring
  • labelstring
  • stylesarrayrequired
  • Each itemobject
  • keystringrequired
  • labelstringrequired
  • descriptionstringrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/starters?id=example&business=all&stage=onboarding&category=product&include_html=true&style=brand&locale=example' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Support

POST/v1/workspaces/{workspaceId}/support/messages

Send a message to Banger support

Emails the message to support@team.bangermail.com with Reply-To set to the signed-in person's verified address (an OAuth grant's person, or the workspace owner for a static API key). The workspace, role and plan are attached. Ten messages a day per person.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • messagestringrequired

    minLength: 1 · maxLength: 5000

  • contextobject

    What the client knows about where the person was. Every field is optional and trimmed.

  • surfacestring

    maxLength: 120

  • app_releasestring

    maxLength: 64

  • browserstring

    maxLength: 300

  • localestring

    maxLength: 35

  • recent_errorsarray

    maxItems: 5

  • Each itemstring

    maxLength: 300

Success response 201

The message was sent to support.

application/json

  • valueobject
  • dataobject
  • statusstringrequired

    enum: "sent"

  • reply_tostringrequired

    format: "email"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/support/messages' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "message": "example",
  "context": {
    "surface": "example",
    "app_release": "example",
    "browser": "example",
    "locale": "example",
    "recent_errors": [
      "example"
    ]
  }
}'

Suppressions

GET/v1/workspaces/{workspaceId}/suppressions

listSuppressions

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • email_hashstringrequired
  • reasonstringrequired

    enum: "unsubscribe", "hard_bounce", "complaint", "manual"

  • source_idstring | nullrequired
  • created_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/suppressions' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/suppressions

createSuppression

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • emailstringrequired

    minLength: 3 · maxLength: 320

  • reasonstring

    default: "manual" · enum: "unsubscribe", "hard_bounce", "complaint", "manual"

  • source_idstring

    maxLength: 500

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • email_hashstringrequired
  • reasonstringrequired

    enum: "unsubscribe", "hard_bounce", "complaint", "manual"

  • source_idstring | nullrequired
  • created_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/suppressions' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "email": "example",
  "reason": "manual",
  "source_id": "example"
}'
DELETE/v1/workspaces/{workspaceId}/suppressions/{emailHash}

deleteSuppression

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

emailHash
path · required
  • valuestring

    pattern: "^[0-9a-f]{64}$"

Request body

No request body is specified in the contract.

Success response 204

Suppression removed.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/suppressions/{emailHash}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Surface data

GET/v1/workspaces/{workspaceId}/surface-data/{surface}

Load a product screen through one authorized database transaction.

Returns the bounded first-paint data for one product-scoped screen. The request validates workspace membership and the selected product in the same tenant-isolated transaction as the endpoint queries. The webhooks screen includes event_definitions (Journey trigger and goal names, including drafts), event_stats (counts across saved incoming receipts), and receipts (newest first, up to 51 rows). Clients display 50 receipts and use the extra row to detect another page. Incoming webhooks include a public_url; credentials are fetched separately. Receipt metadata does not contain raw payloads or a historical test/live label. outgoing_event_types contains the fixed catalog of automatic Banger events and the manual webhook.test event, independent of configured endpoints.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

surface
path · required
  • valuestring

    enum: "home", "product", "broadcasts", "audience", "domains", "mailboxes", "journeys", "deliverability", "api_keys", "webhooks", "approvals", "connections", "logs"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

webhook_id
query

On the webhooks screen, restrict receipt history and outbound deliveries to this endpoint.

  • valuestring

    format: "uuid"

event_type
query

On the webhooks screen, filter incoming receipts by exact event name. Catalog definitions and totals remain product-wide.

  • valuestring

    maxLength: 120

receipt_before
query

Incoming receipt cursor, a JSON object with receivedAt, endpointId, and eventId from the last displayed row. Preserve receivedAt verbatim to retain sub-millisecond precision. URL-encode the JSON value.

  • valuestring

    maxLength: 4096

mailbox_id
query
  • valuestring

    format: "uuid"

approval_id
query
  • valuestring

    format: "uuid"

label_id
query
  • valuestring

    format: "uuid"

view
query
  • valuestring

    enum: "inbox", "sent", "drafts", "archive", "trash", "spam", "all"

since
query
  • valuestring

    format: "date-time"

Request body

No request body is specified in the contract.

Success response 200

Product-scoped first-paint screen data.

application/json

  • valueobject
  • dataobjectrequired

    Screen-specific aggregate selected by surface and query parameters. Keys and nested resource projections vary by surface (home, product, broadcasts, audience, domains, mailboxes, journeys, deliverability, api_keys, webhooks, approvals, connections, logs).

  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/surface-data/{surface}?limit=50&webhook_id=00000000-0000-4000-8000-000000000001&event_type=example&receipt_before=example&mailbox_id=00000000-0000-4000-8000-000000000001&approval_id=00000000-0000-4000-8000-000000000001&label_id=00000000-0000-4000-8000-000000000001&view=inbox&since=2026-01-01T00%3A00%3A00Z' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Triage actions

GET/v1/workspaces/{workspaceId}/triage-actions

listTriageActions

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query
  • valuestring

    format: "uuid"

thread_id
query
  • valuestring

    format: "uuid"

rule_id
query
  • valuestring

    format: "uuid"

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • thread_idstringrequired

    format: "uuid"

  • rule_idstringrequired

    format: "uuid"

  • rule_namestringrequired
  • auto_set_for_label_idstring | nullrequired

    format: "uuid"

  • actionstringrequired
  • label_idstring | nullrequired

    format: "uuid"

  • label_namestring | nullrequired
  • label_emojistring | nullrequired
  • thread_subjectstringrequired
  • created_atstringrequired

    format: "date-time"

  • undone_atstring | nullrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-actions?mailbox_id=00000000-0000-4000-8000-000000000001&thread_id=00000000-0000-4000-8000-000000000001&rule_id=00000000-0000-4000-8000-000000000001&limit=50' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/triage-actions/{actionId}/undo

undoTriageAction

Reverse one Triage action. By default also teach its rule the email is not a match; set teach_rule to false for ordinary undo.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

actionId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • teach_ruleboolean

    Also teach the rule that this email is not a match. False reverses the action without feedback.

    default: true

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • undonebooleanrequired

    const: true

  • command_idstring | nullrequired

    format: "uuid"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-actions/{actionId}/undo' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "teach_rule": true
}'

Triage rules

GET/v1/workspaces/{workspaceId}/triage-rules

listTriageRules

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • auto_set_for_label_idstring | nullrequired

    format: "uuid"

  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • actionsarrayrequired
  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledbooleanrequired
  • versionintegerrequired
  • error_codestring | nullrequired
  • example_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules?mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/triage-rules

createTriageRule

Create a Triage rule for incoming mail (every plan; enabled rules count toward the plan amount). When = description (judged by Jev) and/or exact_conditions and/or has_label_ids; Then = actions.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header

Optional retry key, applied when a product is selected.

  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueunspecified
  • allOf 1object
  • namestring

    maxLength: 120

  • descriptionstring | null

    maxLength: 2000

  • exact_conditionsobject

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarray

    maxItems: 50

  • Each itemstring

    format: "uuid"

  • actionsarray

    minItems: 1 · maxItems: 8

  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledboolean
  • allOf 2object
  • mailbox_idstringrequired

    format: "uuid"

Success response 201

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • auto_set_for_label_idstring | nullrequired

    format: "uuid"

  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • actionsarrayrequired
  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledbooleanrequired
  • versionintegerrequired
  • error_codestring | nullrequired
  • example_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example",
  "exact_conditions": {
    "from": [
      "example"
    ],
    "to": [
      "example"
    ],
    "subject_contains": [
      "example"
    ],
    "has_words": [
      "example"
    ],
    "excludes_words": [
      "example"
    ],
    "has_attachment": true
  },
  "has_label_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "actions": [
    {
      "type": "apply_label",
      "label_id": "00000000-0000-4000-8000-000000000001"
    }
  ],
  "enabled": true,
  "mailbox_id": "00000000-0000-4000-8000-000000000001"
}'
POST/v1/workspaces/{workspaceId}/triage-rules/preview

previewTriageRule

Which recent threads a When would match. Read-only; returns no scores.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • mailbox_idstringrequired

    format: "uuid"

  • rule_idstring

    format: "uuid"

  • descriptionstring

    maxLength: 2000

  • exact_conditionsobject

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarray

    maxItems: 50

  • Each itemstring

    format: "uuid"

  • limitinteger

    minimum: 1 · maximum: 200

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • scannedintegerrequired
  • matchesarrayrequired
  • Each itemobject
  • thread_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • fromstring
  • received_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules/preview' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "rule_id": "00000000-0000-4000-8000-000000000001",
  "description": "example",
  "exact_conditions": {
    "from": [
      "example"
    ],
    "to": [
      "example"
    ],
    "subject_contains": [
      "example"
    ],
    "has_words": [
      "example"
    ],
    "excludes_words": [
      "example"
    ],
    "has_attachment": true
  },
  "has_label_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "limit": 1
}'
POST/v1/workspaces/{workspaceId}/triage-rules/run-past-mail

runTriageOnPastMail

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • mailbox_idstringrequired

    format: "uuid"

  • rule_idsarray

    maxItems: 50

  • Each itemstring

    format: "uuid"

  • daysinteger

    minimum: 1 · maximum: 90

  • include_other_actionsboolean

    Also archive

Success response 202

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • queued_threadsintegerrequired
  • daysintegerrequired
  • labels_onlybooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules/run-past-mail' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001",
  "rule_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "days": 1,
  "include_other_actions": true
}'
GET/v1/workspaces/{workspaceId}/triage-rules/{ruleId}

getTriageRule

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

ruleId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • auto_set_for_label_idstring | nullrequired

    format: "uuid"

  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • actionsarrayrequired
  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledbooleanrequired
  • versionintegerrequired
  • error_codestring | nullrequired
  • example_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules/{ruleId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}/triage-rules/{ruleId}

updateTriageRule

A label's auto-set rule can only be edited through updateLabel.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

ruleId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header

Optional retry key, applied when a product is selected.

  • valuestring

    minLength: 1 · maxLength: 256

Request body required

application/json

  • valueobject
  • namestring

    maxLength: 120

  • descriptionstring | null

    maxLength: 2000

  • exact_conditionsobject

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarray

    maxItems: 50

  • Each itemstring

    format: "uuid"

  • actionsarray

    minItems: 1 · maxItems: 8

  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledboolean

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • namestringrequired
  • auto_set_for_label_idstring | nullrequired

    format: "uuid"

  • descriptionstring | nullrequired
  • exact_conditionsobjectrequired

    No additional properties

  • fromarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • toarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • subject_containsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • excludes_wordsarray

    maxItems: 50

  • Each itemstring

    maxLength: 320

  • has_attachmentboolean
  • has_label_idsarrayrequired
  • Each itemstring

    format: "uuid"

  • actionsarrayrequired
  • Each itemobject
  • typestringrequired

    enum: "apply_label", "archive", "mark_read", "star"

  • label_idstring

    format: "uuid"

  • enabledbooleanrequired
  • versionintegerrequired
  • error_codestring | nullrequired
  • example_countintegerrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules/{ruleId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: example' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "description": "example",
  "exact_conditions": {
    "from": [
      "example"
    ],
    "to": [
      "example"
    ],
    "subject_contains": [
      "example"
    ],
    "has_words": [
      "example"
    ],
    "excludes_words": [
      "example"
    ],
    "has_attachment": true
  },
  "has_label_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "actions": [
    {
      "type": "apply_label",
      "label_id": "00000000-0000-4000-8000-000000000001"
    }
  ],
  "enabled": true
}'
DELETE/v1/workspaces/{workspaceId}/triage-rules/{ruleId}

deleteTriageRule

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

ruleId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Triage rule deleted.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-rules/{ruleId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Triage usage

GET/v1/workspaces/{workspaceId}/triage-usage

getTriageUsage

How much Triage the workspace has used this UTC calendar month against its plan amounts, when the count resets, and the cheapest plan that checks more emails. Past the monthly amount new mail stays unsorted until it resets.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • unlimitedbooleanrequired

    Both amounts are lifted for this workspace.

  • rule_limitintegerrequired

    Enabled Triage and auto-set rules allowed at once.

  • rules_enabledintegerrequired
  • run_limitintegerrequired

    Emails Triage checks per UTC calendar month.

  • runs_this_monthintegerrequired
  • resets_atstringrequired

    First instant of the next UTC calendar month.

    format: "date-time"

  • plan_keystringrequired

    The workspace's current plan; free when it has none.

  • next_planunspecifiedrequired

    The cheapest plan above the current one that checks more emails a month; null when none or unlimited.

  • oneOf 1null
  • oneOf 2object
  • plan_keystringrequired
  • labelstringrequired
  • monthly_price_usdnumberrequired

    Headline monthly price (yearly billing / 12).

  • triage_run_limitintegerrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/triage-usage' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Work

GET/v1/workspaces/{workspaceId}/work

listWork

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

cursor
query
  • valuestring

    maxLength: 1024

limit
query
  • valueinteger

    minimum: 1 · maximum: 100 · default: 50

status
query
  • valuestring

    default: "open" · enum: "open", "waiting", "done"

Request body

No request body is specified in the contract.

Success response 200

Workspace-wide Work items.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • threadobjectrequired
  • idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • subjectstringrequired
  • snippetstringrequired
  • last_message_atstringrequired

    format: "date-time"

  • message_countintegerrequired
  • unread_countintegerrequired
  • is_archivedbooleanrequired
  • is_trashbooleanrequired
  • is_spambooleanrequired
  • is_starredbooleanrequired
  • is_sentbooleanrequired
  • has_attachmentsbooleanrequired
  • sender_unverifiedboolean

    True when the latest message's sender passed neither SPF nor DKIM for its From domain, so its From address may be forged.

  • labelsarrayrequired
  • Each itemstring
  • participantsarray
  • Each itemobject
  • namestring

    Further nesting omitted

  • emailstringrequired

    format: "email"

    Further nesting omitted

  • recipientsarray

    The To list of the mailbox's latest sent message in this thread; empty when the mailbox sent none. Sent views show these instead of the sender.

  • Each itemobject
  • namestring

    Further nesting omitted

  • emailstringrequired

    format: "email"

    Further nesting omitted

  • statusstringrequired

    enum: "open", "waiting", "done"

  • priorityintegerrequired
  • assignee_identity_idstring
  • updated_atstringrequired

    format: "date-time"

  • pageobjectrequired
  • next_cursorstring
  • has_morebooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/work?cursor=example&limit=50&status=open' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Connections

GET/v1/workspaces/{workspaceId}/connections

List Banger-managed product and business data connections.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Connection metadata and capabilities. Credential material is never returned.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • adapter_keystringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • display_namestringrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • auth_kindstringrequired

    enum: "api_key", "oauth2", "service_account", "none"

  • freshness_modestringrequired

    enum: "webhook", "poll", "on_demand", "hybrid"

  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • configobjectrequired

    Non-secret adapter configuration such as a cloud host and project ID.

  • Additional propertyAny value
  • active_credential_versioninteger | null
  • external_account_idstring | null
  • external_account_namestring | null
  • last_validated_atstring | null

    format: "date-time"

  • last_success_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/connections/adapters/{adapterKey}

Validate and encrypt a Banger-managed source connection.

Connecting Mailchimp starts the move from Mailchimp at once (as startMailchimpMigration does), and the response carries its first report in `mailchimp_migration`. Without display_name, a Mailchimp connection is named after the account, e.g. "Mailchimp (Acme Inc)". Connecting a Mailchimp account that is already connected answers 409 `mailchimp_account_already_connected` with `error.details.connection_id`.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

adapterKey
path · required
  • valuestring

    enum: "anthropic", "figma", "github", "google-analytics", "google-calendar", "hubspot", "linear", "mailchimp", "notion", "openai", "slack", "snowflake", "zendesk"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • api_keystringrequired

    API key or provider service-account JSON.

    minLength: 12 · maxLength: 10000

  • display_namestring

    maxLength: 100

  • configobject
  • Additional propertyAny value

Success response 200

Idempotent replay of an existing connection request.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • adapter_keystringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • display_namestringrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • auth_kindstringrequired

    enum: "api_key", "oauth2", "service_account", "none"

  • freshness_modestringrequired

    enum: "webhook", "poll", "on_demand", "hybrid"

  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • configobjectrequired

    Non-secret adapter configuration such as a cloud host and project ID.

  • Additional propertyAny value
  • active_credential_versioninteger | null
  • external_account_idstring | null
  • external_account_namestring | null
  • last_validated_atstring | null

    format: "date-time"

  • last_success_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • mailchimp_migrationobject

    The move from one Mailchimp connection into a product. Poll GET /mailchimp-migration for live progress: `phase` says where it is; `counts`, `audiences`, `segments`, `templates` and `campaigns` grow as it goes.

  • migration_idstringrequired

    format: "uuid"

  • connection_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "importing", "completed"

  • phasestringrequired

    importing (reading Mailchimp), copying_designs (templates and campaigns), finishing, completed, needs_new_key (Mailchimp rejected the API key; the move is paused until a new key is saved with rotateConnectionCredential), or disconnected (the connection was removed; everything already moved stays in Banger and the counts stay readable).

    enum: "importing", "copying_designs", "finishing", "completed", "needs_new_key", "disconnected"

  • started_atstringrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • connectionobjectrequired
  • display_namestringrequired
  • account_namestring | nullrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • last_error_codestring | nullrequired
  • needs_new_keybooleanrequired
  • messagestring

    Present when needs_new_key or disconnected, ready to show.

  • progressobjectrequired
  • import_streamsintegerrequired
  • import_streams_doneintegerrequired
  • failing_streamsarrayrequired
  • Each itemobject
  • streamstringrequired
  • refstringrequired
  • error_codestring | nullrequired
  • designs_waitingintegerrequired
  • notestringrequired
  • countsobjectrequired
  • contactsintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • contact_listsintegerrequired
  • contact_fieldsintegerrequired
  • segments_convertedintegerrequired
  • segments_kept_as_listsintegerrequired
  • templates_importedintegerrequired
  • templates_to_rebuildintegerrequired
  • campaigns_imported_as_designsintegerrequired
  • automations_importedintegerrequired
  • audiencesarrayrequired
  • Each itemobject
  • mailchimp_idstringrequired
  • namestringrequired
  • list_idstring | nullrequired

    format: "uuid"

  • list_namestring | nullrequired
  • members_in_bangerintegerrequired
  • subscribedintegerrequired
  • unsubscribedintegerrequired
  • bouncedintegerrequired
  • members_in_mailchimpintegerrequired
  • contact_fieldsarrayrequired
  • Each itemobject
  • mailchimp_tagstringrequired
  • namestringrequired
  • field_keystringrequired
  • typestringrequired

    enum: "text", "number", "boolean", "date", "choice", "choices"

  • consentstringrequired
  • segmentsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • templatesarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • campaignsarrayrequired
  • Each itemobject

    What one Mailchimp segment, template or campaign became.

  • mailchimp_idstringrequired

    Segments: <audience id>:<segment id>. Templates and campaigns: their Mailchimp id.

  • becamestringrequired

    enum: "segment", "contact_list", "template", "needs_rebuild"

  • idstring

    The Banger segment

    format: "uuid"

  • namestringrequired
  • reasonstring

    Why a segment stayed a static list

  • dropped_merge_tagsarray

    Mailchimp merge tags with no Banger equivalent, removed from the design (conditions on merge fields keep their first branch and are listed here).

  • Each itemstring
  • replaced_footerboolean

    Mailchimp's footer section (view in browser, preferences, address, badge) became the product's brand footer.

  • removed_linksarray

    Links to Mailchimp-only pages outside the footer (such as view in browser) that were removed, by their words.

  • Each itemstring
  • links_to_fillarray

    Links left empty in Mailchimp; each is now a URL slot of the design to fill before it can be sent.

  • Each itemobject
  • keystringrequired

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • kept_editsboolean

    A re-run found the design edited in Banger and left it as it is.

  • automationsobjectrequired
  • importedbooleanrequired

    const: false

  • whystringrequired
  • next_stepsarrayrequired
  • Each itemstring
  • help_call_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/adapters/{adapterKey}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "api_key": "examplexxxxx",
  "display_name": "example",
  "config": {}
}'
DELETE/v1/workspaces/{workspaceId}/connections/{connectionId}

disableConnection

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body

No request body is specified in the contract.

Success response 204

Connection, credential, sync state, and grants revoked.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx'
POST/v1/workspaces/{workspaceId}/connections/{connectionId}/validate

Revalidate the active credential and refresh account metadata.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Connection credential is valid.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • adapter_keystringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • display_namestringrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • auth_kindstringrequired

    enum: "api_key", "oauth2", "service_account", "none"

  • freshness_modestringrequired

    enum: "webhook", "poll", "on_demand", "hybrid"

  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • configobjectrequired

    Non-secret adapter configuration such as a cloud host and project ID.

  • Additional propertyAny value
  • active_credential_versioninteger | null
  • external_account_idstring | null
  • external_account_namestring | null
  • last_validated_atstring | null

    format: "date-time"

  • last_success_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/validate' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/connections/{connectionId}/credential

Validate and atomically rotate a managed connection credential.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • api_keystringrequired

    API key or provider service-account JSON.

    minLength: 12 · maxLength: 10000

  • display_namestring

    maxLength: 100

  • configobject
  • Additional propertyAny value

Success response 200

Idempotent replay of a previous rotation.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • adapter_keystringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • display_namestringrequired
  • statusstringrequired

    enum: "pending_validation", "active", "error", "disabled"

  • auth_kindstringrequired

    enum: "api_key", "oauth2", "service_account", "none"

  • freshness_modestringrequired

    enum: "webhook", "poll", "on_demand", "hybrid"

  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • configobjectrequired

    Non-secret adapter configuration such as a cloud host and project ID.

  • Additional propertyAny value
  • active_credential_versioninteger | null
  • external_account_idstring | null
  • external_account_namestring | null
  • last_validated_atstring | null

    format: "date-time"

  • last_success_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/credential' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "api_key": "examplexxxxx",
  "display_name": "example",
  "config": {}
}'
POST/v1/workspaces/{workspaceId}/connections/{connectionId}/query

Execute a typed, bounded read against a Banger-managed connection.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • adapter_keystringrequired

    enum: "figma", "github", "google-analytics", "google-calendar", "hubspot", "linear", "mailchimp", "notion", "slack", "snowflake", "zendesk"

  • operationstringrequired

    enum: "audiences.list", "blocks.children.list", "campaigns.list", "changelog.brief", "channels.list", "comments.list", "commits.list", "companies.list", "contacts.list", "cohorts.list", "customer.brief", "customers.list", "deals.list", "events.list", "file.summary", "funnels.list", "images.render", "invoices.list", "issues.list", "launch.brief", "messages.history", "messages.search", "nodes.get", "notifications.list", "pages.retrieve", "payment_intents.list", "persons.list", "profiles.list", "queries.execute", "queries.list", "releases.list", "reports.list", "reports.run", "repositories.list", "search.list", "subscriptions.list"

  • parametersobject
  • Additional propertyAny value

Success response 200

An authenticated, typed response from the connected source.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • adapter_keystringrequired

    enum: "figma", "github", "google-analytics", "google-calendar", "hubspot", "linear", "mailchimp", "notion", "slack", "snowflake", "zendesk"

  • operationstringrequired
  • capabilitystringrequired
  • sourceobjectrequired

    No additional properties

  • external_account_idstringrequired
  • external_account_namestringrequired
  • fetched_atstringrequired

    format: "date-time"

  • freshnessstringrequired

    const: "live"

  • dataobjectrequired
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/query' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "adapter_key": "figma",
  "operation": "audiences.list",
  "parameters": {}
}'
GET/v1/workspaces/{workspaceId}/connections/{connectionId}/grants

listConnectionGrants

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Active grants for the connection.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject

    No additional properties

  • connection_idstringrequired

    format: "uuid"

  • principal_kindstringrequired

    enum: "agent", "automation", "api_key"

  • principal_idstringrequired
  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • created_by_actor_idstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • expires_atstring | null

    format: "date-time"

  • revoked_atstring | null

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/grants' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/connections/{connectionId}/grants/{principalKind}/{principalId}

grantConnectionAccess

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

principalKind
path · required
  • valuestring

    enum: "agent", "automation", "api_key"

principalId
path · required
  • valuestring

    minLength: 1 · maxLength: 200

Request body required

application/json

  • valueobject

    No additional properties

  • capabilitiesarrayrequired

    minItems: 1 · uniqueItems: true

  • Each itemstring
  • resource_scopeobject
  • Additional propertyAny value
  • expires_atstring

    format: "date-time"

Success response 200

Connection access granted or replaced.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • connection_idstringrequired

    format: "uuid"

  • principal_kindstringrequired

    enum: "agent", "automation", "api_key"

  • principal_idstringrequired
  • capabilitiesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyAny value
  • created_by_actor_idstringrequired
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • expires_atstring | null

    format: "date-time"

  • revoked_atstring | null

    format: "date-time"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/grants/{principalKind}/{principalId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "capabilities": [
    "example"
  ],
  "resource_scope": {},
  "expires_at": "2026-01-01T00:00:00Z"
}'
DELETE/v1/workspaces/{workspaceId}/connections/{connectionId}/grants/{principalKind}/{principalId}

revokeConnectionAccess

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

connectionId
path · required
  • valuestring

    format: "uuid"

principalKind
path · required
  • valuestring

    enum: "agent", "automation", "api_key"

principalId
path · required
  • valuestring

    minLength: 1 · maxLength: 200

Request body

No request body is specified in the contract.

Success response 204

Connection grant revoked.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/connections/{connectionId}/grants/{principalKind}/{principalId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Providers

POST/v1/workspaces/{workspaceId}/providers/google/oauth/session

Start a PKCE-protected Gmail mailbox connection for this workspace.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Gmail authorization URL and poll contract.

application/json

  • valueobject
  • sessionobjectrequired

    No additional properties

  • sessionIdstringrequired

    format: "uuid"

  • authUrlstringrequired

    format: "uri"

  • expiresAtintegerrequired

    format: "int64"

  • pollIntervalMsintegerrequired

    minimum: 250

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/providers/google/oauth/session' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/providers/google/oauth/sessions/{sessionId}

Poll a Gmail authorization session inside its workspace boundary.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sessionId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current Gmail authorization state.

application/json

  • valueobject
  • sessionobjectrequired

    No additional properties

  • statusstringrequired

    enum: "pending", "complete", "error", "expired"

  • mailboxIdstring | nullrequired

    format: "uuid"

  • emailstring | nullrequired

    format: "email"

  • errorstring | nullrequired
  • expiresAtintegerrequired

    format: "int64"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/providers/google/oauth/sessions/{sessionId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Provider connections

GET/v1/workspaces/{workspaceId}/provider-connections

listProviderConnections

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Provider connection metadata. Credential material is never returned.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • kindstringrequired
  • ownershipstringrequired

    enum: "customer", "banger"

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • display_namestringrequired
  • capabilitiesarrayrequired
  • Each itemstring
  • active_credential_versioninteger | null
  • credential_rotation_requiredbooleanrequired
  • last_validated_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • verified_domainsarray
  • Each itemstring

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/provider-connections' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/provider-connections/resend

createResendProviderConnection

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • api_keystringrequired

    minLength: 16 · maxLength: 500

  • display_namestring

    maxLength: 100

Success response 200

Idempotent replay of the created Resend connection.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • kindstringrequired
  • ownershipstringrequired

    enum: "customer", "banger"

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • display_namestringrequired
  • capabilitiesarrayrequired
  • Each itemstring
  • active_credential_versioninteger | null
  • credential_rotation_requiredbooleanrequired
  • last_validated_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • verified_domainsarray
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/provider-connections/resend' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "api_key": "examplexxxxxxxxx",
  "display_name": "example"
}'
PUT/v1/workspaces/{workspaceId}/provider-connections/{providerConnectionId}/credential

rotateResendProviderCredential

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

providerConnectionId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • api_keystringrequired

    minLength: 16 · maxLength: 500

  • display_namestring

    maxLength: 100

Success response 200

Resend credential rotated.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • kindstringrequired
  • ownershipstringrequired

    enum: "customer", "banger"

  • statusstringrequired

    enum: "pending", "active", "suspended", "reconnect_required", "disabled"

  • display_namestringrequired
  • capabilitiesarrayrequired
  • Each itemstring
  • active_credential_versioninteger | null
  • credential_rotation_requiredbooleanrequired
  • last_validated_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • disabled_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • verified_domainsarray
  • Each itemstring

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/provider-connections/{providerConnectionId}/credential' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "api_key": "examplexxxxxxxxx",
  "display_name": "example"
}'
DELETE/v1/workspaces/{workspaceId}/provider-connections/{providerConnectionId}

disableProviderConnection

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

providerConnectionId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body

No request body is specified in the contract.

Success response 204

Provider connection and active credential revoked.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/provider-connections/{providerConnectionId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx'

Sending domains

GET/v1/workspaces/{workspaceId}/sending-domains

listNativeSendingDomains

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Banger-native sending domains for the workspace.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/sending-domains

createNativeSendingDomain

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    The product's exact domain or subdomain. By default Banger derives three separate lane subdomains.

    minLength: 3 · maxLength: 253

  • setup_modestring

    Simple provisions one mailbox transport for receiving and sending from selected mailbox addresses, including Broadcasts and Journeys. Advanced provisions separate sending lanes.

    default: "advanced" · enum: "simple", "advanced"

  • mailbox_modestring

    Simple setup defaults to the root when no mailbox prefix is supplied; advanced defaults to a subdomain. Subdomain preserves existing domain mail. Migrate requests Mailboxes at the exact domain. An occupied exact domain or lane requires a request through sending-domain-migrations followed by authorization in the signed-in Banger Approvals panel. Agent credentials cannot authorize migration. No old messages are imported and DNS is never changed automatically.

    enum: "subdomain", "migrate"

  • root_dmarc_confirmedboolean

    Legacy compatibility field; existing policies are preserved and setup requires no confirmation.

  • lane_prefixesobject

    No additional properties

  • mailboxstring

    minLength: 1 · maxLength: 63 · default: "mail"

  • productstring

    minLength: 1 · maxLength: 63 · default: "tx"

  • broadcaststring

    minLength: 1 · maxLength: 63 · default: "broadcast"

  • route_providersobject

    Resend is accepted only when Banger already detected it in this domain's DNS and the selected product has an active connection. Clients must never advertise it otherwise.

    No additional properties

  • productstring

    default: "banger" · enum: "banger", "resend"

  • broadcaststring

    default: "banger" · enum: "banger", "resend"

  • route_domainsobject

    Exact verified domains synchronized from Resend. Required for each lane that keeps Resend.

    No additional properties

  • productstring

    minLength: 3 · maxLength: 253

  • broadcaststring

    minLength: 3 · maxLength: 253

Success response 200

Idempotent replay of a Banger-native sending-domain request.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "setup_mode": "advanced",
  "mailbox_mode": "subdomain",
  "root_dmarc_confirmed": true,
  "lane_prefixes": {
    "mailbox": "mail",
    "product": "tx",
    "broadcast": "broadcast"
  },
  "route_providers": {
    "product": "banger",
    "broadcast": "banger"
  },
  "route_domains": {
    "product": "example",
    "broadcast": "example"
  }
}'
GET/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}

getNativeSendingDomain

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current domain, stream, provisioning, and required DNS state.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
DELETE/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}

deleteNativeSendingDomain

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • confirm_domainstringrequired

    Must exactly match the root domain being deleted.

    minLength: 3 · maxLength: 253

Success response 202

Sending and receiving are stopped and idempotent provider teardown is queued. Email history and audit records are preserved.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "confirm_domain": "example"
}'
DELETE/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}

removeNativeSendingLane

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

laneKind
path · required
  • valuestring

    enum: "mailbox", "product", "broadcast"

Request body required

application/json

  • valueobject

    No additional properties

  • confirm_domainstringrequired

    Exact subdomain of the selected lane.

Success response 202

Only the selected lane is stopped and queued for removal. Other lanes and message history are preserved.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "confirm_domain": "example"
}'
POST/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}/pause

pauseNativeSendingLane

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

laneKind
path · required
  • valuestring

    enum: "mailbox", "product", "broadcast"

Request body

No request body is specified in the contract.

Success response 200

The selected lane is paused without changing its DNS or another lane.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}/pause' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}/resume

resumeNativeSendingLane

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

laneKind
path · required
  • valuestring

    enum: "mailbox", "product", "broadcast"

Request body

No request body is specified in the contract.

Success response 200

The selected lane resumes when its saved DNS and provider state are ready.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/lanes/{laneKind}/resume' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/verify

verifyNativeSendingDomain

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

sendingDomainId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Banger identity and DNS verification were safely rechecked.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • domain_idstringrequired

    format: "uuid"

  • product_idstringrequired

    format: "uuid"

  • root_domainstringrequired
  • parent_domainstring

    Company domain retained when a lane uses a subdomain.

  • setup_modestring

    enum: "simple", "advanced"

  • domain_statusstringrequired

    enum: "pending", "verified", "failed", "disabled", "deleting", "deleted"

  • lanesarrayrequired

    minItems: 1 · maxItems: 3

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • created_atstring

    format: "date-time"

  • kindstringrequired

    enum: "mailbox", "product", "broadcast"

  • display_namestringrequired
  • from_domainstringrequired
  • mail_from_domainstring | nullrequired
  • inbound_domainstring | nullrequired
  • route_providerstringrequired

    enum: "banger", "resend"

  • selected_provider_connection_idstring | nullrequired

    format: "uuid"

  • inbound_providerstring | nullrequired

    enum: "banger", null

  • statusstringrequired

    enum: "pending", "active", "paused", "deleting", "deleted"

  • status_reasonstring | nullrequired
  • desired_revisionintegerrequired

    minimum: 1

  • observed_revisionintegerrequired

    minimum: 0

  • dns_readybooleanrequired
  • provider_readybooleanrequired
  • inbound_readybooleanrequired
  • outbound_readybooleanrequired
  • banger_transport_readybooleanrequired
  • banger_mail_from_domainstring | nullrequired
  • provisioning_job_idstring | nullrequired

    format: "uuid"

  • provisioning_statusstringrequired

    enum: "pending", "provisioning", "waiting_dns", "active", "failed", "deleting", "deleted", "not_required"

  • provisioning_error_codestring | null
  • provisioning_next_attempt_atstring | null
  • provisioning_last_checked_atstring | null
  • provider_identity_statusstring | null
  • provider_dkim_statusstring | null
  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired
  • deletionobject | nullrequired

    No additional properties

  • job_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "pending", "processing", "waiting_provider", "completed", "failed"

  • last_error_codestring | nullrequired
  • cleanup_recordsarrayrequired

    Exact DNS records the user may remove after teardown completes.

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • lane_idstringrequired

    format: "uuid"

  • providerstringrequired

    enum: "banger", "resend"

  • purposestringrequired
  • typestringrequired

    enum: "TXT", "MX", "CNAME"

  • namestringrequired
  • valuestringrequired
  • priorityinteger | nullrequired
  • requiredbooleanrequired
  • statusstringrequired

    enum: "pending", "verified", "error"

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

  • first_observed_atstring | nullrequired

    format: "date-time"

  • last_checked_atstring | nullrequired

    format: "date-time"

  • errorobjectrequired
  • Additional propertyAny value
  • provider_referencestring | nullrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domains/{sendingDomainId}/verify' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Sending domain migrations

POST/v1/workspaces/{workspaceId}/sending-domain-migrations

requestNativeDomainMigration

Freeze the exact setup and observed DNS into a pending domain.migrate approval. Does not provision resources. Only a signed-in administrator may authorize it through the Approvals panel; agent credentials and automatic review are rejected. Authorization atomically rechecks the DNS snapshot and prepares the approved domain.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    The product's exact domain or subdomain. By default Banger derives three separate lane subdomains.

    minLength: 3 · maxLength: 253

  • setup_modestring

    Simple provisions one mailbox transport for receiving and sending from selected mailbox addresses, including Broadcasts and Journeys. Advanced provisions separate sending lanes.

    default: "advanced" · enum: "simple", "advanced"

  • mailbox_modestring

    Simple setup defaults to the root when no mailbox prefix is supplied; advanced defaults to a subdomain. Subdomain preserves existing domain mail. Migrate requests Mailboxes at the exact domain. An occupied exact domain or lane requires a request through sending-domain-migrations followed by authorization in the signed-in Banger Approvals panel. Agent credentials cannot authorize migration. No old messages are imported and DNS is never changed automatically.

    enum: "subdomain", "migrate"

  • root_dmarc_confirmedboolean

    Legacy compatibility field; existing policies are preserved and setup requires no confirmation.

  • lane_prefixesobject

    No additional properties

  • mailboxstring

    minLength: 1 · maxLength: 63 · default: "mail"

  • productstring

    minLength: 1 · maxLength: 63 · default: "tx"

  • broadcaststring

    minLength: 1 · maxLength: 63 · default: "broadcast"

  • route_providersobject

    Resend is accepted only when Banger already detected it in this domain's DNS and the selected product has an active connection. Clients must never advertise it otherwise.

    No additional properties

  • productstring

    default: "banger" · enum: "banger", "resend"

  • broadcaststring

    default: "banger" · enum: "banger", "resend"

  • route_domainsobject

    Exact verified domains synchronized from Resend. Required for each lane that keeps Resend.

    No additional properties

  • productstring

    minLength: 3 · maxLength: 253

  • broadcaststring

    minLength: 3 · maxLength: 253

Success response 200

Existing migration request returned idempotently.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • requested_by_actor_idstringrequired
  • action_kindstringrequired
  • summarystringrequired
  • capability_scopesarrayrequired
  • Each itemstring
  • resource_scopeobjectrequired
  • Additional propertyarray
  • Each itemstring
  • payloadobjectrequired
  • Additional propertyAny value
  • payload_sha256stringrequired

    pattern: "^[0-9a-f]{64}$"

  • statusstringrequired

    enum: "pending", "approved", "rejected", "cancelled", "expired"

  • missedbooleanrequired
  • expires_atstringrequired

    format: "date-time"

  • qa_automationobject | null

    Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.

  • kindstring

    enum: "dedicated_qa_automation"

  • authorization_referencestring
  • run_idstring
  • operation_keystring
  • recipientsarray
  • Each itemstring

    format: "email"

  • approval_sha256string
  • resource_sha256string
  • decided_by_actor_idstring | null
  • decision_reasonstring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • decided_atstring | null

    format: "date-time"

  • execution_job_idstring

    format: "uuid"

  • reviewobject

    No additional properties

  • dispositionstringrequired

    enum: "automatic", "human_required"

  • recipient_countinteger | nullrequired

    minimum: 0

  • reasonsarrayrequired
  • Each itemstring
  • checksarrayrequired
  • Each itemstring

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/sending-domain-migrations' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "setup_mode": "advanced",
  "mailbox_mode": "subdomain",
  "root_dmarc_confirmed": true,
  "lane_prefixes": {
    "mailbox": "mail",
    "product": "tx",
    "broadcast": "broadcast"
  },
  "route_providers": {
    "product": "banger",
    "broadcast": "banger"
  },
  "route_domains": {
    "product": "example",
    "broadcast": "example"
  }
}'

Webhooks

GET/v1/workspaces/{workspaceId}/webhooks

List inbound event sources and outbound event destinations.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Workspace webhook endpoints.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • kindstringrequired

    enum: "outbound", "inbound"

  • source_keystringrequired

    pattern: "^[a-z0-9][a-z0-9_-]{0,62}$"

  • namestringrequired
  • endpoint_urlstring | null

    format: "uri"

  • statusstringrequired

    enum: "active", "disabled", "error"

  • event_typesarrayrequired
  • Each itemstring
  • connection_idstring | null

    format: "uuid"

  • delivered_countintegerrequired

    minimum: 0

  • failed_countintegerrequired

    minimum: 0

  • last_delivered_atstring | null

    format: "date-time"

  • last_received_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/webhooks

Create a signed, retried destination or idempotent inbound event source.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • kindstringrequired

    enum: "outbound", "inbound"

  • namestringrequired

    minLength: 1 · maxLength: 120

  • source_keystring

    banger_api is reserved for the webhook POST /events creates.

    pattern: "^[a-z0-9][a-z0-9_-]{0,62}$" · default: "custom"

  • source_configobject

    Source-specific deterministic event evaluation and delivery mapping. Supported for Zendesk and Supabase Auth.

    No additional properties

  • vip_tagsarray

    minItems: 1 · maxItems: 20 · uniqueItems: true

  • Each itemstring

    pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"

  • sla_warning_minutesinteger

    minimum: 1 · maximum: 10080

  • project_urlstring

    Supabase project URL.

    format: "uri"

  • mailbox_idstring

    Active Banger sending address used for Supabase Auth email.

    format: "uuid"

  • template_idsobject

    Banger template selected for each Supabase Auth email action.

    No additional properties

  • signupstringrequired

    format: "uuid"

  • invitestringrequired

    format: "uuid"

  • magiclinkstringrequired

    format: "uuid"

  • recoverystringrequired

    format: "uuid"

  • email_changestringrequired

    format: "uuid"

  • reauthenticationstringrequired

    format: "uuid"

  • password_changed_notificationstringrequired

    format: "uuid"

  • email_changed_notificationstringrequired

    format: "uuid"

  • phone_changed_notificationstringrequired

    format: "uuid"

  • identity_linked_notificationstringrequired

    format: "uuid"

  • identity_unlinked_notificationstringrequired

    format: "uuid"

  • mfa_factor_enrolled_notificationstringrequired

    format: "uuid"

  • mfa_factor_unenrolled_notificationstringrequired

    format: "uuid"

  • signing_secretstring

    Supabase Send Email Hook secret. Accepted only for an inbound Supabase source and encrypted at rest.

    minLength: 20 · maxLength: 500

  • endpoint_urlstring

    Required for outbound destinations only.

    format: "uri"

  • event_typesarray

    Events to send. Omitted, an outbound endpoint gets the default activity events; the specific events (mail.received, mail.sent, send.*, journey.*) are sent only when listed. * sends everything, including the high-volume send.delivered.

    minItems: 1 · maxItems: 100 · uniqueItems: true

  • Each itemstring

    enum: "*", "mail.changed", "send.changed", "campaign.changed", "audience.changed", "approval.changed", "automation.changed", "domain.changed", "sending.warning", "sending.lane_paused", "sending.domain_paused", "sending.mailbox_paused", "sending.workspace_frozen", "sending.resumed", "mail.received", "mail.sent", "send.delivered", "send.bounced", "send.complained", "journey.enrolled", "journey.completed", "journey.exited", "custom"

Success response 201

Webhook created. Outbound signing secrets are shown once; inbound credential options can be reopened by authorized callers.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • kindstringrequired

    enum: "outbound", "inbound"

  • source_keystringrequired

    pattern: "^[a-z0-9][a-z0-9_-]{0,62}$"

  • namestringrequired
  • endpoint_urlstring | null

    format: "uri"

  • statusstringrequired

    enum: "active", "disabled", "error"

  • event_typesarrayrequired
  • Each itemstring
  • connection_idstring | null

    format: "uuid"

  • delivered_countintegerrequired

    minimum: 0

  • failed_countintegerrequired

    minimum: 0

  • last_delivered_atstring | null

    format: "date-time"

  • last_received_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • signing_secretstring

    Outbound request signing secret

  • source_urlstring

    Inbound event URL containing its unguessable secret.

    format: "uri"

  • webhook_urlstring

    Public inbound URL to use with the Authorization header.

    format: "uri"

  • bearer_tokenstring

    Secret endpoint token to send as Authorization Bearer.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "kind": "outbound",
  "name": "example",
  "source_key": "custom",
  "source_config": {
    "vip_tags": [
      "example"
    ],
    "sla_warning_minutes": 1,
    "project_url": "https://example.com",
    "mailbox_id": "00000000-0000-4000-8000-000000000001",
    "template_ids": {
      "signup": "00000000-0000-4000-8000-000000000001",
      "invite": "00000000-0000-4000-8000-000000000001",
      "magiclink": "00000000-0000-4000-8000-000000000001",
      "recovery": "00000000-0000-4000-8000-000000000001",
      "email_change": "00000000-0000-4000-8000-000000000001",
      "reauthentication": "00000000-0000-4000-8000-000000000001",
      "password_changed_notification": "00000000-0000-4000-8000-000000000001",
      "email_changed_notification": "00000000-0000-4000-8000-000000000001",
      "phone_changed_notification": "00000000-0000-4000-8000-000000000001",
      "identity_linked_notification": "00000000-0000-4000-8000-000000000001",
      "identity_unlinked_notification": "00000000-0000-4000-8000-000000000001",
      "mfa_factor_enrolled_notification": "00000000-0000-4000-8000-000000000001",
      "mfa_factor_unenrolled_notification": "00000000-0000-4000-8000-000000000001"
    }
  },
  "signing_secret": "examplexxxxxxxxxxxxx",
  "endpoint_url": "https://example.com",
  "event_types": [
    "*"
  ]
}'
PATCH/v1/workspaces/{workspaceId}/webhooks/{endpointId}

Disable a webhook, or re-enable a disabled or failing one, without rotating its endpoint or secret.

Disabling stops deliveries or inbound automation events and keeps the webhook, its name and its history. Disabling an incoming webhook also disables its connection, so Journeys it triggers stop receiving events until it is re-enabled. To remove a webhook for good, delete it.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

endpointId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • statusstringrequired

    enum: "active", "disabled"

Success response 200

Webhook re-enabled or disabled.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • kindstringrequired

    enum: "outbound", "inbound"

  • source_keystringrequired

    pattern: "^[a-z0-9][a-z0-9_-]{0,62}$"

  • namestringrequired
  • endpoint_urlstring | null

    format: "uri"

  • statusstringrequired

    enum: "active", "disabled", "error"

  • event_typesarrayrequired
  • Each itemstring
  • connection_idstring | null

    format: "uuid"

  • delivered_countintegerrequired

    minimum: 0

  • failed_countintegerrequired

    minimum: 0

  • last_delivered_atstring | null

    format: "date-time"

  • last_received_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks/{endpointId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "status": "active"
}'
DELETE/v1/workspaces/{workspaceId}/webhooks/{endpointId}

Permanently delete a webhook so its name can be used again.

An outbound endpoint is deleted with its delivery history. An incoming webhook is deleted with its connection, and only while no Journey, archived ones included, uses that connection as a trigger or goal. To stop a webhook and keep it, PATCH its status to disabled instead.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

endpointId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

Webhook deleted.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks/{endpointId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/webhooks/{endpointId}/credentials

Reopen an active incoming webhook's existing credential options.

Requires automation:execute. Returns the same secret without creating or rotating resources. Never cache or log this response.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

endpointId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Required unless the authenticated API key already binds the product.

  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Private source URL, public webhook URL, and separate bearer token.

application/json

  • valueobject
  • dataunspecified
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • kindstringrequired

    enum: "outbound", "inbound"

  • source_keystringrequired

    pattern: "^[a-z0-9][a-z0-9_-]{0,62}$"

  • namestringrequired
  • endpoint_urlstring | null

    format: "uri"

  • statusstringrequired

    enum: "active", "disabled", "error"

  • event_typesarrayrequired
  • Each itemstring
  • connection_idstring | null

    format: "uuid"

  • delivered_countintegerrequired

    minimum: 0

  • failed_countintegerrequired

    minimum: 0

  • last_delivered_atstring | null

    format: "date-time"

  • last_received_atstring | null

    format: "date-time"

  • last_error_codestring | null
  • created_atstringrequired

    format: "date-time"

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • signing_secretstring

    Outbound request signing secret

  • source_urlstring

    Inbound event URL containing its unguessable secret.

    format: "uri"

  • webhook_urlstring

    Public inbound URL to use with the Authorization header.

    format: "uri"

  • bearer_tokenstring

    Secret endpoint token to send as Authorization Bearer.

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks/{endpointId}/credentials' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'
GET/v1/workspaces/{workspaceId}/webhooks/{endpointId}/deliveries

List recent delivery attempts and HTTP outcomes for an outbound webhook.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

endpointId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Recent delivery attempts.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • event_typestringrequired
  • statusstringrequired

    enum: "pending", "delivering", "delivered", "failed"

  • attempt_countintegerrequired

    minimum: 0

  • http_statusinteger | null

    minimum: 100 · maximum: 599

  • last_error_codestring | null
  • delivered_atstring | null

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks/{endpointId}/deliveries' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/webhooks/{endpointId}/test

Queue one signed synthetic event through the normal retrying delivery path.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

endpointId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 202

Signed test event queued.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • statusstringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/webhooks/{endpointId}/test' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Onboarding

PUT/v1/workspaces/{workspaceId}/onboarding/path

selectOnboardingPath

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • pathstringrequired

    enum: "starter_identity", "company_domain", "resend_gateway", "banger_native_sending", "work_mailbox", "gmail", "native_mailbox", "existing_provider"

Success response 200

The server-authoritative onboarding path was selected.

application/json

  • valueobject
  • dataobjectrequired
  • pathstringrequired

    enum: "starter_identity", "company_domain", "resend_gateway", "banger_native_sending", "work_mailbox", "gmail", "native_mailbox", "existing_provider"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/path' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "path": "starter_identity"
}'
GET/v1/workspaces/{workspaceId}/onboarding/guided

Read the canonical setup (connect, brand, domain) without creating resources or sending email.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

details
query

Include editable drafts, brand, and authoritative DNS records.

  • valueinteger

    enum: 1

Request body

No request body is specified in the contract.

Success response 200

Persisted progress and independently verified capabilities.

application/json

  • valueobject
  • dataobjectrequired
  • product_idstringrequired

    format: "uuid"

  • lessonobject
  • stepstringrequired
  • purposestringrequired
  • setupstringrequired
  • boundarystringrequired
  • example_requeststringrequired
  • resultstringrequired
  • choicestringrequired
  • skipstring | nullrequired
  • guidancestring
  • current_stepstringrequired

    enum: "connect", "business", "identity", "sending"

  • completed_countintegerrequired
  • total_stepsintegerrequired

    enum: 4

  • setupobject

    The web setup gate and finish-setup banner. Each part is complete, verifying (domain records added, DNS still checking), skipped or missing.

  • connectstringrequired

    enum: "complete", "skipped", "missing"

  • brandstringrequired

    enum: "complete", "skipped", "missing"

  • domainstringrequired

    enum: "complete", "verifying", "skipped", "missing"

  • gate_openbooleanrequired

    True while brand or domain was neither done nor skipped.

  • missingarrayrequired

    Parts skipped or never done

  • Each itemstring

    enum: "connect", "brand", "domain"

  • unlock_video_dueboolean

    True once a domain is verified until the workspace has seen the "what you can do now" video.

  • agent_client_namestring | null

    The connected AI app

  • completebooleanrequired
  • shared_education_completeboolean
  • outcomestringrequired

    enum: "in_progress", "production_deferred", "production_ready"

  • recommended_actionstringrequired
  • readinessobjectrequired
  • Additional propertyboolean
  • progressobjectrequired
  • Additional propertyAny value
  • stepsarrayrequired
  • Each itemobject
  • idstringrequired
  • titlestringrequired
  • explanationstring
  • statusstringrequired

    enum: "not_started", "in_progress", "waiting", "needs_attention", "complete", "skipped"

  • blocking_dependencystring | null
  • recommended_actionstring
  • actionsarrayrequired
  • Each itemstring
  • resource_idsarrayrequired
  • Each itemstring
  • evidenceobjectrequired
  • Additional propertyAny value
  • Additional propertyAny value

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/guided?details=1' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001'
POST/v1/workspaces/{workspaceId}/onboarding/guided

Execute one explicit retry-safe onboarding action for the selected product.

Sends target only the authorizing user's verified signup address. Journeys stay inactive and Broadcasts stay unsent. Existing migration approval boundaries apply.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

x-banger-product-id
header

Selected product. Required when multiple active products exist.

  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • actionstringrequired

    enum: "begin_guidance", "save_business", "discover_brand", "skip_business", "choose_identity", "defer_identity", "skip_domain", "choose_delivery", "setup_receiving", "defer_receiving", "setup_sending", "dns_applied", "verify_dns", "continue_domain", "add_inboxes", "skip_inboxes", "finish_for_now", "finish"

  • dataobject

    Business fields company_name, primary_goal, website_url and brand; draft fields name, subject, preview_text, body_text and edit; identity fields domain and local_part. Recipient input is never accepted.

  • Additional propertyAny value

Success response 200

Refreshed canonical state after the requested operation.

application/json

  • valueobject
  • dataobjectrequired
  • product_idstringrequired

    format: "uuid"

  • lessonobject
  • stepstringrequired
  • purposestringrequired
  • setupstringrequired
  • boundarystringrequired
  • example_requeststringrequired
  • resultstringrequired
  • choicestringrequired
  • skipstring | nullrequired
  • guidancestring
  • current_stepstringrequired

    enum: "connect", "business", "identity", "sending"

  • completed_countintegerrequired
  • total_stepsintegerrequired

    enum: 4

  • setupobject

    The web setup gate and finish-setup banner. Each part is complete, verifying (domain records added, DNS still checking), skipped or missing.

  • connectstringrequired

    enum: "complete", "skipped", "missing"

  • brandstringrequired

    enum: "complete", "skipped", "missing"

  • domainstringrequired

    enum: "complete", "verifying", "skipped", "missing"

  • gate_openbooleanrequired

    True while brand or domain was neither done nor skipped.

  • missingarrayrequired

    Parts skipped or never done

  • Each itemstring

    enum: "connect", "brand", "domain"

  • unlock_video_dueboolean

    True once a domain is verified until the workspace has seen the "what you can do now" video.

  • agent_client_namestring | null

    The connected AI app

  • completebooleanrequired
  • shared_education_completeboolean
  • outcomestringrequired

    enum: "in_progress", "production_deferred", "production_ready"

  • recommended_actionstringrequired
  • readinessobjectrequired
  • Additional propertyboolean
  • progressobjectrequired
  • Additional propertyAny value
  • stepsarrayrequired
  • Each itemobject
  • idstringrequired
  • titlestringrequired
  • explanationstring
  • statusstringrequired

    enum: "not_started", "in_progress", "waiting", "needs_attention", "complete", "skipped"

  • blocking_dependencystring | null
  • recommended_actionstring
  • actionsarrayrequired
  • Each itemstring
  • resource_idsarrayrequired
  • Each itemstring
  • evidenceobjectrequired
  • Additional propertyAny value
  • Additional propertyAny value

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/guided' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'x-banger-product-id: 00000000-0000-4000-8000-000000000001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "action": "begin_guidance",
  "data": {}
}'
GET/v1/workspaces/{workspaceId}/onboarding/agent-state

Resume the shared browser and MCP onboarding journey.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current server-owned onboarding state.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/start

Select the agent-led entry surface or the browser fallback.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • entry_surfacestringrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser"

  • client_namestring

    minLength: 1 · maxLength: 100

Success response 200

Journey started or resumed.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/start' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "entry_surface": "codex",
  "client_name": "example"
}'
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/aha-one

Idempotently create the permanent hosted mailbox and start its real welcome-message round trip.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The hosted mailbox and its existing proof were resumed.

application/json

  • valueobject
  • dataobjectrequired
  • proof_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • command_idstringrequired

    format: "uuid"

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

  • send_completebooleanrequired
  • receive_completebooleanrequired
  • round_trip_check_completebooleanrequired
  • agent_check_completebooleanrequired
  • completebooleanrequired
  • expected_subjectstringrequired
  • expected_body_textstringrequired
  • received_message_idstring

    format: "uuid"

  • received_thread_idstring

    format: "uuid"

  • received_subjectstring
  • received_body_textstring
  • received_atstring

    format: "date-time"

  • agent_labelstring
  • agent_suggested_actionstring
  • error_codestring
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/aha-one' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/agent-proof

Send the OAuth-bound agent connection proof to the canonical hosted mailbox.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The same OAuth grant replayed or already completed the proof.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "pending", "verified"

  • attempt_idstringrequired

    format: "uuid"

  • oauth_grant_idstringrequired
  • oauth_client_idstring | nullrequired
  • client_namestring | nullrequired
  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • expected_subjectstringrequired
  • initiated_atstringrequired

    format: "date-time"

  • command_idstring

    format: "uuid"

  • send_statusstring
  • dispatch_statusstring

    enum: "completed", "already-running", "already-settled"

  • replayedboolean
  • message_idstring

    format: "uuid"

  • thread_idstring

    format: "uuid"

  • received_atstring

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/agent-proof' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PUT/v1/workspaces/{workspaceId}/onboarding/agent-state/decision

Record one explicit progressive-onboarding choice.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • decisionstringrequired

    enum: "agent_connection_skipped", "goals_chosen", "domain_bundle_approved", "dns_computer_use_authorized", "dns_manual_selected", "dns_records_applied", "services_reviewed", "persistent_mcp_acknowledged", "autopilot_proposed", "autopilot_skipped", "autopilot_activated", "intro_video_seen", "unlock_video_seen"

  • detailsobject
  • Additional propertyAny value

Success response 200

The choice is persisted in the canonical journey.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/decision' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "decision": "agent_connection_skipped",
  "details": {}
}'
PUT/v1/workspaces/{workspaceId}/onboarding/agent-state/domain-choice

Persist the user's company-domain or no-domain onboarding decision and run canonical discovery.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • choicestringrequired

    enum: "company_domain", "no_domain"

  • domainstring

    minLength: 3 · maxLength: 253

Success response 200

Domain decision stored and journey resumed.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/domain-choice' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "choice": "company_domain",
  "domain": "example"
}'
PUT/v1/workspaces/{workspaceId}/onboarding/agent-state/context

Store reviewed business context supplied by the browser or connected agent.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • contextobjectrequired
  • Additional propertyAny value
  • company_domainstring

    Compatibility bridge for cached connectors that predate chooseAgentOnboardingDomain. The agent must still ask the user first.

    minLength: 3 · maxLength: 253

  • client_namestring

    minLength: 1 · maxLength: 100

Success response 200

Context accepted.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/context' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "context": {},
  "company_domain": "example",
  "client_name": "example"
}'
PUT/v1/workspaces/{workspaceId}/onboarding/agent-state/plan

Store personalized next-step choices after live email activation passes.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • opportunitiesarrayrequired

    minItems: 1 · maxItems: 100

  • Each itemobject
  • Additional propertyAny value

Success response 200

Opportunity plan accepted.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/plan' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "opportunities": [
    {}
  ]
}'
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/apply

Record reviewed artifacts prepared from the opportunity plan.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • summaryobjectrequired
  • Additional propertyAny value

Success response 200

Implementation summary recorded.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/apply' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "summary": {}
}'
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/plan/approve

Approve the proposed opportunity map before the agent prepares sensitive changes.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Opportunity plan approved by the authenticated workspace administrator.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/plan/approve' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/validate

Derive deterministic activation validation from Banger-owned proof state.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • summaryobject
  • Additional propertyAny value

Success response 200

Validation result recorded.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/validate' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "summary": {}
}'
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/complete

Complete onboarding after deterministic validation passes.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Onboarding completed.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • workspace_idstringrequired

    format: "uuid"

  • statusstringrequired

    enum: "choose_agent", "discovering", "planning", "implementing", "validating", "ready", "complete"

  • entry_surfacestring | nullrequired

    enum: "codex", "chatgpt", "claude", "grok", "other_agent", "browser", null

  • agent_statusstringrequired

    enum: "not_connected", "connecting", "connected", "browser_only"

  • agent_client_namestring | nullrequired
  • domain_choicestringrequired

    enum: "undecided", "company_domain", "no_domain"

  • company_domainstring | nullrequired
  • domain_chosen_atstring | nullrequired

    format: "date-time"

  • business_contextobjectrequired
  • Additional propertyAny value
  • opportunity_planarrayrequired
  • Each itemobject
  • Additional propertyAny value
  • implementation_summaryobjectrequired
  • Additional propertyAny value
  • validation_summaryobjectrequired
  • Additional propertyAny value
  • journey_metadataobjectrequired
  • Additional propertyAny value
  • context_reviewed_atstring | nullrequired

    format: "date-time"

  • plan_proposed_atstring | nullrequired

    format: "date-time"

  • plan_approved_atstring | nullrequired

    format: "date-time"

  • completed_atstring | nullrequired

    format: "date-time"

  • versionintegerrequired

    format: "int64" · minimum: 1

  • updated_atstringrequired

    format: "date-time"

  • allOf 2object
  • domain_discoveryunspecifiedrequired
  • oneOf 1object
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired

    Further nesting omitted

  • website_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

    Further nesting omitted

  • company_namestringrequired

    Further nesting omitted

  • summarystringrequired

    Further nesting omitted

  • audiencestringrequired

    Further nesting omitted

  • offeringsarrayrequired

    Further nesting omitted

  • logo_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • favicon_urlstring | nullrequired

    format: "uri"

    Further nesting omitted

  • visual_identityobjectrequired

    Further nesting omitted

  • source_snapshotobjectrequired

    Further nesting omitted

  • dns_signalsarrayrequired
  • Each itemobject

    Further nesting omitted

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

    Further nesting omitted

  • oneOf 2null

    Further nesting omitted

  • provider_detectionsarrayrequired
  • Each itemobject

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject

    Further nesting omitted

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

    Further nesting omitted

  • limitationsarrayrequired
  • Each itemstring

    Further nesting omitted

  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

  • oneOf 2null
  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject

    Further nesting omitted

  • domain_bundleobject | nullrequired
  • Additional propertyAny value
  • growthobjectrequired
  • Additional propertyAny value
  • activationobjectrequired
  • modestringrequired

    enum: "hosted", "company_domain", "starter"

  • statusstringrequired

    enum: "hosted_mailbox_required", "hosted_mailbox_proving", "hosted_mailbox_ready", "needs_context", "needs_provisioning", "provisioning", "dns_required", "ready_for_proof", "proving", "activated", "starter_required", "starter_proving", "starter_ready"

  • domainstring | nullrequired
  • sending_domain_idstring | nullrequired

    format: "uuid"

  • mailbox_idstring | nullrequired

    format: "uuid"

  • mailbox_addressstring | nullrequired

    format: "email"

  • exact_dns_recordsarrayrequired
  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

    Further nesting omitted

  • lane_idstringrequired

    format: "uuid"

    Further nesting omitted

  • providerstringrequired

    enum: "banger", "resend"

    Further nesting omitted

  • purposestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "TXT", "MX", "CNAME"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • priorityinteger | nullrequired

    Further nesting omitted

  • requiredbooleanrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "verified", "error"

    Further nesting omitted

  • provider_statusstringrequired

    enum: "pending", "verified", "error", "not_applicable"

    Further nesting omitted

  • first_observed_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • last_checked_atstring | nullrequired

    format: "date-time"

    Further nesting omitted

  • errorobjectrequired

    Further nesting omitted

  • provider_referencestring | nullrequired

    Further nesting omitted

  • checkpointsarrayrequired
  • Each itemobject
  • keystringrequired

    enum: "domain", "provider", "infrastructure", "dns", "mailbox", "product", "broadcast"

    Further nesting omitted

  • labelstringrequired

    Further nesting omitted

  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • lanesobjectrequired
  • mailboxobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • transactionalobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • marketingobjectrequired
  • statusstringrequired

    enum: "pending", "working", "action_required", "verified"

    Further nesting omitted

  • detailstringrequired

    Further nesting omitted

  • proofunspecifiedrequired
  • oneOf 1object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • command_idstringrequired

    format: "uuid"

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • round_trip_check_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • expected_subjectstringrequired

    Further nesting omitted

  • expected_body_textstringrequired

    Further nesting omitted

  • received_message_idstring

    format: "uuid"

    Further nesting omitted

  • received_thread_idstring

    format: "uuid"

    Further nesting omitted

  • received_subjectstring

    Further nesting omitted

  • received_body_textstring

    Further nesting omitted

  • received_atstring

    format: "date-time"

    Further nesting omitted

  • agent_labelstring

    Further nesting omitted

  • agent_suggested_actionstring

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 2object
  • proof_idstringrequired

    format: "uuid"

    Further nesting omitted

  • domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • native_domain_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_idstringrequired

    format: "uuid"

    Further nesting omitted

  • mailbox_addressstringrequired

    format: "email"

    Further nesting omitted

  • transactional_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • marketing_send_intent_idstring

    format: "uuid"

    Further nesting omitted

  • transactional_subjectstringrequired

    Further nesting omitted

  • marketing_subjectstringrequired

    Further nesting omitted

  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

    Further nesting omitted

  • send_completebooleanrequired

    Further nesting omitted

  • transactional_receivedbooleanrequired

    Further nesting omitted

  • marketing_receivedbooleanrequired

    Further nesting omitted

  • receive_completebooleanrequired

    Further nesting omitted

  • agent_check_completebooleanrequired

    Further nesting omitted

  • completebooleanrequired

    Further nesting omitted

  • error_codestring

    Further nesting omitted

  • replayedbooleanrequired

    Further nesting omitted

  • oneOf 3null
  • overall_readybooleanrequired
  • production_readybooleanrequired
  • completedbooleanrequired
  • pendingbooleanrequired
  • next_actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • action_requiredobjectrequired
  • typestringrequired
  • requiredbooleanrequired
  • actionstringrequired

    enum: "choose_agent", "provision_hosted_mailbox", "send_aha_1", "wait_for_aha_1", "offer_custom_domain", "review_domain_bundle", "provision_domain_bundle", "wait_for_dns_records", "ask_computer_use_permission", "configure_dns_with_computer_use", "present_manual_dns_instructions", "wait_for_dns_propagation", "send_aha_2", "wait_for_aha_2", "create_starter_mailbox", "run_starter_proof", "wait_for_starter_proof", "collect_business_context", "build_lifecycle_map", "review_growth_system", "connect_required_services", "explain_persistent_mcp", "offer_autopilot", "activate_autopilot", "validate", "complete", "open_dashboard"

  • urlstring | nullrequired

    format: "uri"

  • instructionsstring | nullrequired
  • secure_urlstring | nullrequired

    format: "uri"

  • mcp_urlstringrequired

    format: "uri"

  • dashboard_urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/complete' \
  --header "Authorization: Bearer $BANGER_API_KEY"
GET/v1/workspaces/{workspaceId}/onboarding/starter-proof

Read the durable status of a starter-address round trip.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

mailbox_id
query · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current proof status.

application/json

  • valueobject
  • dataobjectrequired
  • proof_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • command_idstringrequired

    format: "uuid"

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

  • send_completebooleanrequired
  • receive_completebooleanrequired
  • round_trip_check_completebooleanrequired
  • agent_check_completebooleanrequired
  • completebooleanrequired
  • expected_subjectstringrequired
  • expected_body_textstringrequired
  • received_message_idstring

    format: "uuid"

  • received_thread_idstring

    format: "uuid"

  • received_subjectstring
  • received_body_textstring
  • received_atstring

    format: "date-time"

  • agent_labelstring
  • agent_suggested_actionstring
  • error_codestring
  • replayedbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/starter-proof?mailbox_id=00000000-0000-4000-8000-000000000001' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/starter-proof

Start or resume a real send-and-receive proof for a starter address.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • mailbox_idstringrequired

    format: "uuid"

Success response 200

The existing proof was resumed.

application/json

  • valueobject
  • dataobjectrequired
  • proof_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • command_idstringrequired

    format: "uuid"

  • phasestringrequired

    enum: "sending", "sent", "received", "checked", "failed"

  • send_completebooleanrequired
  • receive_completebooleanrequired
  • round_trip_check_completebooleanrequired
  • agent_check_completebooleanrequired
  • completebooleanrequired
  • expected_subjectstringrequired
  • expected_body_textstringrequired
  • received_message_idstring

    format: "uuid"

  • received_thread_idstring

    format: "uuid"

  • received_subjectstring
  • received_body_textstring
  • received_atstring

    format: "date-time"

  • agent_labelstring
  • agent_suggested_actionstring
  • error_codestring
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/starter-proof' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "mailbox_id": "00000000-0000-4000-8000-000000000001"
}'
GET/v1/workspaces/{workspaceId}/onboarding/domain-proof

Read the durable status of the domain infrastructure checks.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Current proof status.

application/json

  • valueobject
  • dataobjectrequired
  • proof_idstringrequired

    format: "uuid"

  • domain_idstringrequired

    format: "uuid"

  • native_domain_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • transactional_send_intent_idstring

    format: "uuid"

  • marketing_send_intent_idstring

    format: "uuid"

  • transactional_subjectstringrequired
  • marketing_subjectstringrequired
  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

  • send_completebooleanrequired
  • transactional_receivedbooleanrequired
  • marketing_receivedbooleanrequired
  • receive_completebooleanrequired
  • agent_check_completebooleanrequired
  • completebooleanrequired
  • error_codestring
  • replayedbooleanrequired

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/domain-proof' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/domain-proof

Start or resume two real send-and-receive checks for verified Banger infrastructure.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • native_domain_idstringrequired

    format: "uuid"

Success response 200

The existing proof was resumed.

application/json

  • valueobject
  • dataobjectrequired
  • proof_idstringrequired

    format: "uuid"

  • domain_idstringrequired

    format: "uuid"

  • native_domain_idstringrequired

    format: "uuid"

  • mailbox_idstringrequired

    format: "uuid"

  • mailbox_addressstringrequired

    format: "email"

  • transactional_send_intent_idstring

    format: "uuid"

  • marketing_send_intent_idstring

    format: "uuid"

  • transactional_subjectstringrequired
  • marketing_subjectstringrequired
  • phasestringrequired

    enum: "sending", "receiving", "received", "checked", "failed"

  • send_completebooleanrequired
  • transactional_receivedbooleanrequired
  • marketing_receivedbooleanrequired
  • receive_completebooleanrequired
  • agent_check_completebooleanrequired
  • completebooleanrequired
  • error_codestring
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/domain-proof' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "native_domain_id": "00000000-0000-4000-8000-000000000001"
}'
PUT/v1/workspaces/{workspaceId}/onboarding/goal

selectActivationGoal

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • goalstringrequired

    enum: "work_inbox", "product_email", "campaign", "company_workflow"

Success response 200

The first outcome is selected and the guided run may open in the product shell.

application/json

  • valueobject
  • dataobjectrequired
  • goalstringrequired

    enum: "work_inbox", "product_email", "campaign", "company_workflow"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/goal' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "goal": "work_inbox"
}'
GET/v1/workspaces/{workspaceId}/onboarding/discovery

getWorkspaceDomainDiscovery

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The current company and email-stack discovery.

application/json

  • valueobject
  • dataobjectrequired
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired
  • website_urlstring | nullrequired

    format: "uri"

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

  • company_namestringrequired
  • summarystringrequired
  • audiencestringrequired
  • offeringsarrayrequired
  • Each itemstring
  • logo_urlstring | nullrequired

    format: "uri"

  • favicon_urlstring | nullrequired

    format: "uri"

  • visual_identityobjectrequired
  • colorsarrayrequired

    maxItems: 6

  • Each itemstring
  • fontsarrayrequired

    maxItems: 6

  • Each itemstring
  • tonearrayrequired

    maxItems: 6

  • Each itemstring
  • source_confidencestringrequired

    enum: "high", "medium", "low"

  • hero_image_urlstring

    format: "uri"

  • palettearrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • valuestringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "primary", "accent", "background", "surface", "text", "other"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • typographyarrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • familystringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "heading", "body", "mono", "other"

    Further nesting omitted

  • weightsarrayrequired

    Further nesting omitted

  • assetsarrayrequired

    maxItems: 8

  • Each itemobject

    No additional properties

  • urlstringrequired

    format: "uri"

    Further nesting omitted

  • kindstringrequired

    enum: "logo", "wordmark", "favicon", "hero"

    Further nesting omitted

  • sourcestringrequired

    Further nesting omitted

  • brand_summarystringrequired
  • imagery_stylearrayrequired

    maxItems: 6

  • Each itemstring
  • source_snapshotobjectrequired
  • Additional propertyAny value
  • dns_signalsarrayrequired
  • Each itemobject
  • namestringrequired
  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

  • valuestringrequired
  • ttlintegerrequired

    minimum: 0

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

  • keystringrequired
  • namestringrequired
  • confidencestringrequired

    enum: "high", "medium", "low"

  • dashboard_urlstringrequired

    format: "uri"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • oneOf 2null
  • provider_detectionsarrayrequired
  • Each itemobject
  • keystringrequired
  • namestringrequired
  • categoriesarrayrequired
  • Each itemstring

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • confidencestringrequired

    enum: "high", "medium", "low"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject
  • kindstringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • labelstringrequired
  • statusstringrequired

    enum: "detected", "missing", "needs_review"

  • provider_keysarrayrequired
  • Each itemstring
  • recommendationstringrequired

    enum: "connect", "setup_banger", "review"

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

  • capabilitystringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • provider_keystring
  • actionstringrequired

    enum: "connect", "setup_banger", "review"

  • domainstring

    minLength: 3 · maxLength: 253

  • limitationsarrayrequired
  • Each itemstring
  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/discovery' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/onboarding/discovery

scanWorkspaceDomain

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • domainstringrequired

    minLength: 3 · maxLength: 253

  • stream_kindstring

    default: "default" · enum: "default", "transactional", "marketing"

Success response 201

Public DNS and website discovery completed and was persisted.

application/json

  • valueobject
  • dataobjectrequired
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired
  • website_urlstring | nullrequired

    format: "uri"

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

  • company_namestringrequired
  • summarystringrequired
  • audiencestringrequired
  • offeringsarrayrequired
  • Each itemstring
  • logo_urlstring | nullrequired

    format: "uri"

  • favicon_urlstring | nullrequired

    format: "uri"

  • visual_identityobjectrequired
  • colorsarrayrequired

    maxItems: 6

  • Each itemstring
  • fontsarrayrequired

    maxItems: 6

  • Each itemstring
  • tonearrayrequired

    maxItems: 6

  • Each itemstring
  • source_confidencestringrequired

    enum: "high", "medium", "low"

  • hero_image_urlstring

    format: "uri"

  • palettearrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • valuestringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "primary", "accent", "background", "surface", "text", "other"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • typographyarrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • familystringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "heading", "body", "mono", "other"

    Further nesting omitted

  • weightsarrayrequired

    Further nesting omitted

  • assetsarrayrequired

    maxItems: 8

  • Each itemobject

    No additional properties

  • urlstringrequired

    format: "uri"

    Further nesting omitted

  • kindstringrequired

    enum: "logo", "wordmark", "favicon", "hero"

    Further nesting omitted

  • sourcestringrequired

    Further nesting omitted

  • brand_summarystringrequired
  • imagery_stylearrayrequired

    maxItems: 6

  • Each itemstring
  • source_snapshotobjectrequired
  • Additional propertyAny value
  • dns_signalsarrayrequired
  • Each itemobject
  • namestringrequired
  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

  • valuestringrequired
  • ttlintegerrequired

    minimum: 0

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

  • keystringrequired
  • namestringrequired
  • confidencestringrequired

    enum: "high", "medium", "low"

  • dashboard_urlstringrequired

    format: "uri"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • oneOf 2null
  • provider_detectionsarrayrequired
  • Each itemobject
  • keystringrequired
  • namestringrequired
  • categoriesarrayrequired
  • Each itemstring

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • confidencestringrequired

    enum: "high", "medium", "low"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject
  • kindstringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • labelstringrequired
  • statusstringrequired

    enum: "detected", "missing", "needs_review"

  • provider_keysarrayrequired
  • Each itemstring
  • recommendationstringrequired

    enum: "connect", "setup_banger", "review"

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

  • capabilitystringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • provider_keystring
  • actionstringrequired

    enum: "connect", "setup_banger", "review"

  • domainstring

    minLength: 3 · maxLength: 253

  • limitationsarrayrequired
  • Each itemstring
  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/discovery' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "domain": "example",
  "stream_kind": "default"
}'
PUT/v1/workspaces/{workspaceId}/onboarding/discovery

confirmWorkspaceDomainDiscovery

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • company_namestringrequired

    minLength: 1 · maxLength: 200

  • summarystringrequired

    minLength: 1 · maxLength: 4000

  • audiencestring

    maxLength: 2000

  • offeringsarray

    maxItems: 8

  • Each itemstring

    maxLength: 120

  • website_urlstring | null

    format: "uri"

  • connection_planarrayrequired

    maxItems: 30

  • Each itemobject

    No additional properties

  • capabilitystringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • provider_keystring
  • actionstringrequired

    enum: "connect", "setup_banger", "review"

  • domainstring

    minLength: 3 · maxLength: 253

Success response 200

Company context and the suggested connection plan were confirmed.

application/json

  • valueobject
  • dataobjectrequired
  • domainstringrequired
  • scan_statusstringrequired

    enum: "complete", "partial", "failed"

  • companyobjectrequired
  • domainstringrequired
  • website_urlstring | nullrequired

    format: "uri"

  • website_statusstringrequired

    enum: "available", "missing", "blocked", "error"

  • company_namestringrequired
  • summarystringrequired
  • audiencestringrequired
  • offeringsarrayrequired
  • Each itemstring
  • logo_urlstring | nullrequired

    format: "uri"

  • favicon_urlstring | nullrequired

    format: "uri"

  • visual_identityobjectrequired
  • colorsarrayrequired

    maxItems: 6

  • Each itemstring
  • fontsarrayrequired

    maxItems: 6

  • Each itemstring
  • tonearrayrequired

    maxItems: 6

  • Each itemstring
  • source_confidencestringrequired

    enum: "high", "medium", "low"

  • hero_image_urlstring

    format: "uri"

  • palettearrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • valuestringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "primary", "accent", "background", "surface", "text", "other"

    Further nesting omitted

  • namestringrequired

    Further nesting omitted

  • typographyarrayrequired

    maxItems: 6

  • Each itemobject

    No additional properties

  • familystringrequired

    Further nesting omitted

  • rolestringrequired

    enum: "heading", "body", "mono", "other"

    Further nesting omitted

  • weightsarrayrequired

    Further nesting omitted

  • assetsarrayrequired

    maxItems: 8

  • Each itemobject

    No additional properties

  • urlstringrequired

    format: "uri"

    Further nesting omitted

  • kindstringrequired

    enum: "logo", "wordmark", "favicon", "hero"

    Further nesting omitted

  • sourcestringrequired

    Further nesting omitted

  • brand_summarystringrequired
  • imagery_stylearrayrequired

    maxItems: 6

  • Each itemstring
  • source_snapshotobjectrequired
  • Additional propertyAny value
  • dns_signalsarrayrequired
  • Each itemobject
  • namestringrequired
  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

  • valuestringrequired
  • ttlintegerrequired

    minimum: 0

  • dns_providerunspecifiedrequired
  • oneOf 1object

    No additional properties

  • keystringrequired
  • namestringrequired
  • confidencestringrequired

    enum: "high", "medium", "low"

  • dashboard_urlstringrequired

    format: "uri"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • oneOf 2null
  • provider_detectionsarrayrequired
  • Each itemobject
  • keystringrequired
  • namestringrequired
  • categoriesarrayrequired
  • Each itemstring

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • confidencestringrequired

    enum: "high", "medium", "low"

  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • capability_summaryarrayrequired
  • Each itemobject
  • kindstringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • labelstringrequired
  • statusstringrequired

    enum: "detected", "missing", "needs_review"

  • provider_keysarrayrequired
  • Each itemstring
  • recommendationstringrequired

    enum: "connect", "setup_banger", "review"

  • recommended_connectionsarrayrequired
  • Each itemobject

    No additional properties

  • keystringrequired
  • namestringrequired
  • categorystringrequired

    enum: "email", "customer", "product", "work", "data"

  • prioritystringrequired

    enum: "required", "recommended"

  • reasonstringrequired
  • sourcestringrequired

    enum: "dns", "business_context", "opportunity_plan", "banger_recommendation"

  • setup_modestringrequired

    enum: "oauth", "secure_credentials"

  • availablebooleanrequired
  • provider_keystring
  • evidencearrayrequired
  • Each itemobject
  • namestringrequired

    Further nesting omitted

  • typestringrequired

    enum: "MX", "TXT", "CNAME", "NS"

    Further nesting omitted

  • valuestringrequired

    Further nesting omitted

  • ttlintegerrequired

    minimum: 0

    Further nesting omitted

  • connection_planarrayrequired
  • Each itemobject

    No additional properties

  • capabilitystringrequired

    enum: "work_mailbox", "transactional", "marketing", "deliverability"

  • provider_keystring
  • actionstringrequired

    enum: "connect", "setup_banger", "review"

  • domainstring

    minLength: 3 · maxLength: 253

  • limitationsarrayrequired
  • Each itemstring
  • scanned_atstringrequired

    format: "date-time"

  • confirmed_atstring | nullrequired

    format: "date-time"

curl example

curl --request PUT --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/discovery' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "company_name": "example",
  "summary": "example",
  "audience": "example",
  "offerings": [
    "example"
  ],
  "website_url": "https://example.com",
  "connection_plan": [
    {
      "capability": "work_mailbox",
      "provider_key": "example",
      "action": "connect",
      "domain": "example"
    }
  ]
}'
POST/v1/workspaces/{workspaceId}/onboarding/agent-state/confirm-connection

Confirm the current OAuth agent connection

Requires the OAuth credential installed in the current agent client and automation:read scope.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired

    enum: "connected"

  • messagestringrequired
  • workspace_idstringrequired

    format: "uuid"

  • client_namestringrequired
  • confirmed_atstringrequired

    format: "date-time"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/onboarding/agent-state/confirm-connection' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Access

GET/v1/workspaces/{workspaceId}/access

List workspace members and active invitations.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Workspace directory.

application/json

  • valueobject
  • dataobjectrequired
  • actorIdstringrequired
  • identitiesarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • userIdstringrequired
  • emailstring

    format: "email"

  • displayNamestring
  • kindstringrequired

    const: "user"

  • rolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

  • statusstringrequired

    enum: "active", "suspended"

  • pendingInvitationsarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • codestringrequired

    format: "uuid"

  • inviteCodestring

    format: "uuid"

  • invitedEmailstring

    format: "email"

  • workspaceIdstringrequired

    format: "uuid"

  • workspaceNamestringrequired
  • rolestringrequired

    enum: "admin", "member", "viewer"

  • accessScopestring

    const: "workspace"

  • statusstringrequired

    enum: "pending", "accepted"

  • expiresAtstringrequired

    format: "date-time"

  • notificationSentboolean

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/access' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Invitations

POST/v1/workspaces/{workspaceId}/invitations

Invite a human actor to the workspace.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • emailstringrequired

    format: "email" · maxLength: 320

  • rolestring

    default: "member" · enum: "admin", "member", "viewer"

  • mailbox_idsarray

    maxItems: 250

  • Each itemstring

    format: "uuid"

  • send_modestring

    default: "direct" · enum: "direct", "approval_required"

  • expires_in_hoursinteger

    minimum: 1 · maximum: 720 · default: 168

Success response 201

Invitation created.

application/json

  • valueobject
  • dataobjectrequired
  • idstringrequired

    format: "uuid"

  • codestringrequired

    format: "uuid"

  • inviteCodestring

    format: "uuid"

  • invitedEmailstring

    format: "email"

  • workspaceIdstringrequired

    format: "uuid"

  • workspaceNamestringrequired
  • rolestringrequired

    enum: "admin", "member", "viewer"

  • accessScopestring

    const: "workspace"

  • statusstringrequired

    enum: "pending", "accepted"

  • expiresAtstringrequired

    format: "date-time"

  • notificationSentboolean

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/invitations' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "email": "person@example.com",
  "role": "member",
  "mailbox_ids": [
    "00000000-0000-4000-8000-000000000001"
  ],
  "send_mode": "direct",
  "expires_in_hours": 168
}'

API keys

GET/v1/workspaces/{workspaceId}/api-keys

listWorkspaceApiKeys

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Active scoped API keys. Secret values are never returned.

application/json

  • valueobject
  • dataarrayrequired
  • Each itemobject
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • prefixstringrequired
  • scopesarrayrequired
  • Each itemstring

    enum: "mail:read", "mail:write", "mail:send", "contacts:read", "contacts:write", "campaigns:read", "campaigns:write", "campaigns:send", "automation:read", "automation:execute", "connections:read", "connections:use", "connections:admin", "workspace:admin"

  • expires_atstring

    format: "date-time"

  • last_used_atstring

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/api-keys' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/api-keys

createWorkspaceApiKey

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 100

  • scopesarrayrequired

    minItems: 1 · uniqueItems: true

  • Each itemstring

    enum: "mail:read", "mail:write", "mail:send", "contacts:read", "contacts:write", "campaigns:read", "campaigns:write", "campaigns:send", "automation:read", "automation:execute", "connections:read", "connections:use", "connections:admin", "workspace:admin"

  • expires_atstring

    format: "date-time"

Success response 201

API key created. The token is returned only once.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • prefixstringrequired
  • scopesarrayrequired
  • Each itemstring

    enum: "mail:read", "mail:write", "mail:send", "contacts:read", "contacts:write", "campaigns:read", "campaigns:write", "campaigns:send", "automation:read", "automation:execute", "connections:read", "connections:use", "connections:admin", "workspace:admin"

  • expires_atstring

    format: "date-time"

  • last_used_atstring

    format: "date-time"

  • created_atstringrequired

    format: "date-time"

  • allOf 2object
  • tokenstringrequired
  • smtpobject

    How an app that only sends over SMTP (Supabase Auth, Auth0, WordPress, framework mailers) sends through Banger. The password is an API key with mail:send; Banger relays each message as written and answers only once every check has passed. Present only for a key that can send mail, in an environment whose submission host answers.

  • hoststringrequired
  • portintegerrequired

    Implicit TLS, recommended.

  • starttls_portintegerrequired

    STARTTLS before AUTH.

  • alternate_portsobjectrequired

    The same two listeners, for networks that block 465 and 587.

  • tlsintegerrequired
  • starttlsintegerrequired
  • usernamestringrequired

    Any username works; the key alone identifies the workspace and product.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/api-keys' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example",
  "scopes": [
    "mail:read"
  ],
  "expires_at": "2026-01-01T00:00:00Z"
}'
DELETE/v1/workspaces/{workspaceId}/api-keys/{apiKeyId}

revokeWorkspaceApiKey

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

apiKeyId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 204

API key revoked.

No response body.

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/api-keys/{apiKeyId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"

Billing

GET/v1/workspaces/{workspaceId}/billing

Read billing, usage, and available plans

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • billingobjectrequired
  • workspaceIdstringrequired

    format: "uuid"

  • tierstringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • statusstringrequired
  • planIntervalstring | nullrequired

    enum: "month", "year", null

  • stripeCustomerIdstring | nullrequired
  • stripeSubscriptionIdstring | nullrequired
  • currentPeriodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • cancelAtPeriodEndbooleanrequired
  • prepaidPlanKeystring | nullrequired
  • prepaidUntilinteger | nullrequired

    Unix timestamp in milliseconds.

  • usagePricingobjectrequired

    What Premium includes each month, what it pays per use past that, and the spending limit that caps it.

  • activebooleanrequired

    Whether usage charges run for this workspace now.

  • currencystringrequired

    Lowercase ISO currency of the rates and the limit.

  • ratesobjectrequired
  • emailsPerThousandnumberrequired
  • storagePerGbMonthnumberrequired
  • triagePerThousandnumberrequired
  • spendLimitnumberrequired

    The monthly spending limit in whole units of currency.

  • spendLimitIsDefaultbooleanrequired
  • includedobjectrequired
  • emailsintegerrequired
  • storageBytesintegerrequired
  • triageRunsintegerrequired
  • thisMonthunspecifiedrequired

    While usage charges run, this billing period's use and charge so far. A monthly subscription's period is its subscription period (billed on its renewal invoice); a yearly one's is the UTC calendar month.

  • anyOf 1object
  • emailsintegerrequired
  • averageStorageBytesintegerrequired
  • triageRunsintegerrequired
  • emailsOverintegerrequired
  • storageGbOvernumberrequired
  • triageOverintegerrequired
  • chargeSoFarnumberrequired

    In whole units of currency

  • spendLimitUsedPercentintegerrequired

    How much of the spending limit this period's use has reached.

    minimum: 0 · maximum: 100

  • nearSpendLimitbooleanrequired

    At 80% of the spending limit or more but under it; the admins were emailed.

  • reachedSpendLimitbooleanrequired

    At the spending limit; the admins were emailed.

  • usageStoppedbooleanrequired

    Sending

  • periodStartintegerrequired

    Unix timestamp in milliseconds.

  • periodEndintegerrequired

    Unix timestamp in milliseconds; the meters start over then.

  • carriedOvernumberrequired

    Use from earlier months under the minimum usage invoice (about US$2)

  • anyOf 2null
  • usageobjectrequired
  • storageBytesnumberrequired
  • storageLimitBytesnumberrequired
  • sendsThisMonthnumberrequired
  • sendLimitnumberrequired

    Where sending stops this month

  • includedSendLimitnumber | nullrequired

    What the plan includes while usage charges run; null otherwise.

  • sendsTodaynumberrequired
  • dailySendLimitnumber | nullrequired
  • periodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • catalogobjectrequired
  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • labelstringrequired
  • sendLimitnumberrequired
  • storageGbnumberrequired
  • gmailImportLimitnumberrequired
  • triageRuleLimitnumberrequired
  • triageRunLimitnumberrequired
  • pricesarrayrequired
  • Each itemobject

    Further nesting omitted

  • addonsarrayrequired

    maxItems: 0

  • Each itemunspecified
  • agentPaymentunspecifiedrequired
  • anyOf 1object
  • network_idstringrequired
  • currencystringrequired

    enum: "usd"

  • howstringrequired
  • optionsarrayrequired
  • Each itemobject
  • plan_keystringrequired

    enum: "starter"

    Further nesting omitted

  • intervalstringrequired

    enum: "month", "year"

    Further nesting omitted

  • monthsintegerrequired

    enum: 1, 12

    Further nesting omitted

  • amount_centsintegerrequired

    What to mint the token for

    Further nesting omitted

  • discountobject

    Further nesting omitted

  • anyOf 2null
  • switchOfferunspecified

    The month free on a yearly plan this workspace gets for switching from Mailchimp; null when it doesn't.

  • anyOf 1object
  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • appliesTostringrequired

    enum: "year"

  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "starter"

    Further nesting omitted

  • currencystringrequired

    Further nesting omitted

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • messagestringrequired
  • anyOf 2null

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/billing

Synchronize billing from Stripe

Alias of POST /billing/sync. Requires workspace:admin.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • billingobjectrequired
  • workspaceIdstringrequired

    format: "uuid"

  • tierstringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • statusstringrequired
  • planIntervalstring | nullrequired

    enum: "month", "year", null

  • stripeCustomerIdstring | nullrequired
  • stripeSubscriptionIdstring | nullrequired
  • currentPeriodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • cancelAtPeriodEndbooleanrequired
  • prepaidPlanKeystring | nullrequired
  • prepaidUntilinteger | nullrequired

    Unix timestamp in milliseconds.

  • usagePricingobjectrequired

    What Premium includes each month, what it pays per use past that, and the spending limit that caps it.

  • activebooleanrequired

    Whether usage charges run for this workspace now.

  • currencystringrequired

    Lowercase ISO currency of the rates and the limit.

  • ratesobjectrequired
  • emailsPerThousandnumberrequired
  • storagePerGbMonthnumberrequired
  • triagePerThousandnumberrequired
  • spendLimitnumberrequired

    The monthly spending limit in whole units of currency.

  • spendLimitIsDefaultbooleanrequired
  • includedobjectrequired
  • emailsintegerrequired
  • storageBytesintegerrequired
  • triageRunsintegerrequired
  • thisMonthunspecifiedrequired

    While usage charges run, this billing period's use and charge so far. A monthly subscription's period is its subscription period (billed on its renewal invoice); a yearly one's is the UTC calendar month.

  • anyOf 1object
  • emailsintegerrequired
  • averageStorageBytesintegerrequired
  • triageRunsintegerrequired
  • emailsOverintegerrequired
  • storageGbOvernumberrequired
  • triageOverintegerrequired
  • chargeSoFarnumberrequired

    In whole units of currency

  • spendLimitUsedPercentintegerrequired

    How much of the spending limit this period's use has reached.

    minimum: 0 · maximum: 100

  • nearSpendLimitbooleanrequired

    At 80% of the spending limit or more but under it; the admins were emailed.

  • reachedSpendLimitbooleanrequired

    At the spending limit; the admins were emailed.

  • usageStoppedbooleanrequired

    Sending

  • periodStartintegerrequired

    Unix timestamp in milliseconds.

  • periodEndintegerrequired

    Unix timestamp in milliseconds; the meters start over then.

  • carriedOvernumberrequired

    Use from earlier months under the minimum usage invoice (about US$2)

  • anyOf 2null
  • usageobjectrequired
  • storageBytesnumberrequired
  • storageLimitBytesnumberrequired
  • sendsThisMonthnumberrequired
  • sendLimitnumberrequired

    Where sending stops this month

  • includedSendLimitnumber | nullrequired

    What the plan includes while usage charges run; null otherwise.

  • sendsTodaynumberrequired
  • dailySendLimitnumber | nullrequired
  • periodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • catalogobjectrequired
  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • labelstringrequired
  • sendLimitnumberrequired
  • storageGbnumberrequired
  • gmailImportLimitnumberrequired
  • triageRuleLimitnumberrequired
  • triageRunLimitnumberrequired
  • pricesarrayrequired
  • Each itemobject

    Further nesting omitted

  • addonsarrayrequired

    maxItems: 0

  • Each itemunspecified
  • agentPaymentunspecifiedrequired
  • anyOf 1object
  • network_idstringrequired
  • currencystringrequired

    enum: "usd"

  • howstringrequired
  • optionsarrayrequired
  • Each itemobject
  • plan_keystringrequired

    enum: "starter"

    Further nesting omitted

  • intervalstringrequired

    enum: "month", "year"

    Further nesting omitted

  • monthsintegerrequired

    enum: 1, 12

    Further nesting omitted

  • amount_centsintegerrequired

    What to mint the token for

    Further nesting omitted

  • discountobject

    Further nesting omitted

  • anyOf 2null
  • switchOfferunspecified

    The month free on a yearly plan this workspace gets for switching from Mailchimp; null when it doesn't.

  • anyOf 1object
  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • appliesTostringrequired

    enum: "year"

  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "starter"

    Further nesting omitted

  • currencystringrequired

    Further nesting omitted

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • messagestringrequired
  • anyOf 2null

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/billing/sync

Synchronize the latest Stripe subscription

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • billingobjectrequired
  • workspaceIdstringrequired

    format: "uuid"

  • tierstringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • statusstringrequired
  • planIntervalstring | nullrequired

    enum: "month", "year", null

  • stripeCustomerIdstring | nullrequired
  • stripeSubscriptionIdstring | nullrequired
  • currentPeriodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • cancelAtPeriodEndbooleanrequired
  • prepaidPlanKeystring | nullrequired
  • prepaidUntilinteger | nullrequired

    Unix timestamp in milliseconds.

  • usagePricingobjectrequired

    What Premium includes each month, what it pays per use past that, and the spending limit that caps it.

  • activebooleanrequired

    Whether usage charges run for this workspace now.

  • currencystringrequired

    Lowercase ISO currency of the rates and the limit.

  • ratesobjectrequired
  • emailsPerThousandnumberrequired
  • storagePerGbMonthnumberrequired
  • triagePerThousandnumberrequired
  • spendLimitnumberrequired

    The monthly spending limit in whole units of currency.

  • spendLimitIsDefaultbooleanrequired
  • includedobjectrequired
  • emailsintegerrequired
  • storageBytesintegerrequired
  • triageRunsintegerrequired
  • thisMonthunspecifiedrequired

    While usage charges run, this billing period's use and charge so far. A monthly subscription's period is its subscription period (billed on its renewal invoice); a yearly one's is the UTC calendar month.

  • anyOf 1object
  • emailsintegerrequired
  • averageStorageBytesintegerrequired
  • triageRunsintegerrequired
  • emailsOverintegerrequired
  • storageGbOvernumberrequired
  • triageOverintegerrequired
  • chargeSoFarnumberrequired

    In whole units of currency

  • spendLimitUsedPercentintegerrequired

    How much of the spending limit this period's use has reached.

    minimum: 0 · maximum: 100

  • nearSpendLimitbooleanrequired

    At 80% of the spending limit or more but under it; the admins were emailed.

  • reachedSpendLimitbooleanrequired

    At the spending limit; the admins were emailed.

  • usageStoppedbooleanrequired

    Sending

  • periodStartintegerrequired

    Unix timestamp in milliseconds.

  • periodEndintegerrequired

    Unix timestamp in milliseconds; the meters start over then.

  • carriedOvernumberrequired

    Use from earlier months under the minimum usage invoice (about US$2)

  • anyOf 2null
  • usageobjectrequired
  • storageBytesnumberrequired
  • storageLimitBytesnumberrequired
  • sendsThisMonthnumberrequired
  • sendLimitnumberrequired

    Where sending stops this month

  • includedSendLimitnumber | nullrequired

    What the plan includes while usage charges run; null otherwise.

  • sendsTodaynumberrequired
  • dailySendLimitnumber | nullrequired
  • periodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • catalogobjectrequired
  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • labelstringrequired
  • sendLimitnumberrequired
  • storageGbnumberrequired
  • gmailImportLimitnumberrequired
  • triageRuleLimitnumberrequired
  • triageRunLimitnumberrequired
  • pricesarrayrequired
  • Each itemobject

    Further nesting omitted

  • addonsarrayrequired

    maxItems: 0

  • Each itemunspecified
  • agentPaymentunspecifiedrequired
  • anyOf 1object
  • network_idstringrequired
  • currencystringrequired

    enum: "usd"

  • howstringrequired
  • optionsarrayrequired
  • Each itemobject
  • plan_keystringrequired

    enum: "starter"

    Further nesting omitted

  • intervalstringrequired

    enum: "month", "year"

    Further nesting omitted

  • monthsintegerrequired

    enum: 1, 12

    Further nesting omitted

  • amount_centsintegerrequired

    What to mint the token for

    Further nesting omitted

  • discountobject

    Further nesting omitted

  • anyOf 2null
  • switchOfferunspecified

    The month free on a yearly plan this workspace gets for switching from Mailchimp; null when it doesn't.

  • anyOf 1object
  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • appliesTostringrequired

    enum: "year"

  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "starter"

    Further nesting omitted

  • currencystringrequired

    Further nesting omitted

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • messagestringrequired
  • anyOf 2null

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing/sync' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/billing/checkout

Start checkout or open the billing portal

Requires workspace:admin. Premium (plan key starter) is the one plan sold online. An active subscription opens the customer portal. Snake-case fields take precedence over camel-case aliases.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • plan_keystring

    Premium; its plan key is starter.

    enum: "premium", "starter"

  • planKeystring

    enum: "premium", "starter"

  • intervalstring

    default: "month" · enum: "month", "year"

  • billing_attempt_idstring

    Optional retry identifier: 8–64 letters, digits or hyphens. Invalid identifiers are ignored.

  • billingAttemptIdstring
  • anyOf 1unspecified
  • anyOf 2unspecified

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • urlstringrequired

    format: "uri"

  • kindstringrequired

    enum: "checkout", "portal"

  • discountunspecified

    The switch-from-Mailchimp month applied to this yearly checkout.

  • allOf 1object

    Switch from Mailchimp: one month off the first yearly invoice.

  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • planKeystringrequired

    enum: "starter"

  • intervalstringrequired

    enum: "year"

  • currencystringrequired

    Lowercase ISO currency the amounts are in.

  • amountOffintegerrequired

    In the currency's smallest unit.

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

  • messagestringrequired

    A sentence to tell the person.

  • switchOfferunspecified

    On a monthly checkout, the month a yearly one would get instead.

  • allOf 1object

    Switch from Mailchimp: one month off the first yearly invoice.

  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • planKeystringrequired

    enum: "starter"

  • intervalstringrequired

    enum: "year"

  • currencystringrequired

    Lowercase ISO currency the amounts are in.

  • amountOffintegerrequired

    In the currency's smallest unit.

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

  • messagestringrequired

    A sentence to tell the person.

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing/checkout' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '"example"'
POST/v1/workspaces/{workspaceId}/billing/portal

Open the customer billing portal

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • urlstringrequired

    format: "uri"

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing/portal' \
  --header "Authorization: Bearer $BANGER_API_KEY"
POST/v1/workspaces/{workspaceId}/billing/agent-payment

Buy prepaid plan time with a Shared Payment Token

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • plan_keystringrequired

    Premium; its plan key is starter.

    enum: "premium", "starter"

  • intervalstring

    default: "month" · enum: "month", "year"

  • shared_payment_tokenstringrequired

    pattern: "^spt_[A-Za-z0-9_]{6,200}$"

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • statusstringrequired
  • payment_intent_idstringrequired
  • messagestringrequired
  • plan_keystring

    enum: "starter"

  • prepaid_untilstring | null

    format: "date-time"

  • amount_centsinteger

    What was charged.

  • discountobject
  • offerstringrequired

    enum: "switch_from_mailchimp"

  • amount_off_centsintegerrequired
  • full_price_centsintegerrequired
  • messagestringrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing/agent-payment' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "plan_key": "premium",
  "interval": "month",
  "shared_payment_token": "example"
}'
POST/v1/workspaces/{workspaceId}/billing/spend-limit

Set the monthly spending limit for usage charges

Requires workspace:admin and an active Premium subscription. The limit is in whole units of the billing currency (usagePricing.currency); 0 turns usage charges off and null restores the default. Returns the billing snapshot.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject
  • amountnumber | nullrequired

    minimum: 0

Success response 200

Successful response.

application/json

  • valueobject
  • dataobjectrequired
  • billingobjectrequired
  • workspaceIdstringrequired

    format: "uuid"

  • tierstringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • statusstringrequired
  • planIntervalstring | nullrequired

    enum: "month", "year", null

  • stripeCustomerIdstring | nullrequired
  • stripeSubscriptionIdstring | nullrequired
  • currentPeriodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • cancelAtPeriodEndbooleanrequired
  • prepaidPlanKeystring | nullrequired
  • prepaidUntilinteger | nullrequired

    Unix timestamp in milliseconds.

  • usagePricingobjectrequired

    What Premium includes each month, what it pays per use past that, and the spending limit that caps it.

  • activebooleanrequired

    Whether usage charges run for this workspace now.

  • currencystringrequired

    Lowercase ISO currency of the rates and the limit.

  • ratesobjectrequired
  • emailsPerThousandnumberrequired
  • storagePerGbMonthnumberrequired
  • triagePerThousandnumberrequired
  • spendLimitnumberrequired

    The monthly spending limit in whole units of currency.

  • spendLimitIsDefaultbooleanrequired
  • includedobjectrequired
  • emailsintegerrequired
  • storageBytesintegerrequired
  • triageRunsintegerrequired
  • thisMonthunspecifiedrequired

    While usage charges run, this billing period's use and charge so far. A monthly subscription's period is its subscription period (billed on its renewal invoice); a yearly one's is the UTC calendar month.

  • anyOf 1object
  • emailsintegerrequired
  • averageStorageBytesintegerrequired
  • triageRunsintegerrequired
  • emailsOverintegerrequired
  • storageGbOvernumberrequired
  • triageOverintegerrequired
  • chargeSoFarnumberrequired

    In whole units of currency

  • spendLimitUsedPercentintegerrequired

    How much of the spending limit this period's use has reached.

    minimum: 0 · maximum: 100

  • nearSpendLimitbooleanrequired

    At 80% of the spending limit or more but under it; the admins were emailed.

  • reachedSpendLimitbooleanrequired

    At the spending limit; the admins were emailed.

  • usageStoppedbooleanrequired

    Sending

  • periodStartintegerrequired

    Unix timestamp in milliseconds.

  • periodEndintegerrequired

    Unix timestamp in milliseconds; the meters start over then.

  • carriedOvernumberrequired

    Use from earlier months under the minimum usage invoice (about US$2)

  • anyOf 2null
  • usageobjectrequired
  • storageBytesnumberrequired
  • storageLimitBytesnumberrequired
  • sendsThisMonthnumberrequired
  • sendLimitnumberrequired

    Where sending stops this month

  • includedSendLimitnumber | nullrequired

    What the plan includes while usage charges run; null otherwise.

  • sendsTodaynumberrequired
  • dailySendLimitnumber | nullrequired
  • periodEndinteger | nullrequired

    Unix timestamp in milliseconds.

  • catalogobjectrequired
  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "free", "starter", "pro", "business", "scale", "enterprise"

  • labelstringrequired
  • sendLimitnumberrequired
  • storageGbnumberrequired
  • gmailImportLimitnumberrequired
  • triageRuleLimitnumberrequired
  • triageRunLimitnumberrequired
  • pricesarrayrequired
  • Each itemobject

    Further nesting omitted

  • addonsarrayrequired

    maxItems: 0

  • Each itemunspecified
  • agentPaymentunspecifiedrequired
  • anyOf 1object
  • network_idstringrequired
  • currencystringrequired

    enum: "usd"

  • howstringrequired
  • optionsarrayrequired
  • Each itemobject
  • plan_keystringrequired

    enum: "starter"

    Further nesting omitted

  • intervalstringrequired

    enum: "month", "year"

    Further nesting omitted

  • monthsintegerrequired

    enum: 1, 12

    Further nesting omitted

  • amount_centsintegerrequired

    What to mint the token for

    Further nesting omitted

  • discountobject

    Further nesting omitted

  • anyOf 2null
  • switchOfferunspecified

    The month free on a yearly plan this workspace gets for switching from Mailchimp; null when it doesn't.

  • anyOf 1object
  • offerstringrequired

    enum: "switch_from_mailchimp"

  • sourcestringrequired

    enum: "signup_campaign", "mailchimp_connection"

  • appliesTostringrequired

    enum: "year"

  • plansarrayrequired
  • Each itemobject
  • planKeystringrequired

    enum: "starter"

    Further nesting omitted

  • currencystringrequired

    Further nesting omitted

  • yearlyPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • firstYearPriceintegerrequired

    In the currency's smallest unit.

    Further nesting omitted

  • messagestringrequired
  • anyOf 2null

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}/billing/spend-limit' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "amount": 0
}'

Workspaces

POST/v1/workspaces

createWorkspace

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
Idempotency-Key
header · required
  • valuestring

    minLength: 16 · maxLength: 128

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 200

Success response 200

Idempotent replay of a previously created workspace.

application/json

  • valueobject
  • dataunspecifiedrequired
  • allOf 1object
  • idstringrequired

    format: "uuid"

  • namestringrequired
  • shardstringrequired
  • rolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

  • revisionintegerrequired

    format: "int64"

  • name_sourcestringrequired

    Where the workspace name came from: signup (automatic sign-up name), brand (the company or brand confirmed in onboarding), or user (typed by a person; brand confirmations no longer rename it).

    enum: "signup", "brand", "user"

  • owner_emailstring | nullrequired

    The earliest active owner's email address. Null when the caller is a static API key or the owner has no recorded address.

  • avatar_urlstring | nullrequired

    The workspace's brand mark: the default product's brand logo, else the logo of the most recently confirmed company discovery.

  • allOf 2object
  • replayedbooleanrequired

curl example

curl --request POST --globoff 'https://api.bangermail.com/v1/workspaces' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Idempotency-Key: examplexxxxxxxxx' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example"
}'
GET/v1/workspaces/{workspaceId}

Read the workspace, its owner, and the signed-in person's other workspaces.

Any actor authorized for the workspace may read it. other_workspaces lists the signed-in person's other active memberships. An OAuth grant or an API key is authorized for this workspace only and learns nothing about the others, so its other_workspaces is empty and its response carries a note saying so. A static API key has no person behind it, so its owner_email is null.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 200

The workspace as the caller sees it.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • namestringrequired
  • name_sourcestringrequired

    Where the workspace name came from: signup (automatic sign-up name), brand (the company or brand confirmed in onboarding), or user (typed by a person; brand confirmations no longer rename it).

    enum: "signup", "brand", "user"

  • rolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

  • owner_emailstring | nullrequired
  • avatar_urlstring | nullrequired
  • other_workspacesarrayrequired

    maxItems: 50

  • Each itemobject

    No additional properties

  • idstringrequired

    format: "uuid"

  • namestringrequired
  • rolestringrequired

    enum: "owner", "admin", "member", "viewer", "partner"

  • notestring

    Present for API-key and OAuth callers, whose connection is authorized for this workspace only.

curl example

curl --request GET --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"
PATCH/v1/workspaces/{workspaceId}

Rename a workspace.

Requires an active owner or admin; credentials need workspace:admin for this workspace. The name is trimmed and must be 1-80 characters. A typed name is final: later brand confirmations no longer rename the workspace (name_source becomes user). Bumps the workspace revision and records a "workspace" change.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body required

application/json

  • valueobject

    No additional properties

  • namestringrequired

    minLength: 1 · maxLength: 80

Success response 200

The workspace was renamed.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • namestringrequired

    minLength: 1 · maxLength: 80

  • name_sourcestringrequired

    const: "user"

curl example

curl --request PATCH --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}' \
  --header "Authorization: Bearer $BANGER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "example"
}'
DELETE/v1/workspaces/{workspaceId}

Permanently delete an owned workspace and queue physical object cleanup.

Requires the authenticated actor to be an owner. Static workspace API keys cannot delete a workspace; a human session or user-authorized OAuth grant with workspace:admin is required. Paid subscriptions must be cancelled first. PostgreSQL state is deleted atomically and all B2 object versions under the workspace prefix are purged asynchronously.

Authentication: Bearer workspace API key.

Parameters

Name / locationSchema
workspaceId
path · required
  • valuestring

    format: "uuid"

Request body

No request body is specified in the contract.

Success response 202

The canonical workspace was deleted and physical object cleanup was queued.

application/json

  • valueobject
  • dataobjectrequired

    No additional properties

  • idstringrequired

    format: "uuid"

  • namestringrequired
  • deletedbooleanrequired

    const: true

  • storage_cleanupstringrequired

    const: "queued"

  • next_workspace_idstring

    format: "uuid"

curl example

curl --request DELETE --globoff 'https://api.bangermail.com/v1/workspaces/{workspaceId}' \
  --header "Authorization: Bearer $BANGER_API_KEY"