Workspace
Many v3 requests refer to things by name rather than by key: a task is assigned to Priya Patel or to the Finance Team group, a checklist is tagged urgent, a Linked Checklist field in a template document names the Supplier Onboarding template. Every one of those names is resolved against what your workspace actually contains, and a name that matches nothing is refused.
GET /v3/workspace is where those names come from. It returns, in one call, every member and group that can be assigned work, every tag, every template and the time zone the request's dates are read in. Read it before you send names — especially before you compose a template document — rather than guessing at a spelling that looks right.
It is built by the same read that template writes use to resolve names, so a name in this response is a name that resolves. It is the companion to the schema routes: those say what a document may contain, this says what it may name.
To check which workspace a key belongs to and who it acts as, use GET /v3/auth/test instead.
Endpoints
| Method | Path | Description | MCP tool |
|---|---|---|---|
GET | /v3/workspace | Get the workspace | get_workspace_info |
The Workspace Object
| Field | Type | Description |
|---|---|---|
teamId | string (GUID) | Your workspace's key — the same value GET /v3/auth/test reports. |
teamName | string | Your workspace's name. |
region | string | US or EU — the region your workspace's data is stored in. |
timeZone | string | The time zone a date with no zone of its own is read in when a template is written, and in which due date times of day and due date scenarios are computed. See Time Zone. |
members | array of member | Everybody a request or document can name as a person. |
groups | array of group | Every group, which can be named anywhere a person can. |
tags | array of string | Every tag name in the workspace. |
templates | array of template | Every template, including archived ones. |
{
"teamId": "6c1d2f0a-93b4-4e7d-a8f2-51c0de7b9a33",
"teamName": "Acme Corp",
"region": "US",
"timeZone": "Europe/London",
"members": [
{
"id": 1043,
"type": "TeamMember",
"name": "James Okafor",
"firstName": "James",
"lastName": "Okafor",
"email": "james.okafor@acme.example",
"role": "Member",
"isActive": true
},
{
"id": 1044,
"type": "TeamMember",
"name": "Priya Patel",
"firstName": "Priya",
"lastName": "Patel",
"email": "priya.patel@acme.example",
"role": "Member",
"isActive": true
},
{
"id": 1042,
"type": "TeamMember",
"name": "Sarah Chen",
"firstName": "Sarah",
"lastName": "Chen",
"email": "sarah.chen@acme.example",
"role": "Administrator",
"isActive": true
}
],
"groups": [
{
"id": 12,
"type": "Group",
"name": "Finance Team"
}
],
"tags": ["q3-audit", "urgent"],
"templates": [
{ "key": "8a1e4c7d-2b9f-4d3a-b6e8-5f0c1a2d9e47", "name": "Employee Onboarding" },
{ "key": "3f2b8c1e-7a4d-4e5b-9c61-2d8f0a7b6e14", "name": "Invoice Review" },
{ "key": "c47d9e2a-6f13-4b8e-a052-9d1e7f3b6c28", "name": "Supplier Onboarding" }
]
}
Members
Each entry has the same shape as the Member object on the Members and Groups page.
| Field | Type | Description |
|---|---|---|
id | integer | The member's id. |
type | string | Always TeamMember. |
name | string | The member's full name — the text a name in a request is matched against. Absent for a member recorded with a surname and no first name. |
firstName | string | The member's first name. Absent when there is none. |
lastName | string | The member's surname. Absent when there is none. |
email | string | The member's email address, which is unique in the workspace. |
role | string | Administrator, Member or Guest. |
isActive | boolean | Always true here, because deactivated members are not listed. |
The list includes Guests and leaves out deactivated members — exactly the set that assignees and mentions are resolved against. The workspace's anonymous member, which carries unattributed work, is never listed.
Groups
| Field | Type | Description |
|---|---|---|
id | integer | The group's id. |
type | string | Always Group. |
name | string | The group's name. |
Member ids and group ids come from different tables, so member 12 and group 12 are two different assignees. That is why every entry carries its type, and why a request that names an assignee by id must give the type as well.
Templates
| Field | Type | Description |
|---|---|---|
key | string (GUID) | The template's key, as the Templates routes take it. |
name | string | The template's current name — its latest version's — which is what a Linked Checklist field's templateName is matched against. |
Archived templates are included, because a template document may still link to one. Two templates with the same name are listed as two entries; a document that names that name is refused rather than pointed at either of them.
Get the Workspace
Returns every member, group, tag and template the workspace has, and the time zone this request's dates are read in.
GET /v3/workspace
Parameters
This endpoint takes no parameters.
Example
GET https://api.checkflow.io/v3/workspace
X-API-KEY: your-api-key-here
HTTP/1.1 200 OK
The body is a Workspace object.
Responses
| Status | Code | When |
|---|---|---|
200 | — | Always, for a valid key. |
Notes
- The response is not paged. The whole workspace comes back in one response, because the question it answers is whether a name exists, and a name missing from one page could not be read as the name not existing.
- Any key can call it, including a key that acts as the workspace.
- It is charged to the
standardrate limit budget.
Using the Names
| To send | Use | Matched |
|---|---|---|
| A person | members[].name or members[].email, or { "type": "TeamMember", "id": 1042 } | Name or email, case-insensitively |
| A group | groups[].name, or { "type": "Group", "id": 12 } | Name, case-insensitively |
| A tag | An entry of tags | Case-insensitively — see Tag Names |
| A template in a Linked Checklist field | templates[].name | By the template's current name |
- Prefer the email address for people. It is always present and always unique. A name is absent for a member recorded with a surname only, and two people can share a name — a name that matches more than one member or group is refused, and you must name the one you mean by type and id.
- A tag name that is not in the list is not an error. Tagging is how tags are created, so sending a new name coins a new tag rather than failing. Check
tagsfirst so that you reuseurgentrather than creatingUrgent!beside it. - Re-read the workspace rather than holding it for a long time. People join and leave, tags are created by use and templates are published.
Data Sets and Library folders are not in this response. To link a field to a Data Set, find it with GET /v3/data-sets and read the one you want for its views and fields.
Time Zone
timeZone is the time zone of the member the key acts as — the zone they chose on their profile — or the zone named in the request's X-CF-Timezone header when it sends one. A key that acts as the workspace reads as UTC unless the header names a zone. See Time Zones.
When you create or version a template, this is the zone its dates are read in unless the document's settings.timeZone names another, and it is the zone in which a due date's time of day and every due date scenario are computed.
If your integration assumes UTC but the acting member's zone is, say, America/New_York, a due date rule such as "next day, 9 am" falls at 9 am New York time. Read timeZone before authoring, or set settings.timeZone in the document.
MCP Equivalent
The MCP tool get_workspace_info returns the same object and takes no arguments. The MCP server tells agents to call it before sending any member, group, tag or template name. See Workspace Tools.
Related Pages
- Members and Groups — searchable, paged lists of the same people and groups, and each group's members.
- Tags — the tag list with usage counts, and the rules for tag names.
- Template Documents — where the names from this response are used.
- Authentication — check which workspace a key belongs to and who it acts as.