DevelopersAPI reference

Billing API

REST endpoints for billing in SKUFlow: 4 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
Get the SKUFlow planGET /organizations/{organizationId}/billing/planread
List the plans to choose fromGET /organizations/{organizationId}/billing/plan-optionsread
Choose a plan (first run)POST /organizations/{organizationId}/billing/choose-plansensitive
List AI credit packsGET /organizations/{organizationId}/billing/credit-packsread

Get the SKUFlow plan

GET /organizations/{organizationId}/billing/plan

The business's SKUFlow plan: tier, trial, which plan features are included, and this period's AI credits, texts and SKUFlow emails (used, allowance, purchased credits, remaining). Also lists every plan for comparison. Read-only; any member.

Permissionorganization.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolbilling_plan (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/billing/plan" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
tierenum or nullNull when billing is not set up on this server. One of core, connect, grow, pro.
planNamestring or null
statusstring or nullTRIALING, ACTIVE, PAST_DUE, CANCELED, ...
trialEndsAtstring or null
trialDaysLeftinteger or nullWhole days left in the trial; null when not trialing.
currentPeriodEndstring or null
cancelAtPeriodEndboolean
featuresobjectPlan feature key → included.
usageobject
usage.ai_creditsobject or null
usage.ai_credits.usednumber
usage.ai_credits.limitnumber or nullNull is unlimited.
usage.ai_credits.creditsnumberPurchased or granted on top of the plan's allowance.
usage.ai_credits.remainingnumber or nullBelow zero: past the allowance (texts are then billed per segment).
usage.ai_credits.overageboolean
usage.smsobject or null
usage.sms.usednumber
usage.sms.limitnumber or nullNull is unlimited.
usage.sms.creditsnumberPurchased or granted on top of the plan's allowance.
usage.sms.remainingnumber or nullBelow zero: past the allowance (texts are then billed per segment).
usage.sms.overageboolean
usage.emailsobject or nullSKUFlow emails this period (allowance, used); null when the plan version predates the email allowance (then see emails below).
usage.emails.usednumber
usage.emails.limitnumber or nullNull is unlimited.
usage.emails.creditsnumberPurchased or granted on top of the plan's allowance.
usage.emails.remainingnumber or nullBelow zero: past the allowance (texts are then billed per segment).
usage.emails.overageboolean
usage.telephony_usageobject or nullTelephony billed this period, in cents (numbers, call minutes, recordings at Twilio's cost + 20%); null when not priced.
usage.telephony_usage.usednumber
usage.telephony_usage.limitnumber or nullNull is unlimited.
usage.telephony_usage.creditsnumberPurchased or granted on top of the plan's allowance.
usage.telephony_usage.remainingnumber or nullBelow zero: past the allowance (texts are then billed per segment).
usage.telephony_usage.overageboolean
usage.shipping_usageobject or nullShipping labels bought on SKUFlow's carrier account this period, in cents (postage + markup); null when not priced.
usage.shipping_usage.usednumber
usage.shipping_usage.limitnumber or nullNull is unlimited.
usage.shipping_usage.creditsnumberPurchased or granted on top of the plan's allowance.
usage.shipping_usage.remainingnumber or nullBelow zero: past the allowance (texts are then billed per segment).
usage.shipping_usage.overageboolean
emailsobject or nullSKUFlow email against the plan's allowance; null when it cannot be counted.
emails.usedThisMonthnumberEmails sent through SKUFlow email this calendar month (UTC), counted here.
emails.allowancenumber or nullThe plan's monthly email allowance (null: unknown plan).
officeUsersobjectTeam members (everyone who can sign in) against the plan's number.
officeUsers.usedinteger or nullOffice members plus pending office invitations; null when it could not be counted.
officeUsers.limitinteger or nullNull is unlimited. Every member counts.
degradedbooleanBilling could not be reached: this is the last known plan, or (planSource outage) none, and paid add-ons and new users are paused.
planSourceenumWhere the plan came from: live (Base316), memory or stored (the last answer, Base316 unreachable), outage (nothing known), fake (development). One of live, memory, stored, outage, fake.
tiersarray of objectEvery plan, cheapest first, for comparison and upgrade prompts.
tiers[].keystring
tiers[].namestring
tiers[].taglinestring
tiers[].monthlyPricenumber
tiers[].yearlyPricenumber
tiers[].featuresarray of string
tiers[].officeUsersnumber or null
tiers[].aiCreditsnumber
tiers[].smsSegmentsnumber
tiers[].emailsnumberSKUFlow emails a month.
trialobject
trial.tierstring
trial.daysnumber
addonsarray of objectPaid add-ons sold on any plan, and whether this business has each one.
addons[].keystringAdd-on key: phone or ads.
addons[].featurestringThe plan feature it includes.
addons[].namestring
addons[].descriptionstring
addons[].monthlyPricenumberUSD per month on a monthly plan.
addons[].yearlyPricenumberUSD per year on a yearly plan.
addons[].includedInTrialbooleanThe free trial includes it, within the trial's telephony limits.
addons[].requiresstring or nullThe add-on it needs first (phone).
addons[].includedNumbersintegerLocal numbers it includes.
addons[].draftbooleanNot on sale yet: its price is not decided, and adding it is refused (409).
addons[].attachedbooleanOn this business's subscription now.
addons[].termsobjectThe fee and every usage rate today: shown and accepted before adding it.
addons[].terms.keystring
addons[].terms.namestring
addons[].terms.monthlyPricenumberUSD per month on a monthly plan.
addons[].terms.yearlyPricenumberUSD per year on a yearly plan.
addons[].terms.includedNumbersintegerLocal numbers whose monthly charge is included.
addons[].terms.requiresstring or nullThe add-on it needs (phone), or null.
addons[].terms.markupnumberUsage is billed at cost × this (1.2 = cost + 20%).
addons[].terms.ratesarray of objectEvery usage rate at the price the business pays.
addons[].terms.exampleobject
addons[].terms.trialobjectWhat the free trial includes before the phone system pauses.
addons[].terms.ratesSourceenumTwilio's Pricing API today, or SKUFlow's documented fallback table. One of twilio, fallback.
addons[].terms.priceVersionstringSend this back in acknowledgement.priceVersion.
addons[].acknowledgementobject or nullThe last acceptance of its terms (who, when, which version), or null.
addons[].acknowledgement.userIdstring
addons[].acknowledgement.userNamestring or null
addons[].acknowledgement.acceptedAtstring (date-time)
addons[].acknowledgement.priceVersionstring
addons[].acknowledgement.contextenumOne of ADD_ADDON, MANAGED_TELEPHONY, REVIEW.
addons[].acknowledgement.termsobject or nullExactly what was shown and accepted (“View terms”).
addons[].needsReviewbooleanAttached, and its prices changed since they were accepted: an owner should review and accept them again (billing.acknowledgeTerms). Nothing is removed.
billingIntervalenum or nullThe subscription's interval: usage is billed in arrears at the end of each. One of month, year.

List the plans to choose from

GET /organizations/{organizationId}/billing/plan-options

The SKUFlow plans a business can choose, cheapest first, as Base316 sells them: name, description, monthly and yearly price (integer cents), users included (null = unlimited), the features included, and the free-trial days on the trial plan. Also trial (the plan and days a new business starts on with no card) and whether this business still has to choose (needsChoice). Read-only; any member. Choose with POST /billing/choose-plan.

Permissionorganization.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolbilling_planOptions (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/billing/plan-options" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
plansarray of object
plans[].keystring
plans[].namestring
plans[].descriptionstring or null
plans[].monthlyCentsinteger or null
plans[].yearlyCentsinteger or null
plans[].officeUsersinteger or null
plans[].featuresarray of string
plans[].trialDaysinteger or null
trialobject
trial.tierstring
trial.daysinteger
needsChoiceboolean

Choose a plan (first run)

POST /organizations/{organizationId}/billing/choose-plan

Money: the owner's plan choice after sign-up. plan: "trial" keeps the free trial the business started on (no card, nothing billed) and returns url: null. A plan key (with interval month or year) returns a one-time Base316 checkout link for that plan, where the owner enters a card and pays; the trial ends once the paid plan starts. Either way the business no longer sees the plan screen. Owner only.

Permissionorganization.accessBillingPortal (Owner)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolbilling_choosePlan (toolset settings)
ApprovalWaits for your approval in SKUFlow when called with an API key or a connected app: the first call answers 428 APPROVAL_REQUIRED; once you approve it, repeat the call with the X-SKUFlow-Approval header. See Approvals.

Request body

FieldTypeRequiredDescription
planenumYes"trial" to keep the free trial, or a plan key from GET /billing/plan-options. One of trial, core, connect, grow, pro.
intervalenumNoOne of month, year. Default month.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/billing/choose-plan" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"plan":"trial"}'

Response

200: the answer's fields
FieldTypeDescription
urlstring or nullThe Base316 checkout page to open; null when nothing is to be paid.

List AI credit packs

GET /organizations/{organizationId}/billing/credit-packs

The AI credit packs on sale (credits, price), cheapest first. Buy one with billing.buyCredits. Read-only.

Permissionorganization.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolbilling_creditPacks (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/billing/credit-packs" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
packsarray of object
packs[].keystring
packs[].namestring
packs[].creditsnumber
packs[].pricestring
packs[].currencystring

On this page