Skip to main content
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, expenses, timesheet approvals, and custom fields — 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.
Field names follow GraphQL conventions exactly as defined in the schema. Every entity exposes its identifier as id (not _id), and the organization-level query is spelled currentOrganisation (British spelling, as in the schema).

Organization

Read account-level data with currentOrganisation and getAuditTrails.
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 with currentPerson, getPerson, getPersons, countPersons, and filterPersonIds. getPotentialProjectOwners lists the people allowed to own a given project.
By default getPersons returns only active people. Pass archived: true to include archived ones.

Projects

Read projects with getProject, getProjects, countProjects, and filterProjectIds. getProjectCategories lists the top-level groupings projects are organised into.
The 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 with getTask, getTasks, countTasks, and filterTaskIds. getTaskCategories lists the categories (boards) tasks belong to.

Tags

Read tags with getTag, getTags, countTags, and filterTagIds. getTagCategories lists the categories tags are grouped into.

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 with getTimeRecord, getTimeRecords, and countTimeRecords. getAbsenceConsumed returns how much of an absence type a person has used in a window. getTimeRecords and countTimeRecords accept top-level arguments alongside filter:
  • startTime / endTime — Unix timestamps in milliseconds bounding the period.
  • time — when true, return only worked time (entries without an absence type).
  • absence — when true, return only absence entries (entries with an absence type).
  • wfh — when true, 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.

Timesheets and approvals

A timesheet is one person’s time records over one timesheet period, and its approval status — draft, submitted, approved, or rejected — belongs to the period, not to the individual records. Time records carry no status field, so getTimeRecords has no status filter. Read approval data with these queries instead: The status field on approval states and events uses one-letter codes: d (draft), s (submitted), a (approved), and r (rejected).

List timesheets awaiting approval

Check whether a period is still a draft

A period nobody has submitted yet returns status: "d". To find every draft in a team, call getTeamApprovalStates with the team’s personIds and keep the entries whose status is d. The submitId of a submitted period is what approveTimesheet and rejectTimesheet expect — see Mutations.

Expense records

An expense record is an expense logged by a person against a project and an expense type. Read them with getExpenseRecord and getExpenseRecords.
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 with getAbsenceType, getAbsenceTypes, and countAbsenceTypes.

Custom fields

Custom field definitions and the values stored on records are separate entities. Read definitions with getCustomField, getCustomFields, and countCustomFields; read values with getCustomFieldValue, getCustomFieldValues, and countCustomFieldValues. A value’s entityType is one of Person, Project, Task, Tag, TimeRecord, or AbsenceType, and entityId is the record it sits on. The value itself lives in the field matching the definition’s fieldType: textValue, numberValue, dateValue, dateTimeValue, urlValue, or booleanValue. The person, project, task, tag, timeRecord, and absenceType fields resolve the owning record inline — only the one matching entityType is set.

Look up records by an external identifier

Beebole has no built-in external ID attribute: an identifier from another system lives in a text custom field (a migrated legacy account gets one named External ID). The value filter matches on customFieldId, entityType, and entityId — not on the value itself — so fetch the field’s values once and match them on your side:
Pick the row whose textValue equals your identifier; its entityId — and the resolved person — is the Beebole record. To read the values on one known record instead, filter by entityType and entityId. Writing values is covered under Custom fields on the Mutations page.

Filtering results

The filter 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.
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):

Other filter types

Every other entity exposes a filter input tuned to its own fields. All fields are optional, name is a case-insensitive match, and following chains conditions the same way. For example, the projects a person manages — the same scope a manager sees in the Budget Status report:
Browse every filter type and its fields in the Schema explorer.

Counting and ID-only queries

For each major entity, alongside the full get… 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, countCustomFields, countCustomFieldValues) return an integer. Use them to size a result set before fetching it.
  • filter…Ids queries (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.

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.