Start free. Pay when you need more documents.

free is free. The paid plans buy more documents, not different features.

The hosted API checks invoice data or creates an e-invoice file from your software. The free plan includes 100 documents a month, with no card. What counts as a document.

Choose a monthly allowance

Free

$0

No card, no expiry

100 documents a month

Build the integration and run real development traffic.

Enough to wire the integration up and run a real month of a side project.

Create a free key

Starter

$49/mo

or $490/yr billed annually, two months free

2,500 documents a month

For small production integrations and early customer rollouts.

2,500 docs ≈ monthly invoicing for ~80 SMB customers.

Upgrade to Starter

Scale

$199/mo

or $1,990/yr billed annually, two months free

25,000 documents a month

For established billing products and higher-volume workflows.

25,000 docs ≈ a mid-size billing platform issuing ~800 invoices a day.

Upgrade to Scale

The hosted API checks invoice data and generates EN 16931, XRechnung and Peppol BIS 3 XML. It accepts JSON or UBL/CII XML and reports the rule, field and suggested correction. It does not write a PDF or send invoices. Country-specific Peppol rules may require additional checks. See all limits.

New to Attestwire? Start free.

Your key appears on this page the moment you submit. No inbox visit, no confirmation link.

Or create it from your terminal: the same call, one curl
POST /v1/keys: the key is in the response, once
curl -sX POST https://api.attestwire.com/v1/keys \
  -H content-type:application/json \
  -d '{"email":"you@example.com"}'

Already have a key? Upgrade.

Same key, same integration. Just a bigger allowance.

Already paying? Change plan in the billing portal.

Or from your terminal
returns {"url": "https://attestwire.com/pay?_ptxn=txn_…"} — open that URL
curl -X POST \
  https://api.attestwire.com/v1/billing/checkout \
  -H 'content-type: application/json' \
  -d '{"key":"YOUR_API_KEY","plan":"starter"}'

The link is single-use. Full flow, with every error code: api.attestwire.com/docs#upgrade.

Only fixing one rejected invoice?

The Invoice Fix Report costs $99 once. You get a signed validation record, guidance for each finding, 30 days of Starter API access and a reply from a person within one business day. Start with the free check; it may be all you need.

See what the Fix Report includes

What counts

One successful POST /v1/validate, POST /v1/parse or POST /v1/generate is one document, whatever its size: we count calls, not findings. A refusal does not consume one. Quotas are per key and reset at 00:00 UTC on the 1st, with no rollover. Keys, usage and health calls are free, and the library is not metered at all.

Questions before you choose

Who answers when something breaks?

Ben, in California, at hello@attestwire.com. Two business days is the target on every plan. A paid plan buys a larger allowance; support is the same on every plan, and there is no support SLA on any plan.

Is Free a trial?

No. No expiry date, no card on file, and the allowance resets each month.

What happens at the limit?

The API returns 429 with quota_exceeded, and a refused call does not consume a document. We do not bill overage.

Can I cancel?

Yes, in the billing portal. Cancellation takes effect at the end of the period you have already paid for, then your key returns to Free, and we would rather refund a month than argue about one. See the terms and refund policy.

Are invoices stored?

No. They are processed in memory and returned to you. See security. An Article 28 DPA is available.

Does Attestwire transmit invoices?

No. It checks and writes invoice documents and is not connected to any delivery network: it is not a Peppol access point, a French PDP (certified sending platform) or a KSeF (Polish national system) connection. A valid: true result is a technical check, and a receiver may still refuse the invoice. Read the terms or see the boundary.

Need more than 25,000 documents a month?

Email hello@attestwire.com for OEM or volume pricing. The price depends on the integration.

The operational ceilings, if you are sizing retry logic

Four limits apply to a key in use and one applies before you have a key. Each returns its own error code, so none of them is reported as quota_exceeded. /v1/validate and /v1/generate are paced at 10 requests per second per key, with a bucket that lets a burst of 20 through.

Going over is 429 with rate_limited and a Retry-After header, and nothing is charged: a paced refusal leaves your monthly allowance untouched and the same request works a second later. The two codes are kept separate because the waits differ: a rate limit clears in about a second, a quota clears next month.

Any request body over 1 MB is refused with 413 and payload_too_large, and on this API that is the ceiling you meet first, for a JSON invoice object and for a file alike. The reader has a second one underneath it, 8,000,000 characters, reported as xml_too_large; you will only reach that one running the library yourself, where there is no body ceiling above it.

A thousand-line invoice is nowhere near either. A base64-embedded attachment is what gets you there: base64 spends four characters per three bytes, so a PDF of about 750 kB fills the request body on its own. Send the invoice without the attachment.

A findings array is capped at 500 entries per severity; past that the response gains a findings_truncated object, and valid still reflects the whole document. No realistic invoice reaches that. Key creation is limited to five requests per IP address per UTC day, answered with 429 and too_many_requests; it is the only limit that applies before you hold a key.

There is no separate sandbox key; use a free key for testing. Rotation, body-size handling and every error code are in the API reference.

Reference for developers: library or API, what the hosted API adds, and your key

Should you use the library or the API?

Use the library when…Use the API when…
Your application runs JavaScript or TypeScriptYour application uses another language
You want processing to stay entirely localYou want a managed endpoint
You prefer to control when the rule set changesYou want the deployed rule set without package upgrades
You do not need centralised usageYou need one shared service across several systems

Both use the same engine. The MIT library is free at any volume and has zero runtime dependencies. Pinning a library version also pins its rules, which keeps CI stable but makes upgrades your responsibility. The hosted API uses the version we have deployed. Read about rule updates.

Why the hosted API

The hosted API adds three things:

After you have a key

Then send your first invoice: how authentication works, and the full API reference.

If your key is exposed or lost

While you still hold the key you can replace it yourself with POST /v1/keys/rotate. You authenticate the call with the key you are replacing, your plan and usage carry over, and the old key stops working at once. That key is the entire credential, so anyone else who has a copy can rotate it away from you on the same terms.

If you think it has been exposed, rotate first and investigate afterwards. If it is lost, what we can do depends on what we can prove: the three cases are set out here.

Prices are in US dollars, billed in advance through Paddle, our merchant of record, monthly or annually as you chose. Paddle adds any sales tax or VAT due where you are. On an annual plan the allowance is still the monthly one, reset on the 1st as usual: you pay for the year, and the documents are counted month by month.

Thirty days' notice before any price increase. See the terms, refund policy, privacy and DPA.