Product documentation
EntraAppMigration
Microsoft Entra app-registration bulk import to Thoryn OAuth clients — read-only dry-run reconciliation report (SSO-1326).
EntraAppMigration
Microsoft Entra app-registration bulk import to Thoryn OAuth clients — read-only dry-run reconciliation report (SSO-1326).
Base URL: https://api.stg.thoryn.org
Operations
| Method | Path | Summary | Scopes |
|---|---|---|---|
POST | /api/v1/migration/entra/app-registrations | Bulk-import Entra app registrations as Thoryn OAuth clients | tenant:clients.write + tenant:migration.entra |
Operation details
POST /api/v1/migration/entra/app-registrations
Bulk-import Entra app registrations as Thoryn OAuth clients
Reads every app registration from the caller's Microsoft Entra tenant via Graph and maps each to a proposed Thoryn OAuth client, returning a reconciliation report bucketed CLEAN / DEGRADED / SKIPPED. With dryRun=true (default) NOTHING is written — the report is a preview. With dryRun=false the report's importable rows are COMMITTED: each CLEAN/DEGRADED row is created as a Thoryn OAuth client through the hub-authoritative client store (product-api never duplicates it). The commit path is IDEMPOTENT per source Entra appId — re-running skips apps already imported (SKIPPED_ALREADY_IMPORTED). Each created client gets a FRESH Thoryn-minted secret (an Entra secret is never imported; the bulk report does not return secrets — obtain a usable secret per client via secret rotation), and a client.created audit row is written per created client. Per-row commitOutcome is one of CREATED, DEGRADED_CREATED, SKIPPED_ALREADY_IMPORTED, SKIPPED_NO_VALID_REDIRECT_URI, or FAILED; one row's failure never aborts the batch.
- Operation ID:
entraAppMigrationMigrateEntraAppRegistrations - Required scopes:
tenant:clients.write+tenant:migration.entra
Request body (required): application/json → EntraAppImportRequest
Responses:
| Status | Description | Body |
|---|---|---|
200 | OK | object |
401 | Unauthorized — bearer token missing, expired, signed by an untrusted issuer, or missing the tnt tenant claim. | Problem (problem+json) |
403 | Forbidden — token lacks a required tenant:* scope, or the tnt claim does not match the tenant addressed by the request path. | Problem (problem+json) |