Skip to content

Depot billing

Is MountBilling with whatever subject deps.Self names.

This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.

GETbilling:readshared facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Billing

StatusBodyDescription
200application/json, AccountBillingViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.

200 response body

FieldTypeDescription
accessrequiredstring, one of active, suspended, trial_expired
accessReasonstring
accessSincestring (date-time) or null
billingDayChangeBillingDayChangeView

billingDayChangeView mirrors Core's field for field.

billingDayChange.allowedrequiredboolean
billingDayChange.blockedDetailstring
billingDayChange.blockedReasonstring
billingDayChange.currentDayrequiredinteger
billingDayChange.nextBoundaryrequiredstring (date-time)
billingDayChange.usedAtstring (date-time) or null
currencyCoderequiredstring
endpointCountrequiredinteger
firstInvoiceDatestring or null
graceEndsAtstring (date-time) or null
paymentMethodOnFilerequiredboolean
planPlan

Plan is the plan block of Core's tenant billing view.

plan.adminCapinteger or null
plan.availableOnrequiredobject
plan.coderequiredstring
plan.commercialrequiredboolean
plan.displayNamerequiredstring
plan.endpointCapinteger or null
plan.featuresrequiredarray of string
plan.isFreerequiredboolean
plan.mobileDeviceCapinteger or null
plan.ownStorageOnlyrequiredboolean
plan.unmanagedCapinteger or null
plan.upgradesrequiredarray of PlanRef
plan.upgrades[].adminCapinteger or null
plan.upgrades[].coderequiredstring
plan.upgrades[].displayNamerequiredstring
plan.upgrades[].endpointCapinteger or null
plan.upgrades[].featuresrequiredarray of string
plan.upgrades[].mobileDeviceCapinteger or null
plan.upgrades[].ownStorageOnlyrequiredboolean
plan.upgrades[].selfServerequiredboolean
plan.upgrades[].unmanagedCapinteger or null
planCoderequiredstring
planNamerequiredstring
platformFeeCentsrequiredinteger

int64.

rateCardVersioninteger or null
statusrequiredstring
suspendReasonstring or null
trialDaysRemainingrequiredinteger
trialEndpointCaprequiredinteger
trialEndsAtstring (date-time) or null
trialStorageCapBytesrequiredinteger

int64.

Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTbilling:manageshared facehosteditmspremoteNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

billingDay relays the organization’s one billing-date change to Core and applies the anchor that comes back before answering.

NOTHING IS DECIDED HERE. Whether the change is allowed, when it takes effect, and which of the several refusals applies are all Core’s to answer, and Core’s refusal is passed through with its status and its body intact so the console reads one vocabulary rather than a translation of it. A Depot that tried to pre-empt any of it would need its own copy of the subscription, the invoices and the once-lock.

The anchor is applied BEFORE the response is written. It is the fast path: the authoritative channel is the twice-daily license check-in, and Core never places a boundary less than its change margin away precisely so the check-in alone would be enough. Applying here just means the console sees the truth immediately instead of within twelve hours, and because the applier is idempotent the check-in that follows changes nothing.

Required, sent as application/json.

FieldTypeDescription
dayrequiredinteger
StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
400application/problem+json, ProblemDetailsMalformed request body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:manage.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/organization/billing-day' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"day": 0
}'

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relay forwards a read to Core under the instance bearer and returns Core’s answer as it stands: status, content type and bytes.

Nothing is decoded, reshaped or summarised. Every field this side renamed would be a field that could drift out of step with the portal, and a customer looking at two different balances has no way to know which is real. It is also what keeps this file from needing to change when a figure is added to an invoice.

The query string is forwarded whole, which is how paging works: page and pageSize are Core’s parameters and this side has no opinion about them.

StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/invoices' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/organization/billing/invoices/{publicId}

Section titled “GET /api/v1/organization/billing/invoices/{publicId}”

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relay forwards a read to Core under the instance bearer and returns Core’s answer as it stands: status, content type and bytes.

Nothing is decoded, reshaped or summarised. Every field this side renamed would be a field that could drift out of step with the portal, and a customer looking at two different balances has no way to know which is real. It is also what keeps this file from needing to change when a figure is added to an invoice.

The query string is forwarded whole, which is how paging works: page and pageSize are Core’s parameters and this side has no opinion about them.

NameInTypeRequiredDescription
publicIdpathstringYes
StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/invoices/<publicId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/organization/billing/invoices/{publicId}/pdf

Section titled “GET /api/v1/organization/billing/invoices/{publicId}/pdf”

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relayStream is relay for the invoice document: the same request, and a body copied rather than read.

Not capped and not buffered. An invoice PDF is a few kilobytes today and a long one is not, and the failure mode of a cap here is a file that downloads successfully and will not open. Content-Type and Content-Disposition are Core’s, so the filename a customer’s browser saves is the filename on the document rather than one invented on the way past.

A refusal is not streamed: it is small, it is a problem document, and it goes through the same relay every other refusal on this face does.

NameInTypeRequiredDescription
publicIdpathstringYes
StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/invoices/<publicId>/pdf' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relay forwards a read to Core under the instance bearer and returns Core’s answer as it stands: status, content type and bytes.

Nothing is decoded, reshaped or summarised. Every field this side renamed would be a field that could drift out of step with the portal, and a customer looking at two different balances has no way to know which is real. It is also what keeps this file from needing to change when a figure is added to an invoice.

The query string is forwarded whole, which is how paging works: page and pageSize are Core’s parameters and this side has no opinion about them.

StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/ledger' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relay forwards a read to Core under the instance bearer and returns Core’s answer as it stands: status, content type and bytes.

Nothing is decoded, reshaped or summarised. Every field this side renamed would be a field that could drift out of step with the portal, and a customer looking at two different balances has no way to know which is real. It is also what keeps this file from needing to change when a figure is added to an invoice.

The query string is forwarded whole, which is how paging works: page and pageSize are Core’s parameters and this side has no opinion about them.

StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/rates' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETbilling:readshared facehosteditmspremoteIdempotentNot fully resolved

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

relay forwards a read to Core under the instance bearer and returns Core’s answer as it stands: status, content type and bytes.

Nothing is decoded, reshaped or summarised. Every field this side renamed would be a field that could drift out of step with the portal, and a customer looking at two different balances has no way to know which is real. It is also what keeps this file from needing to change when a figure is added to an invoice.

The query string is forwarded whole, which is how paging works: page and pageSize are Core’s parameters and this side has no opinion about them.

StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold billing:read.
404application/problem+json, ProblemDetailsNo such organization.
502application/problem+json, ProblemDetailsCould not reach billing. Please try again.
503application/problem+json, ProblemDetailsBilling is unavailable: this deployment is not connected to Outpost.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/organization/billing/usage' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.