Open appvitae.ai

REST Conventions

The public API is organized around resources. Routes should name objects, not UI modules or button actions.

Resource naming

Use plural nouns:

/candidates
/jobs
/clients
/applications
/interviews
/inbox-items
/agent-tasks

Avoid route names tied to product screens:

/ats/candidates
/crm/clients
/find-clients

CRM and ATS are workflow surfaces in the app. They should be represented as filters or query context, not separate entities.

GET /candidates?surface=crm
GET /candidates?surface=ats

Standard methods

MethodUse
GET /resourcesList resources
POST /resourcesCreate a resource
GET /resources/:idRead one resource
PATCH /resources/:idUpdate part of a resource
PUT /resources/:idReplace a resource or owned collection
DELETE /resources/:idDelete or archive a resource

Relationships

Prefer nested routes when the child cannot stand alone:

GET /clients/:id/contacts
POST /clients/:id/contacts
DELETE /clients/:id/contacts/:contactId

Use top-level resources when the entity has its own lifecycle:

GET /applications?candidateId=...&jobId=...
POST /applications
PATCH /applications/:id

Workflow commands

Some recruiting actions are commands rather than simple CRUD. Model those as resources where possible.

Preferred:

PATCH /applications/:id
POST /applications/:id/stage-transitions
POST /application-presentations
DELETE /application-presentations/:id
POST /agent-tasks
PATCH /inbox-items/:id
PATCH /notifications/:id
PATCH /notifications

Avoid:

POST /applications/:id/set-stage
POST /applications/:id/advance-stage
POST /applications/:id/unpresent
PATCH /notifications/read/:id
PATCH /notifications/read-all
POST /inbox/:id/actions/create-client
POST /inbox/:id/actions/refine-search

Legacy command routes may remain temporarily, but frontend clients should move to the canonical resource routes as they are added.

Versioning

The version is part of the path:

https://api.vitae.ai/v1

Breaking changes require a new version or a compatibility alias. The frontend and API route changes ship together in the same implementation pass.