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.
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.