Access grants
Grant or revoke viewer, editor, or hosted admin access to projects and locations for an existing embedded identity.
viewer and editor apply to both embedded and hosted access. admin enables project or location settings and partner-managed user administration after redirect login. Embed sessions never receive admin privileges; an admin grant is capped to editor in the embeddable.identities:manage. Send it as Authorization: Bearer ceyo_platform_... on every request. The key selects the workspace, so paths do not include a workspace identifier. Keep the key on your server.external_user_id identifies an existing embedded identity and is case-sensitive. Project and location path values accept either Signal UUIDs or your configured external IDs.location_scope: "granted" to expose the identity's active direct location grants in one project. This live scope preserves each location's role; adding, changing, or revoking a direct grant updates access, while a project grant never broadens it. Only Overview and Locations are available at project navigation level.POSTGrant project access
/embedded-identities/{external_user_id}/projects/{project_id}/accessCreates or updates a direct project grant for an active embedded identity.
Grant project access
/embedded-identities/{external_user_id}/projects/{project_id}/accessPath parameters
external_user_idstringYour stable, case-sensitive identifier for the embedded identity. URL-encode the value before placing it in the path.
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID in the workspace selected by the API key.
Request body
roleviewer | editor | adminRequired role. viewer is read-only; editor permits supported operational changes; admin additionally manages hosted project or location settings and users.
Response envelope
project_access:ProjectAccessThe requested or resulting direct project grant.
ProjectAccess
project_iduuidCeyo UUID of the granted project.
roleviewer | editor | adminRole granted across the project and all of its locations.
granted_atdatetimeTime the direct project grant was first created, in ISO 8601 format.
201 Created. Repeating the request with the same role returns 200 OK, preserves granted_at, and makes no duplicate. Sending a different role updates the existing direct grant and also preserves granted_at.Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/embedded-identities/customer-user-4821/projects/e6c96c98-d777-40e0-94ec-48931f57782f/access' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"role": "editor"
}'HTTP/1.1 201 Created
{
"project_access": {
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"role": "editor",
"granted_at": "2026-07-31T09:30:00Z"
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_api_key",
"message": "The Bearer API key is invalid.",
"details": null,
"request_id": "req_01K1F8M7QX4R2V9N6Y3Z0A5BCT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404resource_not_foundThe embedded identity, project, or location was not found in this workspace.
409conflictThe requested change conflicts with the current identity or resource state.
422validation_failedOne or more fields are invalid, the role is unsupported, or the location does not belong to the selected project.
429rate_limit_exceededToo many requests were made.
DELETERevoke project access
/embedded-identities/{external_user_id}/projects/{project_id}/accessRemoves the direct project grant for an embedded identity without deleting the identity or its direct location grants.
Revoke project access
/embedded-identities/{external_user_id}/projects/{project_id}/accessPath parameters
external_user_idstringYour stable, case-sensitive identifier for the embedded identity. URL-encode the value before placing it in the path.
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID in the workspace selected by the API key.
204 No Content whether the direct project grant existed or was already absent. The identity and project remain unchanged.Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/embedded-identities/customer-user-4821/projects/e6c96c98-d777-40e0-94ec-48931f57782f/access' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 204 No ContentErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_api_key",
"message": "The Bearer API key is invalid.",
"details": null,
"request_id": "req_01K1F8M7QX4R2V9N6Y3Z0A5BCT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404resource_not_foundThe embedded identity, project, or location was not found in this workspace.
429rate_limit_exceededToo many requests were made.
POSTGrant location access
/embedded-identities/{external_user_id}/projects/{project_id}/locations/{location_id}/accessCreates or updates a direct grant to one location for an active embedded identity.
Grant location access
/embedded-identities/{external_user_id}/projects/{project_id}/locations/{location_id}/accessPath parameters
external_user_idstringYour stable, case-sensitive identifier for the embedded identity. URL-encode the value before placing it in the path.
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID in the workspace selected by the API key.
location_idlocation UUID | location external IDCeyo location UUID or configured partner external ID belonging to the selected project.
Request body
roleviewer | editor | adminRequired role. viewer is read-only; editor permits supported operational changes; admin additionally manages hosted project or location settings and users.
Response envelope
location_access:LocationAccessThe requested or resulting direct location grant.
LocationAccess
project_iduuidCeyo UUID of the project containing the location.
location_iduuidCeyo UUID of the granted location.
roleviewer | editor | adminRole granted for this location.
granted_atdatetimeTime the direct location grant was first created, in ISO 8601 format.
201 Created. Repeating the request with the same role returns 200 OK, preserves granted_at, and makes no duplicate. Sending a different role updates the existing direct grant and also preserves granted_at.Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/embedded-identities/customer-user-4821/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/a1308d14-149c-4dd7-a4c5-295ac9090f58/access' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"role": "viewer"
}'HTTP/1.1 201 Created
{
"location_access": {
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"location_id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"role": "viewer",
"granted_at": "2026-07-31T09:35:00Z"
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_api_key",
"message": "The Bearer API key is invalid.",
"details": null,
"request_id": "req_01K1F8M7QX4R2V9N6Y3Z0A5BCT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404resource_not_foundThe embedded identity, project, or location was not found in this workspace.
409conflictThe requested change conflicts with the current identity or resource state.
422validation_failedOne or more fields are invalid, the role is unsupported, or the location does not belong to the selected project.
429rate_limit_exceededToo many requests were made.
POSTGrant location access in batch
/embedded-identities/{external_user_id}/projects/{project_id}/locations/accessCreates or updates up to 100 direct location grants in one project for an active embedded identity, without issuing a session.
Grant location access in batch
/embedded-identities/{external_user_id}/projects/{project_id}/locations/accessPath parameters
external_user_idstringYour stable, case-sensitive identifier for the embedded identity. URL-encode the value before placing it in the path.
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID in the workspace selected by the API key.
Request body
location_grantsLocationGrantInput[]Required. One to 100 direct location grants in the selected project. Roles may differ between locations.
LocationGrantInput
location_idlocation UUID | location external IDRequired location belonging to the selected project.
roleviewer | editor | adminRequired role. viewer is read-only; editor permits supported operational changes; admin additionally manages hosted project or location settings and users.
Response envelope
location_access:LocationAccess[]The requested or resulting direct location grants, in request order.
LocationAccess
project_iduuidCeyo UUID of the project containing the location.
location_iduuidCeyo UUID of the granted location.
roleviewer | editor | adminRole granted for this location.
granted_atdatetimeTime the direct location grant was first created, in ISO 8601 format.
201 Created when at least one grant is new. When every listed grant already exists, it returns 200 OK. It does not add unlisted locations, remove existing grants, or issue an embed session. An invalid item rolls back the entire batch.granted_at and makes no duplicate. Sending a different role updates that location grant and also preserves granted_at.Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/embedded-identities/customer-user-4821/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/access' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"location_grants": [
{
"location_id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"role": "viewer"
},
{
"location_id": "b2419e25-250d-5ee8-b5d6-306bd0101f69",
"role": "editor"
}
]
}'HTTP/1.1 201 Created
{
"location_access": [
{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"location_id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"role": "viewer",
"granted_at": "2026-07-31T09:35:00Z"
},
{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"location_id": "b2419e25-250d-5ee8-b5d6-306bd0101f69",
"role": "editor",
"granted_at": "2026-07-31T09:36:00Z"
}
]
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_api_key",
"message": "The Bearer API key is invalid.",
"details": null,
"request_id": "req_01K1F8M7QX4R2V9N6Y3Z0A5BCT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404resource_not_foundThe embedded identity, project, or location was not found in this workspace.
409conflictThe requested change conflicts with the current identity or resource state.
422validation_failedOne or more fields are invalid, the role is unsupported, or the location does not belong to the selected project.
429rate_limit_exceededToo many requests were made.
DELETERevoke location access
/embedded-identities/{external_user_id}/projects/{project_id}/locations/{location_id}/accessRemoves the direct location grant for an embedded identity without changing project access or grants to other locations.
Revoke location access
/embedded-identities/{external_user_id}/projects/{project_id}/locations/{location_id}/accessPath parameters
external_user_idstringYour stable, case-sensitive identifier for the embedded identity. URL-encode the value before placing it in the path.
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID in the workspace selected by the API key.
location_idlocation UUID | location external IDCeyo location UUID or configured partner external ID belonging to the selected project.
204 No Content whether the direct location grant existed or was already absent. The identity, project, and location remain unchanged.Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/embedded-identities/customer-user-4821/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/a1308d14-149c-4dd7-a4c5-295ac9090f58/access' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 204 No ContentErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_api_key",
"message": "The Bearer API key is invalid.",
"details": null,
"request_id": "req_01K1F8M7QX4R2V9N6Y3Z0A5BCT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404resource_not_foundThe embedded identity, project, or location was not found in this workspace.
429rate_limit_exceededToo many requests were made.