> This page is for version v1 (default).
> For other versions, use one of these documentation indexes:
> - v1 (default): https://docs.plextera.com/v-1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.plextera.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.plextera.com/_mcp/server.

# Changelog

## Plextera Public API v1

The first version of the Plextera Public API: document processing, workflow automation, and webhook notifications behind one API key.

## Files

* Upload documents up to 50 MB (`POST /files`): PDF, JPEG, PNG, TIFF, WebP, DOCX, XLSX, PPTX, plain text, CSV, HTML, archives, audio, and video. Executable and script files are rejected.
* `GET /files/{fileId}` returns metadata including a temporary `contentUrl` for downloading the content directly.
* Reference one uploaded file from any number of extractions and workflow runs.

## Document Insights

* Submit documents for structured field extraction by `fileId`, HTTPS URL, or direct multipart upload.
* Attach up to 50 string `labels` per extraction and filter the list by them (`labels[key]=value`); `docType` is reserved for configured document-type routing.
* Document metadata includes a standard `mimeType` value such as `application/pdf` when Document Insights can determine it.
* Lifecycle `QUEUED -> PROCESSING -> COMPLETED`, with terminal `FAILED` and `REJECTED` carrying a machine-readable `error`.
* `GET /document-insights/extractions` supports status, time-window, sorting, and label filters; `GET /document-insights/extractions/{extractionId}` returns the full typed `output` and a temporary document `contentUrl`.
* Submit field-level corrections with `POST /document-insights/extractions/{extractionId}/feedback` (returns `201`).
* Delete a terminal extraction with `DELETE /document-insights/extractions/{extractionId}`; a queued or processing extraction returns `409`.

## Workflows

* Trigger Studio-configured workflows with JSON or multipart form-data (`POST /workflows/{workflowId}/runs`).
* Monitor runs with `GET /workflow-runs` and `GET /workflow-runs/{runId}`, including step-level output and nested runs.

## Event Subscriptions

* HTTPS webhooks for extraction and workflow run terminal states, signed with HMAC-SHA256 (`X-Plextera-Signature`, send-time `t`).
* Plextera generates each signing secret. Create returns it once with the new active subscription.
* Generic PATCH does not accept a signing secret, and ordinary subscription responses do not expose it.
* `GET /event-subscriptions` filters by `name`, a case-insensitive substring of the subscription name, alongside `status`, `eventType`, and the creation-time window.
* Events are immutable workspace records and are kept even when no active subscription matched them.
* `GET /events` lists the event types the workspace subscribes to: events a paused or mis-filtered subscription missed stay visible, event types nobody subscribes to are not listed.
* Automatic delivery uses at most 6 total attempts at approximately `T+0`, `T+1m`, `T+3m`, `T+7m`, `T+15m`, and `T+31m`.
* Inspect events with `GET /events`, their exact payload with `GET /events/{eventId}`, and every delivery across subscriptions with `GET /events/{eventId}/deliveries`.
* Inspect one delivery's payload and up to the 100 most recent chronological HTTP attempt records with `GET /events/{eventId}/deliveries/{deliveryId}`.
* Resend any delivery with `POST /events/{eventId}/deliveries/{deliveryId}/resend`; each request creates a new one-attempt delivery for the same event.

## Error model

* One envelope on every error: `error.code`, `error.message`, `error.requestId`, `error.retryable`, and field-level `details`.
* `422 VALIDATION_FAILED` for semantically invalid bodies, `400 INVALID_REQUEST` for malformed requests and bad parameters; every response carries `X-Request-Id`.
* A validation `message` names the rejected fields and the reason (`Name must not exceed 128 characters.`) instead of a generic summary, and stays a rendering of `details`; branch on `code` and `details[].field`, never on `message`.