POST request to https://app.beebole.com/graphql with your key in the apikey HTTP header (see Introduction).
Each mutation returns the affected object so you can read back fields in the same request. Object IDs are exposed as id (not _id). For read-only operations, see Queries.
Time durations in Beebole are expressed in milliseconds. To log 2 hours, pass
7200000 (2 × 60 × 60 × 1000), not 120.Time records
A time record is one logged entry for a person on a given day, linked to projects, a task, or an absence type. Durations are in milliseconds.| Mutation | Key arguments |
|---|---|
addTimeRecord | startTime, duration, personId, optional endTime, taskId, absenceId, projectIds |
editTimeRecordStartTime | id, startTime |
editTimeRecordEndTime | id, endTime |
editTimeRecordDuration | id, duration (milliseconds) |
editTimeRecordProjects | id, projectIds |
editTimeRecordTask | id, taskId |
editTimeRecordAbsence | id, absenceId |
editTimeRecordComment | id, comment |
editTimeRecordNonBillable | id, nonBillable |
editTimeRecordWfh | id, wfh |
deleteTimeRecords | ids (array) |
cloneTimeRecords | personId, sourceStartTime, sourceEndTime, targetStartTime, targetEndTime, optional replaceExisting |
startTime and endTime are Unix timestamps in milliseconds. duration is an integer count of milliseconds.
Log a time entry
This logs 2 hours (7200000 milliseconds) for a person against a task:
Clone a week of time records
cloneTimeRecords copies a person’s entries from a source period to a target period. Set replaceExisting: true to clear the target period first.
Expense records
An expense record is an actual expense logged against a person and/or a project. The amount is sent asvalue with an optional currency; if you omit the currency, Beebole uses the person’s or organization’s default.
| Mutation | Key arguments |
|---|---|
addExpenseRecord | date, expenseTypeId, value, optional currency, personId, projectId, comment |
deleteExpenseRecord | id |
editExpenseRecordDate | id, date |
editExpenseRecordExpense | id, expenseTypeId |
editExpenseRecordPerson | id, personId (null to remove) |
editExpenseRecordProject | id, projectId (null to remove) |
editExpenseRecordAmountValue | id, value |
editExpenseRecordAmountCurrency | id, currency |
editExpenseRecordComment | id, comment |
At least one of
personId or projectId is required on addExpenseRecord — both are otherwise optional.Log an expense
Timesheets and approvals
The approval workflow runs through three mutations. There is no single “add approval event” call — submitting, approving, and rejecting are distinct operations that return aBeeboleApprovalEvent.
| Mutation | Key arguments |
|---|---|
submitTimesheet | personId, startTime, endTime |
approveTimesheet | id (the submit event ID) |
rejectTimesheet | id (the submit event ID), stage, comment |
sendTimesheetReminder | personIds (array), startTime, endTime |
submitTimesheet returns the submit event whose id you pass to approveTimesheet or rejectTimesheet.
Submit a timesheet for a period
Approve or reject
People
| Mutation | Key arguments |
|---|---|
addPerson | name, email, roleId, optional color |
deletePerson | id, optional check (dry-run) |
duplicatePerson | id, name, optional email, roleId |
archivePerson / unarchivePerson | id |
archivePersons / unarchivePersons | ids (array) |
editPersonName | id, name |
editPersonEmail | id, email |
editPersonRole | id, roleId |
editPersonStartDate | id, startDate |
editPersonColor | id, color |
editPersonLang | id, lang |
deletePerson accepts check: true to validate references without deleting.
Create a person
Projects
| Mutation | Key arguments |
|---|---|
addProject | name, optional categoryId, parentId, color |
deleteProject | id, optional check (dry-run) |
deleteProjects | ids (array) |
duplicateProject | id, name, optional parentId |
archiveProject / unarchiveProject | id |
archiveProjects / unarchiveProjects | ids (array) |
editProjectName | id, name |
editProjectParent | id, parentId |
editProjectColor | id, color |
editProjectAvailability | id, availability |
addProjectCategory | name |
deleteProjectCategory | id |
editProjectCategoryName | id, name |
editProjectCategoryLevelNames | id, levelNames |
parentId. The subproject inherits the parent’s category unless you set a different categoryId.
Create a project
Tasks
Tasks are independent planning entities you create, schedule, and track time against. Categories organize tasks into workflow statuses.| Mutation | Key arguments |
|---|---|
addTask | name, optional categoryId, parentId, color, statusId |
deleteTask | id, optional check (dry-run) |
archiveTask / unarchiveTask | id |
archiveTasks / unarchiveTasks | ids (array) |
editTaskName | id, name |
editTaskParent | id, parentId |
editTaskColor | id, color |
editTaskStatus | id, statusId |
editTaskPeriod | id, optional startTime, endTime, effort |
editTaskDuration | id, effort (minutes) |
moveTasksToStatus | taskIds, targetStatusId, orderedTaskIds |
| Mutation | Key arguments |
|---|---|
addTaskCategoryStatus | categoryId, name |
deleteTaskCategoryStatus | categoryId, statusId |
editTaskCategoryStatusName | statusId, name |
editTaskCategoryStatusColor | statusId, color |
editTaskCategoryStatusMaxConcurrentTasks | statusId, maxConcurrentTasks |
editCategoryTaskMove | categoryId, taskMove |
editTaskStatus (single task) or moveTasksToStatus (one or more tasks). editCategoryTaskMove sets a category’s task-move behavior.
Create a task
Organization
Organization settings are edited on the single current organization, so these mutations take noid. The GraphQL field names keep the British spelling Organisation.
| Mutation | Key arguments |
|---|---|
editOrganisationName | name |
editOrganisationColor | color |
editGoogleSSO | google (input) |
editMicrosoftSSO | microsoft (input) |
editCustomSSO | customSSO (input, null to clear) |
Rename the organization
Related content
API Introduction
Authenticate with your API key and send your first request.
Queries
Read time records, people, projects, and tasks over GraphQL.
Schema explorer
Browse the full GraphQL schema interactively.