Browse documentation

Subscription billing

Current release · Updated October 2, 2026

DryKraft subscription billing API: methods, permissions, request fields, response shapes, examples and current limits. Read authentication and error handling first.

GET/api/billing/

Read billing status

Access: Workspace member · Success: 200

$1 USD/user/month, 100 minor units. 15-day trial starts at workspace creation. Pending invitations excluded from members.

No request body is required.

Response

FieldTypeRequiredDetails
planstringNosample or workspace
accessbooleanNoMay mutate/run
trialbooleanNoTrial active
trial_started_atstringNoTimestamp
trial_ends_atstringNoTimestamp
statusstring or nullNo
seatsinteger or nullNo
membersintegerNoEvery member counts
unit_price_minor100No
currencyUSDNo
next_billing_datestring or nullNo
cancel_at_next_billing_datebooleanNoCancellation scheduled
synced_atstring or nullNo
subscribedbooleanNoSubscription exists
checkoutobject or nullNoOpen checkout: seats, expires_at
readybooleanNoBilling configured
enterprise_emailstring or nullNo
enterprise_requested_atstring or nullNo
Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/billing/' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/billing/checkout

Open subscription checkout

Access: Workspace owner · Success: 200

Real hosted Dodo checkout. Seats >=members, 1-10,000. Preserves remaining trial rounded up. Ambiguous open checkout is reserved for 24 hours; do not create another purchase blindly.

JSON request

FieldTypeRequiredDetails
seatsintegerYesSeat quantity Min 1. Max 10000.

Response

FieldTypeRequiredDetails
urluriNo
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/billing/checkout' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "seats": 1
}'
POST/api/billing/refresh

Refresh provider billing state

Access: Workspace owner · Success: 200

Uses canonical provider state. Return-page query/status does not grant access.

JSON request

FieldTypeRequiredDetails
checkoutuuidNo

Response

Use OK.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/billing/refresh' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{}'
POST/api/billing/portal

Open Dodo customer portal

Access: Workspace owner · Success: 200

Requires completed checkout. Portal manages payment methods, invoices and cancellation.

No request body is required.

Response

FieldTypeRequiredDetails
urluriNo
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/billing/portal' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/billing/seats

Change subscription seats

Access: Workspace owner · Success: 200

Active subscription required; seats >=members. Change effective immediately, no immediate charge; next renewal uses new price.

JSON request

FieldTypeRequiredDetails
seatsintegerYesSeat quantity Min 1. Max 10000.

Response

Use OK.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/billing/seats' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "seats": 1
}'
POST/api/billing/enterprise

Save Enterprise requirements

Access: Workspace owner · Success: 200

Saves a request; does not activate a contract, extra features or plan. Contact support@drykraft.com.

JSON request

FieldTypeRequiredDetails
requirementsstringYesOrganization requirements Max 3000 characters.

Response

Use OK.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/billing/enterprise' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "requirements": "<Organization requirements>"
}'