Parse documents from an n8n workflow

ParseForMe connects to n8n with the built-in HTTP Request node: the binary property your workflow already holds is posted as multipart form data, and a Webhook node receives the extracted fields when parsing finishes. The API key lives in an n8n credential, not in a node parameter.

Drop a document to try it — freeNo signup to start. Get 30 free tokens when you sign in.

Does ParseForMe have an n8n node?

Not a dedicated one. The HTTP Request node covers it: point it at the documents endpoint, set the body to multipart form data, and send the binary property as file. Self-hosted and cloud n8n work the same way, and no community node has to be installed.

Keeping the key out of the workflow

Store the key as a Header Auth credential named Authorization and select it on the node. It stays in n8n’s credential store rather than in an exported workflow, so sharing a workflow does not share the key. Revoking it in ParseForMe takes effect immediately.

Verifying the deliveries you receive

Register the Webhook node’s production URL with an auth header n8n also checks, then confirm the HMAC signature in a Code node. Each delivery carries a timestamp and one or two hex signatures, and every one comes from a single fixed IP address you can allowlist at your proxy.

What this integration is not

There is no ParseForMe node, so there is no node-level field picker: you map the returned JSON yourself using the field list the API publishes. Parsing spends tokens per page, and a workflow with a loop in it can spend them quickly.

How to set it up

  1. Create an API key

    Nothing else works without one. Keys are created in the ParseForMe dashboard — under Settings → API keys, or from the inline form on any in-app integration guide. The key is shown once, starts with pfm_live_ and is 52 characters long; store it in your automation platform’s credential store, never in a step’s visible fields. Owners and admins can create keys, a workspace can hold up to 10 active keys, and revoking one takes effect immediately. Send it as a bearer token and check it with /v1/me before you build anything else.

    curl -s https://api.parseforme.com/v1/me \
      -H "Authorization: Bearer pfm_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    
    # {"workspaceId":"…","workspaceName":"Acme","keyName":"Zapier","balance":420}
  2. Store the key as a Header Auth credential

    Create an n8n credential of type Header Auth with name Authorization and value "Bearer pfm_live_…", then point the HTTP Request node at it. The key stays in n8n’s credential store instead of sitting in a node parameter that anyone with workflow access can read, and every /v1 call reuses it.

    Credential  Header Auth
      Name   Authorization
      Value  Bearer pfm_live_…
    
    Test with: GET https://api.parseforme.com/v1/me
  3. Upload with an HTTP Request node

    Method POST, URL https://api.parseforme.com/v1/documents, Send Body on, Body Content Type multipart-form-data. Add a parameter with Parameter Type "n8n Binary File", name file, and Input Data Field Name set to the binary property carrying the document (usually data). Add plain-text parameters for filename and kind only if you need them.

    Method              POST
    URL                 https://api.parseforme.com/v1/documents
    Authentication      Generic → Header Auth
    Send Body           on
    Body Content Type   multipart-form-data
      Parameter Type    n8n Binary File
      Name              file
      Input Data Field  data
  4. Receive results on a Webhook node

    Add a Webhook node, set it to POST, copy the PRODUCTION URL (the test URL only listens while the editor is open), and register it with POST /v1/webhooks. Give the node Header Auth credentials and register the same header as authHeader on that POST — the form below has no authHeader field, so that one needs the curl — and n8n rejects anything that is not from ParseForMe before your workflow runs. Registering an endpoint emails the workspace owners and admins.

    curl -s -X POST https://api.parseforme.com/v1/webhooks \
      -H "Authorization: Bearer pfm_live_…" \
      -H "Content-Type: application/json" \
      -d '{
            "url": "https://n8n.example.com/webhook/parseforme",
            "events": ["document.parsed", "document.failed"],
            "includeResult": true,
            "authHeader": { "name": "X-N8N-Token", "value": "a-long-random-string" }
          }'
  5. Verify the signature in a Code node

    Set the Webhook node’s response to include the raw body, then add a Code node that recomputes the HMAC over t + "." + the raw body and compares it with the v1 value from X-ParseForMe-Signature, rejecting anything more than 300 seconds old. Deliveries come from 46.62.162.196 if you would rather allowlist at the reverse proxy.

    const crypto = require('node:crypto');
    
    // Header: X-ParseForMe-Signature: t=<unix seconds>,v1=<hex hmac-sha256>
    // Signed payload is t + "." + the RAW request body (parse JSON afterwards).
    function verifyParseForMe(rawBody, header, secret) {
      const parts = header.split(',').map((p) => p.trim());
      const t = parts.find((p) => p.startsWith('t='))?.slice(2);
      // Two v1 entries appear while a secret is rotating — either may match.
      const sent = parts.filter((p) => p.startsWith('v1=')).map((p) => p.slice(3));
      if (!t || sent.length === 0) return false;
      if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // 5-minute tolerance
    
      const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
      return sent.some(
        (sig) =>
          sig.length === expected.length &&
          crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)),
      );
    }
  6. Send a test event

    POST /v1/webhooks/{id}/test posts a synthetic document.parsed to the production URL and returns what your node answered, so you can pin the workflow’s input shape before a real document arrives.

    curl -s -X POST https://api.parseforme.com/v1/webhooks/1f8c…/test \
      -H "Authorization: Bearer pfm_live_…"
    
    # {"delivered":true,"status":200}
  7. Keep a polling backstop

    Webhooks are the fast path, not the only one. GET /v1/documents returns documents newest first by creation time, each with a stable id, so a scheduled run picks up anything a delivery missed — and two things only polling sees: an event lost before it was queued (delivery is at-most-once), and a document whose event you missed while an endpoint was disabled. since= filters that same creation time — not the parse time — so set it a little before your last successful check and keep the window wide enough to cover a slow parse: a document created before your watermark but parsed after it will not reappear. Ask for up to 100 with limit=; the response is items only, with no cursor to follow. Deduplicate on the document id.

    GET /v1/documents?status=parsed&since=2026-09-02T08:00:00Z&limit=50
    Host: api.parseforme.com
    Authorization: Bearer pfm_live_…
    
    # → { "items": [ { "id": "8f14e45f-…", "status": "parsed", "kind": "invoice" } ] }
  8. Map the fields you care about

    GET /v1/document-types returns the nine document kinds and the fields each one extracts, so your mapping step can be built against the real field names instead of a guess. Parsed values arrive under result.fields, with a matching entry in result.confidence — route anything you want a human to check on that, rather than on a total.

    curl -s https://api.parseforme.com/v1/document-types \
      -H "Authorization: Bearer pfm_live_…"

Frequently asked questions

Is there a ParseForMe node for n8n?

No — and none is needed. The built-in HTTP Request node uploads the binary, and the Webhook node receives parsed documents.

Does this work on self-hosted n8n?

Yes. Self-hosted and cloud n8n both call the same HTTPS API; a self-hosted instance only needs its webhook URL reachable from the internet to receive deliveries.

How do I send the binary from a previous node?

Set the HTTP Request body to multipart-form-data, add a parameter of type “n8n Binary File” named file, and point its input data field at the binary property (usually data).

Where should the API key live?

In an n8n Header Auth credential, so it is not part of the workflow JSON. Keys can be revoked from ParseForMe at any time and stop working immediately.

n8n is a trademark of n8n GmbH. ParseForMe is not affiliated with, endorsed by or sponsored by n8n.

Try it on your own document

Drop a document to see the structured data come back.

Drop a document to try it — freeNo signup to start. Get 30 free tokens when you sign in.