{"openapi":"3.1.1","info":{"title":"Pagey API","description":"Pagey's document tools, for your own code. Every tool takes files and gives back a job; when the\njob has finished, you download its result.\n\n## Authentication\n\nSend an API key in the `X-Api-Key` header with every request. Create keys on the API keys page of\nyour dashboard; a key is shown once, when you create it. Each key acts as your account, so its\ncalls count towards your plan, and you can revoke one without affecting the others.\n\n## Jobs\n\n1. Call a tool, such as `POST /v1/merge-pdf`, with the files as `multipart/form-data`. The answer\n   is `202 Accepted` with a job whose `status` is `Queued`.\n2. Wait for the job to finish: ask for it with `GET /v1/jobs/{id}` until its `status` is\n   `Completed` or `Failed`, or add a webhook (below) and be told.\n3. Download the result with `GET /v1/jobs/{id}/result`. Results are deleted at the job's\n   `resultExpiresAt` time, an hour after it finishes, or sooner if you delete them yourself\n   with `DELETE /v1/jobs/{id}/result`. Uploaded files are deleted as soon as the job finishes.\n\n## Batches\n\nTo send many files and get the results back together, start a batch with `POST /v1/batches`,\nthen send each file to its tool as usual with the batch's `id` in a form field named `batchId`.\nEach file is still a job of its own and counts as one operation. `GET /v1/batches/{id}` lists the\nbatch's jobs and how many have completed or failed, and `GET /v1/batches/{id}/result` downloads\nevery finished result as one ZIP file. Your plan sets how many files a batch can hold\n(`maxFiles`); a batch takes files for an hour after it is started (`closesAt`).\n\n## Files over 100 MB\n\nA request can be at most 100 MB, so send a larger file in parts first:\n\n1. `POST /v1/uploads` with `{\"fileName\": \"report.pdf\", \"length\": 157286400}` (the size in bytes).\n   The answer has the file's `id` and `partBytes`, the longest a part may be (50 MB).\n2. Send the file's bytes in order, each part with `PATCH /v1/uploads/{id}?offset=N`, where `N` is\n   where the part starts, and a body of `application/octet-stream`. Each answer's `received` is\n   where the next part starts. A part that doesn't arrive whole is dropped, so send it again from\n   the same offset.\n3. Call the tool as usual, with the file's `id` in a form field named `uploads` in place of the\n   file in `files`. Repeat the field for several files; they are taken in that order, after any\n   sent in `files`.\n\nA file sent in parts is used once, and deleted an hour after it was started (`expiresAt`) if no\ntool has taken it.\n\n## Limits and errors\n\nYour plan sets how many operations you can run a month, how much your stored results can take\nup, and the largest file a tool takes; `GET /v1/me` shows each. A larger file is refused with\n`413 Content Too Large`. Once the month's operations are used up, each job takes one prepaid API credit, if you have\nbought any; credits never expire, and `GET /v1/me` shows how many are left. A call that would go\nover your operations and credits, or your storage, is refused with `409 Conflict`. Your plan also sets how many\nrequests your account can make a minute, across all its keys; going over is refused with\n`429 Too Many Requests` and a `Retry-After` header saying how many seconds to wait. Errors are [problem details](https://www.rfc-editor.org/rfc/rfc9457)\nJSON objects whose `detail` says what went wrong.\n\n## Webhooks\n\nA webhook is an address of yours that Pagey posts an event to whenever one of your jobs finishes,\nso you don't have to keep asking. Webhooks come with API access, on the Developer plan and above.\nAdd one, up to five, on the Webhooks page of your dashboard. It\nmust be a public `https://` address. The page shows the endpoint's signing secret once, can send\nit a test event, and lists every delivery with its outcome.\n\n### Events\n\n| Type            | Sent when                                     |\n| --------------- | --------------------------------------------- |\n| `job.completed` | A job has finished and its result is ready.   |\n| `job.failed`    | A job could not be finished; see its `error`. |\n| `ping`          | You asked for a test event.                   |\n\nEach event is a `POST` with a JSON body like this one. `data.job` has the same fields as\n`GET /v1/jobs/{id}`, and is null in a ping.\n\n```json\n{\n  \"id\": \"0199c7a2-3f4e-7b10-9a3c-5d2e8f1b6c47\",\n  \"type\": \"job.completed\",\n  \"created\": \"2026-10-08T09:30:12.415+00:00\",\n  \"data\": {\n    \"job\": {\n      \"id\": \"0199c7a2-1b07-7c55-8e61-2f9a4d0e3b18\",\n      \"operation\": \"merge-pdf\",\n      \"status\": \"Completed\",\n      \"error\": null,\n      \"createdAt\": \"2026-10-08T09:30:10.031+00:00\",\n      \"completedAt\": \"2026-10-08T09:30:12.398+00:00\",\n      \"resultExpiresAt\": \"2026-10-08T10:30:12.398+00:00\",\n      \"fileName\": \"merge-pdf.pdf\",\n      \"resultBytes\": 482113\n    }\n  }\n}\n```\n\nThree headers come with it:\n\n- `Pagey-Event`: the event's type.\n- `Pagey-Delivery`: the event's `id`.\n- `Pagey-Signature`: `t=<unix seconds>,v1=<signature>`, where the signature is the hex HMAC-SHA256\n  of the time, a full stop and the raw body (`<t>.<body>`), keyed with the endpoint's secret.\n\n### Checking the signature\n\nCheck every event before acting on it. Compute the signature from the body exactly as it arrived,\nbefore parsing it, compare it in constant time, and refuse events whose time is more than five\nminutes from now. In Node.js:\n\n```js\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nfunction isFromPagey(rawBody, header, secret) {\n  const parts = Object.fromEntries(header.split(\",\").map((part) => part.split(\"=\")));\n  const age = Math.abs(Date.now() / 1000 - Number(parts.t));\n  const expected = createHmac(\"sha256\", secret).update(`${parts.t}.${rawBody}`).digest(\"hex\");\n  return (\n    age < 300 &&\n    typeof parts.v1 === \"string\" &&\n    parts.v1.length === expected.length &&\n    timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected))\n  );\n}\n```\n\nIn Python:\n\n```python\nimport hashlib, hmac, time\n\ndef is_from_pagey(raw_body: bytes, header: str, secret: str) -> bool:\n    parts = dict(part.split(\"=\", 1) for part in header.split(\",\"))\n    expected = hmac.new(\n        secret.encode(), parts[\"t\"].encode() + b\".\" + raw_body, hashlib.sha256\n    ).hexdigest()\n    return abs(time.time() - int(parts[\"t\"])) < 300 and hmac.compare_digest(\n        parts.get(\"v1\", \"\"), expected\n    )\n```\n\n### Answering and retries\n\nAnswer with any `2xx` status within 10 seconds, and do slow work afterwards. Any other answer, or\nnone, is retried 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours later; after\nseven failed attempts the event is given up on. Each attempt is signed afresh.\n\nBecause of retries, an event can arrive more than once, and events can arrive out of order. Use\nthe event's `id` to skip ones you have already handled, and `GET /v1/jobs/{id}` when you need a\njob's current state. Pagey follows no redirects.","version":"v1"},"paths":{"/v1/me":{"get":{"tags":["Account"],"summary":"Returns the authenticated caller, their plan, this month's usage and their storage.","operationId":"GetMe","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/image-to-pdf":{"post":{"tags":["Tools"],"summary":"Combines images into one PDF, one image per page.","description":"Send the images as multipart/form-data in a field named 'files', in page order. Accepts JPEG, PNG, WebP, GIF and BMP: up to 50 images, 20 MB each and 250 MB in total. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: pageSize (A4, Letter, Fit; default A4), orientation (Auto, Portrait, Landscape; default Auto, which follows each image) and margin (None, Small, Large; default None). Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"ImageToPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"pageSize":{"type":"string"}}},{"type":"object","properties":{"orientation":{"type":"string"}}},{"type":"object","properties":{"margin":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/merge-pdf":{"post":{"tags":["Tools"],"summary":"Joins PDFs into one, in the order they are sent.","description":"Send the PDFs as multipart/form-data in a field named 'files', in the order their pages should appear. Accepts PDF: up to 20 PDFs, 250 MB each and 250 MB in total. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"MergePdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/split-pdf":{"post":{"tags":["Tools"],"summary":"Takes pages out of a PDF, as one PDF or as several in a ZIP.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: pages, a selection such as '1-3, 5, 8-' where '8-' means page 8 to the end (default: every page), and mode: Pages (default) makes a PDF for each selected page, Ranges makes a PDF for each range, and Combined puts all the selected pages into one PDF. Ranges and Combined need pages. Pages and Ranges return a ZIP of PDFs, of at most 500; Combined returns a PDF. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the result from GET /v1/jobs/{id}/result.","operationId":"SplitPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"mode":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/compress-pdf":{"post":{"tags":["Tools"],"summary":"Makes a PDF smaller by shrinking the images in it.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional field level (Light, Recommended, Strong; default Recommended): Light keeps images sharp enough to print, Recommended keeps them sharp on a screen, and Strong makes the smallest file with visibly softer images. Text, fonts, links, bookmarks and form fields are not changed. The result is never larger than the PDF sent: one that cannot be made smaller comes back as it was. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"CompressPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"level":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/rotate-pdf":{"post":{"tags":["Tools"],"summary":"Turns the pages of a PDF.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: rotation (Clockwise, UpsideDown, Counterclockwise; default Clockwise), a quarter turn right, a half turn or a quarter turn left, added to any turn a page has already; and pages, a selection such as '1-3, 5, 8-' where '8-' means page 8 to the end (default: every page). Bookmarks, links, form fields and the rest of the PDF are kept. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"RotatePdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"rotation":{"type":"string"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/reorder-pages":{"post":{"tags":["Tools"],"summary":"Puts the pages of a PDF in a new order.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Required field order: the pages in the order wanted, such as '3, 1-2, 4-' where '4-' means page 4 to the end. Each page may be listed once; pages left out follow the listed ones in their original order, so '5' moves page 5 to the front. Bookmarks, links, form fields and the rest of the PDF are kept. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"ReorderPages","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"order":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/delete-pages":{"post":{"tags":["Tools"],"summary":"Takes pages out of a PDF and keeps the rest.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Required field pages: the pages to delete, such as '1-3, 5, 8-' where '8-' means page 8 to the end. At least one page must be left. Bookmarks to deleted pages are removed. Bookmarks, links, form fields and the rest of the PDF are kept. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"DeletePages","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pdf-to-image":{"post":{"tags":["Tools"],"summary":"Saves the pages of a PDF as JPEG or PNG images, in a ZIP.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: format (Jpeg, Png; default Jpeg); dpi, the resolution, from 50 to 300 (default 150); and pages, a selection such as '1-3, 5, 8-' where '8-' means page 8 to the end (default: every page), of at most 300 pages. Each page becomes one image named after its page number, such as page-03.jpg, drawn as it is shown, on white. A very large page is drawn smaller, to at most 25 million pixels. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the ZIP from GET /v1/jobs/{id}/result.","operationId":"PdfToImage","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"format":{"type":"string"}}},{"type":"object","properties":{"dpi":{"type":"string"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/convert-image":{"post":{"tags":["Tools"],"summary":"Saves images in another format, such as HEIC to JPEG or PNG to WebP.","description":"Send the images as multipart/form-data in a field named 'files'. Accepts JPEG, PNG, WebP, GIF, BMP, TIFF, AVIF and HEIC: up to 20 images, 25 MB each and 250 MB in total. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: format, what to save them as (Jpeg, Png, WebP, Gif, Bmp, Tiff, Avif; default Jpeg); and quality, for Jpeg, WebP and Avif, from 1 to 100 (default 85). Each image is turned upright as its camera recorded, put into sRGB colours, and saved without its metadata, such as camera details and location. Jpeg and Bmp have no see-through parts, so those become white. An animated image, or a TIFF of several pages, gives its first frame. An image may have at most 100 million pixels. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the result from GET /v1/jobs/{id}/result: the image when one was sent, or a ZIP of the images, each named after its file, when several were.","operationId":"ConvertImage","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"format":{"type":"string"}}},{"type":"object","properties":{"quality":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/protect-pdf":{"post":{"tags":["Tools"],"summary":"Locks a PDF with a password.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Required field password: up to 100 characters, needed from then on to open the PDF. The PDF is encrypted with AES-256, which current PDF readers open; a PDF that has a password already is refused. The password is kept encrypted while the job waits and is deleted once it has run. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"ProtectPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"password":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/unlock-pdf":{"post":{"tags":["Tools"],"summary":"Takes the password off a PDF.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Required field password: the PDF's password, the one that opens it or the owner password that lifts its restrictions on printing, copying and changes. The PDF comes back with no password and no restrictions. The job fails if the password is wrong or the PDF has none. The password is kept encrypted while the job waits and is deleted once it has run. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"UnlockPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"password":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/watermark-pdf":{"post":{"tags":["Tools"],"summary":"Writes a watermark across the pages of a PDF.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Required field text: up to 100 characters, sized to fit the page. Optional fields: layout (Diagonal, Horizontal; default Diagonal, from bottom left to top right); opacity, in percent, from 5 to 100 (default 30); color as #RRGGBB (default #808080); and pages, a selection such as '1-3, 5, 8-' where '8-' means page 8 to the end (default: every page). The text is written upright as each page is shown, in DejaVu Sans, which covers Latin, Greek and Cyrillic letters; the rest of the PDF is kept. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"WatermarkPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"text":{"type":"string"}}},{"type":"object","properties":{"layout":{"type":"string"}}},{"type":"object","properties":{"opacity":{"type":"string"}}},{"type":"object","properties":{"color":{"type":"string"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/add-page-numbers":{"post":{"tags":["Tools"],"summary":"Numbers the pages of a PDF.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Optional fields: position (BottomCenter, BottomRight, BottomLeft, TopCenter, TopRight, TopLeft; default BottomCenter); format: Number ('3', the default), PageOfTotal ('Page 3 of 10') or NumberOfTotal ('3 / 10'); pages, the pages to number, a selection such as '1-3, 5, 8-' (default: every page); and firstNumber, from 0 to 100000, the number on the first numbered page, with the rest counting on from it and the total being the last number shown. Without firstNumber, each page shows where it is in the PDF and the total is its page count. The text is written upright as each page is shown, in DejaVu Sans, which covers Latin, Greek and Cyrillic letters; the rest of the PDF is kept. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"AddPageNumbers","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"position":{"type":"string"}}},{"type":"object","properties":{"format":{"type":"string"}}},{"type":"object","properties":{"firstNumber":{"type":"string"}}},{"type":"object","properties":{"pages":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/redact-pdf":{"post":{"tags":["Tools"],"summary":"Blacks out words, personal details and areas of a PDF, removing what is under them.","description":"Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Say what to black out with any of: terms, words or phrases one a line (at most 50, each up to 100 characters), found wherever they appear; matchCase, true to match capitals exactly (default false); patterns, a comma-separated list of Emails, PhoneNumbers, Pan, Aadhaar, CardNumbers to find those details without listing them; and areas, a JSON array of boxes {page, x, y, width, height} in points from the top left of the page as shown (at most 500). Every page with something to black out is redrawn as a picture at 200 dpi with black boxes on it, so nothing under a box stays in the file; other pages are kept as they are. The title, author, bookmarks, attachments and form are left out. A PDF in which none of the terms or details are found fails, rather than coming back unchanged. A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"RedactPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"terms":{"type":"string"}}},{"type":"object","properties":{"matchCase":{"type":"string"}}},{"type":"object","properties":{"patterns":{"type":"string"}}},{"type":"object","properties":{"areas":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/compare-pdf":{"post":{"tags":["Tools"],"summary":"Shows the words taken out of one PDF and put into another.","description":"Send two PDFs as multipart/form-data in a field named 'files': the original first, then the changed one. Accepts PDF: up to 2 PDFs, 250 MB each and 500 MB in total. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Each may have up to 200 pages. Their text is compared word by word, and the result is a PDF report: a first page that counts and lists the changes, then each pair of pages with a change side by side, words taken out marked in red on the original and words put in marked in green on the changed one. Pages are paired by the words they share, so a page put in or taken out shows on its own. Only text is compared; a scanned PDF needs OCR first, and one with no text fails. A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"ComparePdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/summarize-pdf":{"post":{"tags":["Tools"],"summary":"Summarises a PDF with AI, saying which page each point comes from.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 100 pages and must have text in it: make a scan searchable with POST /v1/ocr-pdf first. Only the PDF's text is sent to the AI model (Sarvam AI's, run in India). Optional fields: length (Brief, Detailed; default Brief), and language, the language to write the summary in (English, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Urdu, Kannada, Odia, Malayalam, Punjabi, Assamese, Arabic, ChineseSimplified, French, German, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Spanish, Turkish; default English). Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the summary from GET /v1/jobs/{id}/result, a UTF-8 text file with \"## \" headings, \"- \" points and **bold** words.","operationId":"SummarizePdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"length":{"type":"string"}}},{"type":"object","properties":{"language":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/ask-pdf":{"post":{"tags":["Tools"],"summary":"Reads a PDF so questions can be asked about it with AI.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 100 pages and must have text in it: make a scan searchable with POST /v1/ocr-pdf first. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then ask questions with POST /v1/ask-pdf/{id}/questions until the job's result expires. The result is the PDF's text, pages separated by form feeds.","operationId":"AskPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/ask-pdf/{id}/questions":{"post":{"tags":["Tools"],"summary":"Answers a question about a PDF read by POST /v1/ask-pdf.","description":"Up to 30 questions may be asked about each PDF; they don't count towards the plan's monthly tool jobs. The question is up to 1000 characters. Send the earlier questions and answers in history, oldest first (the last 10 are used), so a follow-up such as \"and the second one?\" makes sense. Only the PDF's text and the questions are sent to the AI model (Sarvam AI's, run in India). The answer uses \"- \" points and **bold** words, and ends each fact with its page, like (p. 3). 404 when the PDF's text has expired, 429 when no questions are left, 503 when the AI tools aren't available.","operationId":"AskPdfQuestion","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskPdfQuestionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskPdfAnswerResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/extract-pdf-data":{"post":{"tags":["Tools"],"summary":"Pulls an invoice's, a bank statement's or any tables' data out of a PDF with AI.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 30 pages and must have text in it: make a scan searchable with POST /v1/ocr-pdf first. Only the PDF's text is sent to the AI model (Sarvam AI's, run in India). Optional fields: kind (Invoice, BankStatement, Tables; default Invoice): an invoice gives its parties, dates, lines, taxes and totals, a bank statement its account details and transactions, and Tables every table; and format (Excel, Csv, Json; default Excel). Excel has a sheet for the details and one for each table; Csv has only the rows (each table in turn, separated by a blank line); Json has everything, with numbers as numbers, dates as YYYY-MM-DD and null for what the PDF doesn't show. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the file from GET /v1/jobs/{id}/result.","operationId":"ExtractPdfData","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"kind":{"type":"string"}}},{"type":"object","properties":{"format":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/translate-pdf":{"post":{"tags":["Tools"],"summary":"Translates a PDF's text into another language with AI.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 30 pages and must have text in it: make a scan searchable with POST /v1/ocr-pdf first. Only the PDF's text is sent to the AI model (Sarvam AI's, run in India). Optional fields: language, the language to translate into (English, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Urdu, Kannada, Odia, Malayalam, Punjabi, Assamese, Arabic, ChineseSimplified, French, German, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Spanish, Turkish; default English), and output (Pdf, Text; default Pdf). Pdf gives a new PDF with a page for each of the original's, holding its translated text and paragraphs but not its layout or pictures; Text gives a UTF-8 text file with each page under a \"--- Page N ---\" line. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the translation from GET /v1/jobs/{id}/result.","operationId":"TranslatePdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"language":{"type":"string"}}},{"type":"object","properties":{"output":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/office-to-pdf":{"post":{"tags":["Tools"],"summary":"Turns a Word, Excel or PowerPoint file into a PDF.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the document as multipart/form-data in a field named 'files'. Accepts one document of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Supported formats: Word (DOCX, DOC), Excel (XLSX, XLS), PowerPoint (PPTX, PPT), OpenDocument (ODT, ODS, ODP) and RTF; macro-enabled files and templates are accepted too, and macros never run. The format is read from the file itself, so its name does not matter. Every page of a document, every sheet of a workbook and every slide of a presentation becomes a page of the PDF, laid out as Office would print it. Files with a password to open them are refused. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"OfficeToPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/ocr-pdf":{"post":{"tags":["Tools"],"summary":"Makes a scanned PDF searchable, by reading the text in its pages (OCR).","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 50 pages. The text read from each scanned page is laid over it as invisible text, so the PDF looks the same but can be searched, and its text selected and copied. Pages that already have text are left as they are, and pages scanned sideways or upside down are turned the right way up. Optional fields: languages, the languages on the pages (English, German, French, Spanish, Portuguese, ChineseSimplified, Hindi, Bengali, Marathi, Telugu, Tamil, Gujarati, Urdu, Kannada, Odia, Malayalam, Punjabi, Assamese), up to 3 separated by commas (default English); and deskew, true to straighten pages scanned at a slight angle (default false). Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"OcrPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"languages":{"type":"string"}}},{"type":"object","properties":{"deskew":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/html-to-pdf":{"post":{"tags":["Tools"],"summary":"Turns an HTML file into a PDF.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the HTML file as multipart/form-data in a field named 'files'. Accepts one HTML file of up to 10 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. Pictures, styles and fonts it links to on the internet are loaded; put anything else, such as pictures, inside the file (as data: addresses or inline SVG). Scripts run. Optional fields: pageSize (A4 or Letter; default A4) and orientation (Portrait or Landscape; default Portrait). The page is printed as Chrome prints it, with its background colours and pictures. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"HtmlToPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"pageSize":{"type":"string"}}},{"type":"object","properties":{"orientation":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/url-to-pdf":{"post":{"tags":["Tools"],"summary":"Turns a web page into a PDF, from its address.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the fields as a form (multipart/form-data or application/x-www-form-urlencoded). Required field url: the address of a page on the public internet, starting with https:// or http:// (https:// is assumed when neither is given), up to 2048 characters. Pages on private networks, and addresses with a port other than 80 or 443, are refused. The page is opened as a visitor who is not signed in would see it, scripts and all. Optional fields: pageSize (A4 or Letter; default A4) and orientation (Portrait or Landscape; default Portrait). The page is printed as Chrome prints it, with its background colours and pictures. Optional field fileName: what to call the result, without an extension; by default it is named after the site. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"UrlToPdf","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","allOf":[{"type":"object","properties":{"url":{"type":"string"}}},{"type":"object","properties":{"pageSize":{"type":"string"}}},{"type":"object","properties":{"orientation":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","allOf":[{"type":"object","properties":{"url":{"type":"string"}}},{"type":"object","properties":{"pageSize":{"type":"string"}}},{"type":"object","properties":{"orientation":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pdf-to-pdfa":{"post":{"tags":["Tools"],"summary":"Turns a PDF into PDF/A, the standard for keeping documents long term.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF is rewritten to meet PDF/A at level B: every font is embedded and colours are tied to a standard colour space, so it looks the same wherever and whenever it is opened. Its text, fonts and links are kept; anything PDF/A forbids, such as scripts, is taken out. PDFs with a password, or with a digital signature that the change would break, are refused. Optional field version: PdfA1b, PdfA2b, PdfA3b (default PdfA2b, what most archives ask for). Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the PDF from GET /v1/jobs/{id}/result.","operationId":"PdfToPdfA","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"version":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pdf-to-word":{"post":{"tags":["Tools"],"summary":"Turns a PDF into a Word document that can be edited.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 200 pages. Its text comes back as paragraphs that rewrap when edited, with their fonts, sizes, colours, bold and italic; headings get Word's heading styles, bullets become lists, columns of text stay columns, and tables drawn with lines become Word tables. Pictures are kept, and charts and diagrams drawn in the PDF become pictures. Each page of the PDF starts a new page. Scanned pages have no text to read, so they come back as pictures; make the PDF searchable with /v1/ocr-pdf first to get their text. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the .docx file from GET /v1/jobs/{id}/result.","operationId":"PdfToWord","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pdf-to-excel":{"post":{"tags":["Tools"],"summary":"Turns the tables and text of a PDF into an Excel workbook.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 200 pages. Each page becomes a sheet. Each line of text is a row, and text set out in columns, such as a bank statement or a report, comes out in columns, even where the PDF draws no lines. Tables drawn with lines keep their merged cells, borders and shading. Numbers become numbers that can be added up, keeping their thousands separators, decimals, currency or per cent sign as their format; negative numbers in brackets stay negative. Scanned pages have no text to read; make the PDF searchable with /v1/ocr-pdf first. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the .xlsx file from GET /v1/jobs/{id}/result.","operationId":"PdfToExcel","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pdf-to-powerpoint":{"post":{"tags":["Tools"],"summary":"Turns a PDF into a PowerPoint deck, one slide a page.","description":"A paid tool: each job counts towards the paid tool jobs your plan allows a month, as well as its operations. Send the PDF as multipart/form-data in a field named 'files'. Accepts one PDF of up to 250 MB. Your plan may set a lower limit per file. A request can be at most 100 MB: send larger files in parts with POST /v1/uploads, and their ids in the field uploads. The PDF may have up to 200 pages. Each page becomes a slide the size of the page. Its pictures, shapes and charts are the slide's background, and its text sits on top in text boxes with its fonts, sizes and colours, so the text can be edited and the slide still looks like the page. Scanned pages come back as pictures only; make the PDF searchable with /v1/ocr-pdf first to get their text. Optional field fileName: what to call the result, without an extension; by default it is named after the first file sent. Optional field batchId: a batch from POST /v1/batches, to send this file with others and download all the results as one ZIP file. Returns a job: poll GET /v1/jobs/{id} until it is Completed, then download the .pptx file from GET /v1/jobs/{id}/result.","operationId":"PdfToPowerPoint","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/api-keys/usage":{"get":{"tags":["API keys"],"summary":"Reports what each of your API keys did per day (UTC) over the last 'days' days, today included: 1 to 90, 30 by default. Lists every active key, and revoked keys used in that time. Today's figures are up to date; earlier days are complete. Refused with 403 while your plan includes no API access.","operationId":"GetApiKeyUsage","parameters":[{"name":"days","in":"query","schema":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32","default":30}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUsageReportResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/jobs":{"post":{"tags":["Jobs"],"summary":"Queues a document operation that takes no files.","operationId":"CreateJob","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobRequest"}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"get":{"tags":["Jobs"],"summary":"Lists your jobs, newest first. Pages start at 1.","operationId":"ListJobs","parameters":[{"name":"page","in":"query","schema":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32","default":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/jobs/{id}":{"get":{"tags":["Jobs"],"summary":"Returns the status of a job.","operationId":"GetJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/jobs/{id}/result":{"get":{"tags":["Jobs"],"summary":"Downloads the result of a completed job, until the job's resultExpiresAt time.","operationId":"GetJobResult","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Jobs"],"summary":"Deletes the result of a completed job now, rather than when it expires, freeing the storage it used. The job stays in your history.","operationId":"DeleteJobResult","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/batches":{"post":{"tags":["Batches"],"summary":"Starts a batch, to send several files to the tools and get them back together.","description":"Send each file to its tool as usual, with this batch's id in the form field batchId. Each file is a job of its own and counts as one operation. Your plan sets how many files a batch can hold (maxFiles), and a batch takes files for an hour after it is started (closesAt). Download every finished result as one ZIP file from GET /v1/batches/{id}/result.","operationId":"CreateBatch","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/batches/{id}":{"get":{"tags":["Batches"],"summary":"Returns a batch and the jobs sent in it, in the order they were sent.","operationId":"GetBatch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/batches/{id}/result":{"get":{"tags":["Batches"],"summary":"Downloads the results of the batch's completed jobs as one ZIP file. Jobs still running, failed or with deleted results are left out.","operationId":"GetBatchResult","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/uploads":{"post":{"tags":["Uploads"],"summary":"Starts sending a file in parts, for a file too large for one request.","description":"Requests to Pagey can be at most 100 MB, so send a larger file in parts: start it here with its fileName and length in bytes, send its parts in order with PATCH /v1/uploads/{id}, each at most partBytes long, then send the file's id to a tool in the form field uploads, in place of the file in files. Repeat the field for several files. A file can be used once, and must be used before expiresAt.","operationId":"CreateUpload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/uploads/{id}":{"get":{"tags":["Uploads"],"summary":"Returns how much of the file has arrived (received), to carry on from.","operationId":"GetUpload","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"patch":{"tags":["Uploads"],"summary":"Sends the next part of the file.","description":"The body is the part's bytes (application/octet-stream), at most partBytes, and offset is where in the file it starts: 0, then the previous answer's received. A part that doesn't arrive whole is dropped, so send it again from the same offset. A part at the wrong offset is refused with 409; GET /v1/uploads/{id} says where to carry on from.","operationId":"AppendUpload","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"offset","in":"query","required":true,"schema":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int64"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"$ref":"#/components/schemas/Stream"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Uploads"],"summary":"Deletes a file sent in parts that you no longer need.","operationId":"DeleteUpload","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/workflows":{"get":{"tags":["Workflows"],"summary":"Lists your saved workflows, by name.","operationId":"ListWorkflows","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["Workflows"],"summary":"Saves a workflow: tools to run on a file one after another.","description":"Each step is {tool, options}: tool is one of office-to-pdf, compress-pdf, rotate-pdf, delete-pages, watermark-pdf, add-page-numbers, ocr-pdf, pdf-to-pdfa, redact-pdf, pdf-to-word, pdf-to-excel, pdf-to-powerpoint, pdf-to-image, and options the tool's settings as a JSON object, named as in its own endpoint (such as {\"level\":\"Strong\"} for compress-pdf, {\"text\":\"DRAFT\"} for watermark-pdf, {\"languages\":[\"English\"]} for ocr-pdf, or {\"terms\":[\"Asha\"],\"patterns\":[\"Emails\"]} for redact-pdf); left out, the tool's defaults. At most 10 steps. office-to-pdf can only be first, and pdf-to-word, pdf-to-excel, pdf-to-powerpoint and pdf-to-image only last. You can save up to 20.","operationId":"CreateWorkflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/workflows/{id}":{"get":{"tags":["Workflows"],"summary":"Returns one of your saved workflows.","operationId":"GetWorkflow","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"put":{"tags":["Workflows"],"summary":"Changes the name and steps of one of your saved workflows.","description":"Each step is {tool, options}: tool is one of office-to-pdf, compress-pdf, rotate-pdf, delete-pages, watermark-pdf, add-page-numbers, ocr-pdf, pdf-to-pdfa, redact-pdf, pdf-to-word, pdf-to-excel, pdf-to-powerpoint, pdf-to-image, and options the tool's settings as a JSON object, named as in its own endpoint (such as {\"level\":\"Strong\"} for compress-pdf, {\"text\":\"DRAFT\"} for watermark-pdf, {\"languages\":[\"English\"]} for ocr-pdf, or {\"terms\":[\"Asha\"],\"patterns\":[\"Emails\"]} for redact-pdf); left out, the tool's defaults. At most 10 steps. office-to-pdf can only be first, and pdf-to-word, pdf-to-excel, pdf-to-powerpoint and pdf-to-image only last. ","operationId":"UpdateWorkflow","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Workflows"],"summary":"Deletes one of your saved workflows. Runs already started carry on.","operationId":"DeleteWorkflow","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/workflows/{id}/runs":{"post":{"tags":["Workflows"],"summary":"Runs one of your saved workflows on a file.","description":"Send one file as multipart/form-data in a field named 'files': a PDF, or a document when the first step is office-to-pdf. Each step is a job of its own, run on the result of the one before, and counts as one operation (and as a paid tool job when its tool is one); the run is refused unless enough are left for every step. Optional field fileName: what to call the result, without an extension. Returns the run: poll GET /v1/workflow-runs/{id} until it is Completed, then download the result from GET /v1/jobs/{resultJobId}/result. A webhook is sent when the run ends, for its last job. Workflows come with the paid plans.","operationId":"RunWorkflow","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"fileName":{"type":"string"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/workflow-runs":{"post":{"tags":["Workflows"],"summary":"Runs steps on a file without saving them as a workflow.","description":"Send the steps as JSON in a form field named 'steps'. Each step is {tool, options}: tool is one of office-to-pdf, compress-pdf, rotate-pdf, delete-pages, watermark-pdf, add-page-numbers, ocr-pdf, pdf-to-pdfa, redact-pdf, pdf-to-word, pdf-to-excel, pdf-to-powerpoint, pdf-to-image, and options the tool's settings as a JSON object, named as in its own endpoint (such as {\"level\":\"Strong\"} for compress-pdf, {\"text\":\"DRAFT\"} for watermark-pdf, {\"languages\":[\"English\"]} for ocr-pdf, or {\"terms\":[\"Asha\"],\"patterns\":[\"Emails\"]} for redact-pdf); left out, the tool's defaults. At most 10 steps. office-to-pdf can only be first, and pdf-to-word, pdf-to-excel, pdf-to-powerpoint and pdf-to-image only last. Send one file as multipart/form-data in a field named 'files': a PDF, or a document when the first step is office-to-pdf. Each step is a job of its own, run on the result of the one before, and counts as one operation (and as a paid tool job when its tool is one); the run is refused unless enough are left for every step. Optional field fileName: what to call the result, without an extension. Returns the run: poll GET /v1/workflow-runs/{id} until it is Completed, then download the result from GET /v1/jobs/{resultJobId}/result. A webhook is sent when the run ends, for its last job. Workflows come with the paid plans.","operationId":"RunWorkflowSteps","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"steps":{"type":"string"}}},{"type":"object","properties":{"fileName":{"type":"string"}}}]}}},"required":true},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/HttpValidationProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/workflow-runs/{id}":{"get":{"tags":["Workflows"],"summary":"Returns a workflow run, with the job for each step started so far.","operationId":"GetWorkflowRun","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/signature-requests":{"post":{"tags":["Signatures"],"summary":"Sends a PDF to people to sign.","description":"Send the PDF as multipart/form-data in a field named 'files', and the request as JSON in a field named 'request': {title, message, inOrder, expiresInDays, signers: [{name, email}], fields: [{signer, type, page, x, y, width, height, label}]}. A field's signer is their place in the list, from 0; its type Signature, Initials, Date, Name or Text; its page from 1; and its box in points from the top left corner of the page as shown. Every signer needs at least one Signature field. Each signer is emailed a link of their own (all at once, or one after another with inOrder), and counts as one paid tool job. When everyone has signed, download the signed PDF, which ends with a page recording who signed and when, from GET /v1/signature-requests/{id}/document?signed=true. Paid plans only.","operationId":"SendForSignature","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["files"],"type":"object","allOf":[{"type":"object","properties":{"files":{"$ref":"#/components/schemas/IFormFileCollection"}}},{"type":"object","properties":{"request":{"type":"string"}}}]}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequestResponse"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"413":{"description":"Payload Too Large","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"get":{"tags":["Signatures"],"summary":"Lists the documents you sent for signature, newest first.","operationId":"ListSignatureRequests","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequestListResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/signature-requests/{id}":{"get":{"tags":["Signatures"],"summary":"Returns a request: who has signed, its fields and its history.","operationId":"GetSignatureRequest","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequestResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["Signatures"],"summary":"Deletes a request and its files. A pending one stops without notice.","operationId":"DeleteSignatureRequest","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/signature-requests/{id}/document":{"get":{"tags":["Signatures"],"summary":"Downloads the PDF as it was sent, or with signed=true the signed PDF once everyone has signed.","operationId":"DownloadSignatureDocument","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signed","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/signature-requests/{id}/cancel":{"post":{"tags":["Signatures"],"summary":"Stops a request before everyone has signed; the signers asked are told.","operationId":"CancelSignatureRequest","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequestResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/signature-requests/{id}/signers/{signerId}/reminders":{"post":{"tags":["Signatures"],"summary":"Emails a signer who hasn't signed their link again, at most once a day.","operationId":"RemindSigner","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequestResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"409":{"description":"Conflict","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/plans":{"get":{"tags":["Billing"],"summary":"Lists the plans on offer, cheapest first.","operationId":"ListPlans","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlanResponse"}}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/products":{"get":{"tags":["Billing"],"summary":"Lists what can be bought once rather than by subscription: a pass, and packs of prepaid credits.","operationId":"ListProducts","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponse"}}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/currencies":{"get":{"tags":["Billing"],"summary":"Lists the currencies prices are given in, the site's own first, with the countries each is for.","operationId":"ListCurrencies","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CurrencyResponse"}}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing":{"get":{"tags":["Billing"],"summary":"Returns your plan and the state of your subscription.","operationId":"GetBilling","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/invoices":{"get":{"tags":["Billing"],"summary":"Lists the invoices for your payments, newest first.","operationId":"ListInvoices","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceListResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/invoices/{id}/pdf":{"get":{"tags":["Billing"],"summary":"Returns one of your invoices as a PDF.","operationId":"GetInvoicePdf","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/billing/details":{"get":{"tags":["Billing"],"summary":"Returns who your invoices are made out to, and the Indian states to choose from.","operationId":"GetBillingDetails","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingDetailsResponse"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Too Many Requests","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"components":{"schemas":{"ApiKeyResponse":{"required":["id","name","prefix","createdAt","lastUsedAt","revokedAt","lastUsedIp"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"prefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["null","string"],"format":"date-time"},"revokedAt":{"type":["null","string"],"format":"date-time"},"lastUsedIp":{"type":["null","string"],"description":"The network address the key was last used from."}}},"ApiKeyUsageDayResponse":{"required":["date","requests","clientErrors","rateLimited","serverErrors","jobs","uploadedBytes","jobsByOperation"],"type":"object","properties":{"date":{"type":"string","description":"The day (UTC).","format":"date"},"requests":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests made with the key, however they were answered.","format":"int64"},"clientErrors":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests refused as mistaken (4xx), apart from rate limits.","format":"int64"},"rateLimited":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests refused for going over your plan's requests a minute (429).","format":"int64"},"serverErrors":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests that failed on Pagey's side (5xx).","format":"int64"},"jobs":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Jobs started.","format":"int64"},"uploadedBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The size of the files sent with those jobs.","format":"int64"},"jobsByOperation":{"type":"object","additionalProperties":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int64"},"description":"How many of those jobs each tool ran, by operation name."}}},"ApiKeyUsageReportResponse":{"required":["from","to","total","keys"],"type":"object","properties":{"from":{"type":"string","description":"The first day covered (UTC).","format":"date"},"to":{"type":"string","description":"The last day covered (UTC): today.","format":"date"},"total":{"description":"All the keys together.","$ref":"#/components/schemas/ApiKeyUsageTotalsResponse"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyUsageResponse"}}}},"ApiKeyUsageResponse":{"required":["key","total","days"],"type":"object","properties":{"key":{"$ref":"#/components/schemas/ApiKeyResponse"},"total":{"$ref":"#/components/schemas/ApiKeyUsageTotalsResponse"},"days":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyUsageDayResponse"},"description":"The days the key was used, oldest first. Days without use are left out."}}},"ApiKeyUsageTotalsResponse":{"required":["requests","clientErrors","rateLimited","serverErrors","jobs","uploadedBytes","jobsByOperation"],"type":"object","properties":{"requests":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests made with the key, however they were answered.","format":"int64"},"clientErrors":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests refused as mistaken (4xx), apart from rate limits.","format":"int64"},"rateLimited":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests refused for going over your plan's requests a minute (429).","format":"int64"},"serverErrors":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests that failed on Pagey's side (5xx).","format":"int64"},"jobs":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Jobs started.","format":"int64"},"uploadedBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The size of the files sent with those jobs.","format":"int64"},"jobsByOperation":{"type":"object","additionalProperties":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int64"},"description":"How many of those jobs each tool ran, by operation name."}}},"AskPdfAnswerResponse":{"required":["answer","questionsLeft"],"type":"object","properties":{"answer":{"type":"string","description":"The answer, with the page of each fact, like (p. 3)."},"questionsLeft":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many more questions may be asked about the PDF.","format":"int32"}}},"AskPdfQuestionRequest":{"required":["question","history"],"type":"object","properties":{"question":{"type":["null","string"],"description":"The question, up to 1,000 characters."},"history":{"type":["null","array"],"items":{"$ref":"#/components/schemas/AskPdfTurn"},"description":"Earlier questions about the PDF and their answers, oldest first."}}},"AskPdfTurn":{"required":["question","answer"],"type":"object","properties":{"question":{"type":"string"},"answer":{"type":"string"}},"description":"An earlier question about the document and the answer it got."},"AuthMethod":{"enum":["None","Session","ApiKey"]},"BatchResponse":{"required":["id","createdAt","closesAt","maxFiles","jobs","completed","failed"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"closesAt":{"type":"string","description":"When the batch stops taking files.","format":"date-time"},"maxFiles":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many files your plan lets the batch hold.","format":"int32"},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/JobResponse"},"description":"The jobs sent in the batch, in the order they were sent."},"completed":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many of the jobs have completed.","format":"int32"},"failed":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many of the jobs have failed.","format":"int32"}}},"BillingDetailsResponse":{"required":["saved","name","gstin","address","stateCode","country","chargesGst","states"],"type":"object","properties":{"saved":{"type":"boolean","description":"Whether details have been saved; until they are, invoices go to the account's email address."},"name":{"type":["null","string"]},"gstin":{"type":["null","string"]},"address":{"type":["null","string"]},"stateCode":{"type":["null","string"]},"country":{"type":"string"},"chargesGst":{"type":"boolean"},"states":{"type":"array","items":{"$ref":"#/components/schemas/StateResponse"},"description":"The Indian states by GST code, to choose StateCode from."}}},"BillingInterval":{"enum":["Month","Year",null]},"BillingResponse":{"required":["plan","status","currentPeriodEnd","scheduledPlan","currency","interval","scheduledInterval","passEndsAt"],"type":"object","properties":{"plan":{"description":"The plan whose limits apply now.","$ref":"#/components/schemas/PlanResponse"},"status":{"oneOf":[{"type":"null"},{"description":"Your subscription's state; null if you have never subscribed.","$ref":"#/components/schemas/SubscriptionStatus"}]},"currentPeriodEnd":{"type":["null","string"],"description":"When the period you have paid for ends; null if you have never subscribed.","format":"date-time"},"scheduledPlan":{"oneOf":[{"type":"null"},{"description":"The plan you move to when the current period ends; null when no change is waiting.","$ref":"#/components/schemas/PlanResponse"}]},"currency":{"type":["null","string"],"description":"What your subscription is charged in; null if you have never subscribed."},"interval":{"oneOf":[{"type":"null"},{"description":"How often your subscription is charged; null if you have never subscribed.","$ref":"#/components/schemas/BillingInterval"}]},"scheduledInterval":{"oneOf":[{"type":"null"},{"description":"How often it is charged after the waiting change; null when none is waiting.","$ref":"#/components/schemas/BillingInterval"}]},"passEndsAt":{"type":["null","string"],"description":"When the pass that gives you Plan runs out, counting any you bought to\nfollow it; null when no pass gives you your plan.","format":"date-time"}}},"CreateJobRequest":{"required":["operation"],"type":"object","properties":{"operation":{"maxLength":64,"minLength":0,"type":"string"}}},"CreateUploadRequest":{"required":["fileName","length"],"type":"object","properties":{"fileName":{"type":["null","string"],"description":"The file's name, which results are named after."},"length":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The file's size in bytes.","format":"int64"}}},"CurrencyResponse":{"required":["currency","countries"],"type":"object","properties":{"currency":{"type":"string","description":"The ISO 4217 code, such as `INR`."},"countries":{"type":"array","items":{"type":"string"},"description":"The ISO 3166 codes of the countries its prices are for, such as `IN`; empty when anyone\nmay pay in it. Checkout refuses it for a visitor the website places elsewhere."}},"description":"A currency prices are given in."},"HttpValidationProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"IFormFile":{"type":"string","format":"binary"},"IFormFileCollection":{"type":"array","items":{"$ref":"#/components/schemas/IFormFile"}},"InvoiceListResponse":{"required":["chargesGst","invoices"],"type":"object","properties":{"chargesGst":{"type":"boolean","description":"Whether Pagey's invoices charge GST."},"invoices":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceResponse"}}}},"InvoiceResponse":{"required":["id","number","kind","issuedAt","description","currency","totalCents","taxCents"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"string"},"kind":{"type":"string"},"issuedAt":{"type":"string","format":"date-time"},"description":{"type":"string"},"currency":{"type":"string"},"totalCents":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"What was paid, tax included, in the minor unit of Currency.","format":"int32"},"taxCents":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The GST in it; 0 when none was charged.","format":"int32"}}},"JobListResponse":{"required":["items","page","pageSize","total"],"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/JobResponse"}},"page":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"pageSize":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"total":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Jobs across all pages.","format":"int32"}}},"JobResponse":{"required":["id","operation","status","error","createdAt","completedAt","resultExpiresAt","fileName","resultFileName","resultBytes","batchId"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"operation":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"error":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"resultExpiresAt":{"type":["null","string"],"description":"When the result is deleted. It cannot be downloaded after this time.","format":"date-time"},"fileName":{"type":["null","string"],"description":"What the result is called, such as \"report-merged.pdf\"; before the job completes, the name\nwithout its extension. Kept after the result is deleted. Null if the job has no name yet."},"resultFileName":{"type":["null","string"],"description":"What the result is called when downloaded. Null when there is no result to download: the\njob has not finished, it failed, or its result has been deleted."},"resultBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"The size of the result while it is stored; otherwise null.","format":"int64"},"batchId":{"type":["null","string"],"description":"The batch the job was sent in, or null when it was sent on its own.","format":"uuid"},"workflowRunId":{"type":["null","string"],"description":"The workflow run the job is a step of (GET /v1/workflow-runs/{id}), or null.","format":"uuid"},"workflowStep":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"Which step of its run the job is, from 1.","format":"int32"},"workflowStepCount":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"How many steps its run has.","format":"int32"},"nextJobId":{"type":["null","string"],"description":"The job for the next step, once this one has handed its result on to it; the result is then\nthat job's input, not this one's to download.","format":"uuid"},"queuePosition":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"While the job waits to start, its place in line: 1 is next. Jobs from paid plans are let\nahead. Null once it has started, and in lists of jobs.","format":"int32"}}},"JobStatus":{"enum":["Queued","Processing","Completed","Failed"]},"JsonElement":{},"MeResponse":{"required":["userId","authMethod","plan","monthlyUnitLimit","unitsUsed","limitResetsAt","storageBytesUsed","storageLimitBytes","isAdmin","maxApiKeys","requestsPerMinute","creditsLeft","creditsUsedThisMonth","paidToolsUsed","monthlyPaidToolLimit","maxUploadBytes","maxBatchFiles","pinnedTools"],"type":"object","properties":{"userId":{"type":"string"},"authMethod":{"$ref":"#/components/schemas/AuthMethod"},"plan":{"type":"string"},"monthlyUnitLimit":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"unitsUsed":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Operations used this month, including any still waiting or running.","format":"int32"},"limitResetsAt":{"type":"string","description":"When UnitsUsed returns to zero.","format":"date-time"},"storageBytesUsed":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The size of the caller's results that are still stored.","format":"int64"},"storageLimitBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"New jobs are refused while StorageBytesUsed is at or over this.","format":"int64"},"isAdmin":{"type":"boolean","description":"Whether the caller may use the admin endpoints."},"maxApiKeys":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many API keys the caller's plan allows at once.","format":"int32"},"requestsPerMinute":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests a minute the caller's plan allows, across all keys.","format":"int32"},"creditsLeft":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Prepaid credits not yet used. Once MonthlyUnitLimit is used up, each\noperation takes one. They never expire.","format":"int32"},"creditsUsedThisMonth":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Credits taken this month; those operations are in UnitsUsed too.","format":"int32"},"paidToolsUsed":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Jobs this month with the paid tools, including any still waiting or running; they are in\nUnitsUsed too. Credits do not pay for more of them.","format":"int32"},"monthlyPaidToolLimit":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many paid tool jobs the caller's plan allows a month.","format":"int32"},"maxUploadBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The largest file a server tool takes from the caller.","format":"int64"},"maxBatchFiles":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many files the caller may send in one batch.","format":"int32"},"pinnedTools":{"type":"array","items":{"type":"string"},"description":"The tools pinned to the top of Home on the website, by name, such as `merge-pdf`."}}},"PlanPriceBody":{"required":["currency","monthlyPriceCents","yearlyPriceCents"],"type":"object","properties":{"currency":{"maxLength":3,"minLength":3,"type":"string","description":"The ISO 4217 code, such as `INR`."},"monthlyPriceCents":{"maximum":2147483647,"minimum":0,"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The price of a month, in the currency's minor unit (cents, or paise for rupees).","format":"int32"},"yearlyPriceCents":{"maximum":2147483647,"minimum":0,"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"The price of a year, in the same unit; null when the plan is not sold by the year in this currency.","format":"int32"}},"description":"A plan's prices in one currency."},"PlanResponse":{"required":["id","name","monthlyUnitLimit","storageLimitBytes","monthlyPriceCents","currency","contactSales","maxApiKeys","requestsPerMinute","yearlyPriceCents","prices","maxUploadBytes","monthlyPaidToolLimit","maxBatchFiles","onSale"],"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"monthlyUnitLimit":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"storageLimitBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How much the results kept for an account may add up to.","format":"int64"},"monthlyPriceCents":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The price of a month, in cents of Currency.","format":"int32"},"currency":{"type":"string"},"contactSales":{"type":"boolean","description":"Whether the plan is set up by talking to us rather than through checkout. Its price is a\nstarting point."},"maxApiKeys":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many API keys an account on the plan may have at once.","format":"int32"},"requestsPerMinute":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Requests a minute an account on the plan may make, across all its keys.","format":"int32"},"yearlyPriceCents":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"The price of a year, in cents of Currency; null when the plan is sold by the month only.","format":"int32"},"prices":{"type":"array","items":{"$ref":"#/components/schemas/PlanPriceBody"},"description":"The plan's prices in every currency it is sold in, Currency first."},"maxUploadBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The largest file a server tool takes from an account on the plan.","format":"int64"},"monthlyPaidToolLimit":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"Jobs a month with the paid tools (OCR, Office to PDF, HTML and web page to PDF, PDF/A).","format":"int32"},"maxBatchFiles":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many files an account on the plan may send in one batch.","format":"int32"},"onSale":{"type":"boolean","description":"Whether the plan can be subscribed or changed to now. False while sales of it are paused;\nthose already on it keep it."}}},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}}},"ProductKind":{"enum":["Pass","Credits"]},"ProductPriceBody":{"required":["currency","amountCents"],"type":"object","properties":{"currency":{"type":"string","description":"The ISO 4217 code, such as `INR`."},"amountCents":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"In the currency's minor unit (cents, or paise for rupees).","format":"int32"}}},"ProductResponse":{"required":["id","name","kind","prices","planId","days","credits","onSale"],"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"description":"`Pass`, a plan for a number of days; or `Credits`, one more operation each once your plan's monthly ones are used up, which never expire.","$ref":"#/components/schemas/ProductKind"},"prices":{"type":"array","items":{"$ref":"#/components/schemas/ProductPriceBody"},"description":"What it costs in each currency it is sold in, the site's own first."},"planId":{"type":["null","string"],"description":"For a pass: the plan it gives."},"days":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"For a pass: how long it lasts.","format":"int32"},"credits":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"description":"For a credit pack: how many credits it adds.","format":"int32"},"onSale":{"type":"boolean","description":"Whether it can be bought now; false while sales of it are paused."}},"description":"Something bought once: a pass, or a pack of prepaid credits."},"SignatureEventKind":{"enum":["Created","Sent","Viewed","Signed","Declined","Reminded","Cancelled","Completed","Expired"]},"SignatureEventResponse":{"required":["kind","at","signerId","address"],"type":"object","properties":{"kind":{"$ref":"#/components/schemas/SignatureEventKind"},"at":{"type":"string","format":"date-time"},"signerId":{"type":["null","string"],"format":"uuid"},"address":{"type":["null","string"]}}},"SignatureField":{"required":["id","signer","type","page","x","y","width","height"],"type":"object","properties":{"id":{"type":"string","description":"Named by the server, f1, f2 and so on, for the signer to fill it by."},"signer":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The signer it is for, from 0, in the order they were given.","format":"int32"},"type":{"$ref":"#/components/schemas/SignatureFieldType"},"page":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"x":{"pattern":"^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$","type":["number","string"],"format":"double"},"y":{"pattern":"^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$","type":["number","string"],"format":"double"},"width":{"pattern":"^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$","type":["number","string"],"format":"double"},"height":{"pattern":"^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$","type":["number","string"],"format":"double"},"label":{"type":["null","string"],"description":"What to ask for in a text field, such as \"Job title\"."}},"description":"Where one signer fills something in: on Page (from 1), a box in points from\nthe top left corner of the page as shown."},"SignatureFieldType":{"enum":["Signature","Initials","Date","Name","Text"],"description":"What a signer puts in a field."},"SignatureRequestListResponse":{"required":["canSend","items"],"type":"object","properties":{"canSend":{"type":"boolean","description":"Whether your plan lets you send documents for signature. Requests sent before a move to the\nfree plan are still listed, and can be downloaded."},"items":{"type":"array","items":{"$ref":"#/components/schemas/SignatureRequestSummaryResponse"}}}},"SignatureRequestResponse":{"required":["id","title","fileName","message","inOrder","status","pageCount","createdAt","expiresAt","endedAt","originalSha256","signedSha256","signers","fields","events"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"fileName":{"type":"string"},"message":{"type":["null","string"]},"inOrder":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SignatureRequestStatus"},"pageCount":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"endedAt":{"type":["null","string"],"format":"date-time"},"originalSha256":{"type":"string"},"signedSha256":{"type":["null","string"],"description":"The SHA-256 of the signed PDF, once everyone has signed."},"signers":{"type":"array","items":{"$ref":"#/components/schemas/SignerResponse"}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/SignatureField"}},"events":{"type":"array","items":{"$ref":"#/components/schemas/SignatureEventResponse"}}}},"SignatureRequestStatus":{"enum":["Pending","Completed","Declined","Cancelled","Expired"]},"SignatureRequestSummaryResponse":{"required":["id","title","status","createdAt","expiresAt","endedAt","signers"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"$ref":"#/components/schemas/SignatureRequestStatus"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"endedAt":{"type":["null","string"],"format":"date-time"},"signers":{"type":"array","items":{"$ref":"#/components/schemas/SignerResponse"}}}},"SignerResponse":{"required":["id","position","name","email","status","notifiedAt","viewedAt","signedAt","declinedAt","declineReason","reminders","remindedAt"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"position":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"name":{"type":"string"},"email":{"type":"string"},"status":{"$ref":"#/components/schemas/SignerStatus"},"notifiedAt":{"type":["null","string"],"format":"date-time"},"viewedAt":{"type":["null","string"],"format":"date-time"},"signedAt":{"type":["null","string"],"format":"date-time"},"declinedAt":{"type":["null","string"],"format":"date-time"},"declineReason":{"type":["null","string"]},"reminders":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"remindedAt":{"type":["null","string"],"format":"date-time"}}},"SignerStatus":{"enum":["Waiting","Notified","Viewed","Signed","Declined"]},"StateResponse":{"required":["code","name"],"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}},"Stream":{"type":"string","format":"binary"},"SubscriptionStatus":{"enum":["Active","PastDue","Canceled",null]},"UploadResponse":{"required":["id","fileName","length","received","partBytes","expiresAt"],"type":"object","properties":{"id":{"type":"string","description":"Send this to a tool in the form field uploads once the file has all arrived.","format":"uuid"},"fileName":{"type":"string","description":"The file's name."},"length":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The file's size in bytes.","format":"int64"},"received":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"How many bytes have arrived: where the next part starts.","format":"int64"},"partBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"description":"The longest a part may be.","format":"int64"},"expiresAt":{"type":"string","description":"When the file is deleted, if no tool has taken it.","format":"date-time"}},"description":"A file being sent in parts."},"WebhookEvent":{"required":["id","type","created","data"],"type":"object","properties":{"id":{"type":"string","description":"Unique to the event and endpoint, and the same on every retry of it.","format":"uuid"},"type":{"type":"string","description":"job.completed, job.failed or ping."},"created":{"type":"string","format":"date-time"},"data":{"required":["job"],"type":"object","properties":{"job":{"required":["id","operation","status","error","createdAt","completedAt","resultExpiresAt","fileName","resultBytes"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"operation":{"type":"string"},"status":{"enum":["Queued","Processing","Completed","Failed"]},"error":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"resultExpiresAt":{"type":["null","string"],"format":"date-time"},"fileName":{"type":["null","string"]},"resultBytes":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["null","integer","string"],"format":"int64"}},"description":"The fields of a job that GET /v1/jobs/{id} also returns."}}}},"description":"The body of every event: what happened, and the object it happened to."},"WorkflowListResponse":{"required":["items"],"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"WorkflowRequest":{"required":["name","steps"],"type":"object","properties":{"name":{"maxLength":80,"minLength":0,"type":"string"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStepInput"},"description":"The tools in order; see POST /v1/workflows."}}},"WorkflowResponse":{"required":["id","name","steps","createdAt","updatedAt"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStepInput"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"WorkflowRunResponse":{"required":["id","status","stepCount","steps","resultJobId","error"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"description":"Completed when the last step has, Failed when a step failed or was turned away, and\notherwise Queued or Processing.","$ref":"#/components/schemas/JobStatus"},"stepCount":{"pattern":"^-?(?:0|[1-9]\\d*)$","type":["integer","string"],"format":"int32"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/JobResponse"},"description":"The job for each step started so far, first step first."},"resultJobId":{"type":["null","string"],"description":"The job to download the result from, once the run has completed.","format":"uuid"},"error":{"type":["null","string"],"description":"Why the run stopped, when it failed."}}},"WorkflowStepInput":{"required":["tool","options"],"type":"object","properties":{"tool":{"type":["null","string"]},"options":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/JsonElement"}]}},"description":"A step as a caller sends it: the settings are any JSON object."}},"securitySchemes":{"ApiKey":{"type":"apiKey","description":"An API key from the API keys page of your dashboard.","name":"X-Api-Key","in":"header"}}},"security":[{"ApiKey":[]}],"tags":[{"name":"Account"},{"name":"Tools"},{"name":"API keys"},{"name":"Jobs"},{"name":"Batches"},{"name":"Uploads"},{"name":"Workflows"},{"name":"Signatures"},{"name":"Billing"},{"name":"Webhooks","description":"Events Pagey sends to your webhook endpoints."}],"webhooks":{"job.completed":{"post":{"tags":["Webhooks"],"summary":"A job has finished and its result is ready.","operationId":"job.completed","parameters":[{"name":"Pagey-Signature","in":"header","description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with the endpoint's secret>","required":true,"schema":{"type":"string"}},{"name":"Pagey-Event","in":"header","description":"The event's type: job.completed.","required":true,"schema":{"type":"string"}},{"name":"Pagey-Delivery","in":"header","description":"The event's id.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}},"required":true},"responses":{"2XX":{"description":"Received. Any other answer, or none within 10 seconds, is retried."}}}},"job.failed":{"post":{"tags":["Webhooks"],"summary":"A job could not be finished.","operationId":"job.failed","parameters":[{"name":"Pagey-Signature","in":"header","description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with the endpoint's secret>","required":true,"schema":{"type":"string"}},{"name":"Pagey-Event","in":"header","description":"The event's type: job.failed.","required":true,"schema":{"type":"string"}},{"name":"Pagey-Delivery","in":"header","description":"The event's id.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}},"required":true},"responses":{"2XX":{"description":"Received. Any other answer, or none within 10 seconds, is retried."}}}},"ping":{"post":{"tags":["Webhooks"],"summary":"A test event, sent when you ask for one.","operationId":"ping","parameters":[{"name":"Pagey-Signature","in":"header","description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with the endpoint's secret>","required":true,"schema":{"type":"string"}},{"name":"Pagey-Event","in":"header","description":"The event's type: ping.","required":true,"schema":{"type":"string"}},{"name":"Pagey-Delivery","in":"header","description":"The event's id.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}},"required":true},"responses":{"2XX":{"description":"Received. Any other answer, or none within 10 seconds, is retried."}}}}},"servers":[{"url":"https://api.pagey.in"}]}