TBBNMerchantDocs
Available

Businesses

post/v1/businesses

Create a Business, owned by the authenticated Marketplace member

curl -X POST https://api.tbbnetwork.com/v1/businesses \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "description": "A short description of this resource.",
  "type": "INDIVIDUAL",
  "legalName": "Acme Co.",
  "registrationNumber": "registrationNumber",
  "taxId": "taxId",
  "legalCountry": "US"
}'

Request body

FieldTypeRequired
namestringyes
descriptionstring—
typeINDIVIDUAL | REGISTEREDyes
legalNamestring—
registrationNumberstring—
taxIdstring—
legalCountrystring—

Response (201)

FieldTypeRequired
idstring (uuid)—
ownerUserIdstring (uuid)—
namestring—
descriptionstringnull—
statusACTIVE | SUSPENDED | DELETED—
typeINDIVIDUAL | REGISTERED—
legalNamestringnull—
registrationNumberstringnull—
taxIdstringnull—
legalCountrystringnull—
logoUrlstringnull—
websiteUrlstringnull—
supportEmailstringnull—
supportPhonestringnull—
privacyPolicyUrlstringnull—
termsUrlstringnull—
openingHoursobject—
verificationStatusPENDING | VERIFIED | REJECTED—
verificationReviewedAtstring,null (date-time)—
verificationReviewedBystringnull—
verificationNotesstringnull—
connectAccountBusinessConnectAccount—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "ownerUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "description": null,
  "status": "ACTIVE",
  "type": "INDIVIDUAL",
  "legalName": null,
  "registrationNumber": null,
  "taxId": null,
  "legalCountry": null,
  "logoUrl": null,
  "websiteUrl": null,
  "supportEmail": null,
  "supportPhone": null,
  "privacyPolicyUrl": null,
  "termsUrl": null,
  "openingHours": null,
  "verificationStatus": "PENDING",
  "verificationReviewedAt": "2026-07-01T12:00:00Z",
  "verificationReviewedBy": null,
  "verificationNotes": null,
  "connectAccount": {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "stripeConnectedAccountId": null,
    "onboardingStatus": "NOT_STARTED",
    "detailsSubmitted": false,
    "country": null,
    "businessType": "individual",
    "representativeMatchedAt": "2026-07-01T12:00:00Z",
    "representativeMismatch": null,
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  },
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/businesses

List the authenticated Marketplace member's own Businesses

curl -X GET https://api.tbbnetwork.com/v1/businesses \
  -H "Authorization: Bearer <session access token>" \

Parameters

ownerUserIdqueryoptional

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "ownerUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Acme Co.",
    "description": null,
    "status": "ACTIVE",
    "type": "INDIVIDUAL",
    "legalName": null,
    "registrationNumber": null,
    "taxId": null,
    "legalCountry": null,
    "logoUrl": null,
    "websiteUrl": null,
    "supportEmail": null,
    "supportPhone": null,
    "privacyPolicyUrl": null,
    "termsUrl": null,
    "openingHours": null,
    "verificationStatus": "PENDING",
    "verificationReviewedAt": "2026-07-01T12:00:00Z",
    "verificationReviewedBy": null,
    "verificationNotes": null,
    "connectAccount": {
      "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "stripeConnectedAccountId": null,
      "onboardingStatus": "NOT_STARTED",
      "detailsSubmitted": false,
      "country": null,
      "businessType": "individual",
      "representativeMatchedAt": "2026-07-01T12:00:00Z",
      "representativeMismatch": null,
      "createdAt": "2026-07-01T12:00:00Z",
      "updatedAt": "2026-07-01T12:00:00Z"
    },
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  }
]
get/v1/businesses/{id}

Get a Business

curl -X GET https://api.tbbnetwork.com/v1/businesses/{id} \
  -H "Authorization: Bearer sk_sandbox_..." \

Parameters

idpathrequired

Response (200)

FieldTypeRequired
idstring (uuid)—
ownerUserIdstring (uuid)—
namestring—
descriptionstringnull—
statusACTIVE | SUSPENDED | DELETED—
typeINDIVIDUAL | REGISTERED—
legalNamestringnull—
registrationNumberstringnull—
taxIdstringnull—
legalCountrystringnull—
logoUrlstringnull—
websiteUrlstringnull—
supportEmailstringnull—
supportPhonestringnull—
privacyPolicyUrlstringnull—
termsUrlstringnull—
openingHoursobject—
verificationStatusPENDING | VERIFIED | REJECTED—
verificationReviewedAtstring,null (date-time)—
verificationReviewedBystringnull—
verificationNotesstringnull—
connectAccountBusinessConnectAccount—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "ownerUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "description": null,
  "status": "ACTIVE",
  "type": "INDIVIDUAL",
  "legalName": null,
  "registrationNumber": null,
  "taxId": null,
  "legalCountry": null,
  "logoUrl": null,
  "websiteUrl": null,
  "supportEmail": null,
  "supportPhone": null,
  "privacyPolicyUrl": null,
  "termsUrl": null,
  "openingHours": null,
  "verificationStatus": "PENDING",
  "verificationReviewedAt": "2026-07-01T12:00:00Z",
  "verificationReviewedBy": null,
  "verificationNotes": null,
  "connectAccount": {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "stripeConnectedAccountId": null,
    "onboardingStatus": "NOT_STARTED",
    "detailsSubmitted": false,
    "country": null,
    "businessType": "individual",
    "representativeMatchedAt": "2026-07-01T12:00:00Z",
    "representativeMismatch": null,
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  },
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
patch/v1/businesses/{id}

Update a Business (owner or Admin). Once verificationStatus is VERIFIED, changing who it legally is (name, legal name, registration number, tax id, legal country) also requires a step-up token scoped to "business:update" — see POST /v1/auth/step-up/confirm. Brand and contact details (logoUrl, websiteUrl, supportEmail, supportPhone, privacyPolicyUrl, termsUrl — https links; an empty string clears one) never need one; the Business's Merchants and Spaces show them unless they set their own.

curl -X PATCH https://api.tbbnetwork.com/v1/businesses/{id} \
  -H "Authorization: Bearer <session access token>" \
  -H "X-TBBN-Step-Up-Token: <step-up-token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "description": "A short description of this resource.",
  "legalName": "Acme Co.",
  "registrationNumber": "registrationNumber",
  "taxId": "taxId",
  "legalCountry": "US",
  "logoUrl": "https://example.com/resource",
  "websiteUrl": "https://example.com/resource",
  "supportEmail": "supportEmail",
  "supportPhone": "+1-555-0173",
  "privacyPolicyUrl": "https://example.com/resource",
  "termsUrl": "https://example.com/resource",
  "openingHours": {
    "timeZone": "America/Denver",
    "days": [
      {
        "day": 1,
        "open": false,
        "opensAt": "09:00",
        "closesAt": "17:00"
      }
    ]
  }
}'

Parameters

idpathrequired
X-TBBN-Step-Up-Tokenheaderoptional

Request body

FieldTypeRequired
namestring—
descriptionstring—
legalNamestring—
registrationNumberstring—
taxIdstring—
legalCountrystring—
logoUrlstring—
websiteUrlstring—
supportEmailstring—
supportPhonestring—
privacyPolicyUrlstring—
termsUrlstring—
openingHoursOpeningHours—

Response (200)

FieldTypeRequired
idstring (uuid)—
ownerUserIdstring (uuid)—
namestring—
descriptionstringnull—
statusACTIVE | SUSPENDED | DELETED—
typeINDIVIDUAL | REGISTERED—
legalNamestringnull—
registrationNumberstringnull—
taxIdstringnull—
legalCountrystringnull—
logoUrlstringnull—
websiteUrlstringnull—
supportEmailstringnull—
supportPhonestringnull—
privacyPolicyUrlstringnull—
termsUrlstringnull—
openingHoursobject—
verificationStatusPENDING | VERIFIED | REJECTED—
verificationReviewedAtstring,null (date-time)—
verificationReviewedBystringnull—
verificationNotesstringnull—
connectAccountBusinessConnectAccount—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "ownerUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "description": null,
  "status": "ACTIVE",
  "type": "INDIVIDUAL",
  "legalName": null,
  "registrationNumber": null,
  "taxId": null,
  "legalCountry": null,
  "logoUrl": null,
  "websiteUrl": null,
  "supportEmail": null,
  "supportPhone": null,
  "privacyPolicyUrl": null,
  "termsUrl": null,
  "openingHours": null,
  "verificationStatus": "PENDING",
  "verificationReviewedAt": "2026-07-01T12:00:00Z",
  "verificationReviewedBy": null,
  "verificationNotes": null,
  "connectAccount": {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "stripeConnectedAccountId": null,
    "onboardingStatus": "NOT_STARTED",
    "detailsSubmitted": false,
    "country": null,
    "businessType": "individual",
    "representativeMatchedAt": "2026-07-01T12:00:00Z",
    "representativeMismatch": null,
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  },
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
delete/v1/businesses/{id}

Soft-delete a Business (owner only)

curl -X DELETE https://api.tbbnetwork.com/v1/businesses/{id} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Response (200)

FieldTypeRequired
idstring (uuid)—
ownerUserIdstring (uuid)—
namestring—
descriptionstringnull—
statusACTIVE | SUSPENDED | DELETED—
typeINDIVIDUAL | REGISTERED—
legalNamestringnull—
registrationNumberstringnull—
taxIdstringnull—
legalCountrystringnull—
logoUrlstringnull—
websiteUrlstringnull—
supportEmailstringnull—
supportPhonestringnull—
privacyPolicyUrlstringnull—
termsUrlstringnull—
openingHoursobject—
verificationStatusPENDING | VERIFIED | REJECTED—
verificationReviewedAtstring,null (date-time)—
verificationReviewedBystringnull—
verificationNotesstringnull—
connectAccountBusinessConnectAccount—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "ownerUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "description": null,
  "status": "ACTIVE",
  "type": "INDIVIDUAL",
  "legalName": null,
  "registrationNumber": null,
  "taxId": null,
  "legalCountry": null,
  "logoUrl": null,
  "websiteUrl": null,
  "supportEmail": null,
  "supportPhone": null,
  "privacyPolicyUrl": null,
  "termsUrl": null,
  "openingHours": null,
  "verificationStatus": "PENDING",
  "verificationReviewedAt": "2026-07-01T12:00:00Z",
  "verificationReviewedBy": null,
  "verificationNotes": null,
  "connectAccount": {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "stripeConnectedAccountId": null,
    "onboardingStatus": "NOT_STARTED",
    "detailsSubmitted": false,
    "country": null,
    "businessType": "individual",
    "representativeMatchedAt": "2026-07-01T12:00:00Z",
    "representativeMismatch": null,
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  },
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/{businessId}/business-users

Invite someone to the team with a role (owner or Admin)

curl -X POST https://api.tbbnetwork.com/v1/businesses/{businessId}/business-users \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "you@example.com",
  "userId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "role": "ADMIN",
  "branchIds": [
    "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
  ]
}'

Parameters

businessIdpathrequired

Request body

FieldTypeRequired
emailstring (email)—
userIdstring (uuid)—
roleADMIN | ACCOUNT_MANAGER | OPERATIONS | ACCOUNTANT | DEVELOPER | SUPPORT | RECEPTION | VIEWERyes
branchIdsstring[]—

Response (201)

FieldTypeRequired
idstring (uuid)—
emailstring,null (email)—
invitedUserIdstring,null (uuid)—
rolestring—
branchIdsstring[]—
statusPENDING | ACCEPTED | DECLINED | REVOKED—
statePENDING | EXPIRED | ACCEPTED | DECLINED | REVOKED—
createdAtstring (date-time)—
expiresAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "email": "you@example.com",
  "invitedUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "role": "role",
  "branchIds": [
    "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
  ],
  "status": "PENDING",
  "state": "PENDING",
  "createdAt": "2026-07-01T12:00:00Z",
  "expiresAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/businesses/{businessId}/business-users

List a Business's team (owner or Admin)

curl -X GET https://api.tbbnetwork.com/v1/businesses/{businessId}/business-users \
  -H "Authorization: Bearer <session access token>" \

Parameters

businessIdpathrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "userId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "role": "ADMIN",
    "branchIds": [
      "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
    ],
    "invitedBy": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "invitedAt": "2026-07-01T12:00:00Z",
    "acceptedAt": "2026-07-01T12:00:00Z"
  }
]
get/v1/businesses/{businessId}/invitations

The team's invitations waiting for an answer (owner or Admin)

curl -X GET https://api.tbbnetwork.com/v1/businesses/{businessId}/invitations \
  -H "Authorization: Bearer <session access token>" \

Parameters

businessIdpathrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "email": "you@example.com",
    "invitedUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "role": "role",
    "branchIds": [
      "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
    ],
    "status": "PENDING",
    "state": "PENDING",
    "createdAt": "2026-07-01T12:00:00Z",
    "expiresAt": "2026-07-01T12:00:00Z"
  }
]

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
delete/v1/businesses/{businessId}/invitations/{invitationId}

Withdraw an invitation (owner or Admin)

curl -X DELETE https://api.tbbnetwork.com/v1/businesses/{businessId}/invitations/{invitationId} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

businessIdpathrequired
invitationIdpathrequired

Response (200)

FieldTypeRequired
idstring (uuid)—
emailstring,null (email)—
invitedUserIdstring,null (uuid)—
rolestring—
branchIdsstring[]—
statusPENDING | ACCEPTED | DECLINED | REVOKED—
statePENDING | EXPIRED | ACCEPTED | DECLINED | REVOKED—
createdAtstring (date-time)—
expiresAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "email": "you@example.com",
  "invitedUserId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "role": "role",
  "branchIds": [
    "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
  ],
  "status": "PENDING",
  "state": "PENDING",
  "createdAt": "2026-07-01T12:00:00Z",
  "expiresAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/businesses/invitations/mine

Invitations to Business teams waiting for you

curl -X GET https://api.tbbnetwork.com/v1/businesses/invitations/mine \
  -H "Authorization: Bearer <session access token>" \

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "team": "BUSINESS",
    "teamId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "teamName": "teamName",
    "logoUrl": null,
    "role": "role",
    "invitedBy": null,
    "createdAt": "2026-07-01T12:00:00Z",
    "expiresAt": "2026-07-01T12:00:00Z"
  }
]

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/invitations/{invitationId}/accept

Accept an invitation and join the team with its role

curl -X POST https://api.tbbnetwork.com/v1/businesses/invitations/{invitationId}/accept \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

invitationIdpathrequired

Response (201)

FieldTypeRequired
businessIdstring (uuid)—
businessNamestring—
rolestring—
Example 201 response
{
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessName": "businessName",
  "role": "role"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/invitations/{invitationId}/decline

Decline an invitation

curl -X POST https://api.tbbnetwork.com/v1/businesses/invitations/{invitationId}/decline \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

invitationIdpathrequired

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
patch/v1/businesses/{businessId}/business-users/{userId}

Change a team member's role or locations (owner or Admin)

curl -X PATCH https://api.tbbnetwork.com/v1/businesses/{businessId}/business-users/{userId} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "role": "ADMIN",
  "branchIds": [
    "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
  ]
}'

Parameters

businessIdpathrequired
userIdpathrequired

Request body

FieldTypeRequired
roleADMIN | ACCOUNT_MANAGER | OPERATIONS | ACCOUNTANT | DEVELOPER | SUPPORT | RECEPTION | VIEWER—
branchIdsstring[]—

Response (200)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
userIdstring (uuid)—
roleADMIN | ACCOUNT_MANAGER | OPERATIONS | ACCOUNTANT | DEVELOPER | SUPPORT | RECEPTION | VIEWER—
branchIdsstring[]—
invitedBystring,null (uuid)—
invitedAtstring (date-time)—
acceptedAtstring,null (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "userId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "role": "ADMIN",
  "branchIds": [
    "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
  ],
  "invitedBy": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "invitedAt": "2026-07-01T12:00:00Z",
  "acceptedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
delete/v1/businesses/{businessId}/business-users/{userId}

Remove a team member (owner or Admin; the owner can't be removed)

curl -X DELETE https://api.tbbnetwork.com/v1/businesses/{businessId}/business-users/{userId} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

businessIdpathrequired
userIdpathrequired

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/{businessId}/branches

Add a Branch (location) to a Business (owner only)

curl -X POST https://api.tbbnetwork.com/v1/businesses/{businessId}/branches \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "addressLine1": "addressLine1",
  "addressLine2": "addressLine2",
  "city": "city",
  "region": "CA",
  "postalCode": "postalCode",
  "country": "US",
  "latitude": 1,
  "longitude": 1
}'

Parameters

businessIdpathrequired

Request body

FieldTypeRequired
namestringyes
addressLine1stringyes
addressLine2string—
citystringyes
regionstring—
postalCodestring—
countrystringyes
latitudenumber—
longitudenumber—

Response (201)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
addressLine1string—
addressLine2stringnull—
citystring—
regionstringnull—
postalCodestringnull—
countrystring—
spaceStatusNOT_ENABLED | SPACE_ENABLED—
createdAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "addressLine1": "addressLine1",
  "addressLine2": null,
  "city": "city",
  "region": null,
  "postalCode": null,
  "country": "US",
  "spaceStatus": "NOT_ENABLED",
  "createdAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/businesses/{businessId}/branches

List a Business's Branches

curl -X GET https://api.tbbnetwork.com/v1/businesses/{businessId}/branches \
  -H "Authorization: Bearer sk_sandbox_..." \

Parameters

businessIdpathrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Acme Co.",
    "addressLine1": "addressLine1",
    "addressLine2": null,
    "city": "city",
    "region": null,
    "postalCode": null,
    "country": "US",
    "spaceStatus": "NOT_ENABLED",
    "createdAt": "2026-07-01T12:00:00Z"
  }
]
patch/v1/branches/{id}

Update a Branch (owner only)

curl -X PATCH https://api.tbbnetwork.com/v1/branches/{id} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "addressLine1": "addressLine1",
  "addressLine2": "addressLine2",
  "city": "city",
  "region": "CA",
  "postalCode": "postalCode",
  "country": "US",
  "latitude": 1,
  "longitude": 1
}'

Parameters

idpathrequired

Request body

FieldTypeRequired
namestringyes
addressLine1stringyes
addressLine2string—
citystringyes
regionstring—
postalCodestring—
countrystringyes
latitudenumber—
longitudenumber—

Response (200)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
addressLine1string—
addressLine2stringnull—
citystring—
regionstringnull—
postalCodestringnull—
countrystring—
spaceStatusNOT_ENABLED | SPACE_ENABLED—
createdAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "addressLine1": "addressLine1",
  "addressLine2": null,
  "city": "city",
  "region": null,
  "postalCode": null,
  "country": "US",
  "spaceStatus": "NOT_ENABLED",
  "createdAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
delete/v1/branches/{id}

Remove a Branch (owner only)

curl -X DELETE https://api.tbbnetwork.com/v1/branches/{id} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/branches/{id}/space-status

Toggle a Branch's Space eligibility flag (owner only). Hook only — no Space product logic exists yet.

curl -X POST https://api.tbbnetwork.com/v1/branches/{id}/space-status \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "spaceStatus": "NOT_ENABLED"
}'

Parameters

idpathrequired

Request body

FieldTypeRequired
spaceStatusNOT_ENABLED | SPACE_ENABLEDyes

Response (200)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
addressLine1string—
addressLine2stringnull—
citystring—
regionstringnull—
postalCodestringnull—
countrystring—
spaceStatusNOT_ENABLED | SPACE_ENABLED—
createdAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "addressLine1": "addressLine1",
  "addressLine2": null,
  "city": "city",
  "region": null,
  "postalCode": null,
  "country": "US",
  "spaceStatus": "NOT_ENABLED",
  "createdAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/{businessId}/merchant-links

Link a Merchant account to a Business (owner only, many-to-many)

curl -X POST https://api.tbbnetwork.com/v1/businesses/{businessId}/merchant-links \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}'

Parameters

businessIdpathrequired

Request body

FieldTypeRequired
merchantIdstring (uuid)yes

Response (201)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
merchantIdstring (uuid)—
statusACTIVE | REVOKED—
linkedAtstring (date-time)—
unlinkedAtstring,null (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "status": "ACTIVE",
  "linkedAt": "2026-07-01T12:00:00Z",
  "unlinkedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/businesses/{businessId}/merchant-links/{linkId}/revoke

Revoke a Business<->Merchant link (owner only)

curl -X POST https://api.tbbnetwork.com/v1/businesses/{businessId}/merchant-links/{linkId}/revoke \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

businessIdpathrequired
linkIdpathrequired

Response (200)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
merchantIdstring (uuid)—
statusACTIVE | REVOKED—
linkedAtstring (date-time)—
unlinkedAtstring,null (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "status": "ACTIVE",
  "linkedAt": "2026-07-01T12:00:00Z",
  "unlinkedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}