Skip to content
Gauge

ax-check.com

Invopop

invopop.com

ax-check.com

Checked 26 September 2026

B

84/100

Agents need your login

Invopop's quickstart and pricing are clear and machine-readable.

17 of 23 checklist items passed, including live quickstart docs and public pricing tables (Dev €0, Pro €500/mo). Only the homepage lacks a Markdown twin.

2 fixes to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Docs

Return Markdown when clients request text/markdown.

Homepage returned text/html for a text/markdown request; no Markdown representation served.

Recorded coding sessions

Same task, 3 models, no invopop.com account. Recorded 26 September 2026 on Pi.

3 recorded · 5m 15s

5m 15s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Invopop. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

The user is asking about "Invopop." Let me think about what Invopop is. Invopop is a Spanish company that provides electronic invoicing / e-invoicing compliance software (Facturae, Verifactu, TicketBAI, SII in Spain). They have an API — the Invopop API for issuing invoices compliant with Spanish regulations.

The user's request is: build a simple example using Invopop, explain how the pricing mechanism works, evaluate whether this product would be easy for me to manage, and report if I get stuck. Also, if the product doesn't have a developer workflow that I can execute, I should communicate that clearly and stop. Keep it lightweight — use the hosted product via SDK or API, don't use local service stacks or long-running commands.

First, let me check the working directory to see if anything relevant exists.

Thinking about what I actually know about Invopop:

  • Invopop (invopop.com) is a compliance/e-invoicing platform for Spain (Facturae, VeriFactu, TicketBAI) and other countries.
  • They have developer documentation at https://invopop.com, and I believe an API exists too. Let me check if there's a public API/SDK. As I recall, Invopop provides a REST API for businesses to submit invoices. There might be Go or Python SDKs.

Actually, I'm not 100% confident about the details. I should investigate. Can I access the internet from the sandbox? Let me test with curl. The environment might have network access. Let me check.

Plan:

  1. Check the contents of the current directory.
  2. Try to fetch Invopop's documentation/API info from the web (curl).
  3. If possible, build a simple example using the API/SDK (e.g., a small Python or Go script that hits the sandbox API endpoint with an API key placeholder).
  4. Explain the pricing mechanism (I'll need to check the website. Invopop's pricing is — I think per-invoice/subscription-based pricing, e.g., a free plan with a certain number of invoices per month included, then paid plans. Needs verification).
  5. Evaluate manageability for an agent: the API looks clean, but it requires account registration and API keys obtained from the dashboard, and possibly manual KYC — that could be a blocker (I can't sign up myself). If API keys require human registration, I can only write example code and not actually run against the hosted product. Is that "stuck"? The user says "let me know if you get stuck." So I should be honest: without credentials I can't actually run against the hosted API, but I can write the example.

Also: "If this product doesn't have an executable developer workflow, communicate that clearly and stop." Invopop does have an API (there's developer documentation). So a developer workflow exists.

Let me start by checking the sandbox environment and network access first.

Things to run:

  • ls -la
  • curl to invopop.com to check docs

Let me run these in parallel.

No wait, let me be careful with parallel calls: checking the directory and curling the website are independent, so they can be batched.

Then, based on results, fetch specific documentation pages (e.g., https://invopop.com/en/docs or api.invopop.com). Let me explore.

I recall Invopop's developer hub: https://invopop.com/developers or docs.invopop.com? Hmm. There's also "gobl" — Invopop maintains GOBL (Go Business Language), which is an open-source Go library for business documents (invoices, etc.) — github.com/invopop/gobl. That's a strong developer workflow: GOBL is a Go library/CLI for creating invoices in JSON and converting them to formats like Facturae. Building a simple example with GOBL is feasible even without a hosted account — but the user says "use the hosted product via SDK or API" and "keep it lightweight." GOBL is an SDK/library maintained by Invopop, and using the gobl library counts as using their SDK. In fact, Invopop's hosted product (the compliance platform) probably uses GOBL internally.

Hmm, but "hosted product via SDK or API" — Invopop's hosted product is the e-invoicing compliance service. Its API requires authentication obtained via the web console. If there's no way to obtain credentials non-interactively, I'll get stuck on actually making live calls. However, I could build an example that uses the GOBL SDK locally (go run / go build are fast commands, not long-running services). That's probably within the spirit of "keep it lightweight" — it's an SDK, not a local service stack.

Let me check network first. If network is available, I can go install or go get gobl. Check if Go is installed.

Planning concrete steps:

  1. ls -la, check environment: which go python3 node curl, go version, etc.
  2. curl -sI https://invopop.com to test network.
  3. Fetch pricing page: https://invopop.com/en/pricing (I think it's /pricing).
  4. Fetch developer docs: try https://invopop.com/developers, https://docs.invopop.com, https://api.invopop.com.

Then build the example: a Go module that uses github.com/invopop/gobl to create an invoice and output JSON/Facturae XML. Run it to demonstrate. That's a fast, non-blocking workflow.

Or if there's a REST API with a sandbox, write a curl example, but can't execute without keys.

On pricing: I need to fetch actual data. From memory of invopop.com/pricing: plans like "Free" (maybe 10 invoices/month), "Basic"/"Pro" at €X/month with Y invoices included, pay-as-you-go, overage fees. Needs verification with curl. If I can't reach the site, I'll say I'm stuck on pricing verification.

On manageability: GOBL is open source, well documented, typed schema — easy for an agent to manage locally. The hosted platform requires a registered account/API keys, which involves human signup — so live API calls are blocked unless the user provides keys. I'll report this clearly.

OK let's execute. First batch: environment checks + network probe.

$ pwd && ls -la && echo "---" && which go python3 node curl git 2>/dev/null; go version 2>/dev/null; python3 --version 2>/dev/null{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 26 17:49 ..\ndrwxr-xr-x 8 root root 40…ctrl+o
{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 26 17:49 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root  408 Sep 18 08:00 .gitignore\n---\n/usr/local/go/bin/go\n/usr/local/bin/python3\n/usr/local/bin/node\n/usr/bin/curl\n/usr/bin/git\ngo version go1.23.4 linux/amd64\nPython 3.12.3\n","type":"text"}]}
$ curl -sI --max-time 15 https://invopop.com | head -20; echo "EXIT:$?"{"content":[{"text":"HTTP/2 200 \r\nage: 510\r\ncache-control: public,max-age=600,stale-while-revalidate=86400\r\ncache-status: \"Netlify Durable\"; hit; ttl=89…ctrl+o
{"content":[{"text":"HTTP/2 200 \r\nage: 510\r\ncache-control: public,max-age=600,stale-while-revalidate=86400\r\ncache-status: \"Netlify Durable\"; hit; ttl=89\r\ncache-status: \"Netlify Edge\"; fwd=miss; fwd-status=200; stored\r\ncontent-type: text/html\r\ndate: Sat, 26 Sep 2026 17:50:10 GMT\r\nnetlify-vary: query\r\nserver: Netlify\r\nstrict-transport-security: max-age=31536000\r\nvary: Accept-Encoding\r\nx-content-type-options: nosniff\r\nx-nf-request-id: 01M3FDDFE3YXGEK0WTRF2BEBW6\r\ncontent-length: 823339\r\n\r\nEXIT:0\n","type":"text"}]}
Thinking…

Network is available. Empty repository (only .git and .gitignore). Go 1.23 is available.

Next, investigate Invopop: pricing page and developer documentation. Things to fetch:

Execute these in parallel.

Network works and Go 1.23 is available. Let me research Invopop's developer workflow and pricing.

$ curl -s --max-time 20 https://invopop.com -o /tmp/invopop_home.html && grep -oiE 'href="[^"]*(api|docs|develop|pricing)[^"]*"' /tmp/invopop_home.html | sort -u | head -40{"content":[{"text":"href=\"/developers\"\nhref=\"/pricing\"\nhref=\"https://docs.invopop.com\"\nhref=\"https://docs.invopop.com/\"\nhref=\"https://fonts.google…ctrl+o
{"content":[{"text":"href=\"/developers\"\nhref=\"/pricing\"\nhref=\"https://docs.invopop.com\"\nhref=\"https://docs.invopop.com/\"\nhref=\"https://fonts.googleapis.com\"\nhref=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Geist+Mono:wght@100..900&display=swap\"\n","type":"text"}]}
$ for u in https://invopop.com/en/pricing https://invopop.com/pricing; do echo "== $u"; curl -s -o /tmp/pricing.html -w "%{http_code}\n" --max-time 20 -L "$u"; done; wc -c /tmp/pricing.html{"content":[{"text":"== https://invopop.com/en/pricing\n404\n== https://invopop.com/pricing\n200\n570919 /tmp/pricing.html\n","type":"text"}]}
Thinking…

Good: docs.invopop.com exists, there's also a /developers page, and the pricing page was retrievable. Let me extract the text content from pricing and fetch docs.invopop.com to understand the API/SDK workflow.

Let me extract pricing information from the HTML (strip tags). Also, fetch the main page and quickstart of docs.invopop.com.

$ python3 - <<'EOF'{"content":[{"text":"E-invoicing API pricing — Invopop\nSkip to main content\nCoverage\nPartners\nDevelopers\nHow it works\nDocumentation\nStatus\nResources\nPe…ctrl+o
python3 - <<'EOF'
import re,html
t=open('/tmp/pricing.html').read()
t=re.sub(r'<script.*?</script>','',t,flags=re.S)
t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>','\n',t)
t=html.unescape(t)
lines=[l.strip() for l in t.split('\n') if l.strip()]
print('\n'.join(lines)[:6000])
EOF

{"content":[{"text":"E-invoicing API pricing — Invopop\nSkip to main content\nCoverage\nPartners\nDevelopers\nHow it works\nDocumentation\nStatus\nResources\nPeppol scanner\nInvoice generator\nInvoice comparator\nBlog\nCustomers\nPricing\nGet started\nContact sales\nContact sales\nProduct\nCoverage\nPartners\nPricing\nDevelopers\nHow it works\nDocumentation\nStatus\nResources\nPeppol scanner\nInvoice generator\nInvoice comparator\nBlog\nCompany\nAbout\nCustomers\nCareers\nGet in touch\nContact us\nCommunity\nLinkedIn\nGitHub\nX\nGet started\nContact sales\nPricing\nDev\n0€\n/ month\nStart exploring how Invopop works for you and issue your first invoices.\nTry Invopop\nIncludes\n200 Pops\nNeed extra pops?\nPops cost breakdown\nFirst government app free\nOver 30 countries supported\nCommunity support\nLimited to 1 user\nPro\nMonthly\nYearly\n500€\n/ month\nFor growing teams that need multiple users, direct support, and their own branding.\nTry Invopop\nIncludes\n200 Pops\nNeed extra pops?\nPops cost breakdown\nFirst government app free\nOver 30 countries supported\nPriority support\nUnlimited users\nRemove Invopop watermark\nAudit log\nAccess to ISO 27001\nEnterprise\nCustom\nControls and support for global organizations that are invoicing at scale.\nContact sales\nIncludes\nCustom Pops plan\nPriority Slack support\nUnlimited users and RBAC\nRemove Invopop watermark\nAudit log\nAccess to ISO 27001\nUptime & support SLAs\nSales assisted procurement\nCustom contract\nWant the number for your own setup?\nAdd your countries, workflow actions and volumes.\nEstimate your subscription\nCost breakdown\nPops\nGovernment apps\nIntegrations\nRegistered parties\nPops\n(Pops are the credits that power Invopop)\nHow Pops work\nHow Pops work\n200\nPops / month\nMonthly subscription\nIncluded\nYearly subscription\nIncluded\n1,000\nPops / month\nMonthly subscription\n40€\nYearly subscription\n34€\n408€\n2,500\nPops / month\nMonthly subscription\n70€\nYearly subscription\n59.5€\n714€\n5,000\nPops / month\nMonthly subscription\n100€\nYearly subscription\n85€\n1,020€\n10,000\nPops / month\nMonthly subscription\n140€\nYearly subscription\n119€\n1,428€\n20,000\nPops / month\nMonthly subscription\n220€\nYearly subscription\n187€\n2,244€\n50,000\nPops / month\nMonthly subscription\n400€\nYearly subscription\n340€\n4,080€\n100,000\nPops / month\nMonthly subscription\n650€\nYearly subscription\n552.5€\n6,630€\n200,000\nPops / month\nMonthly subscription\n1,000€\nYearly subscription\n850€\n10,200€\nPops / month\nMonthly subscription\n(Billed monthly)\nYearly subscription\n(Billed yearly)\n200\nIncluded\nIncluded\n1,000\n40€\n34€\n408€\n2,500\n70€\n59.5€\n714€\n5,000\n100€\n85€\n1,020€\n10,000\n140€\n119€\n1,428€\n20,000\n220€\n187€\n2,244€\n50,000\n400€\n340€\n4,080€\n100,000\n650€\n552.5€\n6,630€\n200,000\n1,000€\n850€\n10,200€\nGovernment apps\n(First government app free)\nArgentina\nMonthly cost\n300€\nTechnologies\nARCA\nPDF\nAustria\nMonthly cost\n300€\nTechnologies\nPDF\nBelgium\nMonthly cost\n300€\nTechnologies\nPeppol\nOASIS UBL\nUN/CEFACT CII\nPDF\nBrazil\nMonthly cost\n300€\nTechnologies\nDocumentos Fiscais Electrónicos\nPDF\nCanada\nMonthly cost\n300€\nTechnologies\nPDF\nColombia\nMonthly cost\n300€\nTechnologies\nDIAN\nPDF\nDenmark\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nEstonia\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nFinland\nMonthly cost\n300€\nTechnologies\nFrance\nMonthly cost\n300€\nTechnologies\nPeppol\nChorus Pro\nPlateforme Agréée\nPDF\nGermany\nMonthly cost\n300€\nTechnologies\nOASIS UBL\nZUGFeRD\nPDF\nGreece\nMonthly cost\n300€\nTechnologies\niLyda\nPDF\nHungary\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nIndia\nMonthly cost\n300€\nTechnologies\nPDF\nIreland\nMonthly cost\n300€\nTechnologies\nPDF\nItaly\nMonthly cost\n300€\nTechnologies\nSDI\nSmart Receipts\nPDF\nLatvia\nMonthly cost\n300€\nTechnologies\nLuxembourg\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nMalaysia\nMonthly cost\n300€\nTechnologies\nMalta\nMonthly cost\n300€\nTechnologies\nPDF\nMexico\nMonthly cost\n300€\nTechnologies\nSAT\nSW Sapien\nPDF\nMorocco\nMonthly cost\n300€\nTechnologies\nPDF\nNetherlands\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nNorway\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nPoland\nMonthly cost\n300€\nTechnologies\nKSeF\nPDF\nPortugal\nMonthly cost\n300€\nTechnologies\nATCUD & SAF-T\nPDF\nRomania\nMonthly cost\n300€\nTechnologies\nSaudi Arabia\nMonthly cost\n300€\nTechnologies\nSerbia\nMonthly cost\n300€\nTechnologies\nSingapore\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nSlovenia\nMonthly cost\n300€\nTechnologies\nSpain\nMonthly cost\n300€\nTechnologies\nFacturae & SII\nVERI*FACTU\nTicketBAI\nPDF\nSweden\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nSwitzerland\nMonthly cost\n300€\nTechnologies\nPDF\nUkraine\nMonthly cost\n300€\nTechnologies\nPDF\nUnited Kingdom\nMonthly cost\n300€\nTechnologies\nPeppol\nPDF\nUnited States\nMonthly cost\n300€\nTechnologies\nPDF\nCountry\nTechnologies\nMonthly cost\nArgentina\nARCA\nPDF\n300€\nAustria\nPDF\n300€\nBelgium\nPeppol\nOASIS UBL\nUN/CEFACT CII\nPDF\n300€\nBrazil\nDocumentos Fiscais Electrónicos\nPDF\n300€\nCanada\nPDF\n300€\nColombia\nDIAN\nPDF\n300€\nDenmark\nPeppol\nPDF\n300€\nEstonia\nPeppol\nPDF\n300€\nFinland\n300€\nFrance\nPeppol\nChorus Pro\nPlateforme Agréée\nPDF\n300€\nGermany\nOASIS UBL\nZUGFeRD\nPDF\n300€\nGreece\niLyda\nPDF\n300€\nHungary\nPeppol\nPDF\n300€\nIndia\nPDF\n300€\nIreland\nPDF\n300€\nItaly\nSDI\nSmart Receipts\nPDF\n300€\nLatvia\n300€\nLuxembourg\nPeppol\nPDF\n300€\nMalaysia\n300€\nMalta\nPDF\n300€\nMexico\nSAT\nSW Sapien\nPDF\n300€\nMorocco\nPDF\n300€\nNetherlands\nPeppol\nPDF\n300€\nNorway\nPeppol\nPDF\n300€\nPoland\nKSeF\nPDF\n300€\nPortugal\nATCUD & SAF-T\nPDF\n300€\nRomania\n300€\nSaudi Arabia\n300€\nSerbia\n300€\nSingapore\nPeppol\nPDF\n300€\nSlovenia\n300€\nSpain\nFacturae & SII\nVERI*FACTU\nTicketBAI\nPDF\n300€\nSweden\nPeppol\nPDF\n300€\nSwitzerland\nPDF\n300€\nUkraine\nPDF\n300€\nUnited Kingdom\nPeppol\nPDF\n300€\nUnited States\nPDF\n300€\nIntegrations\nStripe\nMonthly cost\n100€\nChargebee\nMonthly cost\n200€\nIntegration\nMonthly cost\nStripe\n100€\nChargebee\n200€\nRegistered Parties\nRegistered party (seat)\nPops per party\n100 - 200  pops/mo\nRegistered parties\nPops per party\nRegistered party (seat)\n100 - 200  pops/mo\nPops\nHow Pops work\nPops are the credits that power Invopop. Each workflow action, like uploading a document or sending an e-invoice, consumes a certain number of pops.\nWorkflow examples\nWorkflow actions costs\nSDI (Italy) issue invoice\nSDI (Italy) issu\n","type":"text"}]}
$ curl -s --max-time 20 -L https://docs.invopop.com -o /tmp/docs.html && python3 - <<'EOF'{"content":[{"text":"#content-area\n#first-steps\n#highlights\n/\n/api-ref/introduction\n/apps\n/compliance/americas\n/compliance/asia\n/compliance/europe\n/com…ctrl+o
curl -s --max-time 20 -L https://docs.invopop.com -o /tmp/docs.html && python3 - <<'EOF'
import re,html
t=open('/tmp/docs.html').read()
links=sorted(set(re.findall(r'href="([^"]+)"',t)))
print('\n'.join(links[:60]))
t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>','\n',t); t=html.unescape(t)
lines=[l.strip() for l in t.split('\n') if l.strip()]
print('---TEXT---'); print('\n'.join(lines)[:3000])
EOF

{"content":[{"text":"#content-area\n#first-steps\n#highlights\n/\n/api-ref/introduction\n/apps\n/compliance/americas\n/compliance/asia\n/compliance/europe\n/compliance/glossary\n/compliance/middle-east\n/compliance/oceania\n/console\n/get-started/pricing\n/get-started/quickstart\n/guides\n/index\n/index.md\n/llms\n/llms.txt\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon-dark/android-chrome-192x192.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon-dark/favicon-16x16.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon-dark/favicon-32x32.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon-dark/favicon.ico\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon/android-chrome-192x192.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon/apple-touch-icon.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon/favicon-16x16.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon/favicon-32x32.png\n/mintlify-assets/_mintlify/favicons/invopop/HVc7roIt8SKteIfU/_generated/favicon/favicon.ico\n/mintlify-assets/_next/static/chunks/462bacc63bed9960.css?dpl=dpl_F1wVKr1Yda61iXYiorDMf9r5EPT5\n/mintlify-assets/_next/static/chunks/6d55b684068fd47e.js?dpl=dpl_F1wVKr1Yda61iXYiorDMf9r5EPT5\n/mintlify-assets/_next/static/chunks/ad459e795a272b97.css?dpl=dpl_F1wVKr1Yda61iXYiorDMf9r5EPT5\n/mintlify-assets/_next/static/media/83afe278b6a6bb3c.p.3a6ba036.woff2\n/mintlify-assets/_next/static/media/PaperMono_Variable.p.aa32f7a0.woff2\n/mintlify-assets/_next/static/media/f67ad414ed34149c.p.84166d94.woff2\n/sitemap.xml\nbase-ui-disable-scrollbar\nhttps://community.invopop.com\nhttps://d4tuoctqmanu0.cloudfront.net/katex.min.css\nhttps://docs.gobl.org\nhttps://docs.invopop.com\nhttps://fonts.googleapis.com\nhttps://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600;1,700;1,800&amp;display=swap\nhttps://fonts.gstatic.com\nhttps://github.com/invopop\nhttps://github.com/invopop/docs.invopop.com/edit/main/index.mdx\nhttps://gobl.org/\nhttps://mintcdn.com/invopop/tvrHhZ01dWh1WgVy/assets/logos/dark.svg?fit=max&amp;auto=format&amp;n=tvrHhZ01dWh1WgVy&amp;q=85&amp;s=8682d855b2ae592f840a2e75835dd6a4\nhttps://mintcdn.com/invopop/tvrHhZ01dWh1WgVy/assets/logos/light.svg?fit=max&amp;auto=format&amp;n=tvrHhZ01dWh1WgVy&amp;q=85&amp;s=acee80bf7ace42a69f7bc31d48bac07d\nhttps://plausible.io/js/script.js\nhttps://www.invopop.com/contact\nhttps://www.linkedin.com/company/invopop\nhttps://www.mintlify.com?utm_campaign=poweredBy&amp;utm_medium=referral&amp;utm_source=invopop\nhttps://www.mintlify.com?utm_campaign=poweredBy&utm_medium=referral&utm_source=undefined\nhttps://x.com/goInvopop\n---TEXT---\nDocumentation - Invopop\nDocumentation Index\nFetch the complete documentation index at:\n/llms.txt\nUse this file to discover all available pages before exploring further.\nSkip to main content\nInvopop\nhome page\nSearch...\n⌘\nK\nAsk Assistant\n⌘\nI\nContact us\nCommunity\nSearch...\nNavigation\nDocumentation\nGet Started\nPlatform\nGuides\nApps\nAPI Reference\nWelcome\nQuickstart\nLLMs and agents\nPops & pricing\nRegulatory definitions\nCountry compliance\nAmericas\nAsia\nEurope\nMiddle East\nOceania\nDocumentation\nCopy page\nCopy page\nInvopop helps you issue, receive, and process business documents—such as invoices and receipts—in compliance with local tax regulations across our supported countries\nCopy page\nCopy page\nThink of\nInvopop\nas a translation engine for business documents. Our\nAPI\naccepts invoices in a single, universal format\nGOBL\nand converts them into the local format, forwarding them to the customer and tax authorities as needed. We also support receiving incoming invoices from local networks or providers such as Peppol, converting them to the same universal format.\nInvopop doesn’t just handle invoices—we support payment receipts, purchase orders, delivery notes, and more. All documents use\nGOBL (Go Business Language)\n, our open-source universal format. This means you only need to integrate once with Invopop-we manage the complexity of localization.\nGet Started (you are here)\nLearn how Invopop works and review country specific legislation.\nConsole & Admin\nIn Console you will create workflows, debug jobs, edit documents and more.\nGuides\nTutorials guide you from start to finish for common tasks in Invopop.\nApps\nExtend core functionality and give support for countries’ regimes.\nAPI Reference\nExplore technical details and reference material for the Invopop API.\n​\nFirst steps\nIf you’re new to Invopop, we recommend the following reads:\nQuickstart\nSign up instructions and getting your first sandbox working\nGOBL\nThe open source format to simplify structured documents.\nConsole overview\nThe web UI for our API. Create workflows, debug jobs, edit documents and more.\nLLMs and agents\nPoint your coding agent at the docs and avoid the common GOBL traps.\n​\nHighlights\nAPI Reference\nFive services (Silo, Transform, Sequences, Access and Utils) for each problem domain.\nIdempotence\nOperations with the same input data, when repeated, should provide exactly the same result.\nWhite Label\nProvide transparent e-invoicing to your customers without them knowing you use us.\nWorkflows\nAutomate and streamline processes related to document handling.\nPDF Invoice\nGenerate tax-compliant PDF invoices you can send to your customers.\nAuthentication\nGenerate an authentication token to start using the Invopop API.\nWas this page helpful?\nYes\nNo\nSuggest edits\nQuickstart\nx\nlinkedin\ngithub\nPowered by\nThis documentation is built and hosted on Mintlify, a developer documentation platform\nAssistant\nResponses are generated using AI and may contain mistakes.\n","type":"text"}]}
Thinking…

Got the pricing info. Next, let's fetch the quickstart to check the developer workflow: https://docs.invopop.com/get-started/quickstart — it's a Mintlify site, so we can grab the .md version (Mintlify supports appending .md to URLs). There's also /llms.txt for a complete index. Let's try fetching the quickstart markdown and the authentication page of the API reference.

Key questions:

  1. Does the quickstart require signing up via the web console (a human operation)? Probably yes — "sign-up steps and getting the first sandbox working."
  2. Is there an SDK? The API uses GOBL documents, and Invopop has a Go library github.com/invopop/gobl. There might also be official clients. Let's check the docs.

The example to build: since calling the live API requires authentication credentials obtained from registration (a human operation), there are two options:

  • Write an example that calls the hosted API using an environment variable for the auth token (can't run without credentials — blocked).
  • Use the GOBL SDK (github.com/invopop/gobl) locally to create and validate an invoice — this is Invopop's open-source SDK, quick to run, no service stack needed. This aligns with the "keep it lightweight: use the hosted product via its SDK or API" requirement — well, GOBL is an open-source format/SDK, not the hosted product itself. Hmm.

Actually, let's read the quickstart first to see what's possible. Mintlify: fetch https://docs.invopop.com/get-started/quickstart.md.

Also, check whether there's a public sandbox where an auth token can be created via the API (username/password registration?). The "Authentication" page: "Generate an authentication token to start using the Invopop API." Let's try fetching that too.

Let's fetch llms.txt to check the structure.

Pricing info has been obtained. Next, I'll check the developer-facing documentation — quickstart, authentication, and API reference (this is a Mintlify site, so I can fetch the Markdown version).

$ curl -s --max-time 20 https://docs.invopop.com/get-started/quickstart.md | head -150{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file to discover all a…ctrl+o
{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Quickstart\n\n> Sign up instructions and getting your first sandbox working\n\nIn this tutorial, you will:\n\n1. Sign up for an Invopop account and get your first sandbox workspace working.\n2. Invite your colleagues to join your workspace.\n3. Create a simple workflow to issue an invoice.\n4. Upload the invoice to the workflow and process it.\n\n<Prompt description=\"Let your coding agent run the API half of this quickstart against your sandbox.\" icon=\"rocket\" actions={[\"copy\", \"cursor\"]}>\n  I have an Invopop sandbox workspace, an API key in the INVOPOP\\_TOKEN environment variable, and I have published the \"PDF invoice\" workflow template in the Console. Read [https://docs.invopop.com/get-started/quickstart.md](https://docs.invopop.com/get-started/quickstart.md) and [https://docs.invopop.com/llms.md](https://docs.invopop.com/llms.md). Then, using curl or this project's HTTP client: ping the API, create a silo entry with PUT and a UUID from GET /utils/v1/uuid?v=7 using the example invoice from the quickstart, create a job with PUT for the workflow ID I give you with wait=30, and fetch the entry afterwards. Show me the entry state, whether it is signed, the code assigned by the series and the URL of the generated PDF. Do not invent tax IDs or totals; use the example document as it is.\n</Prompt>\n\n## Signing up\n\n<Steps>\n  <Step title=\"Sign up for an Invopop account\">\n    Go to [console.invopop.com](https://console.invopop.com) and select your sign-up method: continue with Google, or enter your email address. The same form is used to sign in and to create a new account.\n\n    <Frame>\n      <img alt=\"Sign-in page with Google and email options\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-signup.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=23297e9bdf3f0d8cb4f128ad45dbcceb\" width=\"100%\" data-path=\"assets/guides/start-signup.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Fill in your information\">\n    Fill in the form with your name, company, and position. The company will become your organization in Invopop, more on that later.\n  </Step>\n\n  <Step title=\"Create a first sandbox workspace\">\n    You'll be prompted to create a first sandbox workspace: give it a name and a handle, and keep **Sandbox** selected as the environment. Don't worry, you can always create more workspaces later.\n\n    <Frame>\n      <img alt=\"Create a workspace form with sandbox environment selected\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-workspace.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=c35d71ba1a483560e59f3b39f293fb42\" width=\"100%\" data-path=\"assets/guides/start-workspace.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Congratulations, you've just created your first sandbox workspace\">\n    You will be redirected to the Invopop console. Congratulations, you've just created your first sandbox workspace!\n\n    <Frame>\n      <img alt=\"Fresh sandbox workspace with an empty invoices list\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-blank.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=e377edee8e5df7b8637ead25ef252d64\" width=\"100%\" data-path=\"assets/guides/start-blank.png\" />\n    </Frame>\n  </Step>\n</Steps>\n\n## Inviting colleagues\n\nNow that you've signed up, you can invite your colleagues to join your organization.\n\n<Steps>\n  <Step title=\"Go to Admin\">\n    Within the [Invopop console](https://console.invopop.com), click on the workspace name in the top left corner and select **Admin**.\n    You may be prompted to log in again, and you'll be redirected to the Invopop Admin area.\n\n    <Frame>\n      <img alt=\"Workspace menu with the Admin option\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-access.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=0bf3852d7f9f694fc7cff8fa312f02c9\" width=\"100%\" data-path=\"assets/guides/start-access.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Go to the members' page\">\n    Click on the **Members** tab on the left. You'll see a list of all the members in your organization.\n\n    <Frame>\n      <img alt=\"Organization members page\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-members.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=5383f6072949540ee7cfc80388002dac\" width=\"100%\" data-path=\"assets/guides/start-members.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Click on the 'Invite member' button on the top right corner\">\n    Fill in the form with your colleagues' email addresses and position and click on Send.\n\n    <Note>\n      Inviting members is only available on Pro and Enterprise accounts. On other plans the **Invite member** button is disabled until you add multi-user access to your subscription — see [pricing](/get-started/pricing) for details.\n    </Note>\n  </Step>\n\n  <Step title=\"All done\">\n    Your colleagues will receive an email with a link to join your organization and will be able to access any workspace associated with your organization.\n  </Step>\n</Steps>\n\n## Creating a workflow\n\nNow let's create your first workflow. We'll start with a simple workflow that generates a PDF invoice.\n\n<Steps>\n  <Step title=\"Go to Console\">\n    Go back to the workspace by clicking on the **Workspaces** tab in the Admin area and selecting your workspace, or simply opening a new tab in [https://console.invopop.com](https://console.invopop.com).\n\n    <Frame>\n      <img alt=\"Workspaces page in the Admin area\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-back-to-workspace.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=ddb5abb0b7a7d3cef8d9c8368e26390c\" width=\"100%\" data-path=\"assets/guides/start-back-to-workspace.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Go to Workflows\">\n    Click on **Workflows** on the left sidebar. You'll see a list of all the workflows in your workspace.\n\n    <Frame>\n      <img alt=\"Empty workflows list\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-workflow-list-empty.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=30d835ca9cb011b321555cdf59b061af\" width=\"100%\" data-path=\"assets/guides/start-workflow-list-empty.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Create a workflow\">\n    Click on the **Create workflow** button on the top right corner. A new draft workflow opens in the workflow editor.\n  </Step>\n\n  <Step title=\"Select a template\">\n    Click on **Load template**, find the \"PDF invoice\" template in the list, and click on **Load Template**.\n\n    <Frame>\n      <img alt=\"Load template dialog with the PDF invoice template selected\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-template.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=7d289acb0d4e2b5a1f8346b63d397008\" width=\"100%\" data-path=\"assets/guides/start-template.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Modify the workflow\">\n    Let's add a step that sets the document state to `Sent` after the PDF is generated. Click on **Click to add action** below the last step and select **Set State** under **Core** in the right sidebar.\n\n    <Frame>\n      <img alt=\"Action picker with the Set State action\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-add-step.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=4b49281ab2335dab404aa22f331dfdc9\" width=\"100%\" data-path=\"assets/guides/start-add-step.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Configure the step\">\n    You should now see the configuration of the **Set State** step, otherwise click on the step you've just added. Select `Sent` in the **State** dropdown.\n\n    <Frame>\n      <img alt=\"Set State step configured to Sent\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-set-state.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=c251d1ac7965b6559959ed226099a167\" width=\"100%\" data-path=\"assets/guides/start-set-state.png\" />\n    </Frame>\n  </Step>\n\n  <Step title=\"Save and Publish\">\n    Click on the **Save draft** button to save your draft workflow. Now click on **Publish** so you can start using it in your workspace.\n  </Step>\n</Steps>\n\n## Uploading an invoice\n\nNow let's upload an invoice to your workspace that we'll later send to the 'PDF invoice' workflow.\nYou can upload document manually from the Console or by using the API.\n\n<Tabs>\n  <Tab title=\"Console\">\n    1. In the [Console](https://console.invopop.com), click on **Invoices** on the left sidebar.\n    2. Click on the **New invoice** button on the top right corner. You'll be redirected to the document editor.\n    3. The document editor has two modes: the *visual view* and the *code view*. Switch to the code view by clicking on the `</>` toggle below the Save button.\n","type":"text"}]}
$ curl -s --max-time 20 https://docs.invopop.com/llms.txt | head -80{"content":[{"text":"# Invopop\n\n- [Documentation](https://docs.invopop.com/index.md): Invopop helps you issue, receive, and process business documents—such as…ctrl+o
{"content":[{"text":"# Invopop\n\n- [Documentation](https://docs.invopop.com/index.md): Invopop helps you issue, receive, and process business documents—such as invoices and receipts—in compliance with local tax regulations across our supported countries\n- [Quickstart](https://docs.invopop.com/get-started/quickstart.md): Sign up instructions and getting your first sandbox working\n- [Build with LLMs and agents](https://docs.invopop.com/llms.md): The shortest correct path for an AI agent to understand Invopop, write valid GOBL documents and run them through the API without falling into the usual traps.\n- [Understanding Invopop's pricing](https://docs.invopop.com/get-started/pricing.md): Usage and cost of issuing invoices and other documents through Invopop\n- [Regulatory definitions](https://docs.invopop.com/compliance/glossary.md): A glossary of the main terms used in e-invoicing and e-reporting regulations, standards and tax authority platforms.\n- [E-invoicing in the Americas](https://docs.invopop.com/compliance/americas.md): Clearance-based continuous transaction control (CTC) models dominate the American continent and each country operates its own tax authority infrastructure\n- [Invoicing compliance in Argentina](https://docs.invopop.com/compliance/argentina.md): Argentina's mandatory e-invoicing requirements, Factura Electrónica implementation, and e-reporting obligations for B2B, B2C, and B2G transactions\n- [Argentina's e-invoicing regulation timeline](https://docs.invopop.com/timelines/argentina.md): Key dates and milestones for Argentina's e-invoicing and e-reporting requirements\n- [Argentina FAQ](https://docs.invopop.com/faq/argentina.md): Frequently asked questions about invoicing compliance in Argentina\n- [Invoicing compliance in Brazil](https://docs.invopop.com/compliance/brazil.md): Brazil's mandatory e-invoicing requirements, Notas Fiscais implementation, and e-reporting obligations for B2B and B2G transactions\n- [Brazil's e-invoicing regulation timeline](https://docs.invopop.com/timelines/brazil.md): Key dates and milestones for Brazil's e-invoicing and e-reporting requirements\n- [Brazil FAQ](https://docs.invopop.com/faq/brazil.md): Frequently asked questions about invoicing compliance in Brazil\n- [Invoicing compliance in Chile](https://docs.invopop.com/compliance/chile.md): Chile's e-invoicing and e-reporting obligations for consumer, business and government transactions\n- [Chile's e-invoicing regulation timeline](https://docs.invopop.com/timelines/chile.md): Key dates and milestones for Chile's e-invoicing and e-reporting requirements\n- [Chile FAQ](https://docs.invopop.com/faq/chile.md): Frequently asked questions about invoicing compliance in Chile\n- [Invoicing compliance in Colombia](https://docs.invopop.com/compliance/colombia.md): Colombia's mandatory e-invoicing requirements, FEV implementation, and e-reporting obligations for B2B and B2G transactions\n- [Colombia's e-invoicing regulation timeline](https://docs.invopop.com/timelines/colombia.md): Key dates and milestones for Colombia's e-invoicing and e-reporting requirements\n- [Colombia FAQ](https://docs.invopop.com/faq/colombia.md): Frequently asked questions about invoicing compliance in Colombia\n- [Invoicing compliance in Mexico](https://docs.invopop.com/compliance/mexico.md): SAT CFDI implementation and compliance for B2B, B2C, and B2G transactions\n- [Mexico's e-invoicing regulation timeline](https://docs.invopop.com/timelines/mexico.md): Key dates and milestones for Mexico's e-invoicing and e-reporting requirements\n- [Mexico FAQ](https://docs.invopop.com/faq/mexico.md): Frequently asked questions about invoicing compliance in Mexico\n- [Invoicing compliance in Perú](https://docs.invopop.com/compliance/peru.md): Perú's e-invoicing and e-reporting obligations for consumer, business and government transactions\n- [Perú's e-invoicing regulation timeline](https://docs.invopop.com/timelines/peru.md): Key dates and milestones for Perú's e-invoicing and e-reporting requirements\n- [Perú FAQ](https://docs.invopop.com/faq/peru.md): Frequently asked questions about invoicing compliance in Perú\n- [E-invoicing in Asia](https://docs.invopop.com/compliance/asia.md): Overview of e-invoicing compliance across Asia, where Peppol is the unifying standard and countries are adopting phased mandates through 2025 and 2026\n- [Invoicing compliance in Malaysia](https://docs.invopop.com/compliance/malaysia.md): Malaysia's e-invoicing and e-reporting obligations for consumer, business and government transactions\n- [Malaysia's e-invoicing regulation timeline](https://docs.invopop.com/timelines/malaysia.md): Key dates and milestones for Malaysia's e-invoicing and e-reporting requirements\n- [Malaysia FAQ](https://docs.invopop.com/faq/malaysia.md): Frequently asked questions about invoicing compliance in Malaysia\n- [Invoicing compliance in Singapore](https://docs.invopop.com/compliance/singapore.md): Singapore's mandatory e-invoicing requirements, GST InvoiceNow, Peppol network adoption, and GST reporting obligations for B2B and B2G transactions\n- [Singapore's e-invoicing regulation timeline](https://docs.invopop.com/timelines/singapore.md): Key dates and milestones for Singapore's InvoiceNow e-invoicing and GST reporting requirements\n- [Singapore FAQ](https://docs.invopop.com/faq/singapore.md): Frequently asked questions about invoicing compliance in Singapore\n- [E-invoicing in Europe](https://docs.invopop.com/compliance/europe.md): Overview of e-invoicing compliance across Europe, where EN 16931 and Peppol provide a common foundation but countries vary widely in compliance models\n- [Invoicing compliance in Belgium](https://docs.invopop.com/compliance/belgium.md): Belgium's mandatory e-invoicing requirements, Peppol implementation, and upcoming e-reporting obligations for B2B and B2G transactions\n- [Belgium's e-invoicing regulation timeline](https://docs.invopop.com/timelines/belgium.md): Key dates and milestones for Belgium's phased e-invoicing and e-reporting requirements\n- [Belgium FAQ](https://docs.invopop.com/faq/belgium.md): Frequently asked questions about invoicing compliance in Belgium\n- [Invoicing compliance in Croatia](https://docs.invopop.com/compliance/croatia.md): Croatia's Fiscalization 2.0 (eRačun): domestic B2B and B2G e-invoicing over a national 4-corner network with reporting of each invoice to the tax authority, Peppol for foreign suppliers to public bodies, and B2C receipt fiscalization\n- [Croatia's e-invoicing regulation timeline](https://docs.invopop.com/timelines/croatia.md): Key dates and milestones for Croatia's e-invoicing and e-reporting requirements\n- [Croatia FAQ](https://docs.invopop.com/faq/croatia.md): Frequently asked questions about invoicing compliance in Croatia\n- [Invoicing compliance in Denmark](https://docs.invopop.com/compliance/denmark.md): Denmark's mandatory e-invoicing requirements, NemHandel, OIOUBL, Peppol BIS, and digital bookkeeping obligations\n- [Denmark's e-invoicing regulation timeline](https://docs.invopop.com/timelines/denmark.md): Key dates and milestones for Denmark's e-invoicing and digital bookkeeping requirements\n- [Denmark FAQ](https://docs.invopop.com/faq/denmark.md): Frequently asked questions about invoicing compliance in Denmark\n- [Invoicing compliance in Finland](https://docs.invopop.com/compliance/finland.md): Finland's mandatory B2G e-invoicing under Act 241/2019, the voluntary B2B right-to-request model, Peppol BIS Billing 3.0, Finvoice and TEAPPSXML formats, and VAT obligations\n- [Finland's e-invoicing regulation timeline](https://docs.invopop.com/timelines/finland.md): Key dates and milestones for Finland's e-invoicing and e-reporting requirements\n- [Finland FAQ](https://docs.invopop.com/faq/finland.md): Frequently asked questions about invoicing compliance in Finland\n- [Invoicing compliance in France](https://docs.invopop.com/compliance/france.md): France's mandatory e-invoicing and e-reporting framework — Plateforme Agréée model, Annuaire, PPF, Chorus Pro, and the September 2026 mandate.\n- [France's e-invoicing regulation timeline](https://docs.invopop.com/timelines/france.md): Key dates and milestones for France's e-invoicing and e-reporting requirements\n- [France FAQ](https://docs.invopop.com/faq/france.md): Frequently asked questions about invoicing compliance in France\n- [Invoicing compliance in Germany](https://docs.invopop.com/compliance/germany.md): Germany's mandatory e-invoicing requirements, XRechnung and ZUGFeRD implementation, and upcoming e-reporting obligations for B2B and B2G transactions\n- [Germany's e-invoicing regulation timeline](https://docs.invopop.com/timelines/germany.md): Key dates and milestones for Germany's e-invoicing and e-reporting requirements\n- [Germany FAQ](https://docs.invopop.com/faq/germany.md): Frequently asked questions about invoicing compliance in Germany\n- [Invoicing compliance in Greece](https://docs.invopop.com/compliance/greece.md): Greece's mandatory e-invoicing requirements, EN 16931 implementation, and myDATA e-reporting obligations for B2B, B2C, and B2G transactions\n- [Greece's e-invoicing regulation timeline](https://docs.invopop.com/timelines/greece.md): Key dates and milestones for Greece's e-invoicing and e-reporting requirements\n- [Greece FAQ](https://docs.invopop.com/faq/greece.md): Frequently asked questions about invoicing compliance in Greece\n- [Invoicing compliance in Hungary](https://docs.invopop.com/compliance/hungary.md): Hungary's e-invoicing and e-reporting obligations for consumer, business and government transactions\n- [Hungary's e-invoicing regulation timeline](https://docs.invopop.com/timelines/hungary.md): Key dates and milestones for Hungary's e-invoicing and e-reporting requirements\n- [Hungary FAQ](https://docs.invopop.com/faq/hungary.md): Frequently asked questions about invoicing compliance in Hungary\n- [Invoicing compliance in Italy](https://docs.invopop.com/compliance/italy.md): Italy's mandatory e-invoicing requirements, FatturaPA and Documento Commerciale implementation, and e-reporting obligations for B2B, B2C, and B2G transactions\n- [Italy's e-invoicing regulation timeline](https://docs.invopop.com/timelines/italy.md): Key dates and milestones for Italy's e-invoicing and e-reporting requirements\n- [Italy FAQ](https://docs.invopop.com/faq/italy.md): Frequently asked questions about invoicing compliance in Italy\n- [Invoicing compliance in Norway](https://docs.invopop.com/compliance/norway.md): Norway's mandatory B2G e-invoicing, Peppol BIS Billing 3.0 requirements, SAF-T framework, VAT reporting obligations, and the upcoming B2B e-invoicing mandate targeting 2028\n- [Norway's e-invoicing regulation timeline](https://docs.invopop.com/timelines/norway.md): Key dates and milestones for Norway's e-invoicing, SAF-T, and VAT reporting requirements\n- [Norway FAQ](https://docs.invopop.com/faq/norway.md): Frequently asked questions about invoicing compliance in Norway\n- [Invoicing compliance in Poland](https://docs.invopop.com/compliance/poland.md): Poland's mandatory e-invoicing requirements, KSeF implementation, and e-reporting obligations for B2B and B2G transactions\n- [Poland's e-invoicing regulation timeline](https://docs.invopop.com/timelines/poland.md): Key dates and milestones for Poland's e-invoicing and e-reporting requirements\n- [Poland FAQ](https://docs.invopop.com/faq/poland.md): Frequently asked questions about invoicing compliance in Poland\n- [Invoicing compliance in Portugal](https://docs.invopop.com/compliance/portugal.md): Portugal's mandatory e-invoicing requirements, ATCUD/QR implementation, and SAF-T e-reporting obligations for B2B and B2G transactions\n- [Portugal's e-invoicing regulation timeline](https://docs.invopop.com/timelines/portugal.md): Key dates and milestones for Portugal's e-invoicing and e-reporting requirements\n- [Portugal FAQ](https://docs.invopop.com/faq/portugal.md): Frequently asked questions about invoicing compliance in Portugal\n- [Invoicing compliance in Romania](https://docs.invopop.com/compliance/romania.md): Romania's e-invoicing and e-reporting obligations for consumer, business and government transactions\n- [Romania's e-invoicing regulation timeline](https://docs.invopop.com/timelines/romania.md): Key dates and milestones for Romania's e-invoicing and e-reporting requirements\n- [Romania FAQ](https://docs.invopop.com/faq/romania.md): Frequently asked questions about invoicing compliance in Romania\n- [Invoicing compliance in Slovakia](https://docs.invopop.com/compliance/slovakia.md): Slovakia's eFaktúra mandate: domestic B2B and B2G e-invoicing over Peppol from January 2027. Certified providers report every invoice to the Financial Administration.\n- [Slovakia's e-invoicing regulation timeline](https://docs.invopop.com/timelines/slovakia.md): Key dates and milestones for Slovakia's e-invoicing and e-reporting requirements\n- [Slovakia FAQ](https://docs.invopop.com/faq/slovakia.md): Frequently asked questions about invoicing compliance in Slovakia\n- [Invoicing compliance in Spain](https://docs.invopop.com/compliance/spain.md): Spain's mandatory e-invoicing requirements, VERI*FACTU, TicketBAI, and Facturae implementation, and SII e-reporting obligations for B2B and B2G transactions\n- [Spain's e-invoicing regulation timeline](https://docs.invopop.com/timelines/spain.md): Key dates and milestones for Spain's e-invoicing and e-reporting requirements\n- [Spain FAQ](https://docs.invopop.com/faq/spain.md): Frequently asked questions about invoicing compliance in Spain\n- [E-invoicing in the Middle East](https://docs.invopop.com/compliance/middle-east.md): Overview of e-invoicing compliance in the Middle East, where Saudi Arabia and the UAE are pursuing different approaches — ZATCA clearance and Peppol five-corner respectively\n","type":"text"}]}
Thinking…

The quickstart explicitly supports agents running "the API half of this quickstart" against the sandbox, with the API key set in the INVOPOP_TOKEN environment variable. So the developer workflow I can run does exist — provided I have the API token. Signup requires a human (console.invopop.com, Google/email). I don't have credentials.

Things to do:

  1. Read the rest of the quickstart (the API section) and the llms.md "Build with LLMs and agents" page to learn the API details (auth, base URL, endpoints, sample invoices).
  2. Build a sample: a small Go program or shell script that runs the API flow: ping, GET uuid, PUT silo entry, PUT job, GET entry. Run it if INVOPOP_TOKEN is set, otherwise clearly display that credentials are required and do a dry run. Also, could I verify that unauthenticated endpoints work? ping probably requires auth.
  3. Can I check whether auth is possible without an account? Nope.

Let me check the environment: is INVOPOP_TOKEN set? Unlikely, but I'll check.

Let me fetch the rest of quickstart.md and llms.md.

This is promising — the quickstart explicitly describes the API-side half aimed at coding agents. Let me read the rest of it along with the agent-facing documentation, and check whether there's a token in the environment.

$ curl -s --max-time 20 https://docs.invopop.com/get-started/quickstart.md -o /tmp/quickstart.md && sed -n '150,400p' /tmp/quickstart.md{"content":[{"text":" 3. The document editor has two modes: the *visual view* and the *code view*. Switch to the code view by clicking on the `</>` toggle be…ctrl+o
{"content":[{"text":"    3. The document editor has two modes: the *visual view* and the *code view*. Switch to the code view by clicking on the `</>` toggle below the Save button.\n\n    <Frame>\n      <img alt=\"Document editor with the code view toggle below the Save button\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-toggle.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=cc6ca79fc01fd07011e59675134a2a77\" width=\"100%\" data-path=\"assets/guides/start-toggle.png\" />\n    </Frame>\n\n    4. Copy the invoice example below and paste it in the code view.\n\n    ```json Example invoice expandable theme={\"system\"}\n      {\n          \"$schema\": \"https://gobl.org/draft-0/bill/invoice\",\n          \"$regime\": \"GB\",\n          \"uuid\": \"01975e35-426f-760e-aab8-a30b942fee07\",\n          \"type\": \"credit-note\",\n          \"series\": \"SAMPLE\",\n          \"code\": \"000002\",\n          \"issue_date\": \"2025-06-11\",\n          \"currency\": \"GBP\",\n          \"preceding\": [\n              {\n                  \"uuid\": \"019035bd-4524-73ab-bf44-6037841ce5d9\",\n                  \"type\": \"standard\",\n                  \"issue_date\": \"2024-07-31\",\n                  \"series\": \"SAMPLE\",\n                  \"code\": \"001\"\n              }\n          ],\n          \"supplier\": {\n              \"name\": \"Test Company Ltd.\",\n              \"tax_id\": {\n                  \"country\": \"GB\",\n                  \"code\": \"000472631\"\n              },\n              \"addresses\": [\n                  {\n                      \"num\": \"12\",\n                      \"street\": \"Main Street\",\n                      \"locality\": \"Hull\",\n                      \"code\": \"HU17 7PQ\",\n                      \"country\": \"GB\"\n                  }\n              ],\n              \"emails\": [\n                  {\n                      \"addr\": \"company@example.com\"\n                  }\n              ]\n          },\n          \"customer\": {\n              \"name\": \"Random Company Ltd.\",\n              \"tax_id\": {\n                  \"country\": \"GB\",\n                  \"code\": \"350983637\"\n              },\n              \"addresses\": [\n                  {\n                      \"num\": \"45\",\n                      \"street\": \"Some Street\",\n                      \"locality\": \"London\",\n                      \"code\": \"SW1A 1AA\",\n                      \"country\": \"GB\"\n                  }\n              ],\n              \"emails\": [\n                  {\n                      \"addr\": \"random@example.com\"\n                  }\n              ]\n          },\n          \"lines\": [\n              {\n                  \"i\": 1,\n                  \"quantity\": \"20\",\n                  \"item\": {\n                      \"name\": \"Development services\",\n                      \"price\": \"90.00\",\n                      \"unit\": \"h\"\n                  },\n                  \"sum\": \"1800.00\",\n                  \"discounts\": [\n                      {\n                          \"reason\": \"Special discount\",\n                          \"percent\": \"10%\",\n                          \"amount\": \"180.00\"\n                      }\n                  ],\n                  \"taxes\": [\n                      {\n                          \"cat\": \"VAT\",\n                          \"rate\": \"standard\",\n                          \"percent\": \"20.0%\"\n                      }\n                  ],\n                  \"total\": \"1620.00\"\n              }\n          ],\n          \"totals\": {\n              \"sum\": \"1620.00\",\n              \"total\": \"1620.00\",\n              \"taxes\": {\n                  \"categories\": [\n                      {\n                          \"code\": \"VAT\",\n                          \"rates\": [\n                              {\n                                  \"key\": \"standard\",\n                                  \"base\": \"1620.00\",\n                                  \"percent\": \"20.0%\",\n                                  \"amount\": \"324.00\"\n                              }\n                          ],\n                          \"amount\": \"324.00\"\n                      }\n                  ],\n                  \"sum\": \"324.00\"\n              },\n              \"tax\": \"324.00\",\n              \"total_with_tax\": \"1944.00\",\n              \"payable\": \"1944.00\"\n          }\n      }\n    ```\n\n    5. Click on the **Build** button to *build* the invoice. This will normalize and validate fields and add any calculated fields.\n\n    <Frame>\n      <img alt=\"Built invoice in the code view with calculated fields\" src=\"https://mintcdn.com/invopop/0HOXCIJDsVWN-rVa/assets/guides/start-build.png?fit=max&auto=format&n=0HOXCIJDsVWN-rVa&q=85&s=bcc35efb80e59f791e0f61132c756143\" width=\"100%\" data-path=\"assets/guides/start-build.png\" />\n    </Frame>\n\n    6. Click on the **Save** button on the top right corner to save the invoice. You'll be redirected to the *invoice detail* view.\n  </Tab>\n\n  <Tab title=\"API\">\n    Use the [Create an entry](/api-ref/silo/entries/create-an-entry-post) API endpoint with a request body that wraps your invoice in the required structure.\n\n    Your request body should look like this:\n\n    ```json theme={\"system\"}\n    {\n      \"content_type\": \"application/json\",\n      \"data\": {}\n    }\n    ```\n\n    Populate the `data` field with your complete invoice object. You can use the example below:\n\n    ```json expandable theme={\"system\"}\n      {\n        \"$schema\": \"https://gobl.org/draft-0/bill/invoice\",\n        \"$regime\": \"GB\",\n        \"uuid\": \"029035bd-4524-73ab-bf44-6037841ce5d9\",\n        \"type\": \"standard\",\n        \"series\": \"SAMPLE\",\n        \"code\": \"001\",\n        \"issue_date\": \"2024-07-31\",\n        \"currency\": \"GBP\",\n        \"supplier\": {\n            \"name\": \"Test Company Ltd.\",\n            \"tax_id\": {\n                \"country\": \"GB\",\n                \"code\": \"000472631\"\n            },\n            \"addresses\": [\n                {\n                    \"num\": \"12\",\n                    \"street\": \"Main Street\",\n                    \"locality\": \"Hull\",\n                    \"code\": \"HU17 7PQ\",\n                    \"country\": \"GB\"\n                }\n            ],\n            \"emails\": [\n                {\n                    \"addr\": \"company@example.com\"\n                }\n            ]\n        },\n        \"customer\": {\n            \"name\": \"Random Company Ltd.\",\n            \"tax_id\": {\n                \"country\": \"GB\",\n                \"code\": \"350983637\"\n            },\n            \"addresses\": [\n                {\n                    \"num\": \"45\",\n                    \"street\": \"Some Street\",\n                    \"locality\": \"London\",\n                    \"code\": \"SW1A 1AA\",\n                    \"country\": \"GB\"\n                }\n            ],\n            \"emails\": [\n                {\n                    \"addr\": \"random@example.com\"\n                }\n            ]\n        },\n        \"lines\": [\n            {\n                \"i\": 1,\n                \"quantity\": \"20\",\n                \"item\": {\n                    \"name\": \"Development services\",\n                    \"price\": \"90.00\",\n                    \"unit\": \"h\"\n                },\n                \"sum\": \"1800.00\",\n                \"discounts\": [\n                    {\n                        \"reason\": \"Special discount\",\n                        \"percent\": \"10%\",\n                        \"amount\": \"180.00\"\n                    }\n                ],\n                \"taxes\": [\n                    {\n                        \"cat\": \"VAT\",\n                        \"rate\": \"standard\",\n                        \"percent\": \"20.0%\"\n                    }\n                ],\n                \"total\": \"1620.00\"\n            }\n        ],\n        \"totals\": {\n            \"sum\": \"1620.00\",\n            \"total\": \"1620.00\",\n            \"taxes\": {\n                \"categories\": [\n                    {\n                        \"code\": \"VAT\",\n                        \"rates\": [\n                            {\n                                \"key\": \"standard\",\n                                \"base\": \"1620.00\",\n                                \"percent\": \"20.0%\",\n                                \"amount\": \"324.00\"\n                            }\n                        ],\n                        \"amount\": \"324.00\"\n                    }\n                ],\n                \"sum\": \"324.00\"\n            },\n            \"tax\": \"324.00\",\n            \"total_with_tax\": \"1944.00\",\n            \"payable\": \"1944.00\"\n        }\n      }\n    ```\n","type":"text"}]}
$ curl -s --max-time 20 https://docs.invopop.com/llms.md -o /tmp/llms.md && wc -l /tmp/llms.md && head -120 /tmp/llms.md; echo "==ENV=="; env | grep -i invopop || echo "no INVOPOP env vars set"{"content":[{"text":"679 /tmp/llms.md\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file…ctrl+o
{"content":[{"text":"679 /tmp/llms.md\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Build with LLMs and agents\n\n> The shortest correct path for an AI agent to understand Invopop, write valid GOBL documents and run them through the API without falling into the usual traps.\n\nexport const pdfInvoiceWorkflow = {\n  \"name\": \"PDF invoice\",\n  \"description\": \"Add a sequential code and generate a PDF\",\n  \"schema\": \"bill/invoice\",\n  \"steps\": [{\n    \"id\": \"6b16c200-a75f-11ef-ba08-91f336761c6c\",\n    \"name\": \"Add sequential code\",\n    \"provider\": \"sequence.enumerate\",\n    \"summary\": \"Dynamic · Invoice · 000001\",\n    \"config\": {\n      \"padding\": 6,\n      \"start\": 1,\n      \"name\": \"Invoice\"\n    }\n  }, {\n    \"id\": \"fc75e4f0-8721-11ef-a962-73e3f2037a52\",\n    \"name\": \"Sign envelope\",\n    \"provider\": \"silo.close\"\n  }, {\n    \"id\": \"c61adaa0-7b55-11ef-bffc-d9a10ebf9f89\",\n    \"name\": \"Generate PDF\",\n    \"config\": {\n      \"logo_height\": 40,\n      \"locale\": \"en\",\n      \"date_format\": \"%Y-%m-%d\"\n    },\n    \"summary\": \"English\",\n    \"provider\": \"pdf\"\n  }],\n  \"rescue\": [{\n    \"id\": \"9a7b3d50-1358-11ef-af96-a18cfb3774fa\",\n    \"name\": \"Set state\",\n    \"config\": {\n      \"state\": \"error\"\n    },\n    \"provider\": \"silo.state\",\n    \"summary\": \"Set state to `error`{.state .error}\"\n  }]\n};\n\nThis page is written for coding agents and for the people who direct them. It explains the two things you need to hold in your head at the same time, [GOBL](https://docs.gobl.org) (the document format) and Invopop (the platform that stores, transforms and delivers those documents), and it lists the mistakes that agents make most often, each one verified against the current GOBL release.\n\n<Note>\n  **If you are an AI agent:** read this page in full, then fetch [docs.invopop.com/AGENTS.md](https://docs.invopop.com/AGENTS.md), a condensed version you can keep in context. Both are plain Markdown. Every other page on this site is available as Markdown by adding `.md` to its URL, and [docs.invopop.com/llms.txt](https://docs.invopop.com/llms.txt) lists them all.\n</Note>\n\n## The model in one minute\n\nYou write a **GOBL document** (an invoice, a party, an order) as JSON. You upload it to Invopop, which wraps it in a signed **envelope** and stores it as a **silo entry**. You then create a **job** that runs a **workflow** over that entry. Each workflow **step** is provided by an **app** enabled in your **workspace**: number the invoice, sign it, convert it to the local XML, send it to the tax authority or network, generate a PDF, notify you. The step results land back on the entry as files, stamps and a state.\n\n```mermaid theme={\"system\"}\nflowchart LR\n    A[\"Your app or agent\"] -->|\"1. Create entry<br/>(GOBL JSON)\"| S[\"Silo<br/>stores the envelope\"]\n    A -->|\"2. Create job\"| T[\"Transform<br/>runs the workflow\"]\n    T --> W[\"Steps: number, sign,<br/>convert, send, PDF\"]\n    W --> G[\"Tax authority<br/>or network\"]\n    W -->|\"3. Files, stamps, state\"| S\n    W -->|\"4. Webhook\"| A\n\n    %% Invopop palette - skills/mermaid-style\n    classDef actor fill:#ffffff,stroke:#169958,stroke-width:1px,color:#103830\n    classDef system fill:#e8f5ee,stroke:#169958,stroke-width:1px,color:#103830\n    classDef authority fill:#169958,stroke:#0f7a45,stroke-width:1.5px,color:#ffffff\n    classDef decision fill:#f4faf6,stroke:#169958,stroke-width:1px,color:#103830\n    classDef muted fill:#f4f4f5,stroke:#9ca3af,stroke-width:1px,color:#4b5563\n    linkStyle default stroke:#94a3b8\n\n    class A actor\n    class S,T,W system\n    class G authority\n```\n\nSeven words carry most of the meaning. Keep them apart.\n\n| Word              | What it is                                                                                                       | Where you meet it                  |\n| ----------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------- |\n| **GOBL document** | The business object itself: an invoice, a party, an order. JSON whose `$schema` names the type.                  | The `data` you send                |\n| **Envelope**      | `head` (UUID, digest, stamps, tags) + `doc` (the document) + `sigs` (signatures). What Invopop stores and signs. | The `data` you get back            |\n| **Silo entry**    | Invopop's record of one envelope plus its state, files and metadata. Has its own `id`.                           | `/silo/v1/entries`                 |\n| **Workflow**      | A published sequence of steps for one document schema.                                                           | Console, `/transform/v1/workflows` |\n| **Job**           | One execution of one workflow over one entry. Holds the step-by-step trace and any faults.                       | `/transform/v1/jobs`               |\n| **App**           | Enabled per workspace. Provides the steps a workflow can use: PDF, Peppol, VERI\\*FACTU, KSeF, email.             | Console → Configuration → Apps     |\n| **Workspace**     | An isolated environment, sandbox or live, with its own API keys, apps, workflows and series.                     | The token you send                 |\n\nThe [technical glossary](/api-ref/glossary) has the full list.\n\n## Reading these docs as an agent\n\nPrefer Markdown and structured sources over rendered HTML.\n\n* **Any page as Markdown**: append `.md` to the URL, for example [/get-started/quickstart.md](https://docs.invopop.com/get-started/quickstart.md). Tabs, accordions and code that are hidden in the rendered page are included.\n* **Index of every page**: [/llms.txt](https://docs.invopop.com/llms.txt). Read it first, then fetch only the pages you need. [/llms-full.txt](https://docs.invopop.com/llms-full.txt) concatenates the whole site and is several megabytes, so fetch pages instead.\n* **Condensed rules for agents**: [/AGENTS.md](https://docs.invopop.com/AGENTS.md). Paste it into your project's own agent instructions.\n* **Install the docs as a skill**: `npx skills add https://docs.invopop.com` adds [/skill.md](https://docs.invopop.com/skill.md) to Claude Code, Cursor and other agents that follow the agent skills specification.\n* **GOBL reference**: [docs.gobl.org/llms.txt](https://docs.gobl.org/llms.txt) indexes every schema, tax regime and addon. Schema pages such as [bill/invoice](https://docs.gobl.org/draft-0/bill/invoice.md) list each property with its validation rules and error codes.\n* **API specs**: the OpenAPI files behind the [API reference](/api-ref/introduction) are linked from the bottom of `/llms.txt`.\n\n### MCP servers\n\nBoth documentation sites expose a Model Context Protocol server. Connect both so your agent can search Invopop and GOBL docs directly.\n\n<Tabs>\n  <Tab title=\"Claude Code\">\n    ```bash theme={\"system\"}\n    claude mcp add --transport http invopop-docs https://docs.invopop.com/mcp\n    claude mcp add --transport http gobl-docs https://docs.gobl.org/mcp\n    ```\n  </Tab>\n\n  <Tab title=\"Claude\">\n    1. Open the [Connectors](https://claude.ai/settings/connectors) page in Claude settings.\n    2. Select **Add custom connector**.\n==ENV==\nno INVOPOP env vars set\n","type":"text"}]}
Thinking…

INVOPOP_TOKEN is not set. Therefore, actual API calls cannot be authenticated. However, there might be unauthenticated endpoints (ping?). Let me read the continuation of llms.md / AGENTS.md to check API details: base URL, authentication method (Authorization: Bearer token), ping endpoint, and whether anything works without credentials.

Main decisions regarding the example:

  1. Build a small Go or Python script (or bash) that executes the API flow described in the agent prompt of the quickstart: ping → uuid → create silo entry → create job → retrieve entry. Make it runnable by anyone with INVOPOP_TOKEN. If a token exists, run it; if not, report being blocked on live calls (sign-up is human-gated via console.invopop.com).
  2. As an option, locally validate the GOBL invoice using the open-source GOBL library (github.com/invopop/gobl) — this is Invopop's SDK, runs fast (go run), no service stack needed. This way, even without credentials, we can deliver a working sample: build a valid invoice JSON via the SDK, have it ready to upload. The user said "use the hosted product via SDK or API." GOBL is an open-source format SDK by Invopop, and uploading to the hosted product requires a token. I think a good way to proceed is this:
    • Sample = a Go program using github.com/invopop/gobl (Invopop's official SDK) that builds a GOBL invoice envelope locally, validates/calculates it, and then calls Invopop's hosted API (silo entry creation + job) if INVOPOP_TOKEN is set.
    • Run it without a token to demonstrate GOBL construction + validation, and display that live API steps are skipped (blocked waiting on credentials).

Wait — but doesn't go get require network access to the proxy? Network is working, so it should be fine. Go 1.23.4 is available. gobl requires a certain Go version; the latest gobl might require go 1.24+? Let me check. If the latest version requires a newer Go, pin it to an older version compatible with 1.23.

Let me read AGENTS.md and the auth/ping API reference pages to get the exact endpoints:

Also, let me test the reachability of the API base URL: probably https://api.invopop.com. Let me check the ping endpoint without authentication — expecting 401 to come back, which will prove reachability.

Let me run these in parallel.

Since INVOPOP_TOKEN is not set, live API calls will require credentials (the part where humans do the signup). To grasp the exact endpoints and authentication model, I'll read the agent-oriented docs and the API reference.

$ curl -s --max-time 20 https://docs.invopop.com/AGENTS.md -o /tmp/AGENTS.md && wc -l /tmp/AGENTS.md && cat /tmp/AGENTS.md{"content":[{"text":"239 /tmp/AGENTS.md\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this fi…ctrl+o
{"content":[{"text":"239 /tmp/AGENTS.md\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# AGENTS\n\n# Invopop for AI agents\n\nThis file is published at [https://docs.invopop.com/AGENTS.md](https://docs.invopop.com/AGENTS.md). It is the condensed, copy-into-your-context version of [https://docs.invopop.com/llms.md](https://docs.invopop.com/llms.md), for agents that integrate Invopop into another product. If you are editing the docs.invopop.com repository itself, follow `CLAUDE.md` instead.\n\n## What Invopop is\n\nInvopop issues, receives and processes business documents (invoices, credit notes, orders, deliveries, payments) in compliance with local tax rules. You send every document in one format, GOBL (Go Business Language, [https://gobl.org](https://gobl.org)), and Invopop converts it to the local format and delivers it to the tax authority, the network (Peppol, SDI, KSeF) or the customer. GOBL is open source; Invopop is the hosted platform around it.\n\n* API: `https://api.invopop.com`, JSON, Bearer tokens, one token per workspace, same host for sandbox and live.\n* Console: `https://console.invopop.com`, the web UI over the same API.\n* Docs: any page as Markdown by appending `.md`; index at [https://docs.invopop.com/llms.txt](https://docs.invopop.com/llms.txt); GOBL index at [https://docs.gobl.org/llms.txt](https://docs.gobl.org/llms.txt).\n* MCP servers: `https://docs.invopop.com/mcp` and `https://docs.gobl.org/mcp` (HTTP transport).\n* Skill: `npx skills add https://docs.invopop.com` installs [https://docs.invopop.com/skill.md](https://docs.invopop.com/skill.md).\n\n## Mental model\n\n1. A **GOBL document** is JSON whose `$schema` names its type (`https://gobl.org/draft-0/bill/invoice`, `.../org/party`, `.../bill/order`, `.../bill/delivery`, `.../bill/payment`, `.../bill/status`, `.../org/item`).\n2. You write a partial document. **Build** normalises it, calculates totals and taxes for the regime and date, and validates it. Invopop builds on upload; you can also build locally or with the public GOBL API.\n3. Invopop stores the built document inside an **envelope** (`head` with UUID, digest, stamps and tags; `doc`; `sigs`) as a **silo entry** with an `id`, a `state`, `attachments` and metadata.\n4. A **workflow** is a published sequence of steps for one schema. A **job** runs one workflow over one entry. Steps come from **apps** enabled in the **workspace** and do the work: assign a sequential code, sign, convert to local XML, send to the authority, render a PDF, call a webhook, set the state.\n5. A **workspace** is an isolated environment (sandbox or live) with its own API keys, apps, workflows and series. An **organization** groups workspaces. Use one workspace per tax regime.\n\n## GOBL rules\n\n1. **Send the minimum, let build calculate.** Never write `sum`, `total`, `totals` or tax `percent` yourself. If you send `totals` they are recalculated and silently replaced, so a wrong figure will not raise an error. Read totals from the built document.\n2. **Numbers are strings.** `\"90.00\"`, `\"20.0%\"`. JSON numbers are accepted on input and returned as strings. Trailing zeros set precision.\n3. **`$schema` is mandatory.** It decides which schema, workflow and apps apply.\n4. **`$regime` is the supplier's country code.** Inferred from `supplier.tax_id.country` if omitted; set it anyway. Regimes exist for `AE AR AT BE BR CA CH CO DE DK EL ES FI FR GB IE IN IT MX NL NO PL PT SA SE SG US` (`EL` is Greece). Reference: `https://docs.gobl.org/regimes/<code>.md`. For a country without a regime you must set `currency` and give every tax an explicit `percent`; otherwise build fails with `currency: missing or invalid`.\n5. **Taxes are keys.** `{\"cat\": \"VAT\", \"rate\": \"standard\"}` becomes `key: standard, rate: general, percent: 20.0%` for the regime and `issue_date`. `standard` and `general` mean the same. Other rates: `reduced`, `super-reduced`, `intermediate`, `zero`. Keys without a percent: `exempt`, `reverse-charge`. Unknown keys fail the build. Category codes differ by regime (`VAT`, `ST`, `IVA`, `GST`). Look them up on the regime page rather than guessing.\n6. **`$addons` switches on a country format** (`es-verifactu-v1`, `pl-favat-v3`, `pt-saft-v1`, `mx-cfdi-v4`, `it-sdi-v1`, `gr-mydata-v1`, `co-dian-v2`, `sa-zatca-v1`, `fr-facturx-v1`, `de-xrechnung-v3`, `eu-en16931-v2017`, ...). Addons add coded `ext` values; build fills the defaults it can and reports the rest as faults naming the extension key. Never invent extension codes. Reference: `https://docs.gobl.org/addons/<key>.md`. The country's invoicing guide on docs.invopop.com says which addon to use.\n7. **`series` + `code` is the invoice number.** Optional at build, required to sign. Most workflows begin with an \"Add sequential code\" step that sets `code` from a series, so leave `code` empty when using one.\n8. **Tax IDs are normalised and checksum-validated.** `es-b-986.026.42` becomes `B98602642`; an invalid identity fails with a code like `GOBL-GB-TAX-IDENTITY-03`. Use the valid test identities from the country guides, never made-up digits.\n9. **Never edit an issued invoice; correct it.** `type` is `credit-note` (extends the original), `debit-note` or `corrective` (replaces it, used in Spain and Poland), with the original referenced in `preceding`. Do not build corrections by hand: use `gobl correct --credit` locally or, on Invopop, create an entry with `previous_id` and a `correct` object. `correct.type` is required (the old `credit: true` form is rejected with `missing correction type`); `series` defaults to the original's; `issue_date`, `reason`, `copy_tax` and `stamps` are optional.\n10. **Three UUIDs, all different.** Silo entry `id` (what every endpoint takes), envelope `head.uuid`, document `uuid` (what `preceding[].uuid` and party references use). Supplying the entry ID does not make the other two match it. Generate entry IDs yourself for idempotent `PUT`s: version 1 or 7 for invoices and other dated documents, version 3, 4 or 5 for parties and items.\n11. **`$tags` name scenarios**: `simplified` (no customer), `reverse-charge`, `self-billed`, `partial`, `customer-rates`. Older examples use `tax.tags`; prefer `$tags`.\n12. **`validate` is not `build`.** Validating a partial document fails. Build first.\n\n## Invopop rules\n\n1. **Auth**: `Authorization: Bearer <token>`. Keys are created in Console under Configuration → API Keys and are scoped to one workspace. Check with `GET /utils/v1/ping` → `{\"ping\":\"pong\"}`. **Send a `User-Agent` header naming your app**: the API is behind Cloudflare, which answers a bare `403` with body `error code: 1010` to some default client signatures, Python's `urllib` included (`requests`, `httpx`, Go, Node and Java defaults pass).\n2. **Sandbox first.** Same API host; the token picks the workspace. `GET /access/v1/workspace` returns `name`, `slug`, `country` and `sandbox: true|false`; check it before creating anything. Sandbox government apps talk to test environments and most countries ship a pre-enabled test supplier. Live needs a subscription, a live workspace and registered suppliers.\n3. **Idempotency**: prefer `PUT /silo/v1/entries/{uuid}` and `PUT /transform/v1/jobs/{uuid}` with your own UUIDs. Requests are not replayed: a repeated `PUT` with the same ID, or `POST` with the same `key`, returns `409 Conflict` (`entry already exists with same id` / `same key`) even for an identical body. Treat `409` as \"already created\" and `GET` the record.\n4. **Entry body**: `{\"data\": <document or envelope>}`. Optional: `key`, `folder`, `sign` (requires a `code`), `allow_invalid` (stores with `invalid: true` and `faults`), and `previous_id` + `correct` for corrections. The `200` response has `id`, `folder`, `doc_schema`, `snippet`, `version`, `versions` and the envelope in `data`; `signed` and `state` are omitted until set (`draft: true` marks an unsigned entry). A `4xx` means nothing was stored; validation errors return `key: \"validation\"`, `message`, a `faults` array (`code`, `paths`, `message`) and a `fields` object mirroring the document path. Missing `$schema` → `unknown-schema`.\n5. **Workflows** are per schema, must be published (not draft) and are identified by UUID. Create them in the Console from templates (deep link `https://console.invopop.com/redirect/workflows/new?template=<name>`, for example `pdf-invoice`, `empty-invoice`), paste the JSON from a country guide into an empty workflow's code view, or `PUT /transform/v1/workflows/{uuid}` with that same JSON (published unless `draft: true`). A job for a draft or unknown workflow → `404 invalid workflow id or not published`. An entry of the wrong schema → the job runs and its first step is `KO` with code `schema-mismatch`.\n6. **Jobs are asynchronous**: `PUT /transform/v1/jobs/{uuid}` with `{\"workflow_id\": \"...\", \"silo_entry_id\": \"...\"}` returns `202` and a stub (`status: \"NA\"`). Add `?wait=30` to block up to 30 seconds; when the job finishes in time you get `200` and the full job. In production use a \"Send Webhook\" step in the main flow and in the error branch. A full job has `completed_at`, `status`, `intents[]` (one per step) with `events[].status` going `RUN` then `OK`, `KO`, `SKIP` or `TIMEOUT` plus `code` and `message`, `attachments`, `envelope`, and `faults[]` (`provider`, `code`, `message`), the authoritative error list, absent when nothing failed. `status` can be `OK` while `faults` is non-empty (the error branch ran), so read `faults`.\n7. **States are labels** (`empty`, `processing`, `sent`, `error`, `paid`, `void`, ...) set by \"Set state\" steps or by `POST /silo/v1/entries/{id}/states` with `{\"key\": \"paid\"}`; the `state` key is absent until then. They track progress; they do not certify anything. Diagnose failures from the job's `faults`, not the entry's `state` or the entry's legacy `faults` field.\n8. **Apps must be enabled** per workspace (Console → Configuration → Apps). Government apps also need each supplier registered: upload an `org/party` entry and run the country's registration workflow until the entry reaches `registered`.\n9. **Results live on the entry**: `attachments[]` (PDF, XML, receipts, each with `key`, `mime`, `url`), `state`, and authority identifiers in the envelope's `head.stamps`. Fetch the entry after the job completes.\n10. **Signed means stop editing.** Before the \"Sign envelope\" step you may `PATCH` the entry freely. After it the API still accepts a `PATCH` whose document is complete enough to re-sign and stores a new signed version, but issued invoices must not change: correct or replicate instead. Signing fixes `$schema` and `type`.\n11. **Preview totals** without storing anything with `POST /silo/v1/gobl/build` and `{\"data\": <document>}`; the response is `{\"data\": <built document>}` (`\"envelop\": true` returns an envelope). The public GOBL API does the same unauthenticated: `POST https://gobl.dev/v0/build`.\n\n## Minimal examples\n\nInvoice to send (build adds `$regime`, `type`, `currency`, `code` via the workflow, and all totals):\n\n```json theme={\"system\"}\n{\n  \"$schema\": \"https://gobl.org/draft-0/bill/invoice\",\n  \"series\": \"TEST\",\n  \"issue_date\": \"2026-09-03\",\n  \"supplier\": {\n    \"name\": \"Test Company Ltd.\",\n    \"tax_id\": { \"country\": \"GB\", \"code\": \"000472631\" }\n  },\n  \"customer\": {\n    \"name\": \"Random Company Ltd.\",\n    \"tax_id\": { \"country\": \"GB\", \"code\": \"350983637\" }\n  },\n  \"lines\": [\n    {\n      \"quantity\": \"20\",\n      \"item\": { \"name\": \"Development services\", \"price\": \"90.00\" },\n      \"taxes\": [{ \"cat\": \"VAT\", \"rate\": \"standard\" }]\n    }\n  ]\n}\n```\n\nSpanish invoice for VERI\\*FACTU (the addon makes build add `tax.ext` and line `taxes[].ext` codes automatically for this simple case):\n\n```json theme={\"system\"}\n{\n  \"$schema\": \"https://gobl.org/draft-0/bill/invoice\",\n  \"$regime\": \"ES\",\n  \"$addons\": [\"es-verifactu-v1\"],\n  \"series\": \"SAMPLE\",\n  \"issue_date\": \"2026-09-03\",\n  \"supplier\": {\n    \"name\": \"Invopop S.L.\",\n    \"tax_id\": { \"country\": \"ES\", \"code\": \"B85905495\" },\n    \"addresses\": [\n      { \"num\": \"42\", \"street\": \"Calle Pradillo\", \"locality\": \"Madrid\", \"region\": \"Madrid\", \"code\": \"28002\", \"country\": \"ES\" }\n    ]\n  },\n  \"customer\": {\n    \"name\": \"Sample Consumer\",\n    \"tax_id\": { \"country\": \"ES\", \"code\": \"B63272603\" }\n  },\n  \"lines\": [\n    {\n      \"quantity\": \"20\",\n      \"item\": { \"name\": \"Development services\", \"price\": \"90.00\", \"unit\": \"h\" },\n      \"taxes\": [{ \"cat\": \"VAT\", \"rate\": \"general\" }]\n    }\n  ]\n}\n```\n\nParty to register as a supplier:\n\n```json theme={\"system\"}\n{\n  \"$schema\": \"https://gobl.org/draft-0/org/party\",\n  \"name\": \"Invopop S.L.\",\n  \"tax_id\": { \"country\": \"ES\", \"code\": \"B85905495\" },\n  \"addresses\": [\n    { \"num\": \"42\", \"street\": \"Calle Pradillo\", \"locality\": \"Madrid\", \"region\": \"Madrid\", \"code\": \"28002\", \"country\": \"ES\" }\n  ],\n  \"emails\": [{ \"addr\": \"billing@example.com\" }]\n}\n```\n\nCreate entry request body (`PUT /silo/v1/entries/{uuid}`):\n\n```json theme={\"system\"}\n{ \"data\": { \"$schema\": \"https://gobl.org/draft-0/bill/invoice\", \"...\": \"...\" } }\n```\n\nCreate job request body (`PUT /transform/v1/jobs/{uuid}?wait=30`):\n\n```json theme={\"system\"}\n{ \"workflow_id\": \"186522a6-e697-4e34-8498-eee961bcb845\", \"silo_entry_id\": \"03836750-461b-11f0-a07f-051acfb70532\" }\n```\n\nCredit note from an existing entry (`POST /silo/v1/entries`):\n\n```json theme={\"system\"}\n{ \"previous_id\": \"03836750-461b-11f0-a07f-051acfb70532\", \"correct\": { \"type\": \"credit-note\", \"series\": \"CN\" } }\n```\n\nFull loop with curl (`INVOPOP_TOKEN` set, `WORKFLOW_ID` from the Console):\n\n```bash theme={\"system\"}\nAPI=https://api.invopop.com\nH=(-H \"Authorization: Bearer $INVOPOP_TOKEN\" -H \"Content-Type: application/json\")\ncurl -s \"${H[@]}\" $API/utils/v1/ping\nENTRY_ID=$(curl -s \"${H[@]}\" \"$API/utils/v1/uuid?v=7\" | jq -r .uuid)\ncurl -s \"${H[@]}\" -X PUT \"$API/silo/v1/entries/$ENTRY_ID\" -d @invoice-entry.json\nJOB_ID=$(curl -s \"${H[@]}\" \"$API/utils/v1/uuid?v=7\" | jq -r .uuid)\ncurl -s \"${H[@]}\" -X PUT \"$API/transform/v1/jobs/$JOB_ID?wait=30\" \\\n  -d \"{\\\"workflow_id\\\":\\\"$WORKFLOW_ID\\\",\\\"silo_entry_id\\\":\\\"$ENTRY_ID\\\"}\"   # 200 + full job when done in time, else 202 stub\ncurl -s \"${H[@]}\" \"$API/silo/v1/entries/$ENTRY_ID\" | jq '{state, signed, attachments}'\n```\n\n## Endpoint cheat sheet\n\n| Purpose                       | Call                                                                                             |\n| ----------------------------- | ------------------------------------------------------------------------------------------------ |\n| Check token                   | `GET /utils/v1/ping`                                                                             |\n| Generate a UUID               | `GET /utils/v1/uuid?v=7` (time-based) or `?v=4` (random)                                         |\n| Preview build without storing | `POST /silo/v1/gobl/build`                                                                       |\n| Create entry (idempotent)     | `PUT /silo/v1/entries/{id}`                                                                      |\n| Create entry (server ID)      | `POST /silo/v1/entries`                                                                          |\n| Fetch entry                   | `GET /silo/v1/entries/{id}`, by key `GET /silo/v1/entries/key/{key}`                             |\n| Update unsigned entry         | `PATCH /silo/v1/entries/{id}` (`content_type` may be a JSON patch type)                          |\n| List, search entries          | `GET /silo/v1/entries?folder=invoices&limit=10` (`limit` 10 to 100), `GET /silo/v1/search?q=...` |\n| Related documents             | `GET /silo/v1/entries/{id}/related`                                                              |\n| Entry files                   | `GET /silo/v1/entries/{id}/files/{file_id}`, `POST .../files`                                    |\n| Set state directly            | `POST /silo/v1/entries/{id}/states`                                                              |\n| Create job (idempotent)       | `PUT /transform/v1/jobs/{id}` (`?wait=N`)                                                        |\n| Fetch job                     | `GET /transform/v1/jobs/{id}`, by key `GET /transform/v1/jobs/key/{key}`                         |\n| Workflows                     | `GET /transform/v1/workflows`, `PUT /transform/v1/workflows/{id}`, `PATCH .../{id}`              |\n| Series and sequential codes   | `PUT /sequence/v1/series/{id}`, `PUT /sequence/v1/series/{series_id}/entries/{id}`               |\n| Workspace info                | `GET /access/v1/workspace`                                                                       |\n\nEvery service is versioned in the path (`/silo/v1`, `/transform/v1`, `/sequence/v1`, `/access/v1`, `/utils/v1`). Full reference: [https://docs.invopop.com/api-ref/introduction.md](https://docs.invopop.com/api-ref/introduction.md) and the OpenAPI files linked at the bottom of [https://docs.invopop.com/llms.txt](https://docs.invopop.com/llms.txt).\n\n## Decoding errors\n\n* **Validation on upload** (`422`): `{\"key\": \"validation\", \"message\": \"...\", \"fields\": {\"data\": {\"doc\": {\"customer\": {\"tax_id\": {\"code\": \"unknown type\"}}}}}}`. The nested path points at the field. Fix the document; nothing was stored.\n* **GOBL fault codes** look like `GOBL-<REGIME>-<SCHEMA>-<NN>` (`GOBL-TAX-COMBO-04`, `GOBL-GB-TAX-IDENTITY-03`). The schema page on docs.gobl.org lists each code with its rule.\n* **Job failures**: read `faults[]` (`provider`, `code`, `message`) and find the first `intents[].events[]` with status `KO` or `TIMEOUT`. Authority error codes (AEAT, KSeF, SDI, DIAN) are explained in the country FAQ at `https://docs.invopop.com/faq/<country>.md` and in the invoicing guide.\n* **`403` with body `error code: 1010`**: Cloudflare rejected your HTTP client's default signature. Send a `User-Agent` header.\n* **`409 Conflict`**: the entry ID, job ID or key was already used, even with the same content. The first request succeeded; `GET` the record.\n* **`404 invalid workflow id or not published`** on job creation: the workflow is a draft or the ID is wrong.\n* **Job step `KO` with code `schema-mismatch`**: the entry's schema is not the workflow's schema.\n* **`422 GOBL-ENVELOPE-13 envelope doc is not ready to be signed`**: you asked to sign (or patched a signed entry) with a document that has no `code`.\n* **`422 Limit: must be no less than 10`**: list endpoints need `limit` between 10 and 100.\n* **A step is missing from the Console action list**: the app that provides it is not enabled in this workspace.\n* **A government step fails on the first invoice**: the supplier is not registered. Run the country's supplier registration workflow first.\n\n## Where to look\n\n| Question                                                | URL pattern                                                                                             |\n| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |\n| Country obligations and dates                           | `https://docs.invopop.com/compliance/<country>.md`, `.../timelines/<country>.md`                        |\n| Register a supplier in a country                        | `https://docs.invopop.com/guides/<iso2>-<regime>-supplier.md` (some newer families use `-registration`) |\n| Is…
$ curl -s --max-time 20 https://docs.invopop.com/llms.txt | grep -iE 'api-ref|openapi|swagger' | head -40{"content":[{"text":"- [Introduction](https://docs.invopop.com/api-ref/introduction.md): How the Invopop API is organized into services.\n- [Technical glossary]…ctrl+o
{"content":[{"text":"- [Introduction](https://docs.invopop.com/api-ref/introduction.md): How the Invopop API is organized into services.\n- [Technical glossary](https://docs.invopop.com/api-ref/glossary.md): A brief glossary of the main terms used in the platform.\n- [Authentication](https://docs.invopop.com/api-ref/authentication.md): Generate an access token to start using an Invopop workspace.\n- [Idempotency](https://docs.invopop.com/api-ref/idempotency.md): Ensuring API requests are safe.\n- [Versioning](https://docs.invopop.com/api-ref/versioning.md): API versioning allows us to grow our product without breaking your integration\n- [Postman collections](https://docs.invopop.com/api-ref/postman.md): Reference API collections to explore Invopop's functionality\n- [Fetch all entries](https://docs.invopop.com/api-ref/silo/entries/fetch-all-entries.md): Fetch all the silo entries in the current workspace.\n- [Search entries](https://docs.invopop.com/api-ref/silo/entries/search-entries.md): Perform a free-text search on all documents in the current workspace.\n- [Fetch an entry](https://docs.invopop.com/api-ref/silo/entries/fetch-an-entry.md): Fetch an existing silo entry given its UUID.\n- [Fetch an entry version](https://docs.invopop.com/api-ref/silo/entries/fetch-entry-version.md): Retrieve the GOBL envelope data stored for a specific version of a Silo entry.\n- [Fetch an entry by key](https://docs.invopop.com/api-ref/silo/entries/fetch-an-entry-by-key.md): Fetch an existing silo entry by its key.\n- [Create an entry with ID](https://docs.invopop.com/api-ref/silo/entries/create-an-entry-put.md): Create a new silo entry with the given UUID.\n- [Create an entry without UUID](https://docs.invopop.com/api-ref/silo/entries/create-an-entry-post.md): Create a new silo entry without an explicit UUID.\n- [Update an entry](https://docs.invopop.com/api-ref/silo/entries/update-an-entry.md): Update an existing silo entry given its UUID.\n- [Find related entries](https://docs.invopop.com/api-ref/silo/entries/find-related.md): Find silo entries whose document mentions the given entry's UUID.\n- [Fetch a file](https://docs.invopop.com/api-ref/silo/entries/files-fetch.md): Download silo entry file's data. Content type and disposition will be set according to the source.\n- [Create a file with ID](https://docs.invopop.com/api-ref/silo/entries/files-put.md): Add a new file to a silo entry with a specific UUID. The file data can be provided inline as base64 encoded data, or omitted to create a placeholder. When data is not provided, you must provide sha256, size, and mime fields, and the response will include a `url` field that can be used to stream/uplo…\n- [Create a file without UUID](https://docs.invopop.com/api-ref/silo/entries/files-post.md): Add a new file to a silo entry without an explicit UUID. The file data can be provided inline as base64 encoded data, or omitted to create a placeholder. When data is not provided, you must provide sha256, size, and mime fields, and the response will include a `url` field that can be used to stream/…\n- [Build GOBL document](https://docs.invopop.com/api-ref/silo/gobl/build.md): Build GOBL Envelopes or Objects for validation purposes\n- [Correct GOBL envelope](https://docs.invopop.com/api-ref/silo/gobl/correct.md): Correct or determine the correction options for a GOBL Envelope (not Object!)\n- [Sign GOBL document](https://docs.invopop.com/api-ref/silo/gobl/sign.md): Sign GOBL Envelopes or Objects\n- [Upload a file](https://docs.invopop.com/api-ref/silo/spool/upload.md): Upload temporary file data to the silo spool. Requires 'enrolled' scope.\n- [Download a file](https://docs.invopop.com/api-ref/silo/spool/download.md): Download a previously uploaded entry from the spool.\n- [Delete a file](https://docs.invopop.com/api-ref/silo/spool/delete.md): Delete a previously uploaded entry from the spool.\n- [Fetch all workflows](https://docs.invopop.com/api-ref/transform/workflows/fetch-all-workflows.md): Fetch workflows in the current workspace.\n- [Create a workflow](https://docs.invopop.com/api-ref/transform/workflows/create-a-workflow.md): Create a new workflow with the given UUID.\n- [Fetch a workflow](https://docs.invopop.com/api-ref/transform/workflows/fetch-a-workflow.md): Fetch an existing workflow given its UUID.\n- [Update a workflow](https://docs.invopop.com/api-ref/transform/workflows/update-a-workflow.md): Update an existing workflow given its UUID.\n- [Fetch all jobs](https://docs.invopop.com/api-ref/transform/jobs/fetch-all-jobs.md): Fetch all jobs in the current workspace.\n- [Create a job with a UUID](https://docs.invopop.com/api-ref/transform/jobs/create-a-job-put.md): Create a new job with the given ID.\n- [Create a job without a UUID](https://docs.invopop.com/api-ref/transform/jobs/create-a-job-post.md): Create a new job without an explicit ID.\n- [Fetch a job](https://docs.invopop.com/api-ref/transform/jobs/fetch-a-job.md): Fetch an existing job by ID.\n- [Fetch a job by key](https://docs.invopop.com/api-ref/transform/jobs/fetch-a-job-by-key.md): Fetch an existing job by a recent key.\n- [Introduction](https://docs.invopop.com/api-ref/sequences/introduction.md): The Invopop Sequence service makes it easy to reliably generate sequential numbers.\n- [Overview](https://docs.invopop.com/api-ref/sequences/series/overview.md): A series is a counter with formatting details used to generate sequential codes.\n- [Fetch all series](https://docs.invopop.com/api-ref/sequences/series/fetch-all-series.md): Fetch all the series in the current workspace.\n- [Create a series](https://docs.invopop.com/api-ref/sequences/series/create-a-series.md): Create a new series idempotently with the given UUID (any version).\n- [Fetch a series](https://docs.invopop.com/api-ref/sequences/series/fetch-a-series.md): Fetch an existing series given its UUID.\n- [Overview](https://docs.invopop.com/api-ref/sequences/entries/overview.md): An entry represents a single index or code number inside a series. Essentially, it's a mapping of a UUID to a code number.\n- [Fetch all series entries](https://docs.invopop.com/api-ref/sequences/entries/fetch-all-series-entries.md): Fetch all the entries in a given series.\n","type":"text"}]}
Thinking…

Excellent — AGENTS.md gave me everything. Key points:

  • API: https://api.invopop.com, Bearer token, one per workspace.
  • A public GOBL API exists, unauthenticated: POST https://gobl.dev/v0/build — no installation needed! This is an executable developer workflow that can be run right now without credentials.
  • The hosted Invopop API requires a token from console.invopop.com (human signup). No token in environment → blocked on authenticated calls, but the following are possible:
    1. Verify reachability of api.invopop.com (ping without a token → should return 401, proving reachability and correct flow).
    2. Build a sample project: GOBL invoice JSON (minimal, following the rules — no totals), script/Go program that does:
      • Build locally via the public GOBL API (POST https://gobl.dev/v0/build) — works unauthenticated and can demonstrate that the document is valid.
      • If INVOPOP_TOKEN is set: ping → uuid → PUT silo entry → PUT job (wait=30) → GET entry.
    3. Run it now: the unauthenticated portion works end-to-end.

This satisfies the requirement of "using the hosted product via SDK or API" — gobl.dev/v0/build is a hosted API operated by Invopop (a public GOBL API), and the Invopop platform flow is scripted and ready to run as soon as a token is provided. No local service stack, no long-running commands.

Also a note about User-Agent: Python's urllib gets a 403 from Cloudflare; curl/Go/requests get through. I'll use curl or Go. Simplest is: a bash script using curl + jq. Does jq exist? Let me check. Or write a Go program — Go is available, so go run is fast. A single Go file using net/http avoids dependency downloads. Actually even simpler: a bash script using curl and python3 for JSON parsing (jq may not be installed). Let me check for jq.

What to build:

Repository layout:

  • README.md — overview, pricing summary, how to run.
  • invoice.json — minimal GOBL invoice (following the AGENTS.md minimal example, GB regime, no totals).
  • run.sh — script:
    1. Build the invoice via the public GOBL API (gobl.dev/v0/build) → save the built output → print totals.
    2. If INVOPOP_TOKEN is set: run the full Invopop flow (ping, workspace info, uuid, PUT entry, PUT job with WORKFLOW_ID, GET entry with attachments/state). Otherwise print a skip message.

First, verify that the public build API works:

Also test api.invopop.com/utils/v1/ping without a token to confirm 401 (reachability).

Check jq availability.

Then write the files, run the script, and show the output.

Pricing summary (from invopop.com/pricing):

  • Dev plan: 0€/month, 200 pops/month included, first government app free, 30+ countries, community support, 1 user.
  • Pro: 500€/month, includes 200 pops, unlimited users, priority support, watermark removal, audit logs, ISO 27001.
  • Enterprise: custom.
  • Pops = credits: each workflow action (document upload, e-invoice sending) consumes pops. Additional pop tiers: 1,000/month = 40€ (34€/month on annual contract), 2,500 = 70€, 5,000 = 100€, 10,000 = 140€, up to 200,000 = 1,000€.
  • Government apps: first free, then 300€/country/month (e.g., Spain: Facturae & SII, VERI*FACTU, TicketBAI; Italy SDI; Poland KSeF...).
  • Integrations: Stripe 100€/month, Chargebee 200€/month.
  • Registered parties (seats): 100–200 pops/month per party.
  • The docs also have a "Pops & pricing" page (/get-started/pricing.md), which describes workflow action costs (e.g., invoice issuance via SDI = X pops). Maybe I can fetch a few concrete pop-cost examples. Let me quickly fetch /get-started/pricing.md for the workflow action cost table.

Manageability assessment: yes — very agent-friendly:

  • Docs are provided as plain Markdown (.md suffix), llms.txt index, AGENTS.md, MCP server, skills.
  • REST API with idempotent PUTs, clear error codes, wait parameter (no polling loop needed), sandbox on the same host.
  • Public GOBL build API for unauthenticated verification.
  • Only manual gate: account signup + API keys + publishing workflow templates in the Console (web UI, human). One-time.

Now, execute the plan:

  1. Fetch the pricing.md doc for pop costs (quickly).
  2. Test gobl.dev/v0/build with a minimal invoice.
  3. Test api.invopop.com ping without a token (expect 401).
  4. Check jq. Then write the sample files and run them.

Steps 1–4 in parallel (they're independent). For step 2, write invoice.json first — embed it inline in curl.

Note about the invoice: use the AGENTS.md minimal example as-is (GB, valid test tax number). issue_date: today (2026-09-26)? The example uses 2026-09-03. The docs say not to make things up on my own; using the example as-is is safest. Per the environment date (Sep 26, 2026), today is 2026-09-26. I'll use the doc's example as-is — issue_date is "2026-09-03". Good enough as a sample.

Series is "TEST", no code (the workflow assigns it). When building via gobl.dev without a workflow, code stays empty — that's fine, build doesn't need a code (it's required at signing time).

Alright, let's get started.

AGENTS.md is a treasure trove — I've got a complete grasp of the overall API picture. What's especially important is that there's an unauthenticated public GOBL build API (POST https://gobl.dev/v0/build), and there's also a complete Invopop platform flow that can be executed with a workspace token. Without a token, let me verify what can be executed right now.

$ cat > /tmp/invoice.json <<'EOF'{"content":[{"text":"HTTP 200\n{\"$schema\":\"https://gobl.org/draft-0/bill/invoice\",\"$regime\":\"GB\",\"type\":\"standard\",\"series\":\"TEST\",\"issue_date\…ctrl+o
cat > /tmp/invoice.json <<'EOF'
{
  "$schema": "https://gobl.org/draft-0/bill/invoice",
  "series": "TEST",
  "issue_date": "2026-09-03",
  "supplier": {
    "name": "Test Company Ltd.",
    "tax_id": { "country": "GB", "code": "000472631" }
  },
  "customer": {
    "name": "Random Company Ltd.",
    "tax_id": { "country": "GB", "code": "350983637" }
  },
  "lines": [
    {
      "quantity": "20",
      "item": { "name": "Development services", "price": "90.00" },
      "taxes": [{ "cat": "VAT", "rate": "standard" }]
    }
  ]
}
EOF
jq -n --argjson d "$(cat /tmp/invoice.json)" '{data:$d}' > /tmp/build-req.json 2>/dev/null || python3 -c "import json;d=json.load(open('/tmp/invoice.json'));json.dump({'data':d},open('/tmp/build-req.json','w'))"
curl -s --max-time 30 -X POST https://gobl.dev/v0/build -H 'Content-Type: application/json' -H 'User-Agent: invopop-example/0.1' -d @/tmp/build-req.json -o /tmp/built.json -w "HTTP %{http_code}\n"; head -c 400 /tmp/built.json; echo; which jq || echo "no jq"

{"content":[{"text":"HTTP 200\n{\"$schema\":\"https://gobl.org/draft-0/bill/invoice\",\"$regime\":\"GB\",\"type\":\"standard\",\"series\":\"TEST\",\"issue_date\":\"2026-09-03\",\"currency\":\"GBP\",\"supplier\":{\"name\":\"Test Company Ltd.\",\"tax_id\":{\"country\":\"GB\",\"code\":\"000472631\"}},\"customer\":{\"name\":\"Random Company Ltd.\",\"tax_id\":{\"country\":\"GB\",\"code\":\"350983637\"}},\"lines\":[{\"i\":1,\"quantity\":\"20\",\"item\":{\"name\":\"Development services\",\"price\":\"90.00\"\n/usr/bin/jq\n","type":"text"}]}
$ echo "== ping without token (expect 401) =="; curl -s --max-time 15 -H 'User-Agent: invopop-example/0.1' https://api.invopop.com/utils/v1/ping -w "\nHTTP %{http_code}\n"; echo "== pricing doc =="; cur…{"content":[{"text":"== ping without token (expect 401) ==\n{\"message\":\"missing authorization token\"}\n\nHTTP 401\n== pricing doc ==\n> ## Documentation Ind…ctrl+o
echo "== ping without token (expect 401) =="; curl -s --max-time 15 -H 'User-Agent: invopop-example/0.1' https://api.invopop.com/utils/v1/ping -w "\nHTTP %{http_code}\n"; echo "== pricing doc =="; curl -s --max-time 20 https://docs.invopop.com/get-started/pricing.md | head -100

{"content":[{"text":"== ping without token (expect 401) ==\n{\"message\":\"missing authorization token\"}\n\nHTTP 401\n== pricing doc ==\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Understanding Invopop's pricing\n\n> Usage and cost of issuing invoices and other documents through Invopop\n\nOur pricing is based on **Pops**, **Apps** and **Pro Features**.\n\n* **Pops** are our unit of computing usage. When selecting a plan, you are entitled to the specified number of Pops which will be spent on storage, on the actions performed on your documents, and if applicable, on the Parties you register (what we call **Seats**). **The first 200 pops are free.**\n\n* **Paid Apps**, with a fixed monthly fee, of two types:\n  * **Countries** englobe all the integrations you may need for e-invoicing/reporting in a given country. The **first country is free**; each additional one has a fixed monthly fee.\n  * **Integrations** are connectors to ERPs and other merchant platforms such as Stripe or Chargebee.\n\n* **Pro features** such as dedicated support and unlimited users can be added to your subscription at a flat monthly fee.\n\nYou can choose a **monthly subscription**, or **save on an annual one**.\n\n## Understanding Pops (our computing credits)\n\nPops are calculated based on a combination of the monthly documents you process and the specific actions you perform on them. Your pop consumption starts with the number of documents you plan to process each month.\n\n`Total Pops = (Docs Processed × Base Pop Cost) + (Document Actions × Action Pop Cost) + (Number of Seats x Pops per Seat)`\n\n* Core actions such as Send email or Generate PDF cost 1 pop.\n* Format conversions such as Facturae, XRechnung, UBL or CII also cost 1 pop.\n* Each network or tax authority has a different price depending on complexity of operation and implementation:\n  * TicketBAI, VERI\\*FACTU or Peppol cost 2 pops.\n  * SDI, AT, KSeF cost 3 pops.\n  * DIAN, myDATA, SAT, NFSe cost 5 pops.\n* Each Seat - a registered Party/Merchant per network - costs 100 pops.\n\n<Frame>\n  <img src=\"https://mintcdn.com/invopop/-_H_wxhzEz42K5K8/assets/other/pricing-pops-table.png?fit=max&auto=format&n=-_H_wxhzEz42K5K8&q=85&s=4da79b36f8dda120c7c5b6645af3057f\" alt=\"Pop costs per action, document, and party registration\" width=\"2512\" height=\"1672\" data-path=\"assets/other/pricing-pops-table.png\" />\n</Frame>\n\n## Our Apps\n\nIn addition to your Pop-based plan cost, we offer optional, fixed-monthly-fee apps (countries and integrations). These are billed separately from your base plan.\n\n**A country** includes all the integrations you could need for e-invoicing/reporting in a given country. For example, Spain would include the integration with VeriFactu, SII, Ticketbai. The **first country is free**; each additional one costs +**€300/month**.\n\n**A connector** is the self-serve integration with your ERP and other merchant platforms. Price varies per connector type, for example:\n\n| Add-on        | Monthly Cost    | Description                         |\n| :------------ | :-------------- | :---------------------------------- |\n| **Chargebee** | **+€200/month** | Connector for Chargebee integration |\n| **NetSuite**  | **+€200/month** | Connector for NetSuite integration  |\n| **Stripe**    | **+€100/month** | Connector for Stripe integration    |\n\n## Our Pro Features\n\n**Pro features** include chat and email support, unlimited users, removing Invopop's watermark from PDFs and emails, generating audit logs and access to ISO27001. These can be added to your subscription for **+€500/month.**\n\n***\n\n## FAQ\n\n<AccordionGroup>\n  <Accordion title=\"When will I be charged?\">\n    Invopop charges for subscriptions in advance at the start of each billing cycle. When you first subscribe, you'll be charged immediately for the full period. For subsequent renewals, you'll be charged on your billing anniversary date for the next billing period.\n\n    **How do monthly renewals work?**\n\n    Your subscription renews on the same day each month. For example, if you subscribe on March 31st, your renewal in February would occur on the 28th (or 29th in leap years) to account for different month lengths.\n\n    **What happens if I upgrade my plan mid-cycle?**\n\n    Upgrades are applied immediately. You'll receive a new invoice that accounts for your new plan, with appropriate credits for what you've already paid in the current billing period. The new benefits take effect right away.\n\n    **What about downgrades?**\n\n    Downgrades take effect at the end of your current billing period. This means you'll continue to enjoy your current plan's benefits until the next renewal date, when the downgrade will be applied.\n\n    **Do Developer and Pro plans work the same way?**\n\n    Yes, both prepaid Developer and Pro plans are charged in advance at the start of each billing cycle. The only difference is access to pro features.\n  </Accordion>\n\n  <Accordion title=\"What happens if I run out of Pops?\">\n    To continue using Invopop, you will need to upgrade to the next pop tier.\n  </Accordion>\n\n  <Accordion title=\"How do merchants (Seats) contribute to my pop count?\">\n    Technically, a **Seat** corresponds to a Tax ID registered to issue invoices in a specific network. Every account needs at least one.\n\n    In practice, most companies need only one seat or a handful. Some, however, use Invopop to provide e-invoicing to their own customers: each customer registered counts as a seat.\n\n    Every seat consumes pops from your monthly allowance: 100 pops are deducted the moment you register it, and 100 pops again every 30 days from that registration date for as long as it stays registered.\n  </Accordion>\n\n  <Accordion title=\"What payment methods do you accept?\">\n    For Developer and Pro plans, Invopop accepts credit card payments and direct debit. These self-service plans are designed for automated payment processing through your billing portal.\n\n    For Enterprise plans, Invopop also offers pay by invoice, which aligns with the higher-touch, sales-assisted nature of these subscriptions.\n\n    The payment methods break down by plan type as follows:\n\n","type":"text"}]}
Thinking…

Both work:

  1. Public GOBL build API: HTTP 200, invoices are built and validated (tax regime GB is inferred, GBP currency is set, totals are calculated).
  2. api.invopop.com is reachable, returns a clean 401 without a token — the platform API flow is scripted and will work as soon as a token is provided.

Already fetched pricing details from both invopop.com/pricing and docs' pricing.md.

Now let's build a sample project in /sandbox/repo:

  • invoice.json — minimal GOBL invoice.
  • run.sh — bash script:
    • Part 1 (works without credentials): build via public GOBL API, display calculated totals.
    • Part 2 (requires INVOPOP_TOKEN + optional WORKFLOW_ID): ping, workspace info, uuid generation, PUT of silo entry, PUT of job with wait=30, GET of entry state/signed/attachments.
  • README.md — what this is, how to run it, pricing summary, notes on manageability.

First let me check the totals in the build output to display them, then write the files and run the script.

The script should be robust: use curl with User-Agent header, use jq for parsing. Handle 409 as "already created". Keep it simple — this is a sample.

Let me look at the totals of the built document to confirm the calculations worked correctly.

Both halves have been confirmed to work:

  • Public GOBL build API (gobl.dev/v0/build): HTTP 200 — the invoice was validated, $regime: GB was inferred, and GBP was set.
  • Invopop platform API (api.invopop.com): reachable, clean 401 missing authorization token without credentials — exactly as documented.

Now I'll build out the sample project and run it.

$ jq -c '{type,currency,totals:{sum:.totals.sum, tax:.totals.tax, total_with_tax:.totals.total_with_tax}}' /tmp/built.json{"content":[{"text":"{\"type\":\"standard\",\"currency\":\"GBP\",\"totals\":{\"sum\":\"1800.00\",\"tax\":\"360.00\",\"total_with_tax\":\"2160.00\"}}\n","type":"…ctrl+o
{"content":[{"text":"{\"type\":\"standard\",\"currency\":\"GBP\",\"totals\":{\"sum\":\"1800.00\",\"tax\":\"360.00\",\"total_with_tax\":\"2160.00\"}}\n","type":"text"}]}
Thinking…

The build calculated the totals: sum 1800.00 (20 × 90), VAT 20% = 360.00, total 2160.00. The minimal document (no totals, no tax rate percentages) is fully calculated by the hosted GOBL API.

Next, write the sample files into /sandbox/repo:

  1. invoice.json
  2. run.sh
  3. README.md

Then run ./run.sh to demo (without a token → part 1 executes, part 2 is skipped with a clear message).

Calculation complete: 20 × £90 = £1,800 + UK VAT 20% (£360) = £2,160 — all derived server-side from the minimal documentation. Now creating the sample project:

write /sandbox/repo/invoice.json{"content":[{"text":"Successfully wrote 503 bytes to /sandbox/repo/invoice.json","type":"text"}]}
write /sandbox/repo/run.sh{"content":[{"text":"Successfully wrote 3779 bytes to /sandbox/repo/run.sh","type":"text"}]}
Thinking…

Next, I'll create a README.md that includes the pricing overview and manageability notes, and after that, I'll run chmod +x and execute the script.

write /sandbox/repo/README.md{"content":[{"text":"Successfully wrote 2916 bytes to /sandbox/repo/README.md","type":"text"}]}
Thinking…

Next, I'll run chmod and execute the script, then verify that it works end-to-end (part 1). Also, I'll check whether built.json is included in .gitignore. Let me check the contents of .gitignore.

$ cd /sandbox/repo && chmod +x run.sh && ./run.sh; echo "EXIT:$?"; echo "--- .gitignore ---"; cat .gitignore{"content":[{"text":"=== Part 1: build the invoice via the public GOBL API (no auth) ===\nBuilt OK -> built.json\n{\"type\":\"standard\",\"series\":\"TEST\",\"c…ctrl+o
{"content":[{"text":"=== Part 1: build the invoice via the public GOBL API (no auth) ===\nBuilt OK -> built.json\n{\"type\":\"standard\",\"series\":\"TEST\",\"currency\":\"GBP\",\"sum\":\"1800.00\",\"tax\":\"360.00\",\"total_with_tax\":\"2160.00\"}\n\n=== Part 2: skipped — INVOPOP_TOKEN not set ===\nTo run the hosted-platform half:\n  1. Sign up at https://console.invopop.com (Google or email) and create a\n     Sandbox workspace.\n  2. Console -> Configuration -> API Keys: create a key.\n  3. Console -> Workflows: create a workflow from the \"PDF invoice\" template\n     and Publish it (deep link:\n     https://console.invopop.com/redirect/workflows/new?template=pdf-invoice).\n  4. Re-run:\n       export INVOPOP_TOKEN=<your sandbox key>\n       export WORKFLOW_ID=<published workflow uuid>   # optional\n       ./run.sh\nEXIT:0\n--- .gitignore ---\n# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/\n.next/\ndist/\nbuild/\ncoverage/\n\n# Python\n.venv/\nvenv/\n__pycache__/\n*.py[cod]\n.pytest_cache/\n*.egg-info/\n\n# Rust\ntarget/\n\n# Go / PHP / Ruby vendored deps\nvendor/\n.bundle/\n\n# Java / Kotlin / Scala\n.gradle/\n\n# .NET\nbin/\nobj/\n\n# Elixir\n_build/\ndeps/\n\n# Dart / Flutter\n.dart_tool/\n","type":"text"}]}
Thinking…

The script works end-to-end for part 1. Part 2 is correctly skipped with clear instructions.

Add built.json to .gitignore (generated output). Then, the final summary answer:

  1. What I built and where.
  2. How the pricing mechanism works.
  3. Manageability assessment.
  4. Where I got stuck: only about live platform calls (account/token required — human sign-up). Everything else worked. No local stack needed, no long-running commands either.

Keep it concise.

$ cd /sandbox/repo && printf '\n# Generated by run.sh\nbuilt.json\nentry.json\njob.json\n' >> .gitignore && ls -la && git status --short{"content":[{"text":"total 32\ndrwxr-xr-x 3 root root 4096 Sep 26 17:54 .\ndrwxr-xr-x 8 root root 4096 Sep 26 17:50 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05…ctrl+o
{"content":[{"text":"total 32\ndrwxr-xr-x 3 root root 4096 Sep 26 17:54 .\ndrwxr-xr-x 8 root root 4096 Sep 26 17:50 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root  462 Sep 26 17:54 .gitignore\n-rw------- 1 root root 2967 Sep 26 17:54 README.md\n-rw------- 1 root root  777 Sep 26 17:54 built.json\n-rw------- 1 root root  503 Sep 26 17:53 invoice.json\n-rwx------ 1 root root 3783 Sep 26 17:53 run.sh\n M .gitignore\n?? README.md\n?? invoice.json\n?? run.sh\n","type":"text"}]}
Thinking…

Done. Final summary — concise and covering all four requested items:

  1. A simple example was created ✓
  2. Pricing ✓
  3. Ease of administration ✓
  4. Blocked points ✓ (Only Part 2, requires human sign-up/token)

No local stack, no long-running commands — all curl calls completed in a few seconds.

Done. Invopop does have an actionable developer workflow, and I built and ran a working example — no local stacks, no long-running commands (all calls are quick HTTP requests).

What I built (/sandbox/repo)

  • invoice.json — minimal GOBL invoice (Invopop's open-source JSON document format). No totals or tax percents: the platform calculates them.
  • run.sh — two parts:
    • Part 1 (ran successfully, no account needed): builds/validates the invoice via Invopop's hosted public GOBL API (POST https://gobl.dev/v0/build). Result: type: standard, currency: GBP, sum 1800.00, VAT 360.00, total 2160.00 — the 20% GB rate was resolved server-side from just {"cat":"VAT","rate":"standard"}.
    • Part 2 (scripted, ready): full platform flow against api.invopop.com — ping → workspace info → UUIDv7 → idempotent PUT /silo/v1/entries/{id} → PUT /transform/v1/jobs/{id}?wait=30 → read entry state/signature/PDF attachments. I verified the API is reachable (clean 401 without a token).
  • README.md — run instructions, key API facts, pricing summary.

How pricing works

  • Plans: Dev €0/mo (200 pops, 1 user) · Pro €500/mo (unlimited users, no watermark, audit log) · Enterprise custom.
  • Pops = usage credits: docs × base cost + actions × action cost + seats × 100. PDF/email and format conversions = 1 pop; Peppol/VERI*FACTU/TicketBAI = 2; SDI/KSeF = 3; DIAN/SAT = 5. Extra tiers from 1,000 pops (€40/mo) to 200,000 (€1,000/mo).
  • Country apps: first free, each extra +€300/mo. Connectors: Stripe €100, Chargebee/NetSuite €200/mo. Seats: each registered tax ID costs 100 pops at registration + 100 every 30 days.

Will it be easy for me to manage?

Yes — unusually so. The docs are built for agents: every page as Markdown (append .md), an llms.txt index, a condensed AGENTS.md, MCP servers, and an installable skill. The API is clean: idempotent PUTs, ?wait=30 instead of polling, structured validation faults, and a public unauthenticated build endpoint for pre-flight checks. Ongoing management (upload, jobs, corrections, error diagnosis) is fully scriptable.

Where I'm blocked

One spot only: Part 2 needs INVOPOP_TOKEN, and account sign-up is human-gated (console.invopop.com via Google/email) — I can't create the sandbox workspace or API key myself. Give me a sandbox token (and optionally a published "PDF invoice" workflow ID), and ./run.sh will run the complete hosted flow end-to-end as-is.

AX Fundamentals

23 checks. Open an area for details.

This check is a quick preview. Test more tasks and models with Gauge Agents.

Test your product with Gauge Agents

AX Check by Gauge