Endpoint for Projects & Tasks
NEW v2.35.0 · xoCRM
Projects Endpoint
Manage xoCRM projects and project tasks via the JSON API: export, create, update, and delete—including multilingual descriptions, project managers, assignees, and status history.
Endpoints
| Method | Endpoint | Scope | Description |
|---|---|---|---|
GET | /Export/JSON/projects | projects:read | All projects (optional ?include_tasks=1) |
GET | /Export/JSON/project/{id} | projects:read | Single project |
POST | /Import/JSON/projects | projects:write | Create new projects |
PUT | /Import/JSON/projects | projects:write | Update projects (project_id required) |
DELETE | /Delete/JSON/project/{id} | projects:delete | Delete project (cascading, including tasks) |
GET | /Export/JSON/project_tasks | project_tasks:read | All tasks (see below for filters) |
GET | /Export/JSON/project_task/{id} | project_tasks:read | Single task |
POST | /Import/JSON/project_tasks | project_tasks:write | Create new tasks (project_id required) |
PUT | /Import/JSON/project_tasks | project_tasks:write | Update tasks (task_id required) |
DELETE | /Delete/JSON/project_task/{id} | project_tasks:delete | Delete task (project remains intact) |
Filter (Export)
Projects
?status={id}— Project status?customer_id={id}— Assigned customer?category_id={id}— Project category?leader_admin_id={id}— Project Leader?is_private=0|1— private projects?date_from / ?date_to— Creation date?last_modified={ts}— modified since?include_tasks=1— Tasks embedded
Tasks
?project_id={id}— Tasks in a project?status={id}— Task status?priority=1-5— Priority?admin_id={id}— Assigned user?customer_id={id}/?category_id={id}?due_from / ?due_to— Due date range?progress_min / ?progress_max— Progress (0–100)?last_modified={ts}— Last modified
?language=de|en controls the language of the status/category names. The meta blocks project_statuses[] and task_statuses[] provide all available status values.
Payload Structure (Project)
{
"type": "projects",
"data": [
{
"name": "Website-Relaunch",
"description": "Beschreibung (Default-Sprache)
",
"descriptions": [
{ "language_id": 1, "project_name": "Website Relaunch", "project_description": "EN
" }
],
"customer_scope": "specific",
"customer_ids": [4711],
"date_start": "2026-07-01",
"date_end": "2026-09-30",
"is_private": false,
"leader_admin_ids": [1],
"category_ids": [2],
"relationships": [ { "target_type": "orders_id", "target_id": 12345 } ],
"admin_id": 1,
"status_comment": "Project created via API"
}
]
}Payload Structure (Task)
{
"type": "project_tasks",
"data": [
{
"project_id": 126,
"name": "Konzept erstellen",
"priority": 4,
"progress_percent": 0,
"date_start": "2026-07-01",
"due_date": "2026-07-15",
"hours_planned": 8.5,
"hours_actual": null,
"status_id": 60,
"assigned_admin_ids": [1],
"admin_id": 1,
"status_comment": "Aufgabe via API angelegt"
}
]
}Notes
- NEW v2.36.0: Projects and tasks include
`status_history[]` in the export—all status entries, includingcomments(meeting minutes),`progress_percent`,`status_name`, and`user_name`. admin_id= the admin who performed the action (stored ascreated_by/modified_byand asuser_idin the status history; if not specified = 0/System).status_idis validated against the status management (typeprojectsortasks); if not specified, the default status applies. A status change via PUT automatically creates a status history entry with`status_comment`—since v2.40.0,`status_comment`also writes an entry even without a status change (work notes/minutes); for tasks,`progress_percent`is included in the entry as progress.descriptions[]is multilingual; for PUT requests, merge semantics apply—only the provided languages/fields are overwritten.leader_admin_ids,relationships(projects), andassigned_admin_ids(tasks) are only replaced if the key is included in the payload (replace-on-present).- A POST request with an ID that has already been assigned returns
“Already exists”—in that case, use PUT (and conversely,“Not found”is returned for PUT requests on unknown IDs). - Note:
DELETE /project/{id}will cascade and delete all tasks associated with the project. Linked orders/tickets are only unlinked, not deleted. The response contains`deleted_tasks`.