Projects

Projects

Manage projects and list project hours. Scope: projects.read / projects.write.

List projects

GET /v1/projects
projects.read
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Query
Name Type Description
page integer Page number (from 1, default 1)
per_page integer Items per page (default 25, max 200)
search string Free-text search
client_id string
Request body

None

Response
data array
id string
name string
number string
status string

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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 and response are shown to the right of this endpoint.

Create a project

POST /v1/projects
projects.write
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Headers
Name Type Description
Idempotency-Key string Optional on POST only; cached 24h; replay returns X-Idempotent-Replay
Request body
name string Required
client_id string
description string
status string

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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",
    "description": "string",
    "status": "planned",
    "start_date": "2026-07-01",
    "end_date": "2026-07-01",
    "budget": 0
}'

Curl, Node and response are shown to the right of this endpoint.

Retrieve a project

GET /v1/projects/{id}
projects.read
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string Resource id (UUID, lowercase)
Request body

None

Response
data object
id string
name string
number string
status string

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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 and response are shown to the right of this endpoint.

Update a project

PATCH /v1/projects/{id}
projects.write
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string Resource id (UUID, lowercase)
Request body
name string
client_id string
description string
status string

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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

Free in request; domain `normalizeStatus` maps to this set (`archived` → `completed`; unknown → `active`).

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",
    "description": "string",
    "status": "planned",
    "start_date": "2026-07-01",
    "end_date": "2026-07-01",
    "budget": 0
}'

Curl, Node and response are shown to the right of this endpoint.

List project hours

GET /v1/projects/{id}/hours
projects.read
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string Resource id (UUID, lowercase)
Query
Name Type Description
page integer
per_page integer
from string
to string
status string Free DB match; recommended draft|submitted|approved|rejected
legacy_user_id integer Filter only; not returned on hour entries
Request body

None

Response
data array
date string
hours number
minutes integer
status string

Domain time-report statuses (list filter is free string matching DB).

Enum
draft submitted approved rejected
activity_name string
description 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 and response are shown to the right of this endpoint.