List the project's sites
const url = 'https://example.com/v1/projects/example/sites?limit=25';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://example.com/v1/projects/example/sites?limit=25' \ --header 'Authorization: Bearer <token>'The sites that sign their own people in to this project. Tenant admins only: a site creates people in the tenant. includeUnregistered=true lists unregistered ones too. Mounted when the deployment supplies a SiteBinding.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”ProjectId — opaque branded string.
Query Parameters
Section titled “Query Parameters”1..100. Default 25.
Where the previous page ended: its nextCursor, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise 400 bad-input, and the list starts again without it. Absent → first page.
With true, unregistered sites too.
Responses
Section titled “Responses”A page of sites.
object
A site that signs its own people in to one project: it vouches for whoever is signed in there, so they ask the project’s agents and decide its approvals as themselves. Each person it signs in is a person of the tenant, shown as “
object
Set by a tenant admin, never by the site: shown after every name the site signs in.
The site’s origin (https://acme-store.example).
Where an approval opens on the site; {approvalId} is replaced. A site’s people get it in their reviewer email.
Role → grant. A person with several allowed roles gets the most any of them gives.
object
What a person with one of the site’s roles gets in the site’s project. Reading the project comes with every role; nothing above it ever does.
object
Whether they may start turns with the project’s agents.
The reviewer role they decide approvals with, at most the site’s reviewerCeiling; absent: they decide none.
Whether the site’s statements are accepted.
At most this many live people from the site.
At most this many new people from the site per day.
One of the site’s live public keys. Kindgi never has a private half.
object
The key’s RFC 7638 thumbprint, to compare with the one the site shows.
What the site’s statements carry as aud: this deployment’s public URL, given at enrollment.
Example
{ "data": [ { "roleMap": { "additionalProperty": { "reviewer": "standard" } }, "reviewerCeiling": "standard" } ]}projectId is not a project id (a UUID), or a malformed query.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Not a tenant admin.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}