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.
/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
| Field | Type | Required | Details |
|---|---|---|---|
plan | string | No | sample or workspace |
access | boolean | No | May mutate/run |
trial | boolean | No | Trial active |
trial_started_at | string | No | Timestamp |
trial_ends_at | string | No | Timestamp |
status | string or null | No | |
seats | integer or null | No | |
members | integer | No | Every member counts |
unit_price_minor | 100 | No | |
currency | USD | No | |
next_billing_date | string or null | No | |
cancel_at_next_billing_date | boolean | No | Cancellation scheduled |
synced_at | string or null | No | |
subscribed | boolean | No | Subscription exists |
checkout | object or null | No | Open checkout: seats, expires_at |
ready | boolean | No | Billing configured |
enterprise_email | string or null | No | |
enterprise_requested_at | string or null | No |
curl --request GET \
--url 'https://app.drykraft.com/api/billing/' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/billing/checkoutOpen 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
| Field | Type | Required | Details |
|---|---|---|---|
seats | integer | Yes | Seat quantity Min 1. Max 10000. |
Response
| Field | Type | Required | Details |
|---|---|---|---|
url | uri | No |
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
}'/api/billing/refreshRefresh provider billing state
Access: Workspace owner · Success: 200
Uses canonical provider state. Return-page query/status does not grant access.
JSON request
| Field | Type | Required | Details |
|---|---|---|---|
checkout | uuid | No |
Response
Use OK.
curl --request POST \
--url 'https://app.drykraft.com/api/billing/refresh' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{}'/api/billing/portalOpen Dodo customer portal
Access: Workspace owner · Success: 200
Requires completed checkout. Portal manages payment methods, invoices and cancellation.
No request body is required.
Response
| Field | Type | Required | Details |
|---|---|---|---|
url | uri | No |
curl --request POST \
--url 'https://app.drykraft.com/api/billing/portal' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/billing/seatsChange 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
| Field | Type | Required | Details |
|---|---|---|---|
seats | integer | Yes | Seat quantity Min 1. Max 10000. |
Response
Use OK.
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
}'/api/billing/enterpriseSave 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
| Field | Type | Required | Details |
|---|---|---|---|
requirements | string | Yes | Organization requirements Max 3000 characters. |
Response
Use OK.
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>"
}'