Undoes the enrollment an earlier import performed — the imported contacts stay in the Directory.
The safety net for a sync that enrolled the wrong cohort. It withdraws every `Served` grant that run authored <b>and still owns</b> — a grant somebody has since blocked, switched to humans-only or re-enrolled by hand belongs to that operator now and is reported as left alone, never steamrolled — and hands the transports it took over back to the provider's own bot. Contacts, environments and any operator edits to them are untouched: this reverses "the agent answers these people", not the import. Like the import it enqueues a job and returns `202 Accepted`; poll the returned run. Rejected with `400` when the source run granted nothing, and `409` when it is still sweeping or has already been undone.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The completed import run whose enrollment should be reversed.
uuidThe tenant identifier
Response Body
curl -X POST "https://api.fruxon.com/v1/tenants/string/directory/importRuns/497f6eca-6276-4993-bfeb-53cbbbba6f08:undoEnrollment"{
"id": "00000000-0000-0000-0000-000000000000",
"kind": "IMPORT",
"sourceRunId": "00000000-0000-0000-0000-000000000000",
"provider": "string",
"integrationConfigId": "00000000-0000-0000-0000-000000000000",
"scheduleId": "00000000-0000-0000-0000-000000000000",
"targetNetworkId": "00000000-0000-0000-0000-000000000000",
"targetAgentMode": "ON",
"enrollmentScope": "ALL_CONTACTS",
"enrollmentEnvironmentIds": [
"00000000-0000-0000-0000-000000000000"
],
"status": "PENDING",
"participantsCreated": 0,
"participantsUpdated": 0,
"participantsExisting": 0,
"participantsFailed": 0,
"contactsUnaffiliated": 0,
"valuesWithheld": 0,
"sampleFailures": [
{
"address": "string",
"reason": "string"
}
],
"accessGranted": 0,
"accessAlreadyGranted": 0,
"accessSkipped": 0,
"accessOutOfScope": 0,
"channelsActuated": 0,
"channelsNotActuated": 0,
"accessWithdrawn": 0,
"accessLeftAlone": 0,
"channelsReleased": 0,
"channelsNotReleased": 0,
"errorMessage": "string",
"createdAt": 0,
"modifiedAt": 0,
"startedAt": 0,
"completedAt": 0
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}Gets a directory import run by id — poll it to track progress and read the final counters.
Use this endpoint after `POST directory/import` returns `202 Accepted`. It reads the durable import job row for the current tenant and returns the current lifecycle status plus counters captured by the background worker. Pending and running imports have progress metadata only; completed imports include participant-created/existing/failed counts and the bounded failure sample, while failed imports include the captured error message for operator triage.
Infers the enrollment target application for a directory import from the source config.
Walks the config's inbound doorways (manual channel bindings and active messaging endpoints) to the active messaging entry points they materialized, and returns the owning application(s). When the config feeds exactly one application, it is returned as the suggestion the sync wizard pre-answers with; zero or several candidates leave the suggestion empty and the UI shows a picker. The tenant's Default application is never suggested by fallback — only when the config explicitly routes to it.