List projects
Changed onUse this endpoint to retrieve a list of projects (also called jobs or roles) from your Atlas account.
In Atlas, a project represents a recruitment assignment - for example, "Head of Engineering at Acme Corp" or "Sales Manager at Globex". This endpoint returns a summary list of all your projects, which you can filter and page through.
What you can filter by:
- state - the current status of the project. Options are: active (being worked on), closed (finished), on_hold (paused), lead (a potential opportunity not yet confirmed), pitch (being pitched to a client), opportunity (a speculative role), or talent_pool (a pipeline of candidates not tied to a specific role). You can pass multiple states at once.
- createdAfter / createdBefore - only return projects created within a specific date range
- updatedAfter / updatedBefore - only return projects last modified within a specific date range (ISO 8601). Filters on the updatedAt field. To keep an external copy in sync, use updatedAfter as a cursor: persist the maximum updatedAt you receive and pass it back as updatedAfter on the next run to fetch only what changed since (the bound is inclusive, so upsert by id to stay idempotent)
- ownerEmail - only return projects owned by a specific consultant (identified by their Atlas email address)
- memberEmail - only return projects where a specific consultant is a team member
- companyId - only return projects belonging to a specific company (multiple comma-separated company IDs return the union)
- role - filter by job title (partial matches are supported)
- public - filter by public (job-board) visibility. public=true returns only the projects advertised on your public job board, public=false only the ones that are not, and omitting it returns both. Combine with state=active to get exactly the set the public jobs portal advertises
- includeDeleted - include soft-deleted projects as tombstones (with a populated deletedAt)
Unknown query parameters are rejected: Any parameter that is not documented here is rejected with a 422 — the endpoint never silently ignores a filter it does not understand, so a typo (or a filter that does not exist) can never come back as a 200 with the full unfiltered list.
Pagination: Results are returned in pages. Use the page and pageSize parameters to move through large result sets. The response includes a total count so you know how many results exist in total.
Requesting extra job metadata (expand): By default the list returns the summary fields described below. Pass a comma-separated expand list to have selected job metadata returned on every row, so an incremental sync does not need a follow-up detail call per project:
GET /api/v1/projects?updatedAfter=2026-06-01T00:00:00Z&expand=companyContacts,contractType,func,salary,seniority,workMode
- Allowed values: companyContacts, contractType, func, salary, seniority, workMode. Any other value is rejected with 422.
- expand=salary returns both salary and salaryCurrency.
- expand=companyContacts returns the job's hiring contacts as [{ id, personId, name }], or [] when it has none. Adding or removing a contact does not change the job's updatedAt, so an updatedAfter sync does not pick up a change that only touches contacts. To keep contacts current, re-read them periodically (a full list with expand=companyContacts, or Get project details).
- Each field holds the same value and enum shape as the corresponding field on Get project details, and is null when the project has no value set.
- expand combines freely with every filter and with pagination — expanded fields appear on all pages.
- Backward compatible: omit expand (or send it empty) and the response is exactly as before — a field you did not request is absent from the row, not returned as null.
What you get back: Each project in the list includes its ID, job role title, current state, the associated company, the endClient (the company the role is ultimately for, as { id, name }, or null when none is set), and the owner (the consultant the project is attributed to, as { userId, email, name }). The owner is the primary recruiter attribution field for rolling projects up per recruiter; it is null when the project has no owner (projects have no creator fallback). To get the full details of a specific project (including pipeline stages, salary, members, etc.), use the Get project details endpoint with the project's ID.
Request
- Base URLhttps://api.recruitwithatlas.com
- AuthHTTP bearer
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Query parameters
Comma-separated project states to filter by
Include soft-deleted projects as tombstones (with a populated deletedAt). Defaults to false. Pair with updatedAfter to incrementally sync deletions.
Comma-separated project owner emails
Comma-separated project member emails
Comma-separated company UUIDs — only projects belonging to these companies are returned
Filter by job role (case-insensitive partial match)
Filter by public (job-board) visibility. true returns only projects advertised on the public job board, false only the ones that are not. Omit to return both.
Comma-separated job metadata fields to add to every list row. Omit it (or send an empty value) and the response shape is unchanged. Unknown values are rejected with 422. Allowed values: companyContacts, contractType, func, salary, seniority, workMode. Requesting salary also returns salaryCurrency. companyContacts returns the hiring contacts linked to each project.
Page number (1-indexed)
Items per page (max 100)
Alias for pageSize
Response
Paginated list of projects
Example response
{
"data": [
{
"jobRole": "Software Engineer",
"state": "active",
"owner": {
"email": "owner@agency.com",
"name": "Jane Smith"
},
"updatedAt": "2026-06-01T12:00:00.000Z",
"createdAt": "2026-06-01T12:00:00.000Z",
"companyContacts": [
{
"name": "Jane Doe"
}
],
"salaryCurrency": "USD"
}
],
"pagination": {
"page": 1,
"pageSize": 25,
"total": 42,
"totalPages": 2
}
}Changes
- warning
added the new
undefinedenum value to the//response property for the response status - warning
added the new
undefinedenum value to the////response property for the response status - warning
added the new
undefinedenum value to the//response property for the response status - warning
added the new
undefinedenum value to the//response property for the response status - info
added the optional property
//to the response with the status - info
added the required property
//to the response with the status
- warning
- info
added the optional property
to the response with the status
- info