Grant an entitlement override
const url = 'https://api.sloose.com/entitlements/admin/orgs/org_9f3c/overrides';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"key":"example","value":1,"reason":"example","grantedBy":"example","expiresAt":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.sloose.com/entitlements/admin/orgs/org_9f3c/overrides \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "key": "example", "value": 1, "reason": "example", "grantedBy": "example", "expiresAt": "example" }'Backoffice route: a staff session, or ADMIN_TOKEN; never a customer’s session. Raises a limit or switches on a feature for one organisation without changing its plan. reason is required because an override nobody can explain later is a liability; grantedBy is the staff member unless the request says otherwise. Written down as org.override.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The organisation id.
Example
org_9f3cThe organisation id.
Request Bodyrequired
Section titled “Request Bodyrequired”object
A plan limit key or a feature key.
Why. Required.
Who authorised it. Defaults to the staff member making the request, or “admin token”.
An ISO date (midnight UTC) or an ISO timestamp with Z or an offset, kept in UTC. Omitted or empty means it does not expire; anything else is a 400.
Examplegenerated
{ "key": "example", "value": 1, "reason": "example", "grantedBy": "example", "expiresAt": "example"}Responses
Section titled “Responses”Granted, with the organisation’s entitlements as they now resolve.
object
Everything the widget needs to know about what this organisation may do.
object
object
object
object
CRM users allowed to use the widget; null = unlimited.
Connections the organisation may hold — a sandbox is a connection like any other; null = unlimited. A file is not one.
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, each spent at its first admitted row: one that ends having admitted none is given back) while the rows it writes are its chain’s: one that writes a row new to its chain past the rows the chain was counted for is counted at that row. This is judged by key only while the chain’s keys are kept: a day after the chain last ran, or for a chain begun before keys were kept, a link’s rows are judged by the count it declared instead, as they were before, and no run is counted at a later row.
Imports that may be running in the organisation at once, dry runs aside; null or absent = no limit. A run past it is refused at authorise with LIMIT_RUNS_CONCURRENT.
The most rows one import set may declare. Checked before anything is written.
Server-side runs only. Browser runs are never refused on it.
USD per 1,000 rows beyond rows_per_month, server-side runs only; null = not offered.
Bytes of uploaded files the organisation may hold at once; null = no limit, absent = the plan offers no files. Checked when an upload is reserved: past it, only NEW uploads are refused, with LIMIT_FILES_BYTES; nothing stored is deleted early.
Days a stored file is kept after its last use (a run that used it, naming it in a sheet, or its upload); absent = the longest any plan keeps one.
object
object
object
Runs counted this period, through any of the organisation’s connections: each once, at the first row it sent to be written, whether or not the CRM took that row.
AI credits. Included credits reset each period; purchased ones do not.
object
Included + purchased − reserved
Applies right now regardless of the action.
Example
{ "entitlements": { "plan": { "key": "free" }, "status": "free", "warnings": [ "LIMIT_ROWS" ] }}The key is unknown, the value is the wrong type for it — a limit that counts something takes a whole number of none or more, runs_concurrent at least 1, and row_overage_per_1000 any price of none or more; null only for a limit a plan may leave unsaid — a required field is missing, or expiresAt is not an ISO date or timestamp.
object
Examplegenerated
{ "error": "example"}A bearer that is neither the token nor a live session (code: AUTH_REQUIRED).
The error envelope every non-2xx answer uses.
object
Human-readable explanation.
Machine-readable reason. Absent on a few legacy 400s.
Examplegenerated
{ "error": "example", "code": "example"}A customer’s session, an API token, or no bearer at all — not staff, and not the ADMIN_TOKEN (code: ADMIN_REQUIRED).
The error envelope every non-2xx answer uses.
object
Human-readable explanation.
Machine-readable reason. Absent on a few legacy 400s.
Examplegenerated
{ "error": "example", "code": "example"}The restore switch is on (code: MAINTENANCE): every route but /health and /robots.txt is refused before anything is read, except the operator’s own POST /staff/people/{id}/delete with the ADMIN_TOKEN. Sloose is down for maintenance. Please try again in a few minutes.
object
Example
{ "code": "MAINTENANCE"}Headers
Section titled “Headers”Seconds until asking again is worth it (300 while the switch is on).