{"openapi":"3.1.0","info":{"title":"Transmutify API","version":"v1","description":"External Transmutify API for creating transformation runs, opening hosted reviews, approving final output, and retrieving providers, schemas, and transformation details."},"servers":[{"url":"https:\/\/api.transmutify.io\/v1","description":"V1 API"}],"security":[{"http":[]}],"paths":{"\/transformations\/file":{"post":{"operationId":"v1.transformations.file","description":"Creates a run in `awaiting_upload` status and returns temporary upload\ninstructions for the caller's source file.\nThe processing starts immediately after upload completed.\nUse the returned `id` to inspect\nstatus while the hosted Review UI handles review and approval.","summary":"Initialize a file-based transformation run","tags":["FileTransformation"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/StoreFileTransformationRequest"}}}},"responses":{"201":{"description":"`TransformationRunInitResource`","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/FileTransformationRunInitResource"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/providers":{"get":{"operationId":"v1.providers.index","description":"Returns every provider the organization has registered, including\nprovider key (e.g. `anthropic`, `openai`), model identifier, and\ndisplay labels. Use a provider's returned `id` as `provider_id` when\ninitializing a transformation run.","summary":"List AI providers configured for the caller's organization","tags":["Provider"],"responses":{"200":{"description":"Paginated set of `ProviderResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}},"links":{"type":"object","properties":{"first":{"type":["string","null"]},"last":{"type":["string","null"]},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}},"required":["first","last","prev","next"]},"meta":{"type":"object","properties":{"current_page":{"type":"integer","minimum":1},"from":{"type":["integer","null"],"minimum":1},"last_page":{"type":"integer","minimum":1},"links":{"type":"array","description":"Generated paginator links.","items":{"type":"object","properties":{"url":{"type":["string","null"]},"label":{"type":"string"},"active":{"type":"boolean"}},"required":["url","label","active"]}},"path":{"type":["string","null"],"description":"Base path for paginator generated URLs."},"per_page":{"type":"integer","description":"Number of items shown per page.","minimum":0},"to":{"type":["integer","null"],"description":"Number of the last item in the slice.","minimum":1},"total":{"type":"integer","description":"Total number of items being paginated.","minimum":0}},"required":["current_page","from","last_page","links","path","per_page","to","total"]}},"required":["data","links","meta"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/providers\/{provider}":{"get":{"operationId":"v1.providers.show","summary":"Show an AI provider configured for the caller's organization","tags":["Provider"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"`ProviderResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProviderResource"}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/transformations\/raw":{"post":{"operationId":"v1.transformations.raw","description":"Stores the submitted `content`, creates a queued review-stage run, and\ndispatches review preparation immediately. Use this endpoint when callers\ncan send the full input body in the API request instead of uploading a file.","summary":"Start a raw-content transformation run","tags":["RawTransformation"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/StoreRawTransformationRequest"}}}},"responses":{"201":{"description":"`TransformationRunInitResource`","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RawTransformationRunInitResource"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/schemas":{"get":{"operationId":"v1.schemas.index","description":"Each schema describes the desired output structure for a\ntransformation: a map of target field names to their `description`,\n`data_type`, and `is_required` flag. Use a schema's returned `id` as\n`schema_id` when initializing a transformation run.","summary":"List target schemas defined for the caller's organization","tags":["Schema"],"responses":{"200":{"description":"Paginated set of `SchemaResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/SchemaResource"}},"links":{"type":"object","properties":{"first":{"type":["string","null"]},"last":{"type":["string","null"]},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}},"required":["first","last","prev","next"]},"meta":{"type":"object","properties":{"current_page":{"type":"integer","minimum":1},"from":{"type":["integer","null"],"minimum":1},"last_page":{"type":"integer","minimum":1},"links":{"type":"array","description":"Generated paginator links.","items":{"type":"object","properties":{"url":{"type":["string","null"]},"label":{"type":"string"},"active":{"type":"boolean"}},"required":["url","label","active"]}},"path":{"type":["string","null"],"description":"Base path for paginator generated URLs."},"per_page":{"type":"integer","description":"Number of items shown per page.","minimum":0},"to":{"type":["integer","null"],"description":"Number of the last item in the slice.","minimum":1},"total":{"type":"integer","description":"Total number of items being paginated.","minimum":0}},"required":["current_page","from","last_page","links","path","per_page","to","total"]}},"required":["data","links","meta"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/schemas\/{schema}":{"get":{"operationId":"v1.schemas.show","summary":"Show a target schema defined for the caller's organization","tags":["Schema"],"parameters":[{"name":"schema","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"`SchemaResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/SchemaResource"}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}},"\/transformations\/{transformationRun}":{"get":{"operationId":"v1.transformations.show","description":"Returns the run's status, mapping rule, and any failure details.\nPoll this endpoint to track run progress.","summary":"Retrieve the current state of a transformation run","tags":["TransformationRun"],"parameters":[{"name":"transformationRun","in":"path","required":true,"description":"The transformation run UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"`TransformationRunResource`","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TransformationRunResource"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"},"429":{"$ref":"#\/components\/responses\/ApiRateLimited"},"500":{"$ref":"#\/components\/responses\/ApiInternalServerError"}}}}},"components":{"securitySchemes":{"http":{"type":"http","scheme":"bearer"}},"schemas":{"ApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code.","example":"not_found"},"message":{"type":"string","description":"Human-readable error message.","example":"The requested resource was not found."},"type":{"type":"string","description":"High-level error category.","example":"not_found"},"request_id":{"type":"string","description":"Identifier for correlating this error with server logs.","example":"9f2b4c1a-8e6d-4a3b-9c1f-7d2e5a8b3c4d"}},"required":["code","message","type","request_id"]}},"required":["error"],"title":"ApiError"},"ApiValidationError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code.","example":"validation_failed"},"message":{"type":"string","description":"Human-readable error message.","example":"The given data was invalid."},"type":{"type":"string","description":"High-level error category.","example":"validation"},"request_id":{"type":"string","description":"Identifier for correlating this error with server logs.","example":"9f2b4c1a-8e6d-4a3b-9c1f-7d2e5a8b3c4d"},"fields":{"type":"object","description":"Per-field validation messages keyed by field name.","example":{"email":["The email field is required."],"name":["The name must be a string."]},"additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["code","message","type","request_id","fields"]}},"required":["error"],"title":"ApiValidationError"},"FileTransformationRunInitResource":{"type":"object","example":{"id":"019dc45d-3b81-7369-a776-2d95c5caab97","status":"awaiting_upload","stage":"review","input_source":"upload","schema_id":"019dc458-710e-73a0-9b5a-bb7d6f7ddc42","review_url":"https:\/\/review.transmutify.io\/reviews\/019dc45d-3b81-7369-a776-2d95c5caab97?signature=...","upload":{"url":"https:\/\/storage.example.com\/transmutify\/uploads\/019dc45d-3b81-7369-a776-2d95c5caab97\/input.csv","headers":{"Content-Type":"text\/csv"},"method":"PUT","expires_at":"2026-01-15T12:45:00Z"}},"properties":{"id":{"type":"string","format":"uuid","description":"Stable UUID of the transformation run. Use this in subsequent requests against the run."},"status":{"type":"string","description":"Current lifecycle status. File runs start as `awaiting_upload`; raw runs start as `queued`."},"stage":{"type":"string","description":"Current stage of the run. Create responses start in `review`."},"input_source":{"type":"string","description":"Input source for this run (`upload`, `raw`, or `image`)."},"schema_id":{"type":"string","format":"uuid","description":"UUID of the schema this run targets."},"review_url":{"type":"string","format":"uri","description":"Signed hosted-review URL for end-user review."},"upload":{"type":"object","description":"Pre-signed upload instructions for the source file.","properties":{"url":{"type":"string","example":"https:\/\/storage.example.com\/transmutify\/uploads\/source.csv"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"method":{"type":"string","example":"PUT"},"expires_at":{"type":"string","format":"date-time","example":"2026-01-15T12:45:00Z"}},"required":["url","headers","method","expires_at"]}},"required":["id","status","stage","input_source","schema_id","review_url","upload"],"title":"FileTransformationRunInitResource"},"ProviderResource":{"type":"object","example":{"id":"019dc459-c94a-71b4-a35f-6b6d384ef74b","name":"Production OpenAI","provider":"openai","provider_label":"OpenAI","model":"gpt-5.2","model_label":"GPT-5.2","created_at":"2026-01-10T09:15:00Z","updated_at":"2026-01-10T09:15:00Z"},"properties":{"id":{"type":"string","description":"Stable provider identifier. Pass this as `provider_id` when creating a transformation run."},"name":{"type":"string","description":"User-defined name for this provider configuration."},"provider":{"type":"string","description":"Provider key (e.g. `anthropic`, `openai`, `xai`, `gemini`, `openrouter`)."},"provider_label":{"type":"string","description":"Human-readable provider name suitable for display."},"model":{"type":"string","description":"Model identifier used with this provider (e.g. `claude-sonnet-4-5-20250929`)."},"model_label":{"type":"string","description":"Human-readable model name suitable for display."},"created_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the provider was added."},"updated_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the provider was last updated."}},"required":["id","name","provider","provider_label","model","model_label","created_at","updated_at"],"title":"ProviderResource"},"RawTransformationRunInitResource":{"type":"object","example":{"id":"019dc45d-3b81-7369-a776-2d95c5caab97","status":"queued","stage":"review","input_source":"raw","schema_id":"019dc458-710e-73a0-9b5a-bb7d6f7ddc42","review_url":"https:\/\/review.transmutify.io\/reviews\/019dc45d-3b81-7369-a776-2d95c5caab97?signature=..."},"properties":{"id":{"type":"string","format":"uuid","description":"Stable UUID of the transformation run. Use this in subsequent requests against the run."},"status":{"type":"string","description":"Current lifecycle status. File runs start as `awaiting_upload`; raw runs start as `queued`."},"stage":{"type":"string","description":"Current stage of the run. Create responses start in `review`."},"input_source":{"type":"string","description":"Input source for this run (`upload`, `raw`, or `image`)."},"schema_id":{"type":"string","format":"uuid","description":"UUID of the schema this run targets."},"review_url":{"type":"string","format":"uri","description":"Signed hosted-review URL for end-user review."}},"required":["id","status","stage","input_source","schema_id","review_url"],"title":"RawTransformationRunInitResource"},"SchemaResource":{"type":"object","example":{"id":"019dc458-710e-73a0-9b5a-bb7d6f7ddc42","name":"Employee import","fields":{"employee_id":{"label":"Employee ID","description":"Stable employee identifier from the source HR system.","data_type":"string","is_required":true,"transformations":{"trim_whitespace":{"enabled":true},"uppercase":{"enabled":true}}},"work_email":{"label":"Work Email","description":"Employee work email address.","data_type":"email","is_required":true,"transformations":{"trim_whitespace":{"enabled":true},"lowercase":{"enabled":true}}},"start_date":{"label":"Start Date","description":"First day of employment.","data_type":"date","format":"Y-m-d","is_required":false,"transformations":{"date_format":{"enabled":true,"from":"m\/d\/Y","to":"Y-m-d"}}}},"created_at":"2026-01-10T09:10:00Z","updated_at":"2026-01-10T09:10:00Z"},"properties":{"id":{"type":"string","description":"Stable schema identifier. Pass this as `schema_id` when creating a transformation run."},"name":{"type":"string","description":"User-defined name for this schema."},"fields":{"type":"object","description":"Map of target field definitions keyed by field name. Each entry contains `description`, `data_type`, `is_required`, and optional `label`.","additionalProperties":{"type":"object","properties":{"label":{"type":["string","null"],"description":"Optional display label used as a review UI column name when no review-specific override is configured."},"description":{"type":"string"},"data_type":{"type":"string"},"is_required":{"type":"boolean"},"format":{"type":["string","null"]},"transformations":{"type":"object","description":"Optional field-level transformations applied after mapping.","additionalProperties":{"type":"object","additionalProperties":[]}}},"required":["description","data_type","is_required"]}},"created_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the schema was created."},"updated_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the schema was last updated."}},"required":["id","name","fields","created_at","updated_at"],"title":"SchemaResource"},"StoreFileTransformationRequest":{"type":"object","properties":{"schema_id":{"type":"string","format":"uuid","description":"Target schema UUID that defines the desired output fields for this transformation."},"provider_id":{"type":["string","null"],"format":"uuid","description":"AI provider UUID used for AI-assisted structured mapping or image extraction. Required when filename is JPG, PNG, or WebP; omit for manual structured-file mapping."},"dry_run":{"type":"boolean","description":"When true, the run generates synthetic output and skips review preparation quota consumption."},"filename":{"type":"string","description":"Original source filename used to create upload instructions. CSV, TSV, TXT, and XLSX start structured-file mapping; JPG, PNG, and WebP start image extraction after upload completion.","maxLength":255},"input_has_header":{"type":["boolean","null"],"description":"Optional override for whether the uploaded structured file contains a header row. Ignored for image filenames."},"output_format":{"type":"string","description":"Output artifact format produced after hosted review approval. Defaults to JSON when omitted.","enum":["json","csv"]},"notify_url":{"type":["string","null"],"format":"uri","description":"Optional webhook URL for transformation completion notifications. Production callbacks must use HTTPS."},"success_callback":{"type":["string","null"],"format":"uri","description":"Optional hosted-review success callback used after a reviewer approves the review. Production callback URLs must use HTTPS."},"cancel_callback":{"type":["string","null"],"format":"uri","description":"Optional hosted-review cancel callback used after a reviewer cancels the review. Production callback URLs must use HTTPS."},"locale":{"type":["string","null"],"description":"Optional locale for the hosted review UI translations. Case-insensitive; unsupported values fall back to `en`.","enum":["en","de","fr","nl","es","it","pl","ar"]},"appearance":{"type":["string","null"],"description":"Optional hosted-review appearance persisted for all review interactions.","enum":["light","dark"]},"metadata":{"type":["object","null"],"description":"Optional caller-defined metadata JSON object echoed in transformation responses and customer webhooks.","example":{"external_id":"import-2026-01-15","source":{"system":"hris","batch":42}},"additionalProperties":[]},"column_labels":{"type":["object","null"],"description":"Optional JSON object keyed by schema field name. Values override the labels shown in the hosted Review UI.","example":{"employee_id":"Employee ID","work_email":"Work email","department":"Department"},"additionalProperties":{"type":["string","null"]}}},"required":["schema_id","filename"],"title":"StoreFileTransformationRequest"},"StoreRawTransformationRequest":{"type":"object","properties":{"schema_id":{"type":"string","format":"uuid","description":"Target schema UUID that defines the desired output fields for this raw transformation."},"provider_id":{"type":"string","format":"uuid","description":"AI provider UUID required for the raw flow. Dry-runs keep this shape but do not call the provider."},"content":{"type":"string","description":"Raw source content to transform. In non-dry-runs this content is sent to the configured AI provider.","maxLength":50000},"dry_run":{"type":"boolean","description":"When true, generate synthetic schema-shaped output instead of sending raw content to AI."},"output_format":{"type":"string","description":"Output artifact format for the immediately queued final run. Defaults to JSON when omitted.","enum":["json","csv"]},"notify_url":{"type":["string","null"],"format":"uri","description":"Optional webhook URL for transformation completion notifications. Production callbacks must use HTTPS."},"success_callback":{"type":["string","null"],"format":"uri","description":"Optional hosted-review success callback used after a reviewer approves the review. Production callback URLs must use HTTPS."},"cancel_callback":{"type":["string","null"],"format":"uri","description":"Optional hosted-review cancel callback used after a reviewer cancels the review. Production callback URLs must use HTTPS."},"locale":{"type":["string","null"],"description":"Optional locale for the hosted review UI translations. Case-insensitive; unsupported values fall back to `en`.","enum":["en","de","fr","nl","es","it","pl","ar"]},"appearance":{"type":["string","null"],"description":"Optional hosted-review appearance persisted for all review interactions.","enum":["light","dark"]},"metadata":{"type":["object","null"],"description":"Optional caller-defined metadata JSON object echoed in transformation responses and customer webhooks.","example":{"external_id":"import-2026-01-15","source":{"system":"hris","batch":42}},"additionalProperties":[]},"column_labels":{"type":["object","null"],"description":"Optional JSON object keyed by schema field name. Values override the labels shown in the hosted Review UI.","example":{"employee_id":"Employee ID","work_email":"Work email","department":"Department"},"additionalProperties":{"type":["string","null"]}}},"required":["schema_id","provider_id","content"],"title":"StoreRawTransformationRequest"},"TransformationRunInitResource":{"type":"object","example":{"id":"019dc45d-3b81-7369-a776-2d95c5caab97","status":"awaiting_upload","stage":"review","input_source":"upload","schema_id":"019dc458-710e-73a0-9b5a-bb7d6f7ddc42","review_url":"https:\/\/review.transmutify.io\/reviews\/019dc45d-3b81-7369-a776-2d95c5caab97?signature=...","upload":{"url":"https:\/\/storage.example.com\/transmutify\/uploads\/019dc45d-3b81-7369-a776-2d95c5caab97\/input.csv","headers":{"Content-Type":"text\/csv"},"method":"PUT","expires_at":"2026-01-15T12:45:00Z"}},"properties":{"id":{"type":"string","description":"Stable UUID of the transformation run. Use this in subsequent requests against the run."},"status":{"type":"string","description":"Current lifecycle status (e.g. `awaiting_upload`, `queued`, `processing`, `completed`, `failed`)."},"stage":{"type":"string","description":"Current stage of the run (`review` while hosted review is active, `final` once approved)."},"input_source":{"type":"string","description":"Input source for this run (`upload`, `raw`, or `image`)."},"schema_id":{"type":"string","description":"UUID of the schema this run targets."},"review_url":{"type":"string","description":"Signed hosted-review URL for end-user review."},"upload":{"type":"object","description":"Pre-signed upload instructions for the source file.","properties":{"url":{"type":"string","example":"https:\/\/storage.example.com\/transmutify\/uploads\/source.csv"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"method":{"type":"string","example":"PUT"},"expires_at":{"type":"string","format":"date-time","example":"2026-01-15T12:45:00Z"}},"required":["url","headers","method","expires_at"]}},"required":["id","status","stage","input_source","schema_id","review_url"],"title":"TransformationRunInitResource"},"TransformationRunResource":{"type":"object","example":{"id":"019dc45d-3b81-7369-a776-2d95c5caab97","status":"completed","terminal":true,"stage":"final","schema_id":"019dc458-710e-73a0-9b5a-bb7d6f7ddc42","provider_id":"019dc459-c94a-71b4-a35f-6b6d384ef74b","dry_run":false,"input_source":"upload","metadata":{"external_id":"import-2026-01-15","source":{"system":"hris","batch":42}},"review_url":"https:\/\/review.transmutify.io\/reviews\/019dc45d-3b81-7369-a776-2d95c5caab97?signature=...","review_state":"approved","review_canceled_at":null,"review_approved_at":"2026-01-15T12:30:45Z","review_expires_at":"2026-01-16T12:00:00Z","output_format":"json","mapping_rule":{"employee_id":"Employee ID","first_name":"First Name","last_name":"Last Name","work_email":"Email","department":"Department","start_date":"Start Date"},"source_headers":["Employee ID","First Name","Last Name","Email","Department","Start Date"],"input_has_header":true,"total_rows":248,"processed_rows":248,"error":null,"notification_status":"delivered","download_url":"https:\/\/storage.example.com\/transmutify\/outputs\/019dc45d-3b81-7369-a776-2d95c5caab97.json?expires=1705323600","file_retention_until":"2026-02-14T12:30:00Z","started_at":"2026-01-15T12:30:00Z","completed_at":"2026-01-15T12:31:24Z","failed_at":null},"properties":{"id":{"type":"string","description":"Stable UUID of the transformation run. Use this in subsequent requests against the run."},"status":{"type":"string","description":"Current lifecycle status (e.g. `awaiting_upload`, `queued`, `processing`, `completed`, `failed`)."},"terminal":{"type":"boolean","description":"Whether this run has reached a final state."},"stage":{"type":"string","description":"Current stage of the run (`review` while hosted review is active, `final` once approved)."},"schema_id":{"type":"string","description":"UUID of the schema this run targets."},"provider_id":{"type":["string","null"],"format":"uuid","description":"UUID of the selected AI provider. Null when no provider was selected for a structured-file run."},"dry_run":{"type":"boolean","description":"Whether this is a dry run (no AI provider invoked, synthetic input data used)."},"input_source":{"type":"string","description":"Input source for this run (`upload`, `raw`, or `image`)."},"metadata":{"type":["object","null"],"description":"Caller-defined metadata submitted when the transformation was initialized.","additionalProperties":[]},"review_url":{"type":["string","null"],"description":"Signed hosted-review URL for end-user review, when review is available."},"review_state":{"type":["string","null"],"description":"Current hosted-review state (`active`, `canceled`, `approved`, `expired`), or null when no review exists."},"review_canceled_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the reviewer first canceled, or null otherwise."},"review_approved_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the reviewer approved, or null otherwise."},"review_expires_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp after which the hosted review page shows an expired state, or null when no review exists."},"output_format":{"type":"string","description":"Output artifact format requested when the run was initialized (`json` by default)."},"mapping_rule":{"type":["object","null"],"description":"Currently effective mapping rule keyed by target field name; values are the source CSV column header or null.","additionalProperties":{"type":["string","null"]}},"source_headers":{"type":"array","description":"Column headers detected in the uploaded source file.","items":{"type":"string"}},"input_has_header":{"type":["boolean","null"],"description":"Whether the uploaded source file has a real header row. False when synthetic `column_1, column_2, ...` names were generated."},"total_rows":{"type":["integer","null"],"description":"Total number of rows in the source file, when known."},"processed_rows":{"type":"integer","description":"Number of rows processed so far by the current stage."},"error":{"type":["object","null"],"description":"Failure payload describing the last error, if the run is in a failed state. Null otherwise.","properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]},"type":{"type":["string","null"]},"stage":{"type":["string","null"]},"retryable":{"type":"boolean"},"context":{"anyOf":[{"type":"array","items":[]},{"type":"null"},{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0,"additionalItems":false}]}},"required":["code","message","type","stage","retryable","context"]},"notification_status":{"type":["string","null"],"description":"Delivery status of the successful final-output webhook (`pending`, `delivered`, `failed`), or null if none exists."},"upload":{"type":"object","description":"Pre-signed upload instructions for the source file. Present only while `status` is `awaiting_upload`.","properties":{"url":{"type":"string","example":"https:\/\/storage.example.com\/transmutify\/uploads\/source.csv"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"method":{"type":"string","example":"PUT"},"expires_at":{"type":"string","format":"date-time","example":"2026-01-15T12:45:00Z"}},"required":["url","headers","method","expires_at"]},"download_url":{"type":["string","null"],"description":"Pre-signed URL to download the produced output file. Present only when output is ready."},"file_retention_until":{"type":["string","null"],"description":"ISO-8601 UTC timestamp until which the output file is retained and downloadable. Null when no output file exists yet."},"started_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the run started executing, or null if it has not started."},"completed_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the run completed successfully, or null otherwise."},"failed_at":{"type":["string","null"],"format":"date-time","description":"ISO-8601 UTC timestamp the run failed, or null otherwise."}},"required":["id","status","terminal","stage","schema_id","provider_id","dry_run","input_source","metadata","review_url","review_state","review_canceled_at","review_approved_at","review_expires_at","output_format","mapping_rule","source_headers","input_has_header","total_rows","processed_rows","error","notification_status","download_url","file_retention_until","started_at","completed_at","failed_at"],"title":"TransformationRunResource"}},"responses":{"AuthenticationException":{"description":"Unauthenticated.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}},"ValidationException":{"description":"The given data was invalid.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiValidationError"}}}},"ModelNotFoundException":{"description":"The requested resource was not found.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}},"ApiForbidden":{"description":"This action is unauthorized.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}},"ApiConflict":{"description":"The request could not be completed because it conflicts with the current resource state.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}},"ApiRateLimited":{"description":"Too many requests.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}},"ApiInternalServerError":{"description":"An unexpected error occurred.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiError"}}}}}}}