Skip to main content

Capabilities

Projects

Projects are the top-level containers for files, workflows, and agent sessions. These endpoints let you list and search projects, create them, read and update their metadata, and manage who has access.

Project IDs are the same projectId you pass when listing workflows or launching an agent, so listing projects is usually the first call an integration makes.

All paths below are relative to your instance's base URL (https://<your-domain>.nomic.ai/api/v0) and require an API key with the appropriate developer:projects:* scope. See the overview for authentication details.

Scopes​

ScopeGrants
developer:projects:readRead projects and their members.
developer:projects:createCreate new projects.
developer:projects:adminUpdate project metadata and member roles.

The broad developer scope implies developer:projects:create and developer:projects:admin (which in turn implies developer:projects:read).

Roles​

Members hold one role per project. The member endpoints name roles with the short role values in the first column; the app and the rest of the product use the plain-language names in the second column. They line up one-to-one:

API roleIn the productCan
adminAdminManage the project, its members, and all of its content.
editorMemberRead and write the project's content — start conversations, and add and edit files.
viewerRead-only memberRead the project's content, but not change it.

Most projects use only Admin and Member (admin and editor) — that is what the app's member picker offers, and what we recommend for integrations. Use viewer (Read-only member) to give someone read-only access to a project they should see but not contribute to.


List projects​

GET /projects

List projects available to the authenticated user. For an organization admin this is every project in the organization; for anyone else it is the projects they belong to.

Scope: developer:projects:read · Rate limit: Standard (300 req / min)

Query parameters​

ParameterTypeDefaultDescription
limitint20Max results per page (1–100).
cursorstring (uuid)—Opaque cursor from a previous page's nextCursor.
searchstring—Filter by project name or project number (case-insensitive substring).
membershipmine | anyanyany returns everything the caller may see; mine narrows it to projects the caller belongs to. Identical for non-admins.

Response​

{
"data": [
{
"id": "019c587e-3456-7890-abcd-ef1234567890",
"name": "Downtown Office Tower",
"description": "Design package reviews and submittals",
"projectNumber": "2024-0142",
"createdAt": "2026-04-01T12:00:00.000Z",
"updatedAt": "2026-08-01T09:30:00.000Z"
}
],
"nextCursor": null,
"totalCount": 1
}
FieldTypeDescription
data[].iduuidProject ID — pass as projectId on workflows / agents.
data[].namestringDisplay name.
data[].descriptionstring?Optional description, or null if unset.
data[].projectNumberstring?AEC project identifier (project/job number), or null if unset.
data[].createdAtstringISO-8601 creation time.
data[].updatedAtstringISO-8601 last update time.
nextCursorstring?Opaque cursor for the next page, or null if there are no more results.
totalCountnumberTotal matching projects across all pages.

Errors​

StatusCause
401Missing or invalid API key.
403API key lacks developer:projects:read scope.
429Standard rate limit exceeded.

Example​

curl "https://<your-domain>.nomic.ai/api/v0/projects?limit=10&search=tower" \
-H "Authorization: Bearer $NOMIC_API_KEY"

Create a project​

POST /projects

Create a project. The authenticated user becomes its first administrator.

Scope: developer:projects:create · Rate limit: Write (60 req / min)

Request body​

FieldTypeRequiredDescription
namestringYesProject name (at least one character).
descriptionstringNoProject description.
projectNumberstringNoAEC project identifier (project/job number).

Response​

Returns 201 Created with the new project under data.

{
"data": {
"id": "019c587e-3456-7890-abcd-ef1234567890",
"name": "Downtown Office Tower",
"description": "Design package reviews and submittals",
"projectNumber": "2024-0142",
"createdAt": "2026-08-01T09:30:00.000Z",
"updatedAt": "2026-08-01T09:30:00.000Z"
}
}

Errors​

StatusCause
400Validation error — e.g. missing name.
401Missing or invalid API key.
403API key lacks developer:projects:create scope.
429Write rate limit exceeded.

Example​

curl -X POST "https://<your-domain>.nomic.ai/api/v0/projects" \
-H "Authorization: Bearer $NOMIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Downtown Office Tower",
"description": "Design package reviews and submittals",
"projectNumber": "2024-0142"
}'

Get a project​

GET /projects/{id}

Fetch a single project by ID.

Scope: developer:projects:read · Rate limit: Standard (300 req / min)

Path parameters​

ParameterTypeDescription
idstring (uuid)Project ID.

Response​

{
"data": {
"id": "019c587e-3456-7890-abcd-ef1234567890",
"name": "Downtown Office Tower",
"description": "Design package reviews and submittals",
"projectNumber": "2024-0142",
"createdAt": "2026-04-01T12:00:00.000Z",
"updatedAt": "2026-08-01T09:30:00.000Z"
}
}

Errors​

StatusCause
401Missing or invalid API key.
403API key lacks developer:projects:read scope.
404No project with that ID is visible to the caller.
429Standard rate limit exceeded.

A project the caller cannot read is reported as 404, so a response never confirms that an ID exists.

Example​

curl "https://<your-domain>.nomic.ai/api/v0/projects/019c587e-3456-7890-abcd-ef1234567890" \
-H "Authorization: Bearer $NOMIC_API_KEY"

Update a project​

POST /projects/{id}

Update a project's metadata. Every field is optional: a field left out is left untouched, and sending null clears a nullable field (description or projectNumber). At least one field must be provided.

Scope: developer:projects:admin · Rate limit: Write (60 req / min)

Path parameters​

ParameterTypeDescription
idstring (uuid)Project ID.

Request body​

FieldTypeDescription
namestringNew project name (at least one character).
descriptionstring | nullNew description; send null to clear it.
projectNumberstring | nullNew project/job number; send null to clear it.

Response​

Returns 200 OK with the updated project under data, in the same shape as Get a project.

Errors​

StatusCause
400Validation error, or no fields to update.
401Missing or invalid API key.
403Read access to the project, but not admin.
404No project with that ID is visible to the caller.
429Write rate limit exceeded.

Example​

curl -X POST "https://<your-domain>.nomic.ai/api/v0/projects/019c587e-3456-7890-abcd-ef1234567890" \
-H "Authorization: Bearer $NOMIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "description": "Updated scope for phase 2", "projectNumber": null }'

List project members​

GET /projects/{id}/members

List the members of a project and the role each holds, highest role first.

Scope: developer:projects:read · Rate limit: Standard (300 req / min)

Path parameters​

ParameterTypeDescription
idstring (uuid)Project ID.

Query parameters​

ParameterTypeDefaultDescription
limitint50Max results per page (1–100).
cursorstring—Opaque cursor from a previous page's nextCursor.

Response​

{
"data": [
{
"id": "019abc12-3456-7890-abcd-ef1234567890",
"email": "alice@example.com",
"name": "Alice Johnson",
"image": "https://<your-domain>.nomic.ai/avatars/alice.png",
"role": "admin"
}
],
"nextCursor": null,
"totalCount": 1
}
FieldTypeDescription
data[].iduuidUser ID of the member.
data[].emailstringMember email.
data[].namestring?Member display name, or null if unset.
data[].imagestring?Member avatar URL, or null if none.
data[].roleadmin | editor | viewerRole on this project — Admin, Member, or Read-only member (see Roles).
nextCursorstring?Cursor for the next page, or null if none remain.
totalCountnumberTotal members on the project.

Errors​

StatusCause
401Missing or invalid API key.
403API key lacks developer:projects:read scope.
404No project with that ID is visible to the caller.
429Standard rate limit exceeded.

Example​

curl "https://<your-domain>.nomic.ai/api/v0/projects/019c587e-3456-7890-abcd-ef1234567890/members" \
-H "Authorization: Bearer $NOMIC_API_KEY"

Update project members​

POST /projects/{id}/members

Grant, change, or revoke project roles in one batch of 1–100 changes, applied atomically: nothing is written unless every entry is valid. Set a member's role to null to remove them.

The batch is idempotent — re-stating a role a member already has, or removing a non-member, is a no-op — so a list read from List project members can be sent back unchanged.

Members must already belong to your organization; identify each by user ID or email. Granting access requires project sharing to be enabled on the instance (removals stay available regardless).

Scope: developer:projects:admin · Rate limit: Write (60 req / min)

Path parameters​

ParameterTypeDescription
idstring (uuid)Project ID.

Request body​

FieldTypeRequiredDescription
membersarrayYes1–100 member changes to apply as one batch.
members[].userstring (uuid or email)YesThe member, by user ID or email address.
members[].roleadmin | editor | viewer | nullYesRole to grant — admin (Admin), editor (Member), or viewer (Read-only member) — or null to remove the member (see Roles).

Response​

Returns 200 OK with the project's members after the batch, highest role first, in the same shape as List project members (without pagination fields).

{
"data": [
{
"id": "019abc12-3456-7890-abcd-ef1234567890",
"email": "alice@example.com",
"name": "Alice Johnson",
"image": null,
"role": "admin"
},
{
"id": "019abc12-3456-7890-abcd-ef1234567891",
"email": "bob@example.com",
"name": "Bob Lee",
"image": null,
"role": "editor"
}
]
}

Errors​

StatusCause
400Validation error, or an unknown or repeated user.
401Missing or invalid API key.
403Read access to the project but not admin, or project sharing is disabled.
404No project with that ID is visible to the caller.
429Write rate limit exceeded.

Example​

Add Bob as an editor and remove Carol in a single call:

curl -X POST "https://<your-domain>.nomic.ai/api/v0/projects/019c587e-3456-7890-abcd-ef1234567890/members" \
-H "Authorization: Bearer $NOMIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"members": [
{ "user": "bob@example.com", "role": "editor" },
{ "user": "carol@example.com", "role": null }
]
}'