Review flow

Hosted Review is where reviewers confirm mappings, fix data, approve output, or cancel before final processing.

Every transformation run gets a signed review_url. Send that URL to the reviewer instead of building your own mapping or validation UI. Review links expire after 24 hours; expired links show a closed state without exposing source data, generated rows, or mapping details.

Steps

Structured file reviews start on Mapping, where reviewers confirm header detection and source-column mappings. Raw text and image reviews skip Mapping because the provider has already generated output rows; they open directly on Validate Data.

Validate Data lets reviewers edit cells and resolve required-field errors before approval. Saved edits are patch records, so an empty string is preserved as an intentional value and can still fail required-field validation.

Approval

Approval is the transition to customer-consumable output. Use all_rows when every row must pass required-field validation. Use valid_rows_only when invalid rows should be skipped and only valid edited rows should be written to the final artifact.

Reviewers can browse and edit up to 1,000 rows, with 100 rows per page. Invalid-row browsing is capped at 1,000 rows. Final processing can still transform up to 100,000 uploaded records.

States

activereview_state

The signed Review URL is usable and the reviewer can complete the current review steps.

approvedreview_state

The reviewer approved the mapping and/or data edits, and final output processing is allowed to run.

canceledreview_state

The reviewer explicitly canceled. The review closes and a cancellation webhook is sent when a notify URL exists.

expiredreview_state

The signed URL is past its expiry and renders an expired state without exposing mapping or data.

Customize each review

File and raw create requests accept optional review customization fields. They are stored on the hosted review and are returned in the run state where relevant.

success_callbackurl | null

Optional callback URL reviewers return to after approving. Production callback URLs must use HTTPS.

cancel_callbackurl | null

Optional callback URL reviewers return to after canceling. Production callback URLs must use HTTPS.

localestring | null

Optional locale hint. Supported values: en, de, fr, nl, es, it, pl, ar.

appearancelight | dark | null

Optional hosted Review appearance persisted for this review interaction.

column_labelsobject | null

Optional target-field label overrides shown as column names in Validate Data.

Review customization
{
  "success_callback": "https://example.com/imports/review-approved",
  "cancel_callback": "https://example.com/imports/review-canceled",
  "locale": "de",
  "appearance": "dark",
  "column_labels": {
    "employee_id": "Personalnummer",
    "work_email": "E-Mail",
    "department": "Abteilung"
  }
}

column_labels keys must match target schema field keys. Blank label values are treated as null, so Review falls back to the schema field label or field key.

After approval or cancellation, callback redirects append transformation_run_id as a query parameter. Store that id and fetch the run if your app needs fresh state after the browser returns.

Customize organization appearance

Organization admins can configure hosted Review branding under Settings → Review appearance. When custom review branding is enabled for the organization, reviewers see the configured brand name, logo, favicon, accent color, and support URL. Otherwise Review falls back to Transmutify branding and keeps the powered-by footer visible.

  • Logos support PNG, JPG, JPEG, WEBP up to 2 MB.
  • Favicons support PNG, JPG, JPEG, WEBP, ICO up to 512 KB.
  • Accent colors must be six-digit hex colors such as #635bff.

Webhooks and output

Review-stage progress does not send customer processing webhooks. The customer-facing webhook events are final output success (transformation.finished) and explicit review cancellation (transformation.review.canceled). For failures, fetch GET /transformations/{id} and read error.

For end-to-end request examples, continue with the file upload flow or raw content flow.