Skip to content

Start the trial

POST
/orgs/{org}/billing/trial
curl --request POST \
--url https://api.sloose.com/orgs/org_9f3c/billing/trial \
--header 'Authorization: Bearer <token>'

Starts the Business trial if the org is eligible: once per org, on Free, with no Stripe subscription — named by the org, or live at Stripe before its webhook has named it. Any plan Checkout the org has open at Stripe is expired first: starting the trial is choosing it over them, and none can then be paid under it. Answers 200 with started: false when it was not eligible — not an error, just an answer.

Session only: billing is a person’s to manage, never an org’s API token’s (D5).

org
required

The org id the session was issued for. A token for one org can never read another.

string
Example
org_9f3c

The org id the session was issued for. A token for one org can never read another.

Not eligible. reason says which rule refused it; entitlements is unchanged.

Media typeapplication/json
object
started
required
boolean
reason
required
string
Allowed values: ORG_ALREADY_TRIALED NOT_ON_FREE_PLAN HAS_SUBSCRIPTION RESERVATION_LAPSED
entitlements
required

Everything the widget needs to know about what this org may do.

object
orgId
required
string
plan
required
object
id
required
string
key
required
string | null
Allowed values: free team business enterprise
name
required
string
version
required
number
rank
required
number
status
required
string | null
Allowed values: free trialing active past_due suspended cancelled
period
required
object
start
required
string
end
required
string
limits
required
object
crm_users_max
required

CRM users allowed to use the widget; null = unlimited.

number | null
connections_max
required

Connections the org may hold — a sandbox is a connection like any other; null = unlimited. A file is not one.

number | null
runs_per_month
required

Import runs per period, each counted once at the first row it sends to be written, whether or not the CRM takes that row; null = unlimited (fair use). Dry runs never count, and neither does a free retry (Retry failed of a run with failed rows, at most three in a row).

number | null
runs_concurrent

Imports that may be running in the org at once, dry runs aside; null or absent = no limit. A run past it is refused at authorise with LIMIT_RUNS_CONCURRENT.

number | null
rows_per_run
required

The most rows one import set may declare. Checked before anything is written.

number
rows_per_month
required

Server-side runs only. Browser runs are never refused on it.

number
row_overage_per_1000
required

USD per 1,000 rows beyond rows_per_month, server-side runs only; null = not offered.

number | null
schedules_max
required
number
history_days
required
number
ai_credits_monthly
required
number
features
required
object
shared_templates
required
boolean
helper_libraries
required
boolean
server_run
required
boolean
mcp
required
boolean
rollback
required
boolean
scheduled_imports
required
boolean
crmUsers
required
object
active
required
number | null
max
required
number | null
overrides
required
Array<object>
object
id
required
string
key
required
string
value
required
Any of:
number
reason
required
string
grantedBy
required
string
expiresAt
required
string | null
overageAllowed
required
boolean
overageEnabled
required
boolean
graceEndsAt
required
string | null
trialEndsAt
required
string | null
cancelAtPeriodEnd
required
boolean
subscriptionVersion
required
string
resolvedAt
required
string
usage
required
object
periodStart
required
string
periodEnd
required
string
rowsWritten
required
number
rowsOverage
required
number
creditsUsed
required
number
runs
required

Runs counted this period, through any of the org’s connections: each once, at the first row it sent to be written, whether or not the CRM took that row.

number
balance
required

AI credits. Included credits reset each period; purchased ones do not.

object
included
required
number
purchased
required
number
reserved
required
number
available
required

Included + purchased − reserved

number
periodStart
required
string
periodEnd
required
string
warnings
required

Applies right now regardless of the action.

Array<string>
Allowed values: LIMIT_ROWS LIMIT_RUNS LIMIT_RUNS_CONCURRENT LIMIT_ROWS_PER_RUN LIMIT_CONNECTORS LIMIT_SCHEDULES LIMIT_CRM_USERS FEATURE_SHARED_TEMPLATES FEATURE_HELPER_LIBRARIES FEATURE_SERVER_RUN FEATURE_MCP FEATURE_ROLLBACK FEATURE_SCHEDULED_IMPORTS CREDITS_EXHAUSTED STATUS_SUSPENDED STATUS_PAST_DUE
cached
required
boolean
key
additional properties
Example
{
"started": false,
"reason": "ORG_ALREADY_TRIALED",
"entitlements": {
"plan": {
"key": "free"
},
"status": "free",
"warnings": [
"LIMIT_ROWS"
]
}
}

Trial started.

Media typeapplication/json
object
started
required
boolean
entitlements
required

Everything the widget needs to know about what this org may do.

object
orgId
required
string
plan
required
object
id
required
string
key
required
string | null
Allowed values: free team business enterprise
name
required
string
version
required
number
rank
required
number
status
required
string | null
Allowed values: free trialing active past_due suspended cancelled
period
required
object
start
required
string
end
required
string
limits
required
object
crm_users_max
required

CRM users allowed to use the widget; null = unlimited.

number | null
connections_max
required

Connections the org may hold — a sandbox is a connection like any other; null = unlimited. A file is not one.

number | null
runs_per_month
required

Import runs per period, each counted once at the first row it sends to be written, whether or not the CRM takes that row; null = unlimited (fair use). Dry runs never count, and neither does a free retry (Retry failed of a run with failed rows, at most three in a row).

number | null
runs_concurrent

Imports that may be running in the org at once, dry runs aside; null or absent = no limit. A run past it is refused at authorise with LIMIT_RUNS_CONCURRENT.

number | null
rows_per_run
required

The most rows one import set may declare. Checked before anything is written.

number
rows_per_month
required

Server-side runs only. Browser runs are never refused on it.

number
row_overage_per_1000
required

USD per 1,000 rows beyond rows_per_month, server-side runs only; null = not offered.

number | null
schedules_max
required
number
history_days
required
number
ai_credits_monthly
required
number
features
required
object
shared_templates
required
boolean
helper_libraries
required
boolean
server_run
required
boolean
mcp
required
boolean
rollback
required
boolean
scheduled_imports
required
boolean
crmUsers
required
object
active
required
number | null
max
required
number | null
overrides
required
Array<object>
object
id
required
string
key
required
string
value
required
Any of:
number
reason
required
string
grantedBy
required
string
expiresAt
required
string | null
overageAllowed
required
boolean
overageEnabled
required
boolean
graceEndsAt
required
string | null
trialEndsAt
required
string | null
cancelAtPeriodEnd
required
boolean
subscriptionVersion
required
string
resolvedAt
required
string
usage
required
object
periodStart
required
string
periodEnd
required
string
rowsWritten
required
number
rowsOverage
required
number
creditsUsed
required
number
runs
required

Runs counted this period, through any of the org’s connections: each once, at the first row it sent to be written, whether or not the CRM took that row.

number
balance
required

AI credits. Included credits reset each period; purchased ones do not.

object
included
required
number
purchased
required
number
reserved
required
number
available
required

Included + purchased − reserved

number
periodStart
required
string
periodEnd
required
string
warnings
required

Applies right now regardless of the action.

Array<string>
Allowed values: LIMIT_ROWS LIMIT_RUNS LIMIT_RUNS_CONCURRENT LIMIT_ROWS_PER_RUN LIMIT_CONNECTORS LIMIT_SCHEDULES LIMIT_CRM_USERS FEATURE_SHARED_TEMPLATES FEATURE_HELPER_LIBRARIES FEATURE_SERVER_RUN FEATURE_MCP FEATURE_ROLLBACK FEATURE_SCHEDULED_IMPORTS CREDITS_EXHAUSTED STATUS_SUSPENDED STATUS_PAST_DUE
cached
required
boolean
key
additional properties
Example
{
"started": true,
"entitlements": {
"plan": {
"key": "free"
},
"status": "free",
"warnings": [
"LIMIT_ROWS"
]
}
}

No bearer, or one that is expired, revoked or no longer resolves to a member.

Media typeapplication/json

The error envelope every non-2xx answer uses.

object
error
required

Human-readable explanation.

string
code

Machine-readable reason. Absent on a few legacy 400s.

string
key
additional properties
Examplegenerated
{
"error": "example",
"code": "example"
}

The bearer’s role is too low, it was issued for a different org, it is an API token (SESSION_REQUIRED), or it is a staff member’s view of the org (IMPERSONATION_REFUSED; a read-only view is refused before this, IMPERSONATION_READ_ONLY): billing spends and changes the org’s money, and a view would do it in the member’s name.

Media typeapplication/json

The error envelope every non-2xx answer uses.

object
error
required

Human-readable explanation.

string
code

Machine-readable reason. Absent on a few legacy 400s.

string
key
additional properties
Examplegenerated
{
"error": "example",
"code": "example"
}

Stripe refused or was unavailable while the trial asked it whether the org pays already (PAYMENT_PROVIDER_REFUSED, PAYMENT_PROVIDER_UNAVAILABLE), and the trial did not start. Any open plan Checkout of the org closed before the failure stays closed: the trial closes them first, and a Checkout can be made again from Plan. Stripe’s own words are logged, not returned.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: PAYMENT_PROVIDER_REFUSED PAYMENT_PROVIDER_UNAVAILABLE
key
additional properties
Example
{
"code": "PAYMENT_PROVIDER_REFUSED"
}

Report a problem with this page