API Reference
Complete REST API documentation for Identity Mesh. Programmatically manage connectors, sync policies, and monitor identity synchronization operations.
Authentication
The Admin API uses Windows Negotiate (Kerberos/NTLM) by default, and also accepts JWT / Entra ID bearer tokens via the SmartAuth policy scheme. Requests must come from an authenticated principal with appropriate permissions. See the Authentication runbook.
Negotiate + Bearer (SmartAuth)
The API authenticates via Windows Negotiate (Kerberos/NTLM) by default — domain-joined clients authenticate automatically with no keys to manage. The SmartAuth policy scheme also accepts JWT / Entra ID bearer tokens, so cloud-native clients can present an OAuth token instead.
- Negotiate by default (Kerberos preferred, NTLM fallback)
- JWT / Entra ID bearer via SmartAuth
- Role-based access control (RBAC)
- Authentication runbook for setup
Example Request
curl --negotiate -u : \ https://your-server:5100/api/connectors
Base URL
https://your-server:5100/apiThe API runs on your on-premises server alongside the sync engine.
Connectors
Manage identity source and target connectors.
/connectorsList all configured connectors
Response
{
"connectors": [
{
"id": "conn_abc123",
"name": "Active Directory",
"type": "active_directory",
"status": "active",
"lastSync": "2026-01-01T18:30:00Z"
}
],
"total": 1
}/connectors/:idGet details for a specific connector
Parameters
idConnector ID/connectorsCreate a new connector
Request Body
{
"name": "Active Directory",
"type": "active_directory",
"config": {
"host": "ldap.company.com",
"port": 636,
"baseDN": "dc=company,dc=com",
"bindDN": "cn=admin,dc=company,dc=com",
"bindPassword": "********"
}
}config must be a JSON object. A config that does not parse, or whose root is not an object, is refused with 400 and anerror naming the JSON path that carries the fault (for example $.Partitions[0].AttributesToLoad[1]), so a pasted config with a stray line-feed fails at save time instead of on the next import.
/connectors/:idUpdate connector configuration. The same 400 config-validation rule as create applies; masked secret values in the submitted config are restored from the stored one.
/connectors/discover-classesRead the Active Directory forest schema and return each object class with its required and optional attributes. Backs the per-type attribute picker in the AD connector form. New in this release.
Request Body
configJsonThe AD connector config to bind with (credentials may be a secret reference)partitionIdOptional partition whose credentials to useRequires connectors.write. A bind or LDAP failure is returned assuccess: false with an errorMessage, not as an HTTP error.
/connectors/:idDelete a connector
Rules
Create and manage sync rules — join rules, flow rules, projection rules, and MeshComposer rules.
/rulesList all rules, optionally filtered by connector or rule type
Response
{
"items": [
{
"ruleId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"ruleName": "Join on employeeId",
"ruleType": "JoinRule",
"connectorId": "conn_abc123",
"priority": 1,
"isEnabled": true
}
],
"totalCount": 1
}/rulesCreate a new rule (JoinRule, FlowRule, ProjectionRule, or MeshComposerRule)
Request Body
{
"ruleName": "Flow displayName from AD",
"ruleType": "FlowRule",
"connectorId": "conn_abc123",
"sourceAttribute": "displayName",
"targetAttribute": "displayName",
"confidence": 90,
"transformScript": "Trim(source)"
}Import & Export Operations
Trigger and monitor import and export operations on connectors.
/connectors/:id/importTrigger a full or delta import on a connector
Response
{
"runId": "run_123abc",
"connectorId": "conn_abc123",
"runType": "DeltaImport",
"status": "Running",
"startedAt": "2026-01-01T19:00:00Z"
}/connectors/:id/exportTrigger an export to write pending changes to a target connector
/runs/:idGet status of an import or export run
Response
{
"runId": "run_123abc",
"connectorId": "conn_abc123",
"runType": "DeltaImport",
"status": "Completed",
"startedAt": "2026-01-01T19:00:00Z",
"completedAt": "2026-01-01T19:02:15Z",
"stats": {
"objectsProcessed": 1250,
"objectsCreated": 45,
"objectsUpdated": 203,
"objectsDeleted": 12,
"errors": 0
}
}Engine Instances
Manage sync engine instances — list, pause, resume, rename, and remove.
/instancesList all registered engine instances with effective status
/instances/:id/pausePause a specific engine instance
/instances/:id/resumeResume a paused engine instance
/instances/:id/renameRename an instance. Cascades across connector assignments, run history, and pause settings. Returns 409 if the new name is already taken.
/instances/:idRemove an offline instance and unassign its connectors
/connectors/:id/instanceAssign or unassign a connector to an instance. A connector already assigned to another instance must be unassigned first (409 Conflict).
Mesh Objects
Query the unified identity mesh. List, search, and inspect mesh objects with their consolidated attributes from all connected sources.
/mesh/objectsList mesh objects with pagination, type filtering, and anchor search
Parameters
skipNumber of records to skip (pagination offset)takeNumber of records to return (max 200)objectTypeFilter by object type (optional)searchFilter by anchor value substring (optional)Response
{
"items": [
{
"meshObjectId": "c51d176b-0c9e-4b59-80bd-cb49078d9044",
"objectType": "User",
"anchorValue": "jsmith@company.com",
"createdOn": "2026-01-15T10:30:00Z",
"updatedOn": "2026-02-01T14:22:00Z",
"attributeValues": {
"displayName": "John Smith",
"department": "Engineering",
"title": "Senior Developer",
"mail": "jsmith@company.com"
}
}
],
"totalCount": 1,
"skip": 0,
"take": 25
}Each object includes an attributeValues dictionary containing all consolidated attribute name/value pairs, enabling dynamic column display without additional API calls.
/mesh/objects/searchAdvanced search with attribute-based criteria
Request Body
{
"objectType": "User",
"anchorSearch": "smith",
"criteria": [
{
"attributeName": "department",
"operator": "equals",
"value": "Engineering"
}
],
"skip": 0,
"take": 25
}Supported operators: equals,contains,startswith,endswith,ispresent,isnotpresent,istrue,isfalse. Multiple criteria are combined with AND logic.
/mesh/objects/:idGet full mesh object detail with attributes and relationships
Response
{
"meshObjectId": "c51d176b-0c9e-4b59-80bd-cb49078d9044",
"objectType": "User",
"anchorValue": "jsmith@company.com",
"createdOn": "2026-01-15T10:30:00Z",
"updatedOn": "2026-02-01T14:22:00Z",
"attributes": [
{
"attributeName": "displayName",
"attributeValue": "John Smith",
"source": "14d98031-df8d-45cd-8476-1d6dcc02407e",
"confidence": 100,
"updatedOn": "2026-02-01T14:22:00Z"
}
],
"relationships": [
{
"relationshipType": "manager",
"targetMeshObjectId": "a23b456c-...",
"targetAnchorValue": "mjones@company.com",
"targetObjectType": "User"
}
]
}The detail view returns the full attribute array (with source connector, confidence score, and timestamp per attribute) and all relationships to other mesh objects.
Self-service Groups
Owner-managed groups with join requests, expiry, dual-control approval for high-impact groups, and a per-tenant policy. New in this release; see the Self-service groups runbook. Permissions: groups.read, groups.request,groups.own, groups.admin,groups.audit.read, groups.notify.read. Holding groups.own grants nothing on an existing group; ownership is per group.
Group lifecycle
Create, read, update, delete, renew and restore. A deleted or expired group's name stays reserved until retention frees it, and the refusal names that date.
/groupsgroups.read/groups/megroups.read/groupsgroups.own · rate limited/groups/:idgroups.read/groups/:idgroups.own/groups/:idgroups.admin · rate limited/groups/:id/renewgroups.own/groups/:id/restoregroups.own · rate limited/groups/:id/targetsgroups.readMembers and owners
Owners manage members and co-owners. Any member may leave.
/groups/:id/membersgroups.read/groups/:id/members/:personIdgroups.own/groups/:id/members/:personIdgroups.own/groups/:id/members/megroups.request/groups/:id/ownersgroups.read/groups/:id/owners/:personIdgroups.own/groups/:id/owners/:personIdgroups.own/groups/peoplegroups.ownJoin requests and approvals
A high-impact group needs two approvals: an owner first, then a different groups.admin person. Denials are exempt, and an administrator may deny at any stage.
/groups/:id/requestsgroups.request · rate limited/groups/requests/minegroups.request/groups/requests/pendinggroups.own/groups/requests/pending-admingroups.admin/group-requests/:id/approvegroups.own/group-requests/:id/denygroups.own/group-requests/:id/cancelgroups.requestPolicy and audit
The policy is one row. An empty creator-group list means administrators only; an empty allowed-type list means every group type.
/groups/policiesgroups.admin/groups/policiesgroups.admin · rate limited/groups/auditgroups.audit.read/groups/audit/export.csvgroups.audit.read/groups/onboarding/candidatesgroups.admin/groups/onboarding/previewgroups.admin/groups/onboardinggroups.admin · rate limited/groups/:id/releasegroups.admin · rate limitedRoles & assignments
Roles are named permission sets. An assignment row names a sign-in, or a directory group whose members all hold the role at sign-in; a user row always wins over a group row. SeeAuthentication → Role rows.
/rolesroles.read/rolesroles.write/roles/:roleNameroles.write/roles/:roleName/permissionsroles.read/roles/:roleName/permissionsroles.write/user-rolesroles.read/user-roles/principalsroles.write/user-rolesroles.write/user-roles/:idroles.write/user-roles/:idroles.writeSecret provider
Choose, test, migrate to and switch the secret provider. Every route needs secrets.manage, held by Admin by default. Every action that changes something is audited.
/secrets/statussecrets.manage/secrets/targetsecrets.manage/secrets/testsecrets.manage/secrets/migratesecrets.manage/secrets/switchsecrets.manage/secrets/purgesecrets.manageNotifications & Email
Every notification is written to the recipient's inbox, then attempted as email through the provider you choose (SMTP, Mailgun or Microsoft 365). Email is off until it is switched on and saved. See the Email runbook.
/me/notificationsgroups.notify.read/me/notifications/:id/readgroups.notify.read/settings/emailroles.read/settings/emailroles.write/settings/email/:provider/secretroles.write/settings/email/testroles.write/client-logssigned-in user · rate limitedMaintenance
Export re-evaluation and mesh-orphan cleanup, both new in this release. The older uniqueness re-resolve, duplicate-orphan cleanup and staging gates are in the Maintenance operations runbook.
/connectors/:id/export-sweepsync.execute/connectors/:id/export-sweepruns.read/admin/cleanup-mesh-orphans/reportrules.write · rate limited/admin/cleanup-mesh-orphansrules.write · rate limited/admin/cleanup-unlinked-mesh-objects/reportrules.write · rate limited/admin/cleanup-unlinked-mesh-objectsrules.write · rate limitedExport sweep status
{
"requested": false,
"requestedUtc": null,
"lastResult": {
"requestedUtc": "2026-09-23T14:00:00Z",
"startedUtc": "2026-09-23T14:00:07Z",
"completedUtc": "2026-09-23T14:03:41Z",
"scanned": 50210,
"queued": 37,
"error": null
}
}requested is true while a sweep is waiting for the engine to pick it up. The POST returns the same shape with202 Accepted. Queue items created by a sweep carry the reason ManagementSpaceSweep.
Mesh-orphan cleanup
The report is a CSV with columns MeshObjectId, ObjectType, AnchorValue, DisplayName, Source, DuplicateOfMeshObjectId, MatchedBy, ReviewReason, ExportedSnapshotCount. A display-name-only match, an ambiguous match, or an object with exported snapshots is reported with a ReviewReasonand never deleted. Every deletion writes an audit row naming the survivor and the match rule.
Vault: one-time credential link
A check-out session releases its credential once. These two routes let the requester hand that single release to someone, or something, without a portal account. New in this release; see the Vault operations runbook.
/vault/sessions/:id/credential-tokenvault.credential.read · rate limited/vault/credential/redeemanonymous · rate limitedIssue response
{
"token": "…",
"redeemUrl": "https://your-server:5100/api/vault/credential/redeem",
"expiresUtc": "2026-09-23T15:00:00Z"
}Redeem response
{
"credential": "…",
"expires_utc": "2026-09-23T15:00:00Z"
}Issuing a link spends the session's single view, so the portal's Show password on that session then returns409. The token expires with the session. It is sent in the request body, never in the URL, so request logs cannot capture it.
Migration
Saved migration projects for the Microsoft Identity Manager (MIM) migration analyzer. The decisions route changed in this release.
/migration/projects/:id/decisionsschema.writeBody: decisions, provenance andexpectedUpdatedUtc. An unprojectable decision set now returns400 with { "error": "…" }instead of a bare 500, and nothing is persisted. A missing stored export returns 400 withexportMissing: true.
API Notes
The Admin API runs on-premises alongside your sync engine. There are no external rate limits, but operator-scale routes (marked rate limited in the route tables above) share one rate limiter for sensitive operations and answer 429 when it trips.
Error Codes
Standard HTTP status codes with detailed error messages.
400Bad RequestInvalid request parameters
401UnauthorizedAuthentication failed (Negotiate or bearer)
403ForbiddenAuthenticated, but missing the route's permission, or acting on another operator's vault session
404Not FoundResource does not exist
409ConflictState refuses the change: a second credential view, a name already taken, a project changed elsewhere
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer-side error occurred
Connector SDK
Build custom connectors using the IIdentityConnector SDK to integrate any identity source.
IIdentityConnector
Implement FullImport(), DeltaImport(), and Export() to connect any identity source.
Active Directory
LDAP-based connector with uSNChanged delta detection, group membership sync, and OU-aware operations.
SQL Database
Configurable SQL queries for import, configurable delta columns, and parameterized export statements.
Ready to Get Started?
Request API access and start building with Identity Mesh today.