API reference

/v1/billing-bridge

18 operations · 11 support API keys

← All groups · First call? Read the tutorial: auth, permissions, requests and responses, common failures

MethodPathSummaryAuth
GET/v1/billing-bridge/keysList the reseller billing bridge keysSession
POST/v1/billing-bridge/keysCreate a reseller billing bridge keySession
POST/v1/billing-bridge/keys/{id}/revokeRevoke a reseller billing bridge keySession
POST/v1/billing-bridge/keys/{id}/rotateRotate the secret of a reseller billing bridge keySession
GET/v1/billing-bridge/logsList the reseller billing bridge call logSession
GET/v1/billing-bridge/pingBilling system TestConnection with a signed bridge keyAPI key
GET/v1/billing-bridge/productsBilling system ConfigOptions — the key owner's published packagesAPI key
POST/v1/billing-bridge/servicesBilling system CreateAccount — open a CDN service for a billing serviceAPI key
GET/v1/billing-bridge/services/{system}/{service_id}Billing system ClientArea — one service of the key ownerAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/changeBilling system ChangePackageAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/renewBilling system RenewAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/ssoBilling system ServiceSingleSignOn — one-time console sign-in linkAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/suspendBilling system Suspend — stop this service onlyAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/terminateBilling system TerminateAPI key
POST/v1/billing-bridge/services/{system}/{service_id}/unsuspendBilling system UnsuspendAPI key
GET/v1/billing-bridge/settingsRead the reseller billing bridge plugin settingsSession
PUT/v1/billing-bridge/settingsChange the reseller billing bridge plugin settingsSession
GET/v1/billing-bridge/usageBilling system UsageUpdate — current billing cycle usageAPI key

Contract file:api/openapi/v1/control.yaml

Operation details

GET /v1/billing-bridge/keys

List the reseller billing bridge keys

operationId
listResellerBillingBridgeKeys
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Bearer session of the active reseller (tenant session, reseller.customers.manage; 403 reseller_inactive when the tenant is not an active reseller). Lease feature module.billing.bridge (403 entitlement_feature_denied when the plugin is not enabled). Keys are paged by (created_at DESC, id DESC); the secret is never returned here.

Parameters

listResellerBillingBridgeKeys Parameters
NameInTypeRequiredDescription
limitqueryintegerNo—
cursorquerystringNo—

Responses

listResellerBillingBridgeKeys Responses
StatusDescription
200One page of keys.

Fields:items: array<BillingBridgeKey> next_cursor: string has_more: boolean

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/keys

Create a reseller billing bridge key

operationId
createResellerBillingBridgeKey
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Bearer session of the active reseller (tenant session, reseller.customers.manage; 403 reseller_inactive when the tenant is not an active reseller), MFA step-up proof (audience billing-bridge, action billing_bridge.key.create) in step_up_token; 403 mfa_step_up_required without it. ip_allowlist is required (1–32 addresses or CIDR networks, no /0). The secret is returned once in this response and only its pepper-derived seed is stored. Audit billing_bridge.key.created.

Request body

application/json · Required:Yes

createResellerBillingBridgeKey Request body
NameTypeRequiredDescription
namestringYes—
ip_allowlistarray<string>Yes—
expires_atstring(date-time)No—
step_up_tokenstringYes—

Responses

createResellerBillingBridgeKey Responses
StatusDescription
201The key and its one-time secret.

Fields:key: BillingBridgeKey secret: string

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
415Content-Type must be exactly application/json without parameters.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/keys/{id}/revoke

Revoke a reseller billing bridge key

operationId
revokeResellerBillingBridgeKey
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Step-up action billing_bridge.key.revoke bound to the key id. Revocation is final. Audit billing_bridge.key.revoked.

Parameters

revokeResellerBillingBridgeKey Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Request body

application/json · Required:Yes

revokeResellerBillingBridgeKey Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

revokeResellerBillingBridgeKey Responses
StatusDescription
200The revoked key.

Fields:id: string(uuid) key_id: string owner_scope_id: string(uuid) owner_kind: string: platform / reseller name: string ip_allowlist: array<string> status: string: active / revoked expires_at: string(date-time) last_used_at: string(date-time) created_by: string(uuid) revision: integer(int64) created_at: string(date-time) updated_at: string(date-time) revoked_at: string(date-time)

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/keys/{id}/rotate

Rotate the secret of a reseller billing bridge key

operationId
rotateResellerBillingBridgeKey
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Step-up action billing_bridge.key.rotate bound to the key id. The old secret stops working at once; the new one is returned once. 409 revision_conflict on a stale expected_revision, 409 key_revoked for a revoked key. Audit billing_bridge.key.rotated.

Parameters

rotateResellerBillingBridgeKey Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Request body

application/json · Required:Yes

rotateResellerBillingBridgeKey Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

rotateResellerBillingBridgeKey Responses
StatusDescription
200The key and its new one-time secret.

Fields:key: BillingBridgeKey secret: string

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/billing-bridge/logs

List the reseller billing bridge call log

operationId
listResellerBillingBridgeLogs
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Calls made with the caller's own keys only (owner scope), newest first, cursor paged. Denied calls carry the internal reason_code the caller of the bridge never sees. Rows are kept 90 days.

Parameters

listResellerBillingBridgeLogs Parameters
NameInTypeRequiredDescription
limitqueryintegerNo—
cursorquerystringNo—

Responses

listResellerBillingBridgeLogs Responses
StatusDescription
200One page of log rows.

Fields:items: array<BillingBridgeLogEntry> next_cursor: string has_more: boolean

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/billing-bridge/ping

Billing system TestConnection with a signed bridge key

operationId
pingBillingBridge
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Signed with the bridge headers (billingBridgeSignature). Any authentication failure (unknown key, clock skew over 300 s, replayed nonce, wrong signature, source IP outside the allowlist, revoked or expired key, owner no longer an active reseller) is 401 unauthorized with no further detail; the reason is written to the bridge log. A valid key whose plugin is not enabled gets 403 entitlement_feature_denied. Bridge keys authenticate only /v1/billing-bridge/* facade routes; every other route rejects them.

Responses

pingBillingBridge Responses
StatusDescription
200The key owner and server time.

Fields:owner_kind: string: platform / reseller owner_scope_id: string(uuid) module_enabled: boolean server_time: string(date-time)

401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.

What to do on failure

  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.

↑ Back to list

GET /v1/billing-bridge/products

Billing system ConfigOptions — the key owner's published packages

operationId
listBillingBridgeProducts
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

A (reseller key): the reseller's own published packages with its wholesale cost per period; B (platform key): the platform's published packages (no wholesale_minor).

Responses

listBillingBridgeProducts Responses
StatusDescription
200Published packages.

Fields:data: array<BillingBridgeProduct>

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services

Billing system CreateAccount — open a CDN service for a billing service

operationId
createBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

(owner, external_system, external_service_id) is the idempotency key of the service: repeating it with the same input returns the same service (200, created false); other input is 409 bridge_service_conflict. The customer of (external_system, external_client_id) is found or opened (A: a reseller customer, B: a platform direct customer; username {system}_{client_id}, a short suffix on a clash, random password not returned). A places the order for its customer and pays the prepaid wholesale cost (422 reseller_prepaid_insufficient, reseller_wholesale_unpriced); B opens the subscription without a charge.

Parameters

createBillingBridgeService Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Request body

application/json · Required:Yes

createBillingBridgeService Request body
NameTypeRequiredDescription
external_systemstring: whmcs / zjmf / zjmf_cbapYes—
external_service_idstringYes—
external_client_idstringYes—
clientobjectYes—
product_idstring(uuid)Yes—
product_revisioninteger(int64)No—
periodstring: month / quarter / yearYes—

Responses

createBillingBridgeService Responses
StatusDescription
201Opened (created true).

Fields:data: BillingBridgeService

200Already opened by an earlier call (created false).

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/billing-bridge/services/{system}/{service_id}

Billing system ClientArea — one service of the key owner

operationId
getBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

A service of another owner, or not opened, is 404 bridge_service_not_found.

Parameters

getBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—

Responses

getBillingBridgeService Responses
StatusDescription
200The service.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/change

Billing system ChangePackage

operationId
changeBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Upgrade or downgrade by the new and the current period price (same price is an upgrade), effective at once. A: between the reseller's packages, prorated wholesale difference charged or returned; B: between platform packages, no customer charge.

Parameters

changeBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Request body

application/json · Required:No

changeBillingBridgeService Request body
NameTypeRequiredDescription
product_idstring(uuid)Yes—
product_revisioninteger(int64)No—
periodstring: month / quarter / yearNo—

Responses

changeBillingBridgeService Responses
StatusDescription
200The service after the action.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/renew

Billing system Renew

operationId
renewBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Extends the term by period (default the current period). A renews for its customer at the wholesale cost; B renews without a charge. A retry with the same Idempotency-Key does not renew twice.

Parameters

renewBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Request body

application/json · Required:No

renewBillingBridgeService Request body
NameTypeRequiredDescription
periodstring: month / quarter / yearNo—

Responses

renewBillingBridgeService Responses
StatusDescription
200The service after the action.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/sso

Billing system ServiceSingleSignOn — one-time console sign-in link

operationId
issueBillingBridgeSso
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Returns {url, expires_at}: url is {console}/sso/bridge?ticket=…, valid 60 seconds and once. Only the ticket's digest is stored. Audited as billing_bridge.sso.issued.

Parameters

issueBillingBridgeSso Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Request body

application/json · Required:No

issueBillingBridgeSso Request body
NameTypeRequiredDescription
redirectstringNoSame-site path after sign-in (default /).

Responses

issueBillingBridgeSso Responses
StatusDescription
200The sign-in link.

Fields:data: object

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/suspend

Billing system Suspend — stop this service only

operationId
suspendBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Suspends the subscription: its sites stop being published, configuration is kept, the term keeps running. Other services of the customer are untouched. Already suspended succeeds without a change.

Parameters

suspendBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Request body

application/json · Required:No

suspendBillingBridgeService Request body
NameTypeRequiredDescription
reasonstringNo—

Responses

suspendBillingBridgeService Responses
StatusDescription
200The service after the action.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/terminate

Billing system Terminate

operationId
terminateBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Cancels the subscription (sites stop) and marks the service terminated; when the customer has no other live service of this owner, the CDN account is disabled. Later actions are 409 bridge_service_terminated.

Parameters

terminateBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Responses

terminateBillingBridgeService Responses
StatusDescription
200The service after the action.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/billing-bridge/services/{system}/{service_id}/unsuspend

Billing system Unsuspend

operationId
unsuspendBillingBridgeService
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Republishes the subscription. Already active succeeds without a change.

Parameters

unsuspendBillingBridgeService Parameters
NameInTypeRequiredDescription
systempathstring: whmcs / zjmf / zjmf_cbapYes—
service_idpathstringYes—
Idempotency-KeyheaderstringYes{system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict.

Responses

unsuspendBillingBridgeService Responses
StatusDescription
200The service after the action.

Fields:data: BillingBridgeService

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/billing-bridge/settings

Read the reseller billing bridge plugin settings

operationId
getResellerBillingBridgeSettings
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Reseller plugin settings. sso_require_mfa defaults to false (bridge SSO skips the second factor); revision 0 means never saved. Lease feature module.billing.bridge (403 entitlement_feature_denied).

Responses

getResellerBillingBridgeSettings Responses
StatusDescription
200Current settings.

Fields:sso_require_mfa: boolean revision: integer(int64) updated_at?: string(date-time)

401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
503A required dependency is unavailable.

What to do on failure

  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

PUT /v1/billing-bridge/settings

Change the reseller billing bridge plugin settings

operationId
putResellerBillingBridgeSettings
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:reseller.customers.manage

Description (from the contract)

Requires a step-up proof (audience billing-bridge, action billing_bridge.settings.update, bound to the owner scope): turning MFA off weakens every bridge SSO sign-in. expected_revision is the revision read (0 for the first save); a stale revision is 409. Audited as billing_bridge.settings.updated.

Request body

application/json · Required:Yes

putResellerBillingBridgeSettings Request body
NameTypeRequiredDescription
sso_require_mfabooleanYes—
expected_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

putResellerBillingBridgeSettings Responses
StatusDescription
200Saved settings.

Fields:sso_require_mfa: boolean revision: integer(int64) updated_at?: string(date-time)

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
409The requested state conflicts with an existing resource or idempotency fact.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/billing-bridge/usage

Billing system UsageUpdate — current billing cycle usage

operationId
getBillingBridgeUsage
Auth
  • API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Up to 100 ids; ids that are not the owner's opened services are left out.

Parameters

getBillingBridgeUsage Parameters
NameInTypeRequiredDescription
external_systemquerystring: whmcs / zjmf / zjmf_cbapYes—
idsquerystringYesComma-separated external_service_id (1–100).

Responses

getBillingBridgeUsage Responses
StatusDescription
200Usage of the current billing cycle.

Fields:data: array<BillingBridgeUsage>

400{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
401{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
403{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
404{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
409{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
412{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
422{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.
503{"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list