A2A REGISTRY·AGENT RECORD·fbbc1e43-6975-46d2-a066-7e8ad90357b3

Provider

Emboss

Emboss

Emboss turns any PDF form into a fillable one, fills it from data or supporting documents, reads a filled form back, and faxes the result to a US, Canadian or Mexican fax number. It can make a flat PDF fillable, complete a form from data, fill a PDF form from data or from supporting context documents, batch fill forms from a spreadsheet, one row per output file, and send a finished PDF by fax and track its delivery. Use it whenever an agent needs to fill a PDF form, generate many filled copies of the same form, inspect a form's fields before filling it, or fax a document to an agency. Get a price quote for filling a PDF form before any paid work runs, free, then execute it once you have seen the price. Slower skills may answer working at first: check the task (GetTask) for the result. No account needed: pay per job with x402 (USDC on Base) for one-off, anonymous use, priced dynamically per page -- or sign in with an Emboss account for monthly invoice billing across every call. A pay-per-call API is also available at https://api.getemboss.ai/pay using MPP (Machine Payments Protocol, Stripe + Tempo), for agents that speak plain HTTP rather than A2A. Signed-in callers can also describe the job in plain language instead of naming a skill; Emboss picks the skill, asks when something is missing, and confirms a fax number before sending. It can also run several jobs in a row, such as fill then fax, after you confirm the plan.

Observed evidence

Task verified

Last sweep

Launch endpoint ↗

Agent datasheet

Agent ID
fbbc1e43-6975-46d2-a066-7e8ad90357b3
Category
Productivity
Canonical card
https://api.getemboss.ai/.well-known/agent-card.json
Endpoint
https://api.getemboss.ai/a2a
Protocol version
0.3
Agent version
1.0.0
Streaming
Supported
Input modes
application/pdf, text/csv, application/json, text/plain
Output modes
application/pdf, application/json, text/plain

Reachability record

Last 100 checks shown · 99.8% across 30 days

2026-11-04T00:39:54.936920Z: passed2026-11-04T01:11:09.438181Z: passed2026-11-04T01:42:33.031550Z: passed2026-11-04T02:13:59.826277Z: passed2026-11-04T02:45:31.825000Z: passed2026-11-04T03:16:53.536740Z: passed2026-11-04T03:48:26.123664Z: passed2026-11-04T04:19:42.336872Z: passed2026-11-04T04:51:03.128076Z: passed2026-11-04T05:22:17.729420Z: passed2026-11-04T05:53:26.831844Z: passed2026-11-04T06:24:58.335010Z: passed2026-11-04T06:43:58.888779Z: passed2026-11-04T07:15:18.395908Z: passed2026-11-04T07:46:35.980964Z: passed2026-11-04T08:17:40.885614Z: passed2026-11-04T08:48:51.380047Z: passed2026-11-04T09:19:59.779153Z: passed2026-11-04T09:51:22.287783Z: passed2026-11-04T10:22:47.784568Z: passed2026-11-04T10:54:03.890665Z: passed2026-11-04T11:25:26.487052Z: passed2026-11-04T11:56:31.589242Z: passed2026-11-04T12:27:56.478597Z: passed2026-11-04T12:59:43.887376Z: passed2026-11-04T13:31:25.592059Z: passed2026-11-04T14:03:09.890322Z: passed2026-11-04T14:35:24.697534Z: passed2026-11-04T15:07:35.189423Z: passed2026-11-04T15:39:08.594098Z: passed2026-11-04T16:10:41.283361Z: passed2026-11-04T16:42:08.883067Z: passed2026-11-04T17:13:36.598676Z: passed2026-11-04T17:45:04.379936Z: passed2026-11-04T18:16:35.590397Z: passed2026-11-04T18:48:10.690373Z: passed2026-11-04T19:19:41.896414Z: passed2026-11-04T19:51:08.491970Z: passed2026-11-04T20:22:30.495007Z: passed2026-11-04T20:53:51.492951Z: passed2026-11-04T21:25:13.583644Z: passed2026-11-04T21:56:26.787198Z: passed2026-11-04T22:27:51.392921Z: passed2026-11-04T22:59:29.978335Z: passed2026-11-04T23:31:18.789812Z: passed2026-11-05T00:02:55.490962Z: passed2026-11-05T00:34:18.484807Z: passed2026-11-05T01:05:34.688120Z: passed2026-11-05T01:07:06.018392Z: passed2026-11-05T01:38:14.912584Z: passed2026-11-05T02:09:29.108460Z: passed2026-11-05T02:41:00.411276Z: passed2026-11-05T03:12:34.316883Z: passed2026-11-05T03:43:53.815579Z: passed2026-11-05T04:15:13.921660Z: passed2026-11-05T04:46:28.908449Z: passed2026-11-05T05:17:39.718264Z: passed2026-11-05T05:18:54.245019Z: passed2026-11-05T05:50:03.954603Z: passed2026-11-05T06:21:22.042646Z: passed2026-11-05T06:52:49.351077Z: passed2026-11-05T07:24:08.948475Z: passed2026-11-05T07:55:35.751078Z: passed2026-11-05T08:26:46.557582Z: passed2026-11-05T08:57:55.647297Z: passed2026-11-05T09:29:02.253225Z: passed2026-11-05T10:00:11.050680Z: passed2026-11-05T10:31:11.451272Z: passed2026-11-05T11:02:10.544598Z: passed2026-11-05T11:33:26.453478Z: passed2026-11-05T12:04:33.141158Z: passed2026-11-05T12:35:46.356473Z: passed2026-11-05T13:07:08.145254Z: passed2026-11-05T13:38:34.349044Z: passed2026-11-05T14:10:12.646282Z: passed2026-11-05T14:41:53.750244Z: passed2026-11-05T14:43:21.448795Z: passed2026-11-05T15:14:58.239293Z: passed2026-11-05T15:46:12.853096Z: passed2026-11-05T16:17:33.553241Z: passed2026-11-05T16:48:41.854093Z: passed2026-11-05T17:20:12.946029Z: passed2026-11-05T17:51:25.850761Z: passed2026-11-05T18:22:41.842928Z: passed2026-11-05T18:53:53.749083Z: passed2026-11-05T19:25:10.752666Z: passed2026-11-05T19:56:23.738472Z: passed2026-11-05T20:27:34.538716Z: passed2026-11-05T20:58:48.555913Z: passed2026-11-05T21:30:05.642893Z: passed2026-11-05T22:01:33.938800Z: passed2026-11-05T22:33:11.442166Z: passed2026-11-05T23:04:50.749183Z: passed2026-11-05T23:36:35.844132Z: passed2026-11-06T00:08:09.649592Z: passed2026-11-06T00:39:24.446247Z: passed2026-11-06T01:10:34.340005Z: passed2026-11-06T01:41:47.442912Z: passed2026-11-06T01:43:02.715882Z: passed2026-11-06T02:14:21.202332Z: passed
PassFailureAverage 1204 ms

Declared skills

Make a PDF fillable

make_fillable

Turn a flat or scanned PDF form into a fillable PDF with detected fields. Make a flat PDF fillable. Input: a flat (non-fillable) PDF file, or a `library` slug from find_form to start from a blank government form Emboss already keeps. Output: a form_id and the fields detected on the PDF (each field's id, label, kind, whether it is required, its options, group and description), ready for fill_form or fill_from_context. Adobe LiveCycle XFA forms are filled through their datasets, and a fill from documents also returns the values as a data export; a dynamic XFA form whose layout flows or repeats rows is accepted with no fields to fill (warning xfa_dynamic_form). Also: detect form fields in a PDF; add fillable fields to a document; extract a PDF form schema; make a government or business form fillable; XFA forms; Adobe LiveCycle forms; Adobe dynamic forms. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

document-processing · form-schema · forms · make-fillable · pdf · pdf-form-fields · xfa

Fill a form from data

fill_form

Fill a PDF form from structured data such as JSON or key-value answers. Fill a PDF form from data. Input: a form_id (from make_fillable or find_forms) or a flat PDF file, plus a values object mapping field names to answers. Output: a filled PDF file, the form_id, and any values that matched no field. Also: fill a PDF form from JSON; populate form fields from data; complete a PDF application from known values; write answers into a form. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

data-entry · fill-pdf · form-filling · forms · json · pdf

Fill a form from context documents

fill_from_context

Fill a PDF form using facts found in supporting documents. Complete a form from data found in supporting documents. Input: a form_id, a PDF file, or a `library` slug from find_form, plus one or more context files and/or freeform context text (a resume, a prior filing, notes) to extract answers from. Output: a filled PDF file, the form_id, how many fields were filled and dropped, and any warnings. Also: fill a PDF form from DOCX, spreadsheets, images, JSON, or other documents; pre-fill a government form from supporting paperwork; complete an application from a resume or company details; extract answers from context documents into a form. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

context-fill · document-extraction · document-processing · extraction · fill-pdf · form-filling · forms · pdf

Prepare a form from documents

prepare

Prepare a form from documents: a proposal of every answer with its source, what is missing, and where documents disagree, before writing, plus attachments for a package. Prepare a form instead of filling it. Input: a form_id, a PDF file, or a `library` slug from find_form, plus one or more context files and/or freeform context text, and an optional policy (safe or strict). Output: a proposal_id and the proposal itself, listing every field's proposed answer with the document it came from, the questions still open, and the signatures and attachments a person still has to supply. Nothing is written into the PDF until a later call commits it. Also: review a form before it is filled; see which answers came from which document; find the gaps in an application; check a form for conflicting information; propose answers for review instead of writing them. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

agents · extraction · forms · pdf · review

Batch fill forms from a spreadsheet

fill_batch

Fill one copy of a PDF form for every row of a spreadsheet. Batch fill forms from a spreadsheet. Input: a form_id (required), plus a CSV file part or csv_text with one row per filled copy, and an optional column-to-field mapping. Output: one filled PDF per row and the form_id. Also: batch fill PDF forms from a CSV or Excel file; mail-merge a PDF form; generate many filled forms from a table of records. Optional input: retention (ephemeral or account_default) is accepted but changes nothing: a batch fills an existing form, which keeps its own setting. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

batch · fill-pdf · forms · mail-merge · pdf · spreadsheet

Read a batch fill's rows, a page at a time

get_batch

Read the rows of a batch fill, a page at a time. Free. Input: the batch_id from fill_batch, plus an optional limit (1 to 100, default 100) and offset (default 0). Output: the batch's status and counts, up to limit rows (each with its download link or error), the zip link once the batch is done, and next_offset, where the next page starts (empty on the last page, and while the batch is still running). Works for the account that ran the batch.

pdf · forms · batch · spreadsheet

Suggest a column-to-field mapping

suggest_mapping

Propose which spreadsheet columns fill which PDF form fields. Suggest how spreadsheet columns map to form fields before a batch fill. Input: a form_id (required), plus a CSV file part, csv_text, or a list of column names (columns). Output: a suggested mapping from columns to field names for review. Also: map CSV columns to form fields; match spreadsheet headers to a PDF form; plan a batch fill. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

form-schema · forms · mapping · pdf · spreadsheet

Find previously processed forms

find_forms

Find forms previously made fillable, by title search and state. Input: an optional query string, state filter (ready, processing, failed, or all), and a result limit and offset. Output: a list of matching forms, each with its id, title, state, page count and field count, and next_offset, where the next page starts (empty on the last page).

pdf · forms · search

Find a blank government form

find_form

Find a blank government form in the Emboss library by name or number, ready to fill. Find a blank US federal form in the Emboss library, by name, number or alias. Input: a query string such as 'W-9', 'i9' or 'taxpayer identification'. Output: each matching form's slug, title, agency, revision and page count, and next_offset when more matches follow (an optional limit and offset page through them). Pass a slug as `library` on make_fillable or fill_from_context to start from that form instead of uploading one. Also: look up a blank IRS or USCIS form; find a W-9 or an I-9 to fill in; get a blank federal form by its number; search a library of government forms.

form-schema · forms · government-forms · library · pdf · search

Get a form's status and field inventory

get_form

Get a form's current status and field inventory. Input: a form_id. Output: the form's state (ready, processing, or failed), title, page count, and field list.

pdf · forms · inspection

Commit a proposal

commit

Write or confirm the answers, render the form with text that fits, check it, and return the PDF with a report and a receipt, or one submission package. Commit a proposal from prepare: write any remaining values, render the PDF with text that fits, check it, and return the filled PDF with a report and a receipt. Input: a proposal_id from prepare, plus any values still needed (field_id, value, and an optional note), a confirm list of field ids whose proposed value is accepted as-is, an optional policy (safe or strict), and an optional package flag. With package the output is one submission package as well: the filled form, the proposal's attachments in the order the form asks for them, and the receipt embedded in the file. Output: a job_id; when the task completes, the verification result, a receipt link, the filled PDF, and the package when one was asked for. Checkboxes take yes or no; yes ticks that box. In a Yes/No pair, say yes to the box you want; two yeses in one pair are refused. Also: commit a proposal to a filled PDF; render a prepared form; finalize a form after review; write the reviewed answers into the document. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

agents · forms · pdf

Check a filled form

verify

Check a filled form: required fields, allowed options, consistent choices, text that fits, empty signature boxes; returns complete, review required or incomplete. Check a filled PDF against a form's contract: required fields, allowed options, consistent choices, text that fits, empty signature boxes. Input: a form_id and the filled PDF (a FilePart or pdf_url). Output: complete, review_required or incomplete, plus the list of issues found. Also: verify a filled PDF form; check a completed form for missing or invalid fields; validate a filled-in document before submitting it. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

agents · forms · pdf · verification

Read a filled form back

read_form

Read the values out of a filled PDF form, labelled by field, with a completeness verdict when the form is known. Read the values out of a filled PDF. Input: the filled PDF as a FilePart (url or inline bytes), and optionally a form_id when the form is already in the account. Output: every form box in the file with its value and whether it is filled, the labels and required flags when the form is recognised, and a completeness verdict. Nothing is stored. Also: extract form data; get values from a filled PDF; read a completed form back into data; pull the answers out of a filled application; turn a filled PDF into JSON. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

document-extraction · extraction · form-schema · forms · pdf · read-back

Attach a document to a proposal

attach

Attach one supporting document to a proposal from prepare, so the commit can hand back one submission package. Input: a proposal_id, the document as a FilePart (PDF, PNG or JPEG), and optionally `for` in the data part naming one of the proposal's requirements. Output: the attachment's number, the requirement it satisfies, its size and its hash.

pdf · forms · agents · attachments

Get a price quote for filling a PDF form

quote_job

Get a price quote for filling a PDF form before any paid work runs. Input: the target skill (make_fillable, fill_form, fill_from_context, suggest_mapping, fill_batch, or send_fax) and its own input, exactly as a direct call to that skill would take. Output: a quote_id, the price and its expiry. For a caller with no account the price is fixed; for an account the job is billed like a direct call, so the free allowance and the documents' measured size apply.

pdf · forms · pricing · quote

Run a previously quoted job

execute_quote

Run the job priced by a previous quote_job call, from its staged inputs, with no re-upload. Input: a quote_id. Output: the same result the quoted skill's own direct call would return (a filled PDF, a fillable form, or a batch of filled copies). A quoted fax follows the same hourly rule as send_fax: the 11th fax in an hour waits for a person's approval. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check. In a rehearsal the answer's operation is the quoted skill's, or execute_quote when the call was refused before its quote could be read.

pdf · forms · pricing · quote

Send a PDF by fax

send_fax

Send a PDF to a fax number and track delivery, priced per transmitted page. Send one or more PDFs to a US, Canadian or Mexican fax number. The task stays working until the fax is delivered or fails; a busy, unanswered or dropped call is retried automatically up to three more times over about 17 minutes. Signed-in callers need a payment method on file. The 11th fax in an hour from one account or paying wallet waits for a person's approval. Also: fax a PDF; send a document by fax; fax this form to an agency; transmit a PDF to a fax line; outbound fax from an agent. Add "dry_run": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.

delivery · fax · forms · pdf · transmission

Compose a PDF from artifacts

compose_pdf

Free. Build one PDF from pages of several artifacts, in the order and rotation you name. Input: sources, a list of artifact_id with optional pages (1-based, like 1-3,7) and rotate (90, 180, 270), plus artifact_token per entry for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: assemble a packet from several PDFs; pick pages from different documents into one file; combine selected pages without downloading.

compose · free · packet · pdf · utilities

Merge PDFs

merge_pdf

Free. Join whole PDFs into one file in the order given. Input: sources, a list of artifact_id in the order to join them, plus artifact_token per entry for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: merge PDFs; concatenate documents; combine several PDF files into one.

free · merge · pdf · utilities

Extract pages

extract_pages

Free. Keep only the pages you name from a PDF, in the order you name them. Input: an artifact_id, the pages to keep (1-based, like 1-3,7), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: extract pages from a PDF; pull out specific pages; save part of a document.

extract · free · pages · pdf · utilities

Delete pages

delete_pages

Free. Remove the pages you name from a PDF and keep the rest in order. Input: an artifact_id, the pages to remove (1-based, like 1-3,7), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: delete pages from a PDF; drop blank pages; remove the instructions pages.

delete · free · pages · pdf · utilities

Reorder pages

reorder_pages

Free. Put a PDF's pages in a new order you give, every page exactly once. Input: an artifact_id, the new page order (every page named exactly once, 1-based), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: reorder PDF pages; move a page to the front; rearrange a document.

free · pages · pdf · reorder · utilities

Rotate pages

rotate_pages

Free. Rotate the pages you name by 90, 180 or 270 degrees. Input: an artifact_id, rotations as a list of {pages, degrees} entries (pages 1-based like 1-3,7; degrees 90, 180 or 270, added to each page's current rotation), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: rotate PDF pages; fix a sideways scan by an explicit angle; turn a landscape page upright.

free · pages · pdf · rotate · utilities

Inspect a PDF

inspect_pdf

Free. Report a PDF's structure: page count, page sizes and rotations, encryption, form fields, annotations. Input: an artifact_id and an artifact_token for anonymous callers. Output: a report with the page count, each page's size and rotation, whether the PDF is encrypted, whether it has form fields, annotations, outlines, embedded files or JavaScript, its PDF version, mime type, size and sha256; no new artifact. Also: inspect a PDF; how many pages does this have; is this PDF encrypted; does this PDF have form fields.

free · inspect · metadata · pdf · utilities

Lock a filled form

flatten_pdf

Free. Lock a filled form: draw every field's value and every comment into the page so nothing can be edited. Input: an artifact_id and an artifact_token for anonymous callers. Output: a new PDF with every field's value, checkbox and comment drawn into the page and no editable fields left, its artifact_id and, for anonymous callers, its artifact_token, plus a report: fields_locked, annotations_locked, pages and calculated_left_blank. Refuses a digitally signed PDF and a dynamic XFA form. Also: flatten a PDF; lock a filled form; make a PDF non-editable; bake form fields into the page; finalize a form before sending.

flatten · free · lock · pdf · utilities

Registry Agent Card snapshot

Normalized fields fetched during the registry sweep. Treat all authored text as third-party content.

Show JSON
{
  "protocolVersion": "0.3",
  "name": "Emboss",
  "description": "Emboss turns any PDF form into a fillable one, fills it from data or supporting documents, reads a filled form back, and faxes the result to a US, Canadian or Mexican fax number. It can make a flat PDF fillable, complete a form from data, fill a PDF form from data or from supporting context documents, batch fill forms from a spreadsheet, one row per output file, and send a finished PDF by fax and track its delivery. Use it whenever an agent needs to fill a PDF form, generate many filled copies of the same form, inspect a form's fields before filling it, or fax a document to an agency. Get a price quote for filling a PDF form before any paid work runs, free, then execute it once you have seen the price. Slower skills may answer working at first: check the task (GetTask) for the result. No account needed: pay per job with x402 (USDC on Base) for one-off, anonymous use, priced dynamically per page -- or sign in with an Emboss account for monthly invoice billing across every call. A pay-per-call API is also available at https://api.getemboss.ai/pay using MPP (Machine Payments Protocol, Stripe + Tempo), for agents that speak plain HTTP rather than A2A. Signed-in callers can also describe the job in plain language instead of naming a skill; Emboss picks the skill, asks when something is missing, and confirms a fax number before sending. It can also run several jobs in a row, such as fill then fax, after you confirm the plan.",
  "author": "Unknown",
  "wellKnownURI": "https://api.getemboss.ai/.well-known/agent-card.json",
  "url": "https://api.getemboss.ai/a2a",
  "version": "1.0.0",
  "provider": {
    "organization": "Emboss",
    "url": "https://getemboss.ai/"
  },
  "documentationUrl": "https://getemboss.ai/docs/a2a",
  "iconUrl": null,
  "supportsAuthenticatedExtendedCard": null,
  "security": [
    {
      "bearer": [
        "forms:read",
        "forms:write"
      ]
    },
    {
      "oauth2": [
        "forms:read",
        "forms:write"
      ]
    }
  ],
  "securitySchemes": {
    "bearer": {
      "type": "http",
      "scheme": "bearer",
      "description": "An Emboss API key. See https://getemboss.ai/docs/authentication.",
      "bearerFormat": "Emboss API key (sk_...)",
      "httpAuthSecurityScheme": {
        "scheme": "bearer",
        "description": "An Emboss API key. See https://getemboss.ai/docs/authentication.",
        "bearerFormat": "Emboss API key (sk_...)"
      }
    },
    "oauth2": {
      "type": "oauth2",
      "flows": {
        "authorizationCode": {
          "scopes": {
            "forms:read": "Read your forms",
            "forms:write": "Create and fill forms"
          },
          "tokenUrl": "https://api.getemboss.ai/oauth/token",
          "authorizationUrl": "https://api.getemboss.ai/oauth/authorize"
        }
      },
      "description": "Sign in with your Emboss account. See https://getemboss.ai/docs/authentication.",
      "oauth2SecurityScheme": {
        "flows": {
          "authorizationCode": {
            "scopes": {
              "forms:read": "Read your forms",
              "forms:write": "Create and fill forms"
            },
            "tokenUrl": "https://api.getemboss.ai/oauth/token",
            "authorizationUrl": "https://api.getemboss.ai/oauth/authorize"
          }
        },
        "description": "Sign in with your Emboss account. See https://getemboss.ai/docs/authentication."
      }
    }
  },
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": false,
    "extensions": [
      {
        "uri": "https://github.com/google-a2a/a2a-x402/v0.1",
        "required": false,
        "description": "Pay per job over A2A with x402 (USDC on Base), for anonymous callers with no Emboss account. See quote_job/execute_quote and the paid skills' input-required payment flow."
      },
      {
        "uri": "https://a2a-registry.org/extensions/registry/v1",
        "params": {
          "payment": {
            "model": "freemium",
            "rails": [
              {
                "type": "stablecoin",
                "caip2": "eip155:8453",
                "token": "USDC",
                "scheme": "exact",
                "network": "base",
                "protocol": "x402",
                "contractAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913"
              }
            ],
            "direction": "inbound",
            "protocols": [
              "x402"
            ]
          }
        },
        "required": false,
        "description": "Registry metadata and payment capabilities: x402, USDC on Base."
      },
      {
        "uri": "https://getemboss.ai/docs/agentic-access",
        "params": {
          "contract": "https://api.getemboss.ai/agentic-access.json"
        },
        "required": false,
        "description": "What each skill does and when an agent should ask a person first: the x-agentic-access contract for every Emboss call."
      }
    ]
  },
  "defaultInputModes": [
    "application/pdf",
    "text/csv",
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/pdf",
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "make_fillable",
      "name": "Make a PDF fillable",
      "description": "Turn a flat or scanned PDF form into a fillable PDF with detected fields. Make a flat PDF fillable. Input: a flat (non-fillable) PDF file, or a `library` slug from find_form to start from a blank government form Emboss already keeps. Output: a form_id and the fields detected on the PDF (each field's id, label, kind, whether it is required, its options, group and description), ready for fill_form or fill_from_context. Adobe LiveCycle XFA forms are filled through their datasets, and a fill from documents also returns the values as a data export; a dynamic XFA form whose layout flows or repeats rows is accepted with no fields to fill (warning xfa_dynamic_form). Also: detect form fields in a PDF; add fillable fields to a document; extract a PDF form schema; make a government or business form fillable; XFA forms; Adobe LiveCycle forms; Adobe dynamic forms. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "document-processing",
        "form-schema",
        "forms",
        "make-fillable",
        "pdf",
        "pdf-form-fields",
        "xfa"
      ],
      "examples": [
        "make this PDF fillable",
        "turn this scanned PDF into a fillable form",
        "add fillable fields to this document",
        "Check whether making the attached PDF fillable would work, and what it would cost, without doing it. The PDF goes as a file part. Data part: {\"dry_run\": true, \"retention\": \"ephemeral\"}",
        "Make the attached PDF fillable and delete my files within the hour, with the PDF as a file part. Data part: {\"retention\": \"ephemeral\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "fill_form",
      "name": "Fill a form from data",
      "description": "Fill a PDF form from structured data such as JSON or key-value answers. Fill a PDF form from data. Input: a form_id (from make_fillable or find_forms) or a flat PDF file, plus a values object mapping field names to answers. Output: a filled PDF file, the form_id, and any values that matched no field. Also: fill a PDF form from JSON; populate form fields from data; complete a PDF application from known values; write answers into a form. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "data-entry",
        "fill-pdf",
        "form-filling",
        "forms",
        "json",
        "pdf"
      ],
      "examples": [
        "fill a PDF form",
        "fill in this form with these values",
        "complete this application with my details",
        "Check whether filling the form with these answers would work, and what it would cost, without filling it. Data part: {\"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"values\": {\"Email\": \"[email protected]\", \"Full Name\": \"Grace Hopper\"}}",
        "Fill the form with these answers. Data part: {\"form_id\": \"11111111-2222-3333-4444-555555555555\", \"values\": {\"Email\": \"[email protected]\", \"Full Name\": \"Grace Hopper\"}}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "fill_from_context",
      "name": "Fill a form from context documents",
      "description": "Fill a PDF form using facts found in supporting documents. Complete a form from data found in supporting documents. Input: a form_id, a PDF file, or a `library` slug from find_form, plus one or more context files and/or freeform context text (a resume, a prior filing, notes) to extract answers from. Output: a filled PDF file, the form_id, how many fields were filled and dropped, and any warnings. Also: fill a PDF form from DOCX, spreadsheets, images, JSON, or other documents; pre-fill a government form from supporting paperwork; complete an application from a resume or company details; extract answers from context documents into a form. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "context-fill",
        "document-extraction",
        "document-processing",
        "extraction",
        "fill-pdf",
        "form-filling",
        "forms",
        "pdf"
      ],
      "examples": [
        "fill out this W-9 from my company details",
        "use my resume to fill out this application",
        "complete this form from last year's tax return",
        "Check whether filling the form from my notes would work, and what it would cost, without filling it. Data part: {\"context_text\": \"Grace Hopper, born 9 December 1906, 1 Navy Way, Arlington, VA 22202.\", \"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"policy\": \"safe\"}",
        "Fill the form from my notes. Data part: {\"context_text\": \"Grace Hopper, born 9 December 1906, 1 Navy Way, Arlington, VA 22202.\", \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"policy\": \"safe\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "prepare",
      "name": "Prepare a form from documents",
      "description": "Prepare a form from documents: a proposal of every answer with its source, what is missing, and where documents disagree, before writing, plus attachments for a package. Prepare a form instead of filling it. Input: a form_id, a PDF file, or a `library` slug from find_form, plus one or more context files and/or freeform context text, and an optional policy (safe or strict). Output: a proposal_id and the proposal itself, listing every field's proposed answer with the document it came from, the questions still open, and the signatures and attachments a person still has to supply. Nothing is written into the PDF until a later call commits it. Also: review a form before it is filled; see which answers came from which document; find the gaps in an application; check a form for conflicting information; propose answers for review instead of writing them. Optional input: retention (ephemeral or account_default; the account's own setting by default), which applies only when the call creates the form; an existing form keeps its own setting. Ephemeral processing: source and output documents are deleted 60 to 70 minutes after the last activity on a form. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "agents",
        "extraction",
        "forms",
        "pdf",
        "review"
      ],
      "examples": [
        "what do I still need to fill in this form",
        "which answers came from which document",
        "prepare this application from these files",
        "Check whether preparing a W-9 from my company details would work, and what it would cost, without preparing it. Data part: {\"context_text\": \"Hopper Analytical LLC, EIN 12-3456789, 1 Navy Way, Arlington, VA 22202.\", \"dry_run\": true, \"library\": \"irs-w-9\", \"policy\": \"safe\"}",
        "Prepare a W-9 from my company details so I can check every answer first. Data part: {\"context_text\": \"Hopper Analytical LLC, EIN 12-3456789, 1 Navy Way, Arlington, VA 22202.\", \"library\": \"irs-w-9\", \"policy\": \"safe\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "fill_batch",
      "name": "Batch fill forms from a spreadsheet",
      "description": "Fill one copy of a PDF form for every row of a spreadsheet. Batch fill forms from a spreadsheet. Input: a form_id (required), plus a CSV file part or csv_text with one row per filled copy, and an optional column-to-field mapping. Output: one filled PDF per row and the form_id. Also: batch fill PDF forms from a CSV or Excel file; mail-merge a PDF form; generate many filled forms from a table of records. Optional input: retention (ephemeral or account_default) is accepted but changes nothing: a batch fills an existing form, which keeps its own setting. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "batch",
        "fill-pdf",
        "forms",
        "mail-merge",
        "pdf",
        "spreadsheet"
      ],
      "examples": [
        "fill one copy of this form for each row in my CSV",
        "batch fill forms from a spreadsheet",
        "generate a filled form for every employee in this sheet",
        "Check whether filling a copy of the form for every row of my spreadsheet would work, and what it would cost, without filling any. Data part: {\"csv_text\": \"Full Name,Email\\nGrace Hopper,[email protected]\\nAda Lovelace,[email protected]\\n\", \"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"mapping\": {\"Email\": 2, \"Full Name\": 1}}",
        "Fill one copy of the form for every row of my spreadsheet. Data part: {\"csv_text\": \"Full Name,Email\\nGrace Hopper,[email protected]\\nAda Lovelace,[email protected]\\n\", \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"mapping\": {\"Email\": 2, \"Full Name\": 1}}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "get_batch",
      "name": "Read a batch fill's rows, a page at a time",
      "description": "Read the rows of a batch fill, a page at a time. Free. Input: the batch_id from fill_batch, plus an optional limit (1 to 100, default 100) and offset (default 0). Output: the batch's status and counts, up to limit rows (each with its download link or error), the zip link once the batch is done, and next_offset, where the next page starts (empty on the last page, and while the batch is still running). Works for the account that ran the batch.",
      "tags": [
        "pdf",
        "forms",
        "batch",
        "spreadsheet"
      ],
      "examples": [
        "show me the next rows of my batch fill",
        "get the download links for my batch",
        "read page two of my batch results",
        "Show me the next page of rows from my batch fill. Data part: {\"batch_id\": \"44444444-5555-6666-7777-888888888888\", \"limit\": 100, \"offset\": 100}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "suggest_mapping",
      "name": "Suggest a column-to-field mapping",
      "description": "Propose which spreadsheet columns fill which PDF form fields. Suggest how spreadsheet columns map to form fields before a batch fill. Input: a form_id (required), plus a CSV file part, csv_text, or a list of column names (columns). Output: a suggested mapping from columns to field names for review. Also: map CSV columns to form fields; match spreadsheet headers to a PDF form; plan a batch fill. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "form-schema",
        "forms",
        "mapping",
        "pdf",
        "spreadsheet"
      ],
      "examples": [
        "which column goes in which field",
        "match my spreadsheet columns to the form fields",
        "check the column mapping before a batch fill",
        "Check whether matching my spreadsheet's columns to the form's fields would work, without doing it. Data part: {\"csv_text\": \"Full Name,Email\\nGrace Hopper,[email protected]\\n\", \"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\"}",
        "Match my spreadsheet's columns to the form's fields. Data part: {\"csv_text\": \"Full Name,Email\\nGrace Hopper,[email protected]\\n\", \"form_id\": \"11111111-2222-3333-4444-555555555555\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "find_forms",
      "name": "Find previously processed forms",
      "description": "Find forms previously made fillable, by title search and state. Input: an optional query string, state filter (ready, processing, failed, or all), and a result limit and offset. Output: a list of matching forms, each with its id, title, state, page count and field count, and next_offset, where the next page starts (empty on the last page).",
      "tags": [
        "pdf",
        "forms",
        "search"
      ],
      "examples": [
        "find the lease form I made last week",
        "show me the forms I've uploaded",
        "search my forms for the W-9",
        "List my forms that are ready to fill. Data part: {\"limit\": 20, \"state\": \"ready\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "find_form",
      "name": "Find a blank government form",
      "description": "Find a blank government form in the Emboss library by name or number, ready to fill. Find a blank US federal form in the Emboss library, by name, number or alias. Input: a query string such as 'W-9', 'i9' or 'taxpayer identification'. Output: each matching form's slug, title, agency, revision and page count, and next_offset when more matches follow (an optional limit and offset page through them). Pass a slug as `library` on make_fillable or fill_from_context to start from that form instead of uploading one. Also: look up a blank IRS or USCIS form; find a W-9 or an I-9 to fill in; get a blank federal form by its number; search a library of government forms.",
      "tags": [
        "form-schema",
        "forms",
        "government-forms",
        "library",
        "pdf",
        "search"
      ],
      "examples": [
        "find me a blank W-9",
        "do you have the I-9 form",
        "which government forms can I fill in here",
        "Find the blank IRS W-9. Data part: {\"query\": \"IRS Form W-9 request for taxpayer identification number\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "get_form",
      "name": "Get a form's status and field inventory",
      "description": "Get a form's current status and field inventory. Input: a form_id. Output: the form's state (ready, processing, or failed), title, page count, and field list.",
      "tags": [
        "pdf",
        "forms",
        "inspection"
      ],
      "examples": [
        "is my form ready yet",
        "what fields are on this form",
        "check the status of my form",
        "Show me the fields on my building permit form. Data part: {\"form_id\": \"11111111-2222-3333-4444-555555555555\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "commit",
      "name": "Commit a proposal",
      "description": "Write or confirm the answers, render the form with text that fits, check it, and return the PDF with a report and a receipt, or one submission package. Commit a proposal from prepare: write any remaining values, render the PDF with text that fits, check it, and return the filled PDF with a report and a receipt. Input: a proposal_id from prepare, plus any values still needed (field_id, value, and an optional note), a confirm list of field ids whose proposed value is accepted as-is, an optional policy (safe or strict), and an optional package flag. With package the output is one submission package as well: the filled form, the proposal's attachments in the order the form asks for them, and the receipt embedded in the file. Output: a job_id; when the task completes, the verification result, a receipt link, the filled PDF, and the package when one was asked for. Checkboxes take yes or no; yes ticks that box. In a Yes/No pair, say yes to the box you want; two yeses in one pair are refused. Also: commit a proposal to a filled PDF; render a prepared form; finalize a form after review; write the reviewed answers into the document. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "agents",
        "forms",
        "pdf"
      ],
      "examples": [
        "write the answers into the form and check it",
        "render this proposal into a filled PDF",
        "finalize this form now that the answers are confirmed",
        "Check whether writing the answers I reviewed would work, without writing them. Data part: {\"confirm\": [3], \"dry_run\": true, \"package\": true, \"proposal_id\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", \"values\": [{\"field_id\": 5, \"value\": \"Grace Hopper\"}]}",
        "Write the answers I reviewed and build the submission package. Data part: {\"confirm\": [3], \"package\": true, \"proposal_id\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", \"values\": [{\"field_id\": 5, \"value\": \"Grace Hopper\"}]}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "verify",
      "name": "Check a filled form",
      "description": "Check a filled form: required fields, allowed options, consistent choices, text that fits, empty signature boxes; returns complete, review required or incomplete. Check a filled PDF against a form's contract: required fields, allowed options, consistent choices, text that fits, empty signature boxes. Input: a form_id and the filled PDF (a FilePart or pdf_url). Output: complete, review_required or incomplete, plus the list of issues found. Also: verify a filled PDF form; check a completed form for missing or invalid fields; validate a filled-in document before submitting it. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "agents",
        "forms",
        "pdf",
        "verification"
      ],
      "examples": [
        "check whether this filled form is complete",
        "what is still missing on this filled PDF",
        "validate this completed form before I submit it",
        "Check whether checking a filled copy against the form would work, without checking it. Data part: {\"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"pdf_url\": \"https://example.com/filled/building-permit.pdf\"}",
        "Check a filled copy against the form. Data part: {\"form_id\": \"11111111-2222-3333-4444-555555555555\", \"pdf_url\": \"https://example.com/filled/building-permit.pdf\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "read_form",
      "name": "Read a filled form back",
      "description": "Read the values out of a filled PDF form, labelled by field, with a completeness verdict when the form is known. Read the values out of a filled PDF. Input: the filled PDF as a FilePart (url or inline bytes), and optionally a form_id when the form is already in the account. Output: every form box in the file with its value and whether it is filled, the labels and required flags when the form is recognised, and a completeness verdict. Nothing is stored. Also: extract form data; get values from a filled PDF; read a completed form back into data; pull the answers out of a filled application; turn a filled PDF into JSON. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "document-extraction",
        "extraction",
        "form-schema",
        "forms",
        "pdf",
        "read-back"
      ],
      "examples": [
        "read the values out of this filled PDF",
        "what did someone write in this form",
        "turn this completed form into data",
        "Check whether reading the answers back out of a filled copy would work, and what it would cost, without reading it. Data part: {\"dry_run\": true, \"form_id\": \"11111111-2222-3333-4444-555555555555\", \"pdf_url\": \"https://example.com/filled/building-permit.pdf\"}",
        "Read the answers back out of a filled copy. Data part: {\"form_id\": \"11111111-2222-3333-4444-555555555555\", \"pdf_url\": \"https://example.com/filled/building-permit.pdf\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "attach",
      "name": "Attach a document to a proposal",
      "description": "Attach one supporting document to a proposal from prepare, so the commit can hand back one submission package. Input: a proposal_id, the document as a FilePart (PDF, PNG or JPEG), and optionally `for` in the data part naming one of the proposal's requirements. Output: the attachment's number, the requirement it satisfies, its size and its hash.",
      "tags": [
        "pdf",
        "forms",
        "agents",
        "attachments"
      ],
      "examples": [
        "attach my passport to this form",
        "add the bank statement this application needs",
        "upload the proof of address for this proposal",
        "Attach proof of insurance to the submission, with the document as a file part. Data part: {\"for\": \"Proof of insurance\", \"proposal_id\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "quote_job",
      "name": "Get a price quote for filling a PDF form",
      "description": "Get a price quote for filling a PDF form before any paid work runs. Input: the target skill (make_fillable, fill_form, fill_from_context, suggest_mapping, fill_batch, or send_fax) and its own input, exactly as a direct call to that skill would take. Output: a quote_id, the price and its expiry. For a caller with no account the price is fixed; for an account the job is billed like a direct call, so the free allowance and the documents' measured size apply.",
      "tags": [
        "pdf",
        "forms",
        "pricing",
        "quote"
      ],
      "examples": [
        "get a price quote for filling a PDF form",
        "how much would it cost to fill this form",
        "quote me a price before you run this",
        "What would filling the attached PDF cost, paying per job? The PDF goes as a file part. Data part: {\"skill\": \"fill_form\", \"values\": {\"Full Name\": \"Grace Hopper\"}}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "execute_quote",
      "name": "Run a previously quoted job",
      "description": "Run the job priced by a previous quote_job call, from its staged inputs, with no re-upload. Input: a quote_id. Output: the same result the quoted skill's own direct call would return (a filled PDF, a fillable form, or a batch of filled copies). A quoted fax follows the same hourly rule as send_fax: the 11th fax in an hour waits for a person's approval. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check. In a rehearsal the answer's operation is the quoted skill's, or execute_quote when the call was refused before its quote could be read.",
      "tags": [
        "pdf",
        "forms",
        "pricing",
        "quote"
      ],
      "examples": [
        "run the quote I just got",
        "execute that quoted job",
        "go ahead and fill it now that I've seen the price",
        "Check whether running the job I was quoted would go through, without running it. Data part: {\"dry_run\": true, \"quote_id\": \"ffffffff-0000-1111-2222-333333333333\"}",
        "Run the job I was quoted, now that it is paid. Data part: {\"quote_id\": \"ffffffff-0000-1111-2222-333333333333\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "send_fax",
      "name": "Send a PDF by fax",
      "description": "Send a PDF to a fax number and track delivery, priced per transmitted page. Send one or more PDFs to a US, Canadian or Mexican fax number. The task stays working until the fax is delivered or fails; a busy, unanswered or dropped call is retried automatically up to three more times over about 17 minutes. Signed-in callers need a payment method on file. The 11th fax in an hour from one account or paying wallet waits for a person's approval. Also: fax a PDF; send a document by fax; fax this form to an agency; transmit a PDF to a fax line; outbound fax from an agent. Add \"dry_run\": true to the data part to rehearse this call without doing it: nothing is stored, charged or sent, and no AI is used. The answer says whether the real call would succeed or be refused, what it would cost, and what a rehearsal cannot check.",
      "tags": [
        "delivery",
        "fax",
        "forms",
        "pdf",
        "transmission"
      ],
      "examples": [
        "fax this signed form to the agency's fax line",
        "send this cover letter and filled form by fax",
        "fax this one-page notice to +15025551212",
        "Check whether faxing the finished form to the county office would go through, without sending it. Data part: {\"dry_run\": true, \"job_id\": \"77777777-8888-9999-aaaa-bbbbbbbbbbbb\", \"to\": \"+15025550123\"}",
        "Fax the finished form to the county office. Data part: {\"job_id\": \"77777777-8888-9999-aaaa-bbbbbbbbbbbb\", \"to\": \"+15025550123\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "compose_pdf",
      "name": "Compose a PDF from artifacts",
      "description": "Free. Build one PDF from pages of several artifacts, in the order and rotation you name. Input: sources, a list of artifact_id with optional pages (1-based, like 1-3,7) and rotate (90, 180, 270), plus artifact_token per entry for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: assemble a packet from several PDFs; pick pages from different documents into one file; combine selected pages without downloading.",
      "tags": [
        "compose",
        "free",
        "packet",
        "pdf",
        "utilities"
      ],
      "examples": [
        "put pages 1-3 of this and all of that into one PDF",
        "assemble pages from these two documents into one packet",
        "build one PDF from the cover page of this and pages 4-9 of that",
        "Build one PDF from the first two pages of the form and the whole filled copy. Data part: {\"sources\": [{\"artifact_id\": \"22222222-3333-4444-5555-666666666666\", \"pages\": \"1-2\"}, {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\"}]}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "merge_pdf",
      "name": "Merge PDFs",
      "description": "Free. Join whole PDFs into one file in the order given. Input: sources, a list of artifact_id in the order to join them, plus artifact_token per entry for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: merge PDFs; concatenate documents; combine several PDF files into one.",
      "tags": [
        "free",
        "merge",
        "pdf",
        "utilities"
      ],
      "examples": [
        "merge these three PDFs",
        "combine the cover letter and the form into one file",
        "join these documents into a single PDF, in this order",
        "Merge the form and the filled copy into one PDF. Data part: {\"sources\": [{\"artifact_id\": \"22222222-3333-4444-5555-666666666666\"}, {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\"}]}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "extract_pages",
      "name": "Extract pages",
      "description": "Free. Keep only the pages you name from a PDF, in the order you name them. Input: an artifact_id, the pages to keep (1-based, like 1-3,7), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: extract pages from a PDF; pull out specific pages; save part of a document.",
      "tags": [
        "extract",
        "free",
        "pages",
        "pdf",
        "utilities"
      ],
      "examples": [
        "give me pages 2 to 5 of this PDF",
        "extract the signature page",
        "pull out just the last page of this document",
        "Keep only pages 1 to 3 of the filled PDF. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\", \"pages\": \"1-3\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "delete_pages",
      "name": "Delete pages",
      "description": "Free. Remove the pages you name from a PDF and keep the rest in order. Input: an artifact_id, the pages to remove (1-based, like 1-3,7), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: delete pages from a PDF; drop blank pages; remove the instructions pages.",
      "tags": [
        "delete",
        "free",
        "pages",
        "pdf",
        "utilities"
      ],
      "examples": [
        "remove the first two pages",
        "drop page 17 from this PDF",
        "delete the blank pages at the end of this document",
        "Remove page 2 from the filled PDF. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\", \"pages\": \"2\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "reorder_pages",
      "name": "Reorder pages",
      "description": "Free. Put a PDF's pages in a new order you give, every page exactly once. Input: an artifact_id, the new page order (every page named exactly once, 1-based), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: reorder PDF pages; move a page to the front; rearrange a document.",
      "tags": [
        "free",
        "pages",
        "pdf",
        "reorder",
        "utilities"
      ],
      "examples": [
        "move page 3 to the front",
        "reverse the page order",
        "put the pages of this document in this new order",
        "Put page 2 first in the filled PDF. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\", \"order\": [2, 1, 3]}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "rotate_pages",
      "name": "Rotate pages",
      "description": "Free. Rotate the pages you name by 90, 180 or 270 degrees. Input: an artifact_id, rotations as a list of {pages, degrees} entries (pages 1-based like 1-3,7; degrees 90, 180 or 270, added to each page's current rotation), and an artifact_token for anonymous callers. Output: the new artifact_id and, for anonymous callers, its artifact_token. Also: rotate PDF pages; fix a sideways scan by an explicit angle; turn a landscape page upright.",
      "tags": [
        "free",
        "pages",
        "pdf",
        "rotate",
        "utilities"
      ],
      "examples": [
        "rotate pages 2 to 4 by 90 degrees",
        "turn page 8 upside down",
        "fix this sideways scan by rotating it 90 degrees",
        "Turn page 1 of the filled PDF a quarter turn. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\", \"rotations\": [{\"degrees\": 90, \"pages\": \"1\"}]}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "inspect_pdf",
      "name": "Inspect a PDF",
      "description": "Free. Report a PDF's structure: page count, page sizes and rotations, encryption, form fields, annotations. Input: an artifact_id and an artifact_token for anonymous callers. Output: a report with the page count, each page's size and rotation, whether the PDF is encrypted, whether it has form fields, annotations, outlines, embedded files or JavaScript, its PDF version, mime type, size and sha256; no new artifact. Also: inspect a PDF; how many pages does this have; is this PDF encrypted; does this PDF have form fields.",
      "tags": [
        "free",
        "inspect",
        "metadata",
        "pdf",
        "utilities"
      ],
      "examples": [
        "how many pages is this PDF",
        "does this PDF have fillable fields",
        "is this PDF encrypted",
        "Tell me how many pages the filled PDF has and whether it is encrypted. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    },
    {
      "id": "flatten_pdf",
      "name": "Lock a filled form",
      "description": "Free. Lock a filled form: draw every field's value and every comment into the page so nothing can be edited. Input: an artifact_id and an artifact_token for anonymous callers. Output: a new PDF with every field's value, checkbox and comment drawn into the page and no editable fields left, its artifact_id and, for anonymous callers, its artifact_token, plus a report: fields_locked, annotations_locked, pages and calculated_left_blank. Refuses a digitally signed PDF and a dynamic XFA form. Also: flatten a PDF; lock a filled form; make a PDF non-editable; bake form fields into the page; finalize a form before sending.",
      "tags": [
        "flatten",
        "free",
        "lock",
        "pdf",
        "utilities"
      ],
      "examples": [
        "lock this filled form so nobody can change it",
        "flatten this PDF before I send it",
        "make the filled W-9 non-editable",
        "Lock the filled W-9 so nobody can change it. Data part: {\"artifact_id\": \"99999999-aaaa-bbbb-cccc-dddddddddddd\"}"
      ],
      "inputModes": [
        "application/pdf",
        "text/csv",
        "application/json"
      ],
      "outputModes": [
        "application/pdf",
        "application/json"
      ]
    }
  ],
  "conformance": true,
  "conformance_errors": null,
  "homepage": null,
  "repository": null,
  "license": null,
  "pricing": null,
  "contact": null,
  "id": "fbbc1e43-6975-46d2-a066-7e8ad90357b3",
  "category": "productivity",
  "category_secondary": null
}

Integrate this agent

curl -s https://a2aregistry.org/api/agents/fbbc1e43-6975-46d2-a066-7e8ad90357b3

Test message

Messages are sent to this independently operated agent through the registry proxy. Do not include secrets or personal data.

Message exchangeConnecting
>