Skip to content

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

MethodPathSummaryScopes
POST/api/v1/migration/entra/app-registrationsBulk-import Entra app registrations as Thoryn OAuth clientstenant: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:

StatusDescriptionBody
200OKobject
401Unauthorized — bearer token missing, expired, signed by an untrusted issuer, or missing the tnt tenant claim.Problem (problem+json)
403Forbidden — token lacks a required tenant:* scope, or the tnt claim does not match the tenant addressed by the request path.Problem (problem+json)