Integration API
API reference for bulk upsert endpoints used in B2B integrations with Dime.Sheets.
Integration API
The Integration public API provides bulk upsert endpoints for synchronizing data from external systems (ERPs, HR systems, project management tools). Records are matched by externalId -- existing records are updated, new records are created.
Upsert projects
POST /api/v1/integration/projectsUpserts projects by externalId. Each project in the array is matched against existing records; if a match is found the record is updated, otherwise a new project is created.
Request body
[
{
"externalId": "bc-job-1001",
"name": "ERP Migration",
"description": "Migrate from legacy ERP to Business Central",
"clientId": 1,
"startDate": "2026-04-01T00:00:00Z",
"budget": 75000
}
]Response
{
"total": 1,
"succeeded": 1,
"results": [
{ "externalId": "bc-job-1001", "success": true, "error": null }
]
}Upsert tasks
POST /api/v1/integration/tasksUpserts tasks by externalId. Tasks are linked to projects via projectExternalId.
Request body
[
{
"externalId": "bc-task-2001",
"projectExternalId": "bc-job-1001",
"name": "Data migration",
"description": "Migrate historical data",
"estimatedHours": 80.0,
"isBillable": true
}
]TaskUpsertRequest model
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | Yes | External identifier for matching |
projectExternalId | string | Yes | External ID of the parent project |
name | string? | Yes | Task name |
description | string? | Yes | Task description |
estimatedHours | number? | Yes | Estimated hours |
isBillable | boolean? | Yes | Whether the task is billable |
Upsert employees
POST /api/v1/integration/employeesUpserts employee records matched by email. Links the DimeSheets user to an external employee number and ID for downstream sync.
Request body
[
{
"email": "[email protected]",
"employeeNo": "EMP-042",
"employeeExternalId": "bc-emp-042"
}
]EmployeeUpsertRequest model
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to match against existing users |
employeeNo | string | Yes | External employee number |
employeeExternalId | string? | Yes | External employee identifier |
BatchUpsertResponse model
All integration endpoints return the same response shape:
| Field | Type | Description |
|---|---|---|
total | int | Total items in the request |
succeeded | int | Number of successful upserts |
results | UpsertResult[] | Per-item results |
UpsertResult
| Field | Type | Description |
|---|---|---|
externalId | string? | External ID of the item |
success | boolean | Whether the upsert succeeded |
error | string? | Error message if the upsert failed |