Projecten

Projecten

Projecten en uren ophalen/beheren. Scope: projects.read / projects.write.

Projecten ophalen

GET /v1/projects

Paginated list of projects. `search` matches the project name, number or description or the client name; `client_id` limits the list to one client

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Query
Naam Type Beschrijving
page integer
per_page integer
search string
client_id string
Request body

Geen

Response
data array
id string
name string
number string
status string

Project status.

Enum
planned active on_hold completed cancelled
client_id string
budget number
start_date string
end_date string
meta object
page integer
per_page integer
total integer
pages integer

Examples

GET /v1/projects
curl -X GET "https://api.appficient.nl/v1/projects" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node en response staan rechts naast dit endpoint.

Project aanmaken

POST /v1/projects
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Headers
Naam Type Beschrijving
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
name string Required
client_id string
status string

Project status.

Enum
planned active on_hold completed cancelled
start_date string
end_date string
budget number
Response
data object
id string
name string
number string
status string

Project status.

Enum
planned active on_hold completed cancelled
client_id string
budget number
start_date string
end_date string
meta object

Examples

POST /v1/projects
curl -X POST "https://api.appficient.nl/v1/projects" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string",
    "client_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "status": "planned",
    "start_date": "2026-07-01",
    "end_date": "2026-07-01",
    "budget": 0
}'

Curl, Node en response staan rechts naast dit endpoint.

Project ophalen

GET /v1/projects/{id}

One project with its number, status, client, budget and start and end date

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Naam Type Beschrijving
id Required string
Request body

Geen

Response
data object
id string
name string
number string
status string

Project status.

Enum
planned active on_hold completed cancelled
client_id string
budget number
start_date string
end_date string
meta object

Examples

GET /v1/projects/{id}
curl -X GET "https://api.appficient.nl/v1/projects/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node en response staan rechts naast dit endpoint.

Project bijwerken

PATCH /v1/projects/{id}
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Naam Type Beschrijving
id Required string
Request body
name string
client_id string
status string

Project status.

Enum
planned active on_hold completed cancelled
start_date string
end_date string
budget number
Response
data object
id string
name string
number string
status string

Project status.

Enum
planned active on_hold completed cancelled
client_id string
budget number
start_date string
end_date string
meta object

Examples

PATCH /v1/projects/{id}
curl -X PATCH "https://api.appficient.nl/v1/projects/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string",
    "client_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "status": "planned",
    "start_date": "2026-07-01",
    "end_date": "2026-07-01",
    "budget": 0
}'

Curl, Node en response staan rechts naast dit endpoint.

Projecturen ophalen

GET /v1/projects/{id}/hours

Paginated hours registered on a project, of all employees, with date, hours, activity, status and billable flag. Filter on a `from`/`to` date or `status`. Needs the time registration module (`403` `module_required`)

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Naam Type Beschrijving
id Required string
Query
Naam Type Beschrijving
page integer
per_page integer
from string
to string
status string Filter by hour status (`draft`, `submitted`, `approved`, or `rejected`).
Request body

Geen

Response
data array
id string
date string
hours number
minutes integer
status string

Time entry status.

Enum
draft submitted approved rejected
activity_name string
billable boolean
description string

Only present when the entry has a description.

user object Nullable

The employee the hours are registered for.

id string
name string
meta object
page integer
per_page integer
total integer
pages integer

Examples

GET /v1/projects/{id}/hours
curl -X GET "https://api.appficient.nl/v1/projects/{id}/hours" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node en response staan rechts naast dit endpoint.

Uren registreren

POST /v1/projects/{id}/hours

Registers hours on a project, the same as the timesheet in Appficient. Give `hours` or `start` and `end`. A signed-in user (AI connection) always registers hours for themselves: sending `user_id` gives `422`. An API key must send `user_id` (an active employee of the environment), otherwise `422`. The status follows the approval setting of that employee: `draft` when hours need approval, otherwise `approved`. `403 module_required` when the environment has no time registration; `403 time_access_required` when the employee has no access to time registration; `409 project_locked` for an archived or cancelled project. Check projects_hours_list first so the same hours are not registered twice. On `server_error` the result is unknown: do not retry, check projects_hours_list first

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Naam Type Beschrijving
id Required string
Headers
Naam Type Beschrijving
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
date string Required

Date of the work (YYYY-MM-DD).

hours number

Hours worked, for example 1.5, rounded to 2 decimals. At least 0.01 (`422`, detail `too_small`) and at most 14.99 (`422`, detail `too_large`): the entry starts at 09:00 and must end the same day. Give either `hours` or `start` and `end`; use `start` and `end` for a longer day.

start string

Start time (HH:MM), together with `end`.

end string

End time (HH:MM), after `start`.

activity string

Name of an active activity, as shown in `activity_name` of the project hours (case-insensitive). An unknown name gives `422` with the allowed names; a name shared by several active activities gives `422` (detail `ambiguous_activity`).

description string
billable boolean

Defaults to the billable setting of the activity, or false without an activity.

ticket_id string

Optional ticket the hours belong to.

user_id string

Only for API keys, and then required: the id of an active employee of the environment. A signed-in user (AI connection) always registers hours for themselves; sending `user_id` then gives `422`.

Response
data object

Time entry.

id string
date string
hours number
minutes integer
status string

Time entry status.

Enum
draft submitted approved rejected
activity_name string
billable boolean
description string

Only present when the entry has a description.

user object Nullable

The employee the hours are registered for.

id string
name string
meta object

Examples

POST /v1/projects/{id}/hours
curl -X POST "https://api.appficient.nl/v1/projects/{id}/hours" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "date": "2026-07-01",
    "hours": 0,
    "start": "string",
    "end": "string",
    "activity": "string",
    "description": "string",
    "billable": false,
    "ticket_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}'

Curl, Node en response staan rechts naast dit endpoint.