The workspaces the key reaches
const url = 'https://api.facteur.eu/v1/workspaces';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.facteur.eu/v1/workspaces \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The workspaces, and whether this caller may create more.
object
object
How every other route addresses this workspace. The internal id never leaves.
The workspace every member of the organization reaches without being added to it.
Null on the default workspace, which has no member rows because everyone is in it.
The ceilings in force. monthly.messages always carries the figure being
enforced, whether the customer wrote a number or a share of the plan, so
an interface renders it without knowing which. percent is present only
when a share is how it was written.
object
Messages accepted per day, or null for no daily ceiling.
object
The ceiling being enforced. Null next to a percent means the
plan sells no monthly envelope for that share to apply to, so the
rule holds nothing back — shown rather than hidden.
Present only when the ceiling was written as a share of the plan.
What happens to mail past the ceiling.
Whether this caller may create, rename or configure a workspace.
Examplegenerated
{ "workspaces": [ { "slug": "example", "name": "example", "createdAt": "2026-04-15T12:00:00Z", "isDefault": true, "tag": "example", "color": "example", "inboxCount": 1, "memberCount": 1, "messagesThisMonth": 1, "canManage": true, "quota": { "daily": 1, "monthly": { "messages": 1, "percent": 1 }, "onExceed": "example" } } ], "canManage": true}No usable credential. UNAUTHENTICATED when none was presented,
KEY_UNKNOWN, KEY_REVOKED or KEY_EXPIRED when a key was — kept
distinct on purpose, because “mint a new one” and “somebody took this
away from you” are different facts to whoever is reading a red pipeline.
Every failure has this shape. Branch on error.code; error.message is
written for a human and is in French today.
object
object
The stable, machine-readable reason.
A sentence for whoever is reading the failure. Not part of the contract.
Example
{ "error": { "code": "SCOPE_INSUFFICIENT" }}SCOPE_INSUFFICIENT (the message names the scope this request wanted and
the ones the key holds), KEY_CANNOT_REACH (no scope opens this route to
a key at all), FORBIDDEN, or one of the stated refusals listed under
x-api-key-refusals.
Every failure has this shape. Branch on error.code; error.message is
written for a human and is in French today.
object
object
The stable, machine-readable reason.
A sentence for whoever is reading the failure. Not part of the contract.
Example
{ "error": { "code": "SCOPE_INSUFFICIENT" }}