# Parser > Verified bank-statement ledgers, applications, MCA positions and underwriting math from a merchant's documents. - [Introduction](https://docs.parser-app.com/index.md): Send a merchant's documents, get back verified bank-statement ledgers, the application, MCA positions and underwriting math. - [Quickstart](https://docs.parser-app.com/quickstart.md): Submit a packet, wait for it, and read the result. - [Authentication](https://docs.parser-app.com/authentication.md): API keys for systems, AuthKit sign-in for people, permissions, errors and rate limits. - [How a packet is read](https://docs.parser-app.com/concepts/how-a-packet-is-read.md): From the files you send to verified ledgers, positions and underwriting, and when a person is asked to look. - [Jobs](https://docs.parser-app.com/concepts/jobs.md): Every packet is a job: statuses, waiting, idempotency, options, limits and erasure. - [The submission packet](https://docs.parser-app.com/concepts/submission-packet.md): What result.submission_packet says about the submission as a whole. - [Webhooks](https://docs.parser-app.com/guides/webhooks.md): Get every finished job pushed to your system, signed, retried until you take it. - [Review and corrections](https://docs.parser-app.com/guides/review-and-corrections.md): Fix a finished job's categories, positions and months; the fixes stay on the job and the numbers follow. - [Integrating a platform](https://docs.parser-app.com/guides/platform-integration.md): Open a deal for every job, failed ones included, fetch the original files, never miss a job, and erase an end user's data. - [Deals from email](https://docs.parser-app.com/guides/email-intake.md): Forward a deals inbox, or connect Gmail, Microsoft 365 or IMAP. Each deal thread becomes one job. - [Emails and threads](https://docs.parser-app.com/guides/emails.md): Every inbound email gets a stable id, a record, its raw .eml and your tags. See a deal's whole thread, and erase it. - [Integrations](https://docs.parser-app.com/guides/integrations.md): Push each job to your CRM, or alert a Slack channel when a job needs review. - [Usage and quality](https://docs.parser-app.com/guides/usage.md): What you used, what it cost, and how well each bank's statements are read. - [API reference](https://docs.parser-app.com/api-reference/introduction.md): Base URL, authentication, errors and conventions for every endpoint. - [Parse a merchant packet (PDF / PNG / JPEG files)](https://docs.parser-app.com/api-reference/parse/parse-a-merchant-packet-pdf-png-jpeg-files.md): Upload one merchant's packet: one or more files (bank statements, ISO/merchant application, other documents). The packet is one submission: the result's `submission_packet` lists its typed documents, which ones the decision rests on and why the others are excluded, the merchant's details with their… - [Withhold, EBITDA and capacity math over supplied months and positions](https://docs.parser-app.com/api-reference/underwriting/withhold-ebitda-and-capacity-math-over-supplied-months-and-positions.md): Recompute the underwriting block without re-parsing: e.g. after an underwriter excludes a month or edits the MCA table. Months marked `excluded` are dropped. Existing MCA monthly burden converts daily x21, weekly x4 and biweekly x2; offers use x21 / x4.2 / x2.1. - [This tenant's jobs, newest first](https://docs.parser-app.com/api-reference/jobs/this-tenants-jobs-newest-first.md): Id, status, source, timestamps, error and intake; fetch a job for its result. Filter by `status`, `source`, `since` (ISO 8601), `end_user_id` and `external_business_id`; page with `cursor` (the previous page's `next_cursor`, with the same filters). `finished_since` lists finished jobs instead, oldes… - [Job status and, when finished, its result](https://docs.parser-app.com/api-reference/jobs/job-status-and-when-finished-its-result.md): `queued` -> `running` -> `completed` | `review_required` | `failed`. `result` is set once the job finishes (`error` on `failed`). `wait` holds the request until the job finishes or the seconds pass (at most `MAX_WAIT_SECONDS`). The webhook events point here (`payload.result_path`). With corrections… - [Erase a finished job and everything derived from it](https://docs.parser-app.com/api-reference/jobs/erase-a-finished-job-and-everything-derived-from-it.md): Erases the job's request and result, its input files, the cached reads, page atoms and index entries of its documents, the Luna answers it paid for, its metering, email thread entries and webhook events, now. Audited. This is how a merchant's deletion request is honoured: erase each of its jobs. - [A job's corrections, with their history](https://docs.parser-app.com/api-reference/jobs/a-jobs-corrections-with-their-history.md): Every correction of the job, oldest first, reverted ones included (`reverted_at`): who made it, when and why. `summary` is what the corrections in force change. - [Correct a finished job: re-categorize rows, override positions, exclude months](https://docs.parser-app.com/api-reference/jobs/correct-a-finished-job:-re-categorize-rows-override-positions-exclude-months.md): Saves one or more corrections on the job, in order; they apply every time the job is read (`GET /v1/jobs/{job_id}`), and the result is recomputed from the stored ledgers with no model call. `transaction` sets a row's category (one that fits its direction) and/or counterparty, and moves the row's amo… - [Revert one correction](https://docs.parser-app.com/api-reference/jobs/revert-one-correction.md): Takes the correction out of force: the value it set returns to the one before it (an earlier correction in force, else the computed value). It stays in the history with who reverted it, when and why. Audited; the endpoints and integrations subscribed to `job.corrected` are told. - [Erase every finished job of one of your end users](https://docs.parser-app.com/api-reference/jobs/erase-every-finished-job-of-one-of-your-end-users.md): Each finished job submitted with this `end_user_id` is erased exactly as `DELETE /v1/jobs/{job_id}` erases one, and audited. A job still queued or running is not erased: it is listed in `still_running`; call again once it ends. Another tenant's jobs are never touched. - [The files a job was sent](https://docs.parser-app.com/api-reference/jobs/the-files-a-job-was-sent.md): Every file of the request (an email's attachments: the message itself is not kept), in order, whatever the job's status. `GET /v1/jobs/{job_id}/files/{position}` returns one's bytes. - [Download one of a job's original files](https://docs.parser-app.com/api-reference/jobs/download-one-of-a-jobs-original-files.md): The bytes exactly as uploaded (or attached), with `Content-Disposition: attachment` and the declared content type. Erased with the job. Not streamed: each file is sealed as one authenticated piece, opened whole (at most the upload size cap). - [This tenant's webhook endpoints](https://docs.parser-app.com/api-reference/webhooks/this-tenants-webhook-endpoints.md): Every registered endpoint, without its secret. - [Register an endpoint for job events](https://docs.parser-app.com/api-reference/webhooks/register-an-endpoint-for-job-events.md): The endpoint receives `job.completed`, `job.review_required` and `job.failed` (or the listed `topics`) for this tenant's jobs; `job.corrected` (a reviewer corrected a finished job, or reverted a correction) only when listed. The signing `secret` is returned once. Each event is a POST of `{id, tenant… - [Remove an endpoint; its pending deliveries stop](https://docs.parser-app.com/api-reference/webhooks/remove-an-endpoint;-its-pending-deliveries-stop.md): Pending deliveries to it are cancelled; delivered ones stay in its history until purged. - [Replace the signing secret](https://docs.parser-app.com/api-reference/webhooks/replace-the-signing-secret.md): Returns the new secret, shown only now. Every delivery from now on, retries included, is signed with it. - [Send a signed ping to this endpoint](https://docs.parser-app.com/api-reference/webhooks/send-a-signed-ping-to-this-endpoint.md): Queues a `ping` event for this endpoint only, delivered and retried like a job event; check its outcome under deliveries. - [Recent delivery attempts to this endpoint](https://docs.parser-app.com/api-reference/webhooks/recent-delivery-attempts-to-this-endpoint.md): Newest first: each event's status (`pending`, `delivered`, `dead`, `cancelled`), attempts, the receiver's last status code or error and the next retry. - [Send one delivery's event again](https://docs.parser-app.com/api-reference/webhooks/send-one-deliverys-event-again.md): Any delivery that is not still pending: `dead`, `delivered` or `cancelled`. The event is sent as it was first (the same body and `X-Parser-Event-Id`, so a receiver that already has it drops it), as a new delivery with the full retry schedule; the earlier delivery stays in the history. - [Send every dead delivery since a time again](https://docs.parser-app.com/api-reference/webhooks/send-every-dead-delivery-since-a-time-again.md): Each event whose delivery to this endpoint died (its last attempt) at or after `since`, once, unless it has been delivered or is pending since. After an outage, pass when it began. The event is sent as it was first (the same body and `X-Parser-Event-Id`, so a receiver that already has it drops it),… - [Ingest one raw email (RFC 822 / MIME); its attachments become one parse job](https://docs.parser-app.com/api-reference/email/ingest-one-raw-email-rfc-822-mime;-its-attachments-become-one-parse-job.md): Send the raw message as the request body (`Content-Type: message/rfc822`). Authenticate with an API key or token holding `jobs:write`, or as a mail provider's signed webhook for one mailbox: `X-Timestamp`, `X-Mailbox-ID`, `X-Provider-Message-ID` and `X-Signature` = hex HMAC-SHA256 of `timestamp\nmai… - [This tenant's mailboxes](https://docs.parser-app.com/api-reference/mailboxes/this-tenants-mailboxes.md) - [Connect a mailbox](https://docs.parser-app.com/api-reference/mailboxes/connect-a-mailbox.md): `{kind: "forwarding"}`: a new address `@INBOUND_MAIL_DOMAIN` to forward deals to (a Gmail filter, an Outlook rule), and an inbound secret for providers that post mail themselves. `{kind: "gmail", auth: "delegation", address}`: a mailbox in a Workspace domain that authorized the platform's ser… - [A mailbox](https://docs.parser-app.com/api-reference/mailboxes/a-mailbox.md) - [Change a mailbox's label, settings, or pause it](https://docs.parser-app.com/api-reference/mailboxes/change-a-mailboxs-label-settings-or-pause-it.md) - [Disconnect a mailbox: stop its watch, destroy its credentials](https://docs.parser-app.com/api-reference/mailboxes/disconnect-a-mailbox:-stop-its-watch-destroy-its-credentials.md) - [What became of each message: job, merged, ignored:, refused](https://docs.parser-app.com/api-reference/mailboxes/what-became-of-each-message:-job-merged-ignored:-refused.md) - [Gmail's forwarding confirmation code and link, once it arrived](https://docs.parser-app.com/api-reference/mailboxes/gmails-forwarding-confirmation-code-and-link-once-it-arrived.md) - [Give a forwarding mailbox a new address; mail to the old one bounces from now on](https://docs.parser-app.com/api-reference/mailboxes/give-a-forwarding-mailbox-a-new-address;-mail-to-the-old-one-bounces-from-now-on.md): For an address that leaked (spam, a mailing list). The mailbox keeps its settings and messages. Point the Gmail filter or Outlook rule at the new `address`; Gmail mails the new address a confirmation first (`GET /v1/mailboxes/{id}/verification`). - [Check a Gmail mailbox: token, label, watch](https://docs.parser-app.com/api-reference/mailboxes/check-a-gmail-mailbox:-token-label-watch.md) - [Read a Gmail mailbox's messages again since a time (at most 7 days back)](https://docs.parser-app.com/api-reference/mailboxes/read-a-gmail-mailboxs-messages-again-since-a-time-at-most-7-days-back.md) - [This tenant's tracked emails, newest first](https://docs.parser-app.com/api-reference/emails/this-tenants-tracked-emails-newest-first.md): Every inbound email, on every path (forwarding addresses, Gmail, IMAP, Microsoft 365, `POST /v1/intake/email`), ignored and refused ones included. Filter by `mailbox_id`, `thread_id`, `tag`, `outcome` (`job`, `merged`, `ignored`, one `ignored:`, `refused`), `sender` (the From address), `sinc… - [A tracked email](https://docs.parser-app.com/api-reference/emails/a-tracked-email.md) - [Download an email's raw .eml](https://docs.parser-app.com/api-reference/emails/download-an-emails-raw-eml.md): The message exactly as received (RFC 822), as `message/rfc822` with `Content-Disposition: attachment`. 404 when its bytes are not kept: refused, from a sender not allowed, or its mailbox's `store_raw_email` off. Not streamed: sealed as one authenticated piece (at most the message size cap). - [Erase a tracked email](https://docs.parser-app.com/api-reference/emails/erase-a-tracked-email.md): Its record, raw .eml and `email.received` events, now; audited. Its job is not touched (erase it with `DELETE /v1/jobs/{job_id}`, which erases the emails that fed it too). - [Add tags to an email](https://docs.parser-app.com/api-reference/emails/add-tags-to-an-email.md): Tags it already has are kept once. Audited. - [Replace an email's tags](https://docs.parser-app.com/api-reference/emails/replace-an-emails-tags.md): Tags are trimmed and lowercased, then 1-64 of `a-z 0-9 _ : -`; at most 20. Audited. - [Remove a tag from an email](https://docs.parser-app.com/api-reference/emails/remove-a-tag-from-an-email.md): Removing a tag it does not have changes nothing. Audited. - [Every email of a thread, in the order they arrived](https://docs.parser-app.com/api-reference/emails/every-email-of-a-thread-in-the-order-they-arrived.md): The thread id is a job's `intake.email.thread_id` or an email's `thread_id`. Each email carries its outcome and job: the full story of a deal, from the submission through every reply and forward. - [Download a thread's stored emails as one mbox](https://docs.parser-app.com/api-reference/emails/download-a-threads-stored-emails-as-one-mbox.md): Every email of the thread whose raw .eml is kept, in the order they arrived, streamed. Emails kept without their bytes (refused, from a sender not allowed, or `store_raw_email` off) are left out. - [Erase every tracked email of a thread](https://docs.parser-app.com/api-reference/emails/erase-every-tracked-email-of-a-thread.md): Each email's record, raw .eml and `email.received` events, now; audited once. The thread's jobs are not touched: erase them with `DELETE /v1/jobs/{job_id}`. - [Integration types: config JSON Schema, events, the module each needs](https://docs.parser-app.com/api-reference/integrations/integration-types:-config-json-schema-events-the-module-each-needs.md) - [This tenant's installed integrations](https://docs.parser-app.com/api-reference/integrations/this-tenants-installed-integrations.md) - [Install an integration](https://docs.parser-app.com/api-reference/integrations/install-an-integration.md): `config` is validated against the type's schema (the catalog); `secrets` are sealed and never returned. The type's module must be on for the tenant. - [An installed integration (never its secrets)](https://docs.parser-app.com/api-reference/integrations/an-installed-integration-never-its-secrets.md) - [Rename, reconfigure, replace secrets, pause or resume](https://docs.parser-app.com/api-reference/integrations/rename-reconfigure-replace-secrets-pause-or-resume.md) - [Uninstall: its pending runs are cancelled, its secrets destroyed](https://docs.parser-app.com/api-reference/integrations/uninstall:-its-pending-runs-are-cancelled-its-secrets-destroyed.md) - [A new authorize_url for an OAuth integration (to reconnect it)](https://docs.parser-app.com/api-reference/integrations/a-new-authorize_url-for-an-oauth-integration-to-reconnect-it.md) - [Call the integration once (a ping), recorded as a test run](https://docs.parser-app.com/api-reference/integrations/call-the-integration-once-a-ping-recorded-as-a-test-run.md) - [Recent deliveries and tests of this integration, newest first](https://docs.parser-app.com/api-reference/integrations/recent-deliveries-and-tests-of-this-integration-newest-first.md) - [Who is calling: tenant, permissions and enabled modules](https://docs.parser-app.com/api-reference/identity/who-is-calling:-tenant-permissions-and-enabled-modules.md) - [This tenant's modules, on or off](https://docs.parser-app.com/api-reference/identity/this-tenants-modules-on-or-off.md) - [This tenant's API keys (never their secrets)](https://docs.parser-app.com/api-reference/api-keys/this-tenants-api-keys-never-their-secrets.md) - [Create an API key; the key is returned only now](https://docs.parser-app.com/api-reference/api-keys/create-an-api-key;-the-key-is-returned-only-now.md): `scopes` default to `jobs:write jobs:read underwriting:write` (a CRM's key). A key cannot hold a permission its creator lacks. - [Replace a key: same name and scopes, a new secret](https://docs.parser-app.com/api-reference/api-keys/replace-a-key:-same-name-and-scopes-a-new-secret.md): The old key is revoked now, or stays valid for `overlap_seconds` (at most 7 days) so callers can switch. - [Revoke a key at once](https://docs.parser-app.com/api-reference/api-keys/revoke-a-key-at-once.md) - [This tenant's settings](https://docs.parser-app.com/api-reference/tenant/this-tenants-settings.md) - [Change retention or email routing](https://docs.parser-app.com/api-reference/tenant/change-retention-or-email-routing.md): `retention_days` (null: keep everything) and `email_routing`. Job, spend and budget limits and the Luna route are set by the platform: sending them is refused (403). - [Every change made in this tenant, newest first](https://docs.parser-app.com/api-reference/audit/every-change-made-in-this-tenant-newest-first.md) - [This tenant's metered usage, by day and kind](https://docs.parser-app.com/api-reference/usage/this-tenants-metered-usage-by-day-and-kind.md): Daily totals (UTC) of the usage events: jobs submitted and finished by status, documents parsed, pages read (text or image), Luna tokens and cost, emails received, ignored, merged and routed, webhook deliveries and stored bytes. Totals are rolled up every 5 minutes. `group_by`: `day`, `kind` or both… - [Measured Luna token usage and cost, by day, task and model](https://docs.parser-app.com/api-reference/usage/measured-luna-token-usage-and-cost-by-day-task-and-model.md): Calls, paid and replayed calls, prompt / cached / completion / reasoning tokens and provider-reported cost over the last `days`, grouped by day, task and model; `job_id` narrows it to one job. - [This tenant's reading quality, by bank](https://docs.parser-app.com/api-reference/usage/this-tenants-reading-quality-by-bank.md): Per institution: statements read, how many passed the gate, image reads, scans refused as unreadable, Luna labelling and second-read verification; the frequent review reasons; position evidence; how often a confident not-a-deal verdict was overruled by its deal thread; Luna cost per verified stateme… - [Liveness](https://docs.parser-app.com/api-reference/health/liveness.md): 200 while the process serves requests. No key. - [Readiness: database open, Luna configured](https://docs.parser-app.com/api-reference/health/readiness:-database-open-luna-configured.md): 200 when the job store answers and an OpenRouter key is configured, else 503 with which one is missing. No key. ## OpenAPI Specs - [openapi](/openapi.json) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.