Menu

API reference · Partners

Billing transitions

partners · billing_transitions · 5 operations

GET/v1/partners/billing-transitions

List billing transition requests

partners.billing_transitions.list

ReadIdempotentSince 2026-11-01

Lists the requests to move an account's billing to the agency (direction to_parent_pays: from paying its own subscription, self_pays, to being paid by the workspace, parent_pays), newest first, paginated by cursor (limit up to 200). From a workspace, the requests it sent to its accounts; from an account, the ones it received. status: active (default: pending and scheduled, what the app shows), all, or one of pending, scheduled, completed, cancelled, rejected. Each request: the workspace and the account (id and name), who requested it and when, status, scheduled_for (when a scheduled one takes effect: the end of the account's paid period), and who accepted, rejected or cancelled it and when. Owners and admins only.

Scope
partners:read
Permission
View the module · Only owner, admin
MCP tool
partners_billing_transitions_listOn the full surface; on the compact one, mb_execute_operation with id: "partners.billing_transitions.list".

Declared cost: up to 202 reads and 0 writes per call (they count against the daily quota).

Parameters

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

statusenumqueryoptional

active (pending and scheduled, the default: what the app shows), all, or one status.

Values: active, all, pending, scheduled, completed, cancelled, rejected · Default: "active"

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/partners/billing-transitions" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/partners/billing-transitions" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/partners/billing-transitions/{request_id}

Get one billing transition request

partners.billing_transitions.get

ReadIdempotentSince 2026-11-01

Returns one billing transition request that involves this organization (as the requesting workspace or as the account), with the same fields as partners.billing_transitions.list. Any other organization gets billing_transition_not_found. Owners and admins only.

Scope
partners:read
Permission
View the module · Only owner, admin
MCP tool
partners_billing_transitions_getOn the full surface; on the compact one, mb_execute_operation with id: "partners.billing_transitions.get".

Declared cost: up to 1 reads and 0 writes per call (they count against the daily quota).

Parameters

request_idstringpathrequired

The billing change request id (partners.billing_transitions.list).

Response

idstring
statusenum

Values: pending, accepted, scheduled, completed, cancelled, rejected

direction"to_parent_pays"
parent_org_idstring
parent_org_namestring
child_org_idstring
child_org_namestring
requested_bystring
requested_by_namestring
created_atnumber
scheduled_fornumber | null
accepted_atnumber | null
accepted_bystring | null
completed_atnumber | null
rejected_atnumber | null
rejected_bystring | null
rejected_by_namestring | null
cancelled_atnumber | null
cancelled_bystring | null
cancelled_by_namestring | null

Errors

Example

curl "https://api.mb-suite.com/v1/partners/billing-transitions/{request_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/partners/billing-transitions/{request_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/partners/billing-transitions

Ask an account to move its billing to the agency

partners.billing_transitions.request

WriteSince 2026-11-01

From a workspace, asks one of its accounts that pays its own subscription (billing mode self_pays; account_id, or child_org_id) to let the agency pay for it (parent_pays). It changes nothing yet: the account's owners and admins get an email (Amazon SES) and accept or reject it in MB Suite. If they accept, an account on a trial (or without a subscription) moves at once; one with an active subscription moves when its paid period ends (partners.billing_transition.scheduled, then .completed). Errors: partners_workspace_only, partner_account_not_found (not an account of this workspace), billing_transition_requires_self_pays (409), billing_transition_exists (409, one pending or scheduled already; details.request_id), billing_transition_account_past_due (409: the account must settle its debt first). A direct owner or admin of the workspace. It emails the account: confirm with the person first. Returns the request.

Instructions for agents

Tell the person the account's owners and admins were emailed and must accept the request in MB Suite; nothing changes in billing until they do.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
partners:write
Permission
Edit in the module · Only owner, admin
MCP tool
partners_billing_transitions_requestOn the full surface; on the compact one, mb_execute_operation with id: "partners.billing_transitions.request".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota). Touches an external platform (ses): it counts against the external operations quota.

Parameters

account_idstringbodyoptional

The Account (of this workspace, paying for itself) to move to the workspace's billing (platform.orgs.list); child_org_id is accepted too.

child_org_idstringbodyoptional

Same as account_id.

Response

request_idstring
requestobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/partners/billing-transitions" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

POST/v1/partners/billing-transitions/{request_id}/reject

Reject a billing transition request (the account)

partners.billing_transitions.reject

WriteSince 2026-11-01

From the account, rejects a pending request of its agency to take over its billing: the account keeps paying its own subscription and the workspace's owners and admins get an email (Amazon SES). Only a direct owner or admin of the account answers for it: a workspace (billing_transition_account_only) or an agency user acting on the account (403 role_required, details.scope direct) cannot. Only pending requests (billing_transition_not_pending, 409). Accepting is done in the MB Suite app (it changes the account's subscription in Stripe). Returns the request.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
partners:write
Permission
Edit in the module · Only owner, admin
MCP tool
partners_billing_transitions_rejectOn the full surface; on the compact one, mb_execute_operation with id: "partners.billing_transitions.reject".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota). Touches an external platform (ses): it counts against the external operations quota.

Parameters

request_idstringpathrequired

The billing change request id (partners.billing_transitions.list).

Response

requestobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/partners/billing-transitions/{request_id}/reject" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

POST/v1/partners/billing-transitions/{request_id}/cancel

Cancel a pending billing transition request

partners.billing_transitions.cancel

WriteSince 2026-11-01

Cancels a pending billing transition request, from either side (a direct owner or admin of the workspace or of the account; an agency owner or admin acting on the account counts as the workspace): nothing changes in billing and the other side's owners and admins get an email (Amazon SES). A request already scheduled (accepted, waiting for the end of the account's paid period) is cancelled only in the MB Suite app, because it re-enables the renewal of the account's subscription in Stripe (billing_transition_scheduled_app_only, 409). Completed, rejected or cancelled requests: billing_transition_not_cancellable (409). Returns the request.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
partners:write
Permission
Edit in the module · Only owner, admin
MCP tool
partners_billing_transitions_cancelOn the full surface; on the compact one, mb_execute_operation with id: "partners.billing_transitions.cancel".

Declared cost: up to 3 reads and 2 writes per call (they count against the daily quota). Touches an external platform (ses): it counts against the external operations quota.

Parameters

request_idstringpathrequired

The billing change request id (partners.billing_transitions.list).

Response

requestobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/partners/billing-transitions/{request_id}/cancel" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.