POST request to https://app.beebole.com/graphql with your API key in the apikey HTTP header.
Queries never change data. To create, update, archive, or delete records, use Mutations instead. For authentication setup, see the API introduction.
id (not _id), and the organisation-level query is spelled currentOrganisation (British spelling, as in the schema).
Beebole queries are the read operations of the Beebole GraphQL API. They return data from your account — your organization, people, projects, tasks, tags, time records, and expenses — without modifying anything. Every query is sent as a POST request to https://app.beebole.com/graphql with your API key in the apikey HTTP header.
Queries never change data. To create, update, archive, or delete records, use Mutations instead. For authentication setup, see the API introduction.
id (not _id), and the organization-level query is spelled currentOrganisation (British spelling, as in the schema).
Organisation
Read account-level data withcurrentOrganisation and getAuditTrails.
| Query | Arguments | Returns |
|---|---|---|
currentOrganisation | none | The organisation linked to the authenticated API key |
getAuditTrails | startTime, fromPersonId, operations, argumentMatch, responseMatch | Audit trail entries for the organisation |
getAuditTrails returns mutations performed in the account. With no startTime, it covers the last seven days; startTime selects a different seven-day window.
Organization
Read account-level data withcurrentOrganisation and getAuditTrails.
| Query | Arguments | Returns |
|---|---|---|
currentOrganisation | none | The organization linked to the authenticated API key |
getAuditTrails | startTime, fromPersonId, operations, argumentMatch, responseMatch | Audit trail entries for the organization |
getAuditTrails returns mutations performed in the account. With no startTime, it covers the last seven days; startTime selects a different seven-day window.
People
Read team members withcurrentPerson, getPerson, getPersons, countPersons, and filterPersonIds. getPotentialProjectOwners lists the people allowed to own a given project.
Read team members with currentPerson, getPerson, getPersons, countPersons, and filterPersonIds. getPotentialProjectOwners lists the people allowed to own a given project.
| Query | Arguments | Returns |
|---|---|---|
currentPerson | none | The person linked to the API key |
getPerson | id | A single person |
getPersons | filter, archived | A list of people |
countPersons | filter, archived | The number of matching people |
filterPersonIds | filter, archived | Only the IDs of matching people |
getPotentialProjectOwners | projectId | People eligible to own the project |
getPersons returns only active people. Pass archived: true to include archived ones.
getPersons returns only active people. Pass archived: true to include archived ones.
Projects
Read projects withgetProject, getProjects, countProjects, and filterProjectIds. getProjectCategories lists the top-level groupings projects are organised into.
Read projects with getProject, getProjects, countProjects, and filterProjectIds. getProjectCategories lists the top-level groupings projects are organised into.
| Query | Arguments | Returns |
|---|---|---|
getProject | id | A single project |
getProjects | filter, archived, categoryId | A list of projects |
countProjects | filter, archived, categoryId | The number of matching projects |
filterProjectIds | filter, archived, categoryId | Only the IDs of matching projects |
getProjectCategories | none | All project categories |
level field is the project’s depth in the hierarchy, where 0 is a top-level project. Restrict results to one category with categoryId:
level field is the project’s depth in the hierarchy, where 0 is a top-level project. Restrict results to one category with categoryId:
Tasks
Read tasks withgetTask, getTasks, countTasks, and filterTaskIds. getTaskCategories lists the categories (boards) tasks belong to.
Read tasks with getTask, getTasks, countTasks, and filterTaskIds. getTaskCategories lists the categories (boards) tasks belong to.
| Query | Arguments | Returns |
|---|---|---|
getTask | id | A single task |
getTasks | filter, archived, categoryId | A list of tasks |
countTasks | filter, archived, categoryId | The number of matching tasks |
filterTaskIds | filter, archived, categoryId | Only the IDs of matching tasks |
getTaskCategories | none | All task categories |
Tags
Read tags withgetTag, getTags, countTags, and filterTagIds. getTagCategories lists the categories tags are grouped into.
| Query | Arguments | Returns |
|---|---|---|
getTag | id | A single tag |
getTags | filter, archived, categoryId | A list of tags |
countTags | filter, archived, categoryId | The number of matching tags |
filterTagIds | filter, archived, categoryId | Only the IDs of matching tags |
getTagCategories | none | All tag categories |
Tags
Read tags withgetTag, getTags, countTags, and filterTagIds. getTagCategories lists the categories tags are grouped into.
| Query | Arguments | Returns |
|---|---|---|
getTag | id | A single tag |
getTags | filter, archived, categoryId | A list of tags |
countTags | filter, archived, categoryId | The number of matching tags |
filterTagIds | filter, archived, categoryId | Only the IDs of matching tags |
getTagCategories | none | All tag categories |
Time records
A time record is a logged time entry for one person on a specific day, linked to projects, a task, or an absence type. Read them withgetTimeRecord, getTimeRecords, and countTimeRecords. getAbsenceConsumed returns how much of an absence type a person has used in a window.
| Query | Arguments | Returns |
|---|---|---|
getTimeRecord | id | A single time record |
getTimeRecords | startTime, endTime, time, absence, wfh, filter | A list of time records |
countTimeRecords | startTime, endTime, time, absence, wfh, filter | The number of matching time records |
getAbsenceConsumed | personId, absenceId, startTime, endTime | Absence consumed in the window, in the type’s unit |
getTimeRecords and countTimeRecords accept top-level arguments alongside filter:
startTime/endTime— Unix timestamps in milliseconds bounding the period.time— whentrue, return only worked time (entries without an absence type).absence— whentrue, return only absence entries (entries with an absence type).wfh— whentrue, return only entries logged as working from home.filter— a typed filter array (see Filtering results).
person, projects, task, and absence fields resolve the related entities inline.
Expense records
An expense record is an expense logged by a person against a project and an expense type. Read them withgetExpenseRecord and getExpenseRecords.
| Query | Arguments | Returns |
|---|---|---|
getExpenseRecord | id | A single expense record |
getExpenseRecords | startTime, endTime, filter | A list of expense records |
Absence types
Absence types are the kinds of leave people can log against, such as vacation or sick leave. Read them withgetAbsenceType, getAbsenceTypes, and countAbsenceTypes.
| Query | Arguments | Returns |
|---|---|---|
getAbsenceType | id | A single absence type |
getAbsenceTypes | filter, archived | A list of absence types |
countAbsenceTypes | filter, archived | The number of matching absence types |
Filtering results
Thefilter argument is a list of typed input objects — not a list of field/value pairs. Each entity has its own filter input type, such as BeeboleTimeRecordFilter, BeebolePersonFilter, or BeeboleProjectFilter. You set the named fields you want to match directly on each object.
A time record is a logged time entry for one person on a specific day, linked to projects, a task, or an absence type. Read them with getTimeRecord, getTimeRecords, and countTimeRecords. getAbsenceConsumed returns how much of an absence type a person has used in a window.
| Query | Arguments | Returns |
|---|---|---|
getTimeRecord | id | A single time record |
getTimeRecords | startTime, endTime, time, absence, wfh, filter | A list of time records |
countTimeRecords | startTime, endTime, time, absence, wfh, filter | The number of matching time records |
getAbsenceConsumed | personId, absenceId, startTime, endTime | Absence consumed in the window, in the type’s unit |
getTimeRecords and countTimeRecords accept top-level arguments alongside filter:
startTime/endTime— Unix timestamps in milliseconds bounding the period.time— whentrue, return only worked time (entries without an absence type).absence— whentrue, return only absence entries (entries with an absence type).wfh— whentrue, return only entries logged as working from home.filter— a typed filter array (see Filtering results).
duration is an integer in milliseconds. startTime and endTime are BeeboleTime objects — select their subfields ts (a Unix timestamp in milliseconds) and iso (an ISO 8601 string). The person, projects, task, and absence fields resolve the related entities inline.
Expense records
An expense record is an expense logged by a person against a project and an expense type. Read them withgetExpenseRecord and getExpenseRecords.
| Query | Arguments | Returns |
|---|---|---|
getExpenseRecord | id | A single expense record |
getExpenseRecords | startTime, endTime, filter | A list of expense records |
date is a BeeboleTime object (ts in milliseconds, iso as an ISO 8601 string). amount is an object with value (an integer in the currency’s smallest unit) and currency.
Absence types
Absence types are the kinds of leave people can log against, such as vacation or sick leave. Read them withgetAbsenceType, getAbsenceTypes, and countAbsenceTypes.
| Query | Arguments | Returns |
|---|---|---|
getAbsenceType | id | A single absence type |
getAbsenceTypes | filter, archived | A list of absence types |
countAbsenceTypes | filter, archived | The number of matching absence types |
Filtering results
Thefilter argument is a list of typed input objects — not a list of field/value pairs. Each entity has its own filter input type, such as BeeboleTimeRecordFilter, BeebolePersonFilter, or BeeboleProjectFilter. You set the named fields you want to match directly on each object.
following value of AND or OR to chain one condition to the next:
Time record filter fields
BeeboleTimeRecordFilter accepts these fields (each optional):
| Field | Type | Matches |
|---|---|---|
id / notId | ID | A specific time record, or all but one |
personId / notPersonId | ID | Records for (or excluding) one person |
personIds | [ID] | Records for any of several people |
startTime / endTime | Timestamp | Records starting after / ending before a millisecond timestamp |
projectIds / notProjectIds | [ID] | Records on (or excluding) projects, including their sub-projects |
taskIds / notTaskIds | [ID] | Records on (or excluding) tasks |
projectTagIds / projectNotTagIds | [ID] | Records whose projects carry (or lack) given tags |
personTagIds / personNotTagIds | [ID] | Records whose person carries (or lacks) given tags |
projectCategoryIds / notProjectCategoryIds | [ID] | Records by project category |
taskCategoryIds / notTaskCategoryIds | [ID] | Records by task category |
isAbsence | Boolean | Whether the record is an absence |
following | AND / OR | Logical operator chaining this condition to the next |
BeebolePersonFilter supports roleId, tagIds, and name (a case-insensitive match), while BeeboleProjectFilter supports categoryId, managedById, and subProjectId. Browse every filter type and its fields in the Schema explorer.
Each object in the array should set a single matching field. To combine conditions, add a following value of AND or OR to chain one condition to the next:
Time record filter fields
BeeboleTimeRecordFilter accepts these fields (each optional):
| Field | Type | Matches |
|---|---|---|
id / notId | ID | A specific time record, or all but one |
personId / notPersonId | ID | Records for (or excluding) one person |
personIds | [ID] | Records for any of several people |
startTime / endTime | Timestamp | Records starting after / ending before a millisecond timestamp |
projectIds / notProjectIds | [ID] | Records on (or excluding) projects, including their subprojects |
taskIds / notTaskIds | [ID] | Records on (or excluding) tasks |
projectTagIds / projectNotTagIds | [ID] | Records whose projects carry (or lack) given tags |
personTagIds / personNotTagIds | [ID] | Records whose person carries (or lacks) given tags |
projectCategoryIds / notProjectCategoryIds | [ID] | Records by project category |
taskCategoryIds / notTaskCategoryIds | [ID] | Records by task category |
isAbsence | Boolean | Whether the record is an absence |
following | AND / OR | Logical operator chaining this condition to the next |
BeebolePersonFilter supports roleId, tagIds, and name (a case-insensitive match), while BeeboleProjectFilter supports categoryId, managedById, and subProjectId. Browse every filter type and its fields in the Schema explorer.
Counting and ID-only queries
For each major entity, alongside the fullget… query you also get a counterpart that returns just a count, and (for people, projects, tasks, and tags) one that returns only matching IDs.
count…queries (countPersons,countProjects,countTasks,countTags,countTimeRecords,countAbsenceTypes) return an integer. Use them to size a result set before fetching it.filter…Idsqueries (filterPersonIds,filterProjectIds,filterTaskIds,filterTagIds) return an array of IDs instead of full objects, which is lighter when you only need identifiers.
The Beebole query API has no pagination — there are no
limit, offset, first, or cursor arguments. A list query returns every record that matches its arguments. Narrow large result sets with filter, the startTime / endTime window, or categoryId, and use a count… query first to gauge the size.Counting and ID-only queries
For each major entity, alongside the fullget… query you also get a counterpart that returns just a count, and (for people, projects, tasks, and tags) one that returns only matching IDs.
count…queries (countPersons,countProjects,countTasks,countTags,countTimeRecords,countAbsenceTypes) return an integer. Use them to size a result set before fetching it.filter…Idsqueries (filterPersonIds,filterProjectIds,filterTaskIds,filterTagIds) return an array of IDs instead of full objects, which is lighter when you only need identifiers.
The Beebole query API has no pagination — there are no
limit, offset, first, or cursor arguments. A list query returns every record that matches its arguments. Narrow large result sets with filter, the startTime / endTime window, or categoryId, and use a count… query first to gauge the size.Related content
API Introduction
Authenticate with an API key and send your first request.
Mutations
The write operations that create, update, archive, and delete records.
Schema explorer
Browse every query, type, field, and filter input interactively.