Skip to content

Managing Identities

VeraID exposes a full set of RESTful endpoints for identity lifecycle management. All endpoints require authentication via a valid API credential and are scoped by your organization’s tenant.

Create an Identity

Create a new non-human identity in your organization.

Endpoint: POST /api/v1/identities

Request Body

FieldTypeRequiredDescription
namestringYesHuman-readable name (must be unique within your tenant)
typeenumYesNHI type: SERVICE_ACCOUNT, API_KEY, OAUTH_TOKEN, CI_CD, AI_AGENT, IOT_DEVICE, KUBERNETES_POD
descriptionstringNoPurpose or context for this identity
metadataobjectNoArbitrary key-value pairs (e.g., team, cost center, environment)
tagsstring[]NoLabels for filtering and policy assignment
allowedIPsstring[]NoIP allowlist in CIDR notation
allowedOriginsstring[]NoPermitted HTTP origins
expiresAtdatetimeNoOptional expiration timestamp (ISO 8601)
agentConfigobjectNoAI agent configuration (only for AI_AGENT type)

Example

Terminal window
curl -X POST https://app.veraid.io/api/v1/identities \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "deploy-pipeline-staging",
"type": "CI_CD",
"description": "GitHub Actions deployment pipeline for the staging environment",
"metadata": {
"team": "platform",
"repository": "acme/web-app",
"environment": "staging"
},
"tags": ["staging", "github-actions", "platform-team"]
}'

Response

{
"id": "idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d",
"name": "deploy-pipeline-staging",
"type": "CI_CD",
"status": "ACTIVE",
"description": "GitHub Actions deployment pipeline for the staging environment",
"metadata": {
"team": "platform",
"repository": "acme/web-app",
"environment": "staging"
},
"tags": ["staging", "github-actions", "platform-team"],
"allowedIPs": [],
"allowedOrigins": [],
"riskScore": 0,
"lastUsedAt": null,
"expiresAt": null,
"agentConfig": null,
"createdAt": "2026-03-19T10:00:00Z",
"updatedAt": "2026-03-19T10:00:00Z"
}

List Identities

Retrieve a paginated list of identities with optional filters.

Endpoint: GET /api/v1/identities

Query Parameters

ParameterTypeDefaultDescription
typeenumFilter by NHI type
statusenumFilter by lifecycle status (ACTIVE, SUSPENDED, REVOKED)
tagsstringComma-separated list of tags (identities matching any tag are returned)
searchstringFull-text search across name and description
pagenumber1Page number (1-indexed)
limitnumber20Results per page (max 100)

Example

Terminal window
# List all active CI/CD identities tagged with "production"
curl -X GET "https://app.veraid.io/api/v1/identities?type=CI_CD&status=ACTIVE&tags=production&page=1&limit=25" \
-H "Authorization: Bearer kd_live_your_api_key"

Response

{
"data": [
{
"id": "idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d",
"name": "deploy-pipeline-production",
"type": "CI_CD",
"status": "ACTIVE",
"riskScore": 8,
"tags": ["production", "github-actions"],
"lastUsedAt": "2026-03-19T09:45:00Z",
"createdAt": "2025-10-15T14:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 25,
"total": 1,
"totalPages": 1
}
}

Get an Identity

Retrieve the full details of a single identity by its ID.

Endpoint: GET /api/v1/identities/{id}

Example

Terminal window
curl -X GET https://app.veraid.io/api/v1/identities/idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d \
-H "Authorization: Bearer kd_live_your_api_key"

The response contains the full identity object as described in the Identity Overview.

Update an Identity

Modify a mutable field on an existing identity. Only the fields included in the request body are updated; all other fields remain unchanged.

Endpoint: PUT /api/v1/identities/{id}

Updatable Fields

FieldNotes
nameMust remain unique within your tenant
descriptionFree-text update
metadataReplaces the entire metadata object (use merge logic client-side)
tagsReplaces the entire tags array
allowedIPsReplaces the entire IP allowlist
allowedOriginsReplaces the entire origins list
expiresAtSet or clear the expiration
agentConfigUpdate AI agent configuration (AI_AGENT type only)

Example

Terminal window
curl -X PUT https://app.veraid.io/api/v1/identities/idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated: now handles both staging and QA deployments",
"tags": ["staging", "qa", "github-actions", "platform-team"],
"allowedIPs": ["10.0.0.0/16"]
}'

Response

Returns the full updated identity object with updatedAt reflecting the modification timestamp.

Delete an Identity

Permanently delete an identity and all associated data. This action removes the identity record, revokes all linked credentials, and deletes policy bindings.

Endpoint: DELETE /api/v1/identities/{id}

Example

Terminal window
curl -X DELETE https://app.veraid.io/api/v1/identities/idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d \
-H "Authorization: Bearer kd_live_your_api_key"

Response

{
"success": true,
"message": "Identity deleted successfully"
}

Suspend an Identity

Temporarily disable an identity. All active credentials are invalidated, and authentication attempts are rejected until the identity is reactivated.

Endpoint: POST /api/v1/identities/{id}/suspend

Request Body

FieldTypeRequiredDescription
reasonstringNoReason for suspension (recorded in audit log)

Example

Terminal window
curl -X POST https://app.veraid.io/api/v1/identities/idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d/suspend \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"reason": "Owner on leave — suspending per offboarding policy"
}'

Response

{
"id": "idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d",
"status": "SUSPENDED",
"suspendedAt": "2026-03-19T10:30:00Z",
"suspendedReason": "Owner on leave — suspending per offboarding policy"
}

Activate an Identity

Reactivate a previously suspended identity. Credentials that were active before suspension are restored.

Endpoint: POST /api/v1/identities/{id}/activate

Example

Terminal window
curl -X POST https://app.veraid.io/api/v1/identities/idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d/activate \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json"

Response

{
"id": "idt_3a1f8c29-b7d4-4e2a-9c8f-1d5e7a2b4c6d",
"status": "ACTIVE",
"activatedAt": "2026-03-19T14:00:00Z"
}

Error Responses

All identity endpoints return standard error responses:

Status CodeMeaningCommon Causes
400Bad RequestInvalid field values, missing required fields
401UnauthorizedMissing or invalid API credential
403ForbiddenInsufficient permissions for this operation
404Not FoundIdentity ID does not exist in your tenant
409ConflictName collision, invalid state transition (e.g., activating a revoked identity)
429Too Many RequestsRate limit exceeded
{
"error": {
"code": "IDENTITY_NOT_FOUND",
"message": "No identity found with ID idt_invalid_id",
"status": 404
}
}

What’s Next