Skip to main content

Subscriptions

GET Get current subscription​

https://focus.toggl.com/api/organizations/{organization_id}/subscriptions/current

Get current subscription.

curl  https://focus.toggl.com/api/organizations/{organization_id}/subscriptions/current \
-H "Content-Type: application/json"

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID

Response​

200​

NameTypeDescription
focus_trial_ended_atstringnull
grantedbooleanGranted reports an entitlement the organization holds without paying for it: the Stripe-backed fields are empty because no Stripe subscription backs the grant.
organization_idinteger-
priceobject-
productobject-
subscriptionobject-
subscription_itemobject-
track_subscriptionobject-
price​
NameTypeDescription
billing_period_in_monthsinteger-
cost_in_centsinteger-
currencystring-
tagstring-
track_pricing_plan_idinteger-
product​
NameTypeDescription
handlestring-
namestring-
sitestring-
toggl_product_idstring-
track_enterpriseboolean-
track_plan_idinteger-
subscription​
NameTypeDescription
customerobject-
idstring-
payment_failedboolean-
statestring-
subscription_itemobject-
urlstring-
customer​
NameTypeDescription
idstring-
urlstring-
subscription_item​
NameTypeDescription
discountobject-
quantityintegerQuantity is the live paid quantity (number of paid licenses).
scheduled_quantityintegerScheduledQuantity is the scheduled next-cycle quantity when a change is pending in Stripe (typically a decrease); nil when there is no pending change — no schedule, or the scheduled quantity equals the live quantity.
subscription_item_idstringID is the Stripe subscription item ID. Empty for trial-only synthetic responses where no Stripe subscription item exists yet.
updated_atstring-
discount​
NameTypeDescription
amount_offinteger-
coupon_idstring-
currencystring-
durationstring-
namestring-
percent_offnumber-
promotion_code_idstring-
subscription_item​
NameTypeDescription
discountobject-
quantityintegerQuantity is the live paid quantity (number of paid licenses).
scheduled_quantityintegerScheduledQuantity is the scheduled next-cycle quantity when a change is pending in Stripe (typically a decrease); nil when there is no pending change — no schedule, or the scheduled quantity equals the live quantity.
subscription_item_idstringID is the Stripe subscription item ID. Empty for trial-only synthetic responses where no Stripe subscription item exists yet.
updated_atstring-
discount​
NameTypeDescription
amount_offinteger-
coupon_idstring-
currencystring-
durationstring-
namestring-
percent_offnumber-
promotion_code_idstring-
track_subscription​
NameTypeDescription
cancel_datestring-
current_period_ends_atstring-
current_period_starts_atstring-
end_datestring-
pause_starts_atstring-
pausedbooleanPaused is true while the organization is in the unpaid months of a self-serve pause, which is when products make it read-only; the subscription itself stays "active". PauseStartsAt is the first skipped renewal, where those months start, and ResumesAt the renewal billing restarts at. Both are set from the moment the pause applies until billing restarts or the customer resumes, so clients can show a pause that has not started yet.
payment_failedboolean-
resumes_atstring-
start_datestring-
subscription_created_atstring-
subscription_updated_atstring-
trialobject-
trial​
NameTypeDescription
availableboolean-
end_datestring-
start_datestring-
trial_plan_idinteger-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

GET Get current trial​

https://focus.toggl.com/api/organizations/{organization_id}/subscriptions/trials/current

Get the organization's current active Focus plan trial. Add-on module trials (Capacity, Time Off) are excluded: they run alongside the organization's own plan rather than standing in for it.

curl  https://focus.toggl.com/api/organizations/{organization_id}/subscriptions/trials/current \
-H "Content-Type: application/json"

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID

Response​

200​

Current active trial

NameTypeDescription
idinteger-
organization_idinteger-
plan_idinteger-
plan_namestring-
product_handlestring-
toggl_product_namestring-
trial_cancels_atstring-
trial_created_atstring-
trial_deleted_atstring-
trial_ended_atstring-
trial_started_atstring-
trial_typestring-

204​

No active trial found

400​

Invalid request

404​

Subscription not found

500​

Internal server error

POST Upserts a trial​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/subscriptions/upsert-forced-trial

Creates or updates a trial for the organization based on workspace data and Plan import history.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/subscriptions/upsert-forced-trial \
-H "Content-Type: application/json" \
-d '\{"plan_workspace_id":"integer"\}'

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
plan_workspace_idinteger-

Response​

200​

Trial was created or updated

NameTypeDescription
idinteger-
organization_idinteger-
plan_idinteger-
plan_namestring-
product_handlestring-
toggl_product_namestring-
trial_cancels_atstring-
trial_created_atstring-
trial_deleted_atstring-
trial_ended_atstring-
trial_started_atstring-
trial_typestring-

204​

No trial created or updated (existing unchanged trial, paid subscription, or no eligible trial)

400​

Invalid request

409​

Forced trial already exists or org has active subscription

500​

Internal server error

© 2026 Toggl. All rights reserved.