Organization Management Org CRUD, members, billing, transfer (agent→human), discovery

Base URL: https://api.fast.io/current/ Auth: Bearer {jwt_token}

An organization (org) is a collector of workspaces. It can represent a company, a business unit, a team, or simply a personal collection. Orgs are the billable entity — storage, credits, and member limits are tracked at the org level. Every workspace and share lives under an org.

Profile IDs are 19-digit numeric strings. Most endpoints also accept the org's domain name (e.g., acme) in place of the numeric ID.


Internal vs External Orgs

Agents must call both GET /current/orgs/list/ and GET /current/orgs/list/external/ to discover all orgs they can access.

External orgs are the most common pattern when a human invites an agent to help with a specific project — they add the agent to a workspace but not to the org itself.

If the human later invites the agent to the org itself, it moves from external to internal and gains org-level access.


Org Field Constraints

FieldTypeMinMaxRegex / RulesDefault
domainstring280^[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?$ Lowercase alphanumeric + hyphens. Must be unique. Must not be reserved.Required
namestring3100Free text display namenull
descriptionstring101000Free textnull
industrystringMust be one of the values from GET /current/orgs/industries/null
perm_member_managestring'Member or above', 'Admin or above', 'Owner only''Member or above'
perm_authorized_domainsstringEmail domain for auto-join (e.g., acme.com)null
billing_emailstring (email)Valid email with reachable domainUser's email
accent_colorstring (JSON)JSON-encoded color objectnull
background_colorstring (JSON)JSON-encoded color objectnull
background_modestringOne of the supported background display modesnull

Member Roles and Permissions

RoleLevelCan manage membersCan manage settingsCan manage billingCan close orgCan transfer ownership
OwnerHighestYesYesYesYesYes
AdminHighYes (if perm_member_manage allows)YesYesNoNo
MemberStandardIf perm_member_manage = 'Member or above'NoNoNoNo
ViewLowestNoNoNoNoNo

The perm_member_manage org setting controls the minimum role required to add, remove, or update members.


Organization CRUD

Create Organization

POST /current/org/create/

Auth required. Creates a new organization. The authenticated user becomes the owner.

Rate limits: 3/20s, 8/60s, 20/hr, 60/day

Request parameters

NameTypeRequiredDescription
domainstringYes2-80 chars, lowercase alphanumeric + hyphens, must be unique and not reserved. Used as the org identifier in URLs.
namestringNo3-100 chars. Display name for the org.
descriptionstringNoOrganization description.
industrystringNoIndustry type from predefined list (see GET /current/orgs/industries/).
accent_colorstring (JSON)NoBrand accent color as JSON.
background_colorstring (JSON)NoBackground color as JSON.
background_modestringNoBackground display mode.
facebook_urlstring (URL)NoFacebook page URL. Must be valid URL.
twitter_urlstring (URL)NoTwitter profile URL. Must be valid URL.
instagram_urlstring (URL)NoInstagram profile URL. Must be valid URL.
youtube_urlstring (URL)NoYouTube channel URL. Must be valid URL.
homepage_urlstring (URL)NoOrganization website URL. Must be valid URL.
perm_member_managestringNoWho can manage members. See Org Field Constraints above.
perm_authorized_domainsstringNoAuthorized email domain for auto-join.
billing_emailstring (email)NoBilling contact email. Defaults to user's email.

Agent accounts are always assigned the agent plan (free: 50 GB storage, 5,000 credits/month, no trial, no expiration). Agents cannot select or change to a human plan.

curl example

curl -X POST "https://api.fast.io/current/org/create/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "domain=acme-corp" \
  -d "name=Acme Corporation" \
  -d "industry=technology"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "org": {
      "id": "1234567890123456789",
      "domain": "acme-corp",
      "name": "Acme Corporation",
      "description": null,
      "logo": null,
      "accent_color": null,
      "closed": false,
      "suspended": false
    },
    "has_free_trial": true,
    "requires_payment": false,
    "is_agent": false
  }
}

When user is ineligible for free trial:

{
  "result": "yes",
  "response": {
    "org": { "...": "..." },
    "has_free_trial": false,
    "requires_payment": true,
    "no_trial_reason": "existing_org"
  }
}

Response fields

FieldTypeDescription
orgobjectOrganization resource object
org.idstring19-digit numeric organization ID
org.domainstringURL-safe subdomain
org.namestring/nullDisplay name
org.descriptionstring/nullDescription
org.logostring/nullLogo asset URL
org.accent_colorstring/nullBrand color
org.closedbooleanWhether org is closed
org.suspendedbooleanWhether org is suspended
has_free_trialbooleanWhether the org has a free trial period
requires_paymentbooleanWhether payment is required before activation
is_agentbooleanWhether the creating user is an agent
no_trial_reasonstringReason free trial was denied (only when requires_payment is true)

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid org domain was supplied."Invalid domain format
APP_ERROR_INPUT_INVALID400"The supplied org domain name is restricted."Domain is reserved
APP_ERROR_INPUT_INVALID400"The supplied org domain name is already in use."Domain already taken
APP_ERROR_INPUT_INVALID400"An invalid configuration was supplied..."Metadata validation failed
APP_ERROR_INPUT_INVALID400"Invalid JSON provided for {key}."Malformed JSON in color fields
APP_ERROR_UPDATE_ERROR400"There was an internal error processing your create request."Org creation failed
APP_INTERNAL_ERROR500"There was an internal error processing your create request."Storage instance creation failed
APP_INTERNAL_ERROR500"We were unable to create your organization..."Commit failed
APP_FORBIDDEN403GEO/risk restriction messageRequest blocked by geo/risk check

Get Org Details

GET /current/org/{org_id}/details/

Auth required. Returns full org details. Fields vary by the requesting user's permission level.

{org_id} accepts a 19-digit numeric ID or the org's domain name.

Access levels

RoleAccessNotes
OwnerFull accessIncludes encryption key, platform, storage config
AdminExtended accessIncludes billing info, permissions, subscriber status
MemberStandard accessBasic org info, status flags
ViewLimited accessPublic fields only

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/details/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "org": {
      "id": "1234567890123456789",
      "domain": "acme-corp",
      "name": "Acme Corporation",
      "description": "Leading provider of innovation",
      "logo": "https://assets.fast.io/org/logo.png",
      "accent_color": "#0066CC",
      "closed": false,
      "locked": false,
      "suspended": false,
      "created": "2024-01-15 10:30:00",
      "updated": "2024-06-20 14:45:00"
    }
  }
}

Response fields

FieldTypeDescription
org.idstring19-digit numeric organization ID
org.domainstringURL-safe subdomain
org.namestring/nullDisplay name
org.descriptionstring/nullDescription
org.logostring/nullLogo asset URL
org.accent_colorstring/nullBrand color
org.closedbooleanWhether org is closed
org.lockedbooleanWhether org is locked
org.suspendedbooleanWhether org is suspended
org.createdstringCreation timestamp
org.updatedstringLast update timestamp

Error responses

Error CodeHTTP StatusMessageCause
APP_DENIED403"You have not been granted access to this Org."Insufficient permission

Get Public Org Details

GET /current/org/{org_id}/public/details/

No authentication required. Returns limited public info about an org (name, domain, assets). IP-rate-limited.

Rate limits: 30/60s, 1000/hr, 5000/day (IP-based)

{org_id} accepts a 19-digit numeric ID or the org's domain name.

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/public/details/"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "org": {
      "id": "1234567890123456789",
      "domain": "acme-corp",
      "name": "Acme Corporation",
      "description": "Leading provider of innovation",
      "logo": "https://assets.fast.io/org/logo.png",
      "accent_color": "#0066CC"
    }
  }
}

Response fields

FieldTypeDescription
org.idstring19-digit numeric organization ID
org.domainstringURL-safe subdomain
org.namestring/nullDisplay name
org.descriptionstring/nullDescription
org.logostring/nullLogo asset URL
org.accent_colorstring/nullBrand color

Update Organization

POST /current/org/{org_id}/update/

Auth required. Admin or above. Updates org details. Only provided fields are modified.

Rate limits: 1/3s, 5/10s, 20/60s, 100/hr

Access levels

RoleAccess
OwnerFull access
AdminFull access
MemberDenied

Request parameters (all optional)

NameTypeDescription
domainstringNew URL-safe subdomain (2-80 chars, lowercase alphanumeric + hyphens).
namestringDisplay name (3-100 chars). Send "null" to clear.
descriptionstringDescription. Send "null" or "" to clear.
industrystringIndustry type from predefined list.
accent_colorstring (JSON)Brand accent color as JSON. Send "null" to clear.
background_colorstring (JSON)Background color as JSON. Send "null" to clear.
background_modestringBackground display mode.
use_backgroundstringEnable/disable background ("true"/"false").
facebook_urlstring (URL)Facebook URL.
twitter_urlstring (URL)Twitter URL.
instagram_urlstring (URL)Instagram URL.
youtube_urlstring (URL)YouTube URL.
homepage_urlstring (URL)Organization website URL.
perm_member_managestringMember management permission level.
perm_authorized_domainsstringAuthorized email domain for auto-join.
billing_emailstring (email)Billing contact email. Domain must be reachable.
owner_definedstring (JSON)Custom owner-defined properties. Send "null" or "" to clear.

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/update/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "name=Acme Corp Updated" \
  -d "description=Updated description" \
  -d "industry=technology"

Response (200 OK)

{
  "result": "yes"
}

If no actual changes are detected, returns success immediately.

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid org domain was supplied."Invalid domain format
APP_ERROR_INPUT_INVALID400"The supplied org domain name is restricted."Domain is reserved
APP_ERROR_INPUT_INVALID400"The supplied org domain name is already in use."Domain taken by another org
APP_ERROR_INPUT_INVALID400"An invalid configuration was supplied..."Metadata validation failed
APP_ERROR_INPUT_INVALID400"Invalid JSON provided for {key}."Malformed JSON
APP_ERROR_INPUT_INVALID400"The email domain is invalid or cannot receive email."Bad billing email domain
APP_ERROR_UPDATE_ERROR400"There was an internal error processing your update request."Commit failed

Close Organization

POST /current/org/{org_id}/close/

Auth required. Owner only. Soft-deletes the organization. Active subscriptions are automatically cancelled.

Rate limits: 1/3s, 2/60s, 3/hr, 4/day

Request parameters

NameTypeRequiredDescription
confirmstringYesMust match the org domain name or org numeric ID as confirmation.

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/close/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "confirm=acme-corp"

Response (202 Accepted)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"The confirm field provided does not match."Confirmation does not match domain or ID
APP_ERROR_UPDATE_ERROR400"There was an internal error processing your request."Failed to close org

Storage deletion is deferred to the deletion system after a retention period.


Organization Assets

List Available Asset Types

GET /current/org/assets/

Auth required. Returns available org asset metadata types (e.g., logo, background images).

curl example

curl -X GET "https://api.fast.io/current/org/assets/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "assets": [
      {
        "name": "logo",
        "mime_types": ["image/png", "image/jpeg"],
        "max_size": 5242880
      }
    ]
  }
}

List Org Assets

GET /current/org/{org_id}/assets/

Auth required. Any member with at least View permission. Returns assets currently set on the org.

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/assets/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "assets": {
      "logo": {
        "url": "https://assets.fast.io/org/logo.png",
        "mime_type": "image/png",
        "size": 45678
      }
    }
  }
}

Upload Org Asset

POST /current/org/{org_id}/assets/{asset_name}/

Auth required. Admin or above. Upload as multipart/form-data.

Request parameters

NameTypeRequiredDescription
filefile (multipart)YesThe asset file to upload.
metadatastring (JSON array)NoAdditional metadata for the asset.

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/assets/logo/" \
  -H "Authorization: Bearer {jwt_token}" \
  -F "file=@logo.png"

Error responses

Error CodeHTTP StatusMessageCause
APP_POST_FILE_MISSING400"Asset upload missing"No file in the request
APP_ERROR_INPUT_INVALID400"metadata invalid"Metadata is not a valid array

Delete Org Asset

DELETE /current/org/{org_id}/assets/{asset_name}/

Auth required. Admin or above.

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/assets/logo/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

Read Org Asset (Raw)

GET /current/org/{org_id}/assets/{asset_name}/read/

No authentication required. Returns the raw binary content of an org asset with appropriate Content-Type header. Useful for displaying logos and images directly.

HEAD requests return headers only.


Organization Members

Add or Invite a Member

POST /current/org/{org_id}/members/{email_or_user_id}/

Auth required. Permission governed by org's perm_member_manage setting.

Rate limits: 10/3s, 25/10s, 50/60s, 100/hr, 1000/day

The target is specified as a path parameter:

Request parameters (adding existing user by ID)

NameTypeRequiredDescription
permissionsstringYesPermission level: "member", "admin". Cannot add as "owner".
expiresstring (datetime)NoMembership expiration date.
notifystringNoNotification preference.
force_notificationbooleanNoForce send a notification email.

Request parameters (inviting by email)

NameTypeRequiredDescription
permissionsstringYesPermission level for the invitation: "member", "admin".
messagestringNoCustom invitation message.
expiresstring (datetime)NoInvitation expiration.

curl example (add existing user)

curl -X POST "https://api.fast.io/current/org/1234567890123456789/members/9876543210987654321/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "permissions=member"

curl example (invite by email)

curl -X POST "https://api.fast.io/current/org/1234567890123456789/members/jane@example.com/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "permissions=member" \
  -d "message=Welcome to the team!"

Response (200 OK) — direct add

{
  "result": "yes"
}

Response (200 OK) — invitation created

{
  "result": "yes",
  "response": {
    "invitation": {
      "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
      "invitee_email": "jane@example.com",
      "entity_type": "org",
      "state": "pending",
      "created": "2024-01-15 10:30:00"
    }
  }
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"Invalid permission specified."Invalid permission value
APP_CANNOT_ADD_AS_OWNER403"Adding a member as an owner is not allowed"Tried to add as owner (use transfer_ownership)
APP_EXCEEDED_LIMIT429Limit messageMember limit exceeded

Remove a Member

DELETE /current/org/{org_id}/members/{user_id}/

Auth required. Permission governed by org's perm_member_manage setting.

Rate limits: 1/3s, 2/10s, 5/60s, 20/hr, 100/day

The target user ID (19-digit numeric) is a path parameter.

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/members/9876543210987654321/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

List Org Members

GET /current/org/{org_id}/members/list/

Auth required. Any org member. Paginated.

Rate limits: 20/3s, 50/10s, 200/60s, 500/hr, 10000/day

Query parameters

NameTypeDefaultDescription
limitinteger1001-500, number of items to return
offsetinteger0Number of items to skip

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/members/list/?limit=50&offset=0" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "users": [
      {
        "id": "1234567890123456789",
        "account_type": "human",
        "email_address": "owner@example.com",
        "first_name": "John",
        "last_name": "Doe",
        "permissions": "owner"
      },
      {
        "id": "1234567890123456780",
        "account_type": "agent",
        "email_address": "bot@example.com",
        "first_name": "Service",
        "last_name": "Bot",
        "permissions": "admin"
      }
    ],
    "pagination": {
      "total": 2,
      "limit": 50,
      "offset": 0,
      "has_more": false
    }
  }
}

Response fields

FieldTypeDescription
usersarrayArray of member objects
users[].idstring19-digit numeric user ID
users[].account_typestring"human" or "agent"
users[].email_addressstringUser's email
users[].first_namestringFirst name
users[].last_namestringLast name
users[].permissionsstringRole: "owner", "admin", "member"
pagination.totalintegerTotal number of members
pagination.limitintegerRequested page size
pagination.offsetintegerCurrent offset
pagination.has_morebooleanWhether more results exist

Leave Organization (Self)

DELETE /current/org/{org_id}/member/

Auth required. Removes the authenticated user from the org. Owners cannot leave — they must transfer ownership or close the org first.

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/member/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"You cannot leave an org you are the owner of..."User is the org owner
APP_ERROR_INPUT_INVALID400"You cannot leave an org you are not a member of."User is not a member

Get Member Details

GET /current/org/{org_id}/member/{user_id}/details/

Auth required. Any org member.

Rate limits: 200/3s, 500/10s, 750/60s, 1000/hr, 2500/day

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/member/9876543210987654321/details/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "member": {
      "id": "9876543210987654321",
      "account_type": "human",
      "email_address": "jane@example.com",
      "first_name": "Jane",
      "last_name": "Smith",
      "permissions": "admin",
      "invite": "accepted",
      "notify": "Email me",
      "expires": null
    }
  }
}

Response fields

FieldTypeDescription
member.idstring19-digit numeric user ID
member.account_typestring"human" or "agent"
member.email_addressstringUser's email
member.first_namestringFirst name
member.last_namestringLast name
member.permissionsstringRole: "owner", "admin", "member"
member.invitestringInvitation status
member.notifystringNotification preference
member.expiresstring/nullMembership expiration (ISO 8601) or null for no expiry

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"The membership you specified does not exist."User is not a member

Update Member Permissions

POST /current/org/{org_id}/member/{user_id}/update/

Auth required. Permission governed by org's perm_member_manage setting.

Rate limits: 10/3s, 25/10s, 50/60s, 100/hr, 1000/day

Request parameters (all optional)

NameTypeDescription
permissionsstringNew permission level ("member", "admin")
expiresstring (datetime)Membership expiration date
notifystringNotification preference

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/member/9876543210987654321/update/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "permissions=admin"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"The membership you specified does not exist."User is not a member

Transfer Org Ownership

GET /current/org/{org_id}/member/{user_id}/transfer_ownership/

Auth required. Owner only. Transfers ownership of the org to the specified member. The current owner is demoted to admin.

Rate limits: 10/3s, 25/10s, 50/60s, 100/hr, 1000/day

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/member/9876543210987654321/transfer_ownership/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"You cannot transfer ownership to yourself."Target is the current user
APP_ERROR_INPUT_INVALID400"The membership you specified does not exist."User is not an org member
APP_ERROR_INPUT_INVALID400"Member is already an owner."Target is already the owner
APP_ERROR_UPDATE_ERROR400"Failed to update owner of the org."Commit failed

Join Organization

POST /current/org/{org_id}/members/join/

Auth required. Join an org via invite or domain-based auto-join.

Rate limits: 10/3s, 25/10s, 50/60s, 100/hr, 1000/day

Join methods

  1. Via invitation: Append the invitation key to the URL path: .../join/{invitation_key}/ optionally followed by accept or decline. Default is accept.
  2. Via authorized domain: The org must have perm_authorized_domains set and the user's email domain must match. User is added as a Member.

curl example (invitation)

curl -X POST "https://api.fast.io/current/org/1234567890123456789/members/join/abc123def456/accept/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_DENIED403"This org does not allow you to join automatically..."Domain auto-join not enabled
APP_DENIED403"You are not allowed to join this org automatically..."User's email domain does not match
APP_EXCEEDED_LIMIT429Limit messageMember limit exceeded

List Org Invitations

GET /current/org/{org_id}/members/invitations/list/

Auth required. Any org member. An optional state filter can be appended: .../list/pending/.

Rate limits: 10/3s, 25/10s, 50/60s, 100/hr, 1000/day

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/members/invitations/list/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "invitations": [
      {
        "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
        "inviter": "John Doe",
        "invitee_email": "jane@example.com",
        "entity_type": "org",
        "state": "pending",
        "created": "2024-01-15 10:30:00",
        "expires": "2024-02-15 10:30:00"
      }
    ]
  }
}

Response fields

FieldTypeDescription
invitationsarrayArray of invitation objects
invitations[].idstringInvitation identifier
invitations[].inviterstringName of the user who sent the invitation
invitations[].invitee_emailstringEmail address of the invitee
invitations[].entity_typestringAlways "org" for org invitations
invitations[].statestringInvitation state: "pending", "accepted", "declined"
invitations[].createdstringCreation timestamp
invitations[].expiresstring/nullExpiration timestamp

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid invitation state was supplied."Invalid state filter

Update an Invitation

POST /current/org/{org_id}/members/invitation/{invitation_id}/

Auth required. Permission governed by org's perm_member_manage setting.

Rate limits: 10/60s, 20/600s, 30/hr

{invitation_id} can be the invitation ID or the invitee email address.

Request parameters (all optional)

NameTypeDescription
statestringNew invitation state
permissionsstringUpdated permission level
expiresstring (datetime)Updated expiration date

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/members/invitation/eA1B2C3D4E5F6G7H8J9K0L1M2N3O4/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "permissions=admin"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid invitation ID or email was supplied."Invalid identifier
APP_ERROR_INPUT_INVALID400"Invitation not found."Invitation does not exist
APP_ERROR_INPUT_INVALID400"Invitation is not for an Org"Wrong entity type
APP_ERROR_INPUT_INVALID400"An invalid state was supplied."Invalid state value
APP_UPDATE_FAILED400"Failed to update invitation."Commit failed

Delete an Invitation

DELETE /current/org/{org_id}/members/invitation/{invitation_id}/

Auth required. Permission governed by org's perm_member_manage setting.

Rate limits: 10/60s, 20/600s, 30/hr

{invitation_id} can be the invitation ID or the invitee email address.

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/members/invitation/eA1B2C3D4E5F6G7H8J9K0L1M2N3O4/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_DELETE_FAILED400"Failed to delete invitation."Deletion failed

Organization Transfer (Agent to Human)

Agents build orgs, then transfer ownership to humans. The human gets the org plus all workspaces; the agent stays as admin. Only agent accounts can create/list/delete tokens; only human accounts can claim.

The claim URL for humans: https://go.fast.io/claim?token={token}

Create Transfer Token

POST /current/org/{org_id}/transfer/token/create/

Auth required. Agent owner only. Org must be on the agent plan.

Rate limits: 5/min, 20/hour, 50/day

Creates a transfer token: 64-character string, valid 72 hours. Max 5 active tokens per org.

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/transfer/token/create/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "transfer_token": {
      "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
      "token": "a1b2c3d4e5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e0f1g2",
      "org_id": 1234567890123456789,
      "state": "pending",
      "expires": "2026-02-04T12:00:00+00:00",
      "created": "2026-02-01T12:00:00+00:00"
    }
  }
}

Response fields

FieldTypeDescription
transfer_token.idstringOpaque identifier of the transfer token
transfer_token.tokenstring64-character token string to share with the human user
transfer_token.org_idintegerOrganization being transferred
transfer_token.statestringToken state: "pending"
transfer_token.expiresstringISO 8601 expiry timestamp (72 hours from creation)
transfer_token.createdstringISO 8601 creation timestamp

Error responses

Error CodeHTTP StatusMessageCause
APP_AUTH_INVALID401"Authentication required"Missing or invalid token
APP_FORBIDDEN403"Only agent accounts can create org transfer tokens."Non-agent user attempted creation
APP_FORBIDDEN403"Transfer tokens can only be created for organizations on the agent plan."Org not on agent plan
APP_NOT_ACCEPTED406"Maximum of 5 active transfer tokens per organization."Token limit reached

List Transfer Tokens

GET /current/org/{org_id}/transfer/token/list/

Auth required. Agent owner only. Returns all active (pending) transfer tokens for the org.

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/transfer/token/list/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "results": 1,
    "transfer_tokens": [
      {
        "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
        "token": "a1b2c3d4e5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e0f1g2",
        "org_id": 1234567890123456789,
        "state": "pending",
        "expires": "2026-02-04T12:00:00+00:00",
        "created": "2026-02-01T12:00:00+00:00"
      }
    ]
  }
}

Error responses

Error CodeHTTP StatusMessageCause
APP_AUTH_INVALID401"Authentication required"Missing or invalid token
APP_FORBIDDEN403"Only agent accounts can list org transfer tokens."Non-agent user

Delete Transfer Token

DELETE /current/org/{org_id}/transfer/token/{token_id}/

Auth required. Agent owner only. Soft-deletes a pending transfer token.

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/transfer/token/eA1B2C3D4E5F6G7H8J9K0L1M2N3O4/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "transfer_token": {
      "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
      "token": "a1b2c3d4e5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e0f1g2",
      "org_id": 1234567890123456789,
      "state": "deleted",
      "expires": "2026-02-04T12:00:00+00:00",
      "created": "2026-02-01T12:00:00+00:00"
    }
  }
}

Error responses

Error CodeHTTP StatusMessageCause
APP_AUTH_INVALID401"Authentication required"Missing or invalid token
APP_FORBIDDEN403"Only agent accounts can delete org transfer tokens."Non-agent user
APP_FORBIDDEN403"Transfer token does not belong to this organization."Token/org mismatch
APP_MISSING404"Transfer token not found."Invalid token ID
APP_NOT_ACCEPTED406"Token cannot be deleted."Token already claimed/expired/deleted

Public Token Details (Preview Before Claiming)

GET /current/org/transfer/claim/public/details/

No auth required. IP-rate-limited. Preview transfer token details before claiming.

Rate limits: 15/10s, 100/hr, 500/day (IP-based)

Query parameters

NameTypeRequiredDescription
tokenstringYes64-character transfer token string

curl example

curl -X GET "https://api.fast.io/current/org/transfer/claim/public/details/?token=a1b2c3d4e5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e0f1g2"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "transfer_token": {
      "id": "eA1B2C3D4E5F6G7H8J9K0L1M2N3O4",
      "state": "pending",
      "is_claimable": true,
      "expires": "2026-02-04T12:00:00+00:00",
      "created": "2026-02-01T12:00:00+00:00"
    },
    "org": {
      "id": "1234567890123456789",
      "domain": "my-agent-org",
      "name": "My Agent Org",
      "description": "An org built by an AI agent",
      "logo": null,
      "accent_color": null,
      "closed": false,
      "suspended": false
    },
    "created_by": {
      "id": "9876543210987654321",
      "account_type": "agent",
      "email_address": "agent@example.com",
      "first_name": "Agent",
      "last_name": "Smith"
    }
  }
}

Response fields

FieldTypeDescription
transfer_token.idstringToken identifier
transfer_token.statestring"pending", "claimed", "expired", or "deleted"
transfer_token.is_claimablebooleantrue if the token is pending and not expired
transfer_token.expiresstringISO 8601 expiry timestamp
transfer_token.createdstringISO 8601 creation timestamp
orgobject/nullOrganization info. null if the org has been deleted.
created_byobject/nullAgent creator profile. null if the creator no longer exists.

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"A transfer token is required."Missing token query parameter
APP_ERROR_INPUT_INVALID400"Invalid transfer token format."Token string is not exactly 64 characters
APP_MISSING404"Transfer token not found or invalid."No token matches

Claim Organization

POST /current/org/transfer/claim/

Auth required. Human users only.

Rate limits: 5/min, 10/hour, 30/day

Request parameters

NameTypeRequiredDescription
tokenstringYes64-character transfer token string

curl example

curl -X POST "https://api.fast.io/current/org/transfer/claim/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "token=a1b2c3d4e5f6g7h8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e0f1g2"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "org": {
      "id": "1234567890123456789",
      "domain": "my-agent-org",
      "plan": "free"
    },
    "previous_owner": {
      "id": "9876543210987654321",
      "account_type": "agent"
    },
    "workspaces_transferred": 3
  }
}

Response fields

FieldTypeDescription
org.idstringOrganization profile ID
org.domainstringOrganization domain
org.planstringNew billing plan (typically "free")
previous_owner.idstringPrevious agent owner's user ID
previous_owner.account_typestringAlways "agent"
workspaces_transferredintegerNumber of workspaces whose membership was transferred

What happens during claim

  1. Organization ownership transfers to the human user
  2. Previous agent owner becomes an admin member of the org
  3. Billing plan changes from agent to free (credit-based, no trial period)
  4. All workspaces: human becomes owner, agent becomes admin
  5. Transfer token marked as "claimed"
  6. Free trial period starts from the transfer date

Error responses

Error CodeHTTP StatusMessageCause
APP_AUTH_INVALID401"Authentication required"Missing or invalid token
APP_FORBIDDEN403"Agent accounts cannot claim organizations."Agent user attempted claim
APP_MISSING404"Transfer token not found or invalid."Invalid token string
APP_NOT_ACCEPTED406"This transfer token has expired."Token past expiry
APP_NOT_ACCEPTED406"This transfer token has already been used."Token not pending
APP_NOT_ACCEPTED406"This organization is no longer eligible for transfer."Org not on agent plan

Organization Discovery

List Internal Orgs

GET /current/orgs/list/

Auth required. Lists orgs where the user is a direct member (member: true).

Non-admin/non-owner members only see orgs with active subscriptions; admins and owners always see their orgs.

curl example

curl -X GET "https://api.fast.io/current/orgs/list/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "orgs": [
      {
        "id": "1234567890123456789",
        "domain": "acme-corp",
        "name": "Acme Corporation",
        "description": "Leading provider of innovation",
        "logo": "https://assets.fast.io/org/logo.png",
        "accent_color": "#0066CC",
        "closed": false,
        "suspended": false,
        "subscriber": true,
        "user_status": "joined",
        "member": true
      }
    ]
  }
}

Response fields

FieldTypeDescription
orgsarrayArray of organization objects
orgs[].idstring19-digit numeric organization ID
orgs[].domainstringURL-safe subdomain
orgs[].namestring/nullDisplay name
orgs[].descriptionstring/nullDescription
orgs[].logostring/nullLogo asset URL
orgs[].accent_colorstring/nullBrand color
orgs[].closedbooleanWhether org is closed
orgs[].suspendedbooleanWhether org is suspended
orgs[].subscriberbooleanWhether org has an active subscription
orgs[].user_statusstring"joined" or "available"
orgs[].memberbooleanAlways true for this endpoint

Subscription filtering

User RoleBehavior
OwnerAlways sees the org
AdminAlways sees the org
MemberOnly sees the org if it has an active subscription

List External Orgs

GET /current/orgs/list/external/

Auth required. Lists orgs where the user has access only through workspace membership (member: false).

Rate limits: 250/hr, 3000/day

curl example

curl -X GET "https://api.fast.io/current/orgs/list/external/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "orgs": [
      {
        "id": "1234567890123456780",
        "domain": "partner-corp",
        "name": "Partner Corporation",
        "description": "External partner organization",
        "logo": null,
        "accent_color": "#FF6600",
        "closed": false,
        "suspended": false,
        "subscriber": true,
        "user_status": "available",
        "member": false
      }
    ]
  }
}

Response fields

FieldTypeDescription
orgsarrayArray of external organization objects
orgs[].user_statusstringAlways "available" for external orgs
orgs[].memberbooleanAlways false for this endpoint

List All Orgs

GET /current/orgs/all/

Auth required. Lists all accessible orgs (joined + invited).

curl example

curl -X GET "https://api.fast.io/current/orgs/all/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "orgs": [
      {
        "id": "1234567890123456789",
        "domain": "acme-corp",
        "name": "Acme Corporation",
        "description": "Leading provider of innovation",
        "logo": "https://assets.fast.io/org/logo.png",
        "accent_color": "#0066CC",
        "closed": false,
        "suspended": false,
        "user_status": "joined"
      }
    ]
  }
}

Response fields

FieldTypeDescription
orgs[].user_statusstring"joined" (already a member) or "available" (pending invitation)

List Available Orgs

GET /current/orgs/available/

Auth required. Lists orgs available to join (not yet joined). Excludes orgs the user is already a member of.

curl example

curl -X GET "https://api.fast.io/current/orgs/available/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "orgs": [
      {
        "id": "1234567890123456782",
        "domain": "new-company",
        "name": "New Company",
        "description": "An org you can join",
        "logo": null,
        "accent_color": "#FF6600",
        "closed": false,
        "suspended": false
      }
    ]
  }
}

Check Domain Availability

GET /current/orgs/check/domain/{domain_name}

Auth required. Checks if an org domain name is available for use.

Rate limits: 15/3s, 50/10s, 80/60s, 250/hr, 1000/day

Path parameters

NameTypeRequiredDescription
{domain_name}stringYesThe domain name to check for availability.

curl example

curl -X GET "https://api.fast.io/current/orgs/check/domain/acme-corp" \
  -H "Authorization: Bearer {jwt_token}"

Response (202 Accepted) — domain available

{
  "result": "yes"
}

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid name was supplied."Domain format is invalid
APP_NOT_ACCEPTABLE406"The supplied name is restricted."Domain is reserved
APP_NOT_ACCEPTABLE406"The supplied name is already in use."Domain is taken

List Industries

GET /current/orgs/industries/

Auth required. Returns available industry types for org profiles.

curl example

curl -X GET "https://api.fast.io/current/orgs/industries/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "technology": {
      "title": "Technology",
      "description": "Software, hardware, and IT services"
    },
    "healthcare": {
      "title": "Healthcare",
      "description": "Medical, pharmaceutical, and health services"
    },
    "finance": {
      "title": "Finance",
      "description": "Banking, investment, and financial services"
    },
    "education": {
      "title": "Education",
      "description": "Schools, universities, and training providers"
    }
  }
}

Response fields

FieldTypeDescription
{key}stringMachine-readable industry identifier (use this value in create/update requests)
{key}.titlestringHuman-readable display name
{key}.descriptionstringBrief description of the industry category

Billing

Create or Update Subscription

POST /current/org/{org_id}/billing/

Auth required. Admin or above. Creates or updates the org's billing subscription.

Rate limits: 10/60s, 20/600s, 30/hr

Request parameters

NameTypeRequiredDescription
billing_planstringNoTarget plan ID (must be a valid paid plan, e.g., "pro_monthly", "business_monthly").

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/billing/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "billing_plan=pro_monthly"

Response (201 Created) — new subscription

{
  "result": "yes",
  "response": {
    "subscription": { "...": "..." },
    "customer": { "...": "..." },
    "setup_intent": {
      "id": "seti_xxx",
      "client_secret": "seti_xxx_secret_xxx",
      "status": "requires_payment_method"
    },
    "is_active": false,
    "is_trial_eligible": true,
    "public_key": "pk_xxx"
  }
}

Response (202 Accepted) — subscription updated.

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"An invalid plan was supplied."Plan ID not recognized
APP_ERROR_INPUT_INVALID400"Cannot create subscription for a free plan."Tried to subscribe to free plan
APP_NOT_ACCEPTED406"An error occurred updating your subscription..."Subscription update failed
APP_NOT_ACCEPTED406"An error occurred creating the payment intent..."Intent creation failed

Cancel Subscription

DELETE /current/org/{org_id}/billing/

Auth required. Owner only. Cancels the org's subscription.

Rate limits: 10/60s, 20/600s, 30/hr

curl example

curl -X DELETE "https://api.fast.io/current/org/1234567890123456789/billing/" \
  -H "Authorization: Bearer {jwt_token}"

Response (202 Accepted)

{
  "result": "yes",
  "response": {
    "status": "cancelled",
    "message": "Subscription has been successfully cancelled",
    "closed": false
  }
}

If already cancelled:

{
  "result": "yes",
  "response": {
    "status": "already_cancelled",
    "message": "Subscription is already cancelled"
  }
}

Response fields

FieldTypeDescription
statusstring"cancelled" or "already_cancelled"
messagestringHuman-readable status message
closedbooleanWhether the account was also closed (plan-dependent)

Error responses

Error CodeHTTP StatusMessageCause
APP_MISSING404"No subscription was found to cancel."Org is not a subscriber
APP_ERROR_GENERAL500"Your subscription failed to be canceled..."Cancellation failed

Get Billing Details

GET /current/org/{org_id}/billing/details/

Auth required. Admin or above. Returns subscription/billing details.

Rate limits: 500/600s, 10000/day

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/billing/details/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "subscription": { "...": "..." },
    "customer": { "...": "..." },
    "setup_intent": { "...": "..." },
    "payment_intent": { "...": "..." },
    "is_active": true,
    "is_trial_eligible": false,
    "is_cancelled": false,
    "current_plan": "pro_monthly",
    "previous_plan": null,
    "public_key": "pk_xxx"
  }
}

Response fields

FieldTypeDescription
subscriptionobjectPayment provider subscription details
customerobjectPayment provider customer details
setup_intentobject/nullActive setup intent if exists
payment_intentobject/nullActive payment intent if exists
is_activebooleanWhether subscription is currently active
is_trial_eligiblebooleanWhether org is eligible for a trial
is_cancelledbooleanWhether subscription is cancelled
current_planstring/nullCurrent plan ID
previous_planstring/nullPrevious plan ID (if changed)
public_keystringPayment provider publishable key

Get Credit Usage

GET /current/org/{org_id}/billing/usage/limits/credits/

Auth required. Admin or above. Returns credit consumption and limits.

Rate limits: 500/60s, 20000/day

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/billing/usage/limits/credits/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": true,
  "credit_limits_enabled": true,
  "free_org_mode": true,
  "org_id": "1234567890123456789",
  "plan": "free",
  "over_limit": false,
  "usage": {
    "credits_used": 1200,
    "credit_limit": 10000,
    "credits_remaining": 8800,
    "usage_percentage": 12.0
  },
  "period": {
    "start": "2025-01-15T10:00:00+00:00",
    "end": "2025-02-14T10:00:00+00:00",
    "days_total": 30,
    "days_elapsed": 10,
    "days_remaining": 20
  },
  "renewal": {
    "interval_days": 30,
    "next_renewal": "2025-02-14T10:00:00+00:00"
  },
  "trial": null
}

Response fields

FieldTypeDescription
credit_limits_enabledbooleanWhether the plan enforces credit limits
free_org_modebooleantrue for free orgs (reductive model)
over_limitbooleanWhether the org has exceeded its credit limit
usage.credits_usedintegerCredits consumed in the current period
usage.credit_limitintegerTotal credits available per period
usage.credits_remainingintegerCredits remaining in the current period
usage.usage_percentagenumberPercentage of credits used
period.startstringISO 8601 start of the current billing period
period.endstringISO 8601 end of the current billing period
period.days_totalintegerTotal days in the period
period.days_elapsedintegerDays elapsed since period start
period.days_remainingintegerDays remaining until renewal
renewal.interval_daysintegerDays between credit renewals
renewal.next_renewalstring/nullISO 8601 timestamp when credits renew next
run_rateobject/nullUsage rate projections (shown after 25% of period or credits used)
trialobject/nullTrial info if applicable

Credit costs: storage (100/GB), bandwidth (212/GB), AI tokens (1/100 tokens), document ingestion (10/page), video ingestion (5/sec), image ingestion (5/image), file conversions (25/each).


List Billable Members

GET /current/org/{org_id}/billing/usage/members/list/

Auth required. Admin or above. Paginated.

Rate limits: 1/2s, 2/10s, 5/60s, 15/hr, 50/day

Query parameters

NameTypeDefaultDescription
limitinteger1001-500
offsetinteger0Items to skip

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/billing/usage/members/list/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "billable_members": [
      {
        "id": "1234567890123456789",
        "account_type": "human",
        "email_address": "user@example.com",
        "parents": {
          "9876543210987654321": {
            "permission": "member",
            "date_joined": "2024-01-15 10:30:00"
          }
        }
      }
    ]
  }
}

Response fields

FieldTypeDescription
billable_membersarrayArray of billable member objects
billable_members[].idstring19-digit user ID
billable_members[].account_typestring"human" or "agent"
billable_members[].email_addressstringUser's email
billable_members[].parentsobjectMap of workspace IDs to membership details

Get Usage Meters

GET /current/org/{org_id}/billing/usage/meters/list/

Auth required. Admin or above. Returns detailed usage breakdown by meter.

Rate limits: 30/3s, 80/10s, 200/60s, 600/hr, 12000/day

Query parameters

NameTypeRequiredDefaultDescription
meterstringYesMeter type (e.g., "storage_bytes", "bandwidth_bytes", "ai_tokens")
start_timestring (datetime)No30 days agoStart of time range
end_timestring (datetime)NoNowEnd of time range
workspace_idstringNoFilter by workspace (19-digit ID)
share_idstringNoFilter by share (19-digit ID)

Only one of workspace_id or share_id can be specified at a time.

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/billing/usage/meters/list/?meter=storage_bytes&start_time=2024-01-01+00:00:00&end_time=2024-01-31+23:59:59" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "usage": {
      "meter": "storage_bytes",
      "total": 1073741824,
      "cost": 0.50,
      "credits": 500,
      "start_time": "2024-01-01 00:00:00 UTC",
      "end_time": "2024-01-31 23:59:59 UTC",
      "interval_hours": 24,
      "workspace_id": null,
      "share_id": null,
      "data_points": [
        {
          "start_time": "2024-01-01 00:00:00 UTC",
          "end_time": "2024-01-02 00:00:00 UTC",
          "value": 536870912,
          "cost": 0.25,
          "credits": 250
        }
      ]
    }
  }
}

Response fields

FieldTypeDescription
usage.meterstringThe meter type queried
usage.totalnumberTotal usage value for the period
usage.costnumberTotal cost in USD
usage.creditsnumber/nullTotal credits consumed (null for direct-billed meters)
usage.start_timestringStart of the queried range
usage.end_timestringEnd of the queried range
usage.interval_hoursintegerHours per data point (auto-calculated, max 30 points)
usage.data_pointsarrayTime-series data with value, cost, and credits per interval

Error responses

Error CodeHTTP StatusMessageCause
APP_ERROR_INPUT_INVALID400"Must be one of the valid meter types"Invalid meter type
APP_ERROR_INPUT_INVALID400"Only one of workspace_id or share_id can be specified."Both filters provided
APP_ERROR_INPUT_INVALID400"Start time must be before end time."Invalid time range
APP_ERROR_INPUT_INVALID400"Time range must be at least 1 day."Range too short
APP_INTERNAL_ERROR500"Failed to retrieve usage data."Database query failed

List Available Plans

GET /current/org/billing/plan/list/

Auth required. Returns available billing plans. Filtered by account type.

Agents cannot subscribe to human plans.

curl example

curl -X GET "https://api.fast.io/current/org/billing/plan/list/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "results": 3,
    "defaults": {
      "pro": "pro_monthly",
      "business": "business_monthly"
    },
    "plans": [
      {
        "id": "free",
        "name": "Free",
        "category": "free",
        "amount": 0
      },
      {
        "id": "pro_monthly",
        "name": "Pro",
        "category": "pro",
        "amount": 2900
      },
      {
        "id": "business_monthly",
        "name": "Business",
        "category": "business",
        "amount": 4900
      }
    ]
  }
}

Response fields

FieldTypeDescription
resultsintegerNumber of available plans
defaultsobjectDefault plan IDs per category (pro, business)
plansarrayArray of plan detail objects
plans[].idstringPlan identifier (use in subscription requests)
plans[].namestringDisplay name
plans[].categorystringPlan category: "free", "pro", "business", "agent"
plans[].amountintegerPrice in cents (e.g., 2900 = $29.00)

Create Workspace (from Org)

POST /current/org/{org_id}/create/workspace/

Auth required. Member or above. Creates a workspace within the org. Subject to plan feature availability and workspace creation limits.

Rate limits: 1/3s, 2/10s, 5/60s, 20/hr, 100/day

Request parameters

NameTypeRequiredDescription
folder_namestringYesURL-safe folder name for the workspace. Must be unique within the org.
namestringYesDisplay name.
descriptionstringNoWorkspace description.
perm_joinstringYesWho can auto-join from the org. Values: 'Member or above' (default), 'Admin or above', 'Only Org Owners'.
perm_member_managestringYesWho can manage workspace members. Values: 'Member or above' (default), 'Admin or above'.
intelligencestringYes (non-agents)Enable AI features ("true"/"false"). Defaults to "true" for agent accounts.
accent_colorstring (JSON)NoAccent color as JSON.
background_color1string (JSON)NoPrimary background color as JSON.
background_color2string (JSON)NoSecondary background color as JSON.

curl example

curl -X POST "https://api.fast.io/current/org/1234567890123456789/create/workspace/" \
  -H "Authorization: Bearer {jwt_token}" \
  -d "folder_name=project-alpha" \
  -d "name=Project Alpha" \
  -d "perm_join=Member or above" \
  -d "perm_member_manage=Admin or above" \
  -d "intelligence=true"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "workspace": {
      "id": "1234567890123456780",
      "folder_name": "project-alpha"
    }
  }
}

Response fields

FieldTypeDescription
workspace.idstring19-digit numeric workspace ID
workspace.folder_namestringURL-safe folder name

Error responses

Error CodeHTTP StatusMessageCause
APP_FEATURE_LIMIT403"Workspace creation is not available on your current plan."Feature disabled
APP_FEATURE_LIMIT403"You have reached your workspace creation limit."Limit exceeded
APP_NOT_ACCEPTABLE406"The supplied workspace folder name is already in use."Duplicate folder name
APP_ERROR_INPUT_INVALID400"An invalid workspace folder name was supplied."Invalid folder name
APP_ERROR_INPUT_INVALID400"An invalid configuration was supplied..."Metadata validation failed

List Workspaces in Org

GET /current/org/{org_id}/list/workspaces/

Auth required. Lists accessible workspaces within the org.

Rate limits: Org members: 500/hr, 5000/day. External users: 100/hr, 500/day.

Query parameters

NameTypeDefaultDescription
archivedstring"false""true" to show archived workspaces, "false" for active

Access levels

RoleAccessNotes
OwnerFull accessSees all workspaces
AdminFull accessSees all workspaces
MemberFilteredSees workspaces matching join permission level
ExternalFilteredSees only workspaces where they are a direct member

curl example

curl -X GET "https://api.fast.io/current/org/1234567890123456789/list/workspaces/" \
  -H "Authorization: Bearer {jwt_token}"

Response (200 OK)

{
  "result": "yes",
  "response": {
    "workspaces": [
      {
        "id": "1234567890123456780",
        "folder_name": "project-alpha",
        "name": "Project Alpha",
        "description": "Main project workspace"
      }
    ]
  }
}

Response fields

FieldTypeDescription
workspacesarrayArray of workspace objects
workspaces[].idstring19-digit numeric workspace ID
workspaces[].folder_namestringURL-safe folder name
workspaces[].namestringDisplay name
workspaces[].descriptionstring/nullWorkspace description
↑ Back to top