{
 "slug": "invoiceninja",
 "name": "Invoice Ninja",
 "url": "https://invoiceninja.com",
 "domain": "invoiceninja.com",
 "category": "invoicing",
 "category_name": "Invoicing",
 "tested_at": "2026-10-02",
 "run": "20261002T214726Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T200712Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": null,
    "robots": "start"
   },
   "drives": 2
  },
  {
   "run": "20261002T214726Z",
   "date": "2026-10-02",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "setup",
 "door": {
  "passed": 0,
  "tries": 3,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Needs a person to get in",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 0% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: an OpenAPI and an MCP server",
   "have": [
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Needs a person to get in",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 0% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "verify",
 "core": "0/10",
 "scores": {
  "coverage": 0,
  "reliability": null,
  "resilience": null,
  "setup": 70,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 70,
  "security": null,
  "standards": []
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 0,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": null,
  "kb_version": null,
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 3,
 "drives": 3,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Cloudflare Turnstile",
  "visible": true,
  "type": "network",
  "human": "human",
  "how": "Let verified bots and signed agents past the check on sign-up: in Cloudflare, add a WAF custom rule that skips the bot challenge on your sign-up paths for verified bots and for signed agents (rule field cf.bot_management.signed_agent; since 1 July 2026 signed agents count as verified bots), and render Turnstile only when the request is not from a verified agent.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "form"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-13"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "api-docs.invoicing.co: Redoc page with embedded OpenAPI (v5.12.55, 365 operations), auth via X-API-TOKEN; no llms.txt."
  },
  "signup": {
   "status": "human",
   "note": "The only documented sign-up is the web form at app.invoicing.co/#/register with Cloudflare Turnstile.",
   "via": "human"
  },
  "verify": {
   "status": "blocked",
   "note": "Not reached: no account."
  },
  "credentials": {
   "status": "blocked",
   "note": "Not reached. Documented routes: POST /api/v1/login (email+password -> token) and API tokens under Settings > Integrations; REST API access is listed as Pro-only on the pricing page.",
   "via": ""
  },
  "first_call": {
   "status": "blocked",
   "note": "Production API answers JSON (403 Invalid token) without bot checks, but needs credentials. The documented demo sandbox (demo.invoiceninja.com, token TOKEN) returns a Cloudflare 'Just a moment...' challenge to our signed agent."
  },
  "first_action": {
   "status": "blocked",
   "note": "Not reached: no account and the demo sandbox is behind a Cloudflare challenge."
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No 402/x402/MPP/UCP/OAuth discovery anywhere; not listed in x402 Bazaar or mpp.dev. Free plan exists (5 clients, no card), Pro $14/mo and Enterprise from $18/mo upgraded inside the account. That account needs a human at the Turnstile sign-up, so purchasing needs a human; the checkout itself could not be seen.",
   "reached": false
  },
  "cancel": {
   "status": "n/a",
   "grade": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "No plan started (account never created); cancel route not observable.",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "n/a",
   "note": "No account was created, nothing to delete. The OpenAPI documents DELETE /api/v1/companies/{id}, not tested.",
   "left": "stuck",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-02",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": true,
  "mcp": "third-party",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": true
 },
 "surface_notes": {
  "api": "REST v1, X-API-TOKEN auth; Pro plan per pricing page",
  "openapi": "embedded in api-docs.invoicing.co Redoc page, 365 operations, no signup op",
  "sdk": "official PHP SDK; third-party Go SDK",
  "mcp": "several third-party servers on GitHub (e.g. Fuciuss/invoice-ninja-mcp, NightSquawk/invoiceninja-mcp-server); none official; all need an API token",
  "sandbox": "demo.invoiceninja.com with token TOKEN, but behind a Cloudflare challenge for agents",
  "webhooks": "/api/v1/webhooks in OpenAPI; Zapier/Make/n8n listed"
 },
 "can_do": [
  "Read the full API reference and OpenAPI spec headless",
  "Reach the production API from a datacenter IP and get clear JSON auth errors"
 ],
 "cannot_do": [
  {
   "what": "Create an account",
   "why": "Sign-up form shows a visible Cloudflare Turnstile checkbox; there is no sign-up API"
  },
  {
   "what": "Try the API in the public demo sandbox",
   "why": "demo.invoiceninja.com returns a Cloudflare 'Just a moment...' challenge to a signed agent"
  },
  {
   "what": "Create, send, or get paid on an invoice",
   "why": "No account, so no token"
  },
  {
   "what": "Use the REST API on the free plan",
   "why": "Pricing page lists REST API access as Pro and above"
  }
 ],
 "blockers": [
  "Cloudflare Turnstile on the sign-up form",
  "Cloudflare challenge on the demo API sandbox"
 ],
 "tips_for_owner": [
  "Let verified bot-signed agents pass sign-up",
  "Exempt the demo API from Cloudflare challenges",
  "Document an agent sign-up and token route",
  "Allow API tokens on the free plan",
  "Publish llms.txt and a machine-readable spec URL"
 ],
 "tips_for_agents": [
  "The API base is https://invoicing.co/api/v1 with headers X-API-TOKEN and X-Requested-With: XMLHttpRequest; errors are JSON.",
  "Get a token from a human: sign-up has a Turnstile checkbox, and REST API tokens are a Pro feature; POST /api/v1/login (email, password) is documented and returns a token.",
  "The OpenAPI spec is embedded in the Redoc page at api-docs.invoicing.co (window.__redoc_state).",
  "The demo sandbox at demo.invoiceninja.com is behind a Cloudflare challenge for agents.",
  "Third-party MCP servers exist on GitHub; all need an API token."
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox; official self-hosted edition exists (github.com/invoiceninja/invoiceninja, Docker image invoiceninja/invoiceninja)"
  }
 },
 "summary": "Invoice Ninja has a broad, well-documented REST API (OpenAPI, 365 operations) and the production API answers agents from a datacenter without bot checks, but an agent cannot get an account: the only sign-up is a web form with a visible Cloudflare Turnstile checkbox. The documented demo sandbox is also behind a Cloudflare challenge, and REST API tokens are a Pro feature, so no capability could be driven.",
 "wall": "Cloudflare Turnstile on the sign-up form",
 "plan_scope": "none (no free access)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Invoice Ninja is online invoicing software with a well-documented API, but an AI agent trying it on its own could not even create an account: the sign-up form requires passing a visible human-verification check, and the only public demo was also blocked by an automated security check.",
  "can_do": [
   "Read the full technical documentation and API reference without a browser.",
   "Reach the live service and get clear, readable error messages when trying without login details."
  ],
  "cannot_do": [
   {
    "what": "Create an account",
    "why": "The sign-up page requires solving a visible 'prove you're human' check."
   },
   {
    "what": "Try the free demo version",
    "why": "The demo site also blocks automated visitors with a security check."
   },
   {
    "what": "Create, send, or get paid on an invoice",
    "why": "No account could be created, so there was nothing to log into."
   },
   {
    "what": "Use the programming interface on the free plan",
    "why": "The pricing page shows that feature is reserved for paid plans."
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Upload documents to the client/vendor portal",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Run financial reports (P&L, invoices, expenses) and export CSV",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Send automatic late-payment reminder emails",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Integrate via REST API with a generated API token",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Send invoice emails via connected Gmail/Microsoft/SMTP account",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Pass credit card processing fees to clients or offer ACH discount",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Sync bank transactions automatically (Yodlee/GoCardless)",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Send e-invoices over the PEPPOL network",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Invite team members and set per-user access permissions",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Customize invoice design/templates and branded portal URL",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Lock documents until after payment",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  },
  {
   "capability": "Interlink multiple companies under one login",
   "plan": "Pro or Enterprise",
   "evidence": "invoiceninja.com/pricing-plans feature table"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Invoicing",
   "capability": "Create an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/invoices",
    "mcp": null,
    "cli": null,
    "ui": "Invoices > New Invoice"
   },
   "check": "GET /api/v1/invoices/{id} returns the created invoice with matching line items",
   "source": "https://api-docs.invoicing.co/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-02",
   "group": "Invoicing",
   "capability": "Send an invoice to a client",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/invoices/bulk (email action)",
    "mcp": null,
    "cli": null,
    "ui": "Invoice detail > Send Email"
   },
   "check": "GET /api/v1/invoices/{id} shows status 'sent' and activity log has an email event",
   "source": "https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-03",
   "group": "Invoicing",
   "capability": "Edit or delete an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api/v1/invoices/{id}, DELETE /api/v1/invoices/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Invoices > Edit/Archive"
   },
   "check": "GET /api/v1/invoices/{id} reflects updated fields or deleted_at set",
   "source": "https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-04",
   "group": "Invoicing",
   "capability": "Collect an online payment on an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/payments",
    "mcp": null,
    "cli": null,
    "ui": "Client portal > Pay Now"
   },
   "check": "GET /api/v1/invoices/{id} shows status 'paid' and a linked payment record",
   "source": "https://invoiceninja.com/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-05",
   "group": "Invoicing",
   "capability": "Set up recurring invoices with auto-billing",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/recurring_invoices",
    "mcp": null,
    "cli": null,
    "ui": "Recurring Invoices > New"
   },
   "check": "GET /api/v1/recurring_invoices/{id} shows frequency_id and next_send_date set",
   "source": "https://invoiceninja.com/features/, https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-06",
   "group": "Invoicing",
   "capability": "Create and manage a client",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/clients, PUT /api/v1/clients/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Clients > New Client"
   },
   "check": "GET /api/v1/clients/{id} returns the created/updated client record",
   "source": "https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-07",
   "group": "Invoicing",
   "capability": "Track time and convert tasks to invoices",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/tasks, getCustom invoice action",
    "mcp": null,
    "cli": null,
    "ui": "Projects > Kanban > Convert to Invoice"
   },
   "check": "GET /api/v1/invoices/{id} contains line items referencing the task's time entries",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-08",
   "group": "Quotes",
   "capability": "Send a quote for e-signature approval",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/quotes",
    "mcp": null,
    "cli": null,
    "ui": "Quotes > New Quote"
   },
   "check": "GET /api/v1/quotes/{id} shows status 'approved' after client signs",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-09",
   "group": "Quotes",
   "capability": "Convert an approved quote to an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "getCustom invoice action on quote",
    "mcp": null,
    "cli": null,
    "ui": "Quote detail > Convert to Invoice"
   },
   "check": "GET /api/v1/invoices lists a new invoice referencing the source quote id",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-10",
   "group": "Expenses",
   "capability": "Log and categorize a business expense",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/expenses (Adds an expense)",
    "mcp": null,
    "cli": null,
    "ui": "Expenses > New Expense"
   },
   "check": "GET /api/v1/expenses/{id} returns the expense with category and amount",
   "source": "https://api-docs.invoicing.co/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-11",
   "group": "Expenses",
   "capability": "Re-invoice an expense to a client",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/expenses (billable flag) + add to invoice",
    "mcp": null,
    "cli": null,
    "ui": "Expense > Mark Billable > Invoice Client"
   },
   "check": "GET /api/v1/invoices/{id} includes a line item sourced from the expense",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-12",
   "group": "Expenses",
   "capability": "Manage vendors and purchase orders",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/vendors, POST /api/v1/purchase_orders",
    "mcp": null,
    "cli": null,
    "ui": "Vendors / Purchase Orders"
   },
   "check": "GET /api/v1/purchase_orders/{id} shows status converted to an expense after approval",
   "source": "https://api-docs.invoicing.co/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-13",
   "group": "Projects",
   "capability": "Create a project and assign tasks on a Kanban board",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/projects",
    "mcp": null,
    "cli": null,
    "ui": "Projects > Kanban Board"
   },
   "check": "GET /api/v1/projects/{id} shows task_id list and board status per task",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-14",
   "group": "Products",
   "capability": "Maintain a product/service library with inventory levels",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/products",
    "mcp": null,
    "cli": null,
    "ui": "Products > New Product"
   },
   "check": "GET /api/v1/products/{id} shows in_stock_quantity decremented after being used on invoice",
   "source": "https://invoiceninja.com/features/, https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-15",
   "group": "Portal",
   "capability": "View invoice/payment history and pay in the client portal",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Client portal (YourSite.invoicing.co)"
   },
   "check": "Client portal dashboard lists invoices with correct paid/outstanding status",
   "source": "https://invoiceninja.com/client-portal/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-16",
   "group": "Portal",
   "capability": "Upload documents to the client/vendor portal",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "postAdd client document",
    "mcp": null,
    "cli": null,
    "ui": "Client portal > Documents"
   },
   "check": "GET /api/v1/clients/{id} documents array contains the uploaded file",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-17",
   "group": "Reports",
   "capability": "Run financial reports (P&L, invoices, expenses) and export CSV",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Reports menu"
   },
   "check": "Downloaded CSV report row totals match the invoices/expenses in the selected date range",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-18",
   "group": "Reports",
   "capability": "Generate a client account statement",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "postClient statement PDF",
    "mcp": null,
    "cli": null,
    "ui": "Client detail > Statement"
   },
   "check": "Generated PDF lists the client's invoice and payment transaction history",
   "source": "https://api-docs.invoicing.co/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-19",
   "group": "Automation",
   "capability": "Send automatic late-payment reminder emails",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Reminders"
   },
   "check": "Invoice activity log shows reminder email sent after the configured overdue interval",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-20",
   "group": "Automation",
   "capability": "Automate workflows via Zapier/Make/n8n/Pabbly triggers",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Zapier/Integrations"
   },
   "check": "Zap run history shows a triggered action (e.g. new invoice created) firing a connected app",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-21",
   "group": "Automation",
   "capability": "Integrate via REST API with a generated API token",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "all /api/v1/* endpoints",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Account Management > API Tokens"
   },
   "check": "Authenticated request with X-API-Token returns 200 with account data",
   "source": "https://api-docs.invoicing.co/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-22",
   "group": "Automation",
   "capability": "Send invoice emails via connected Gmail/Microsoft/SMTP account",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Email Settings > Connect Gmail"
   },
   "check": "Sent invoice email's From header matches the connected Gmail/MSN address",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-23",
   "group": "Payments",
   "capability": "Connect a payment gateway (Stripe, PayPal, Square, GoCardless, etc.)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Online Payments"
   },
   "check": "Settings page shows gateway status 'Connected' and test payment routes through it",
   "source": "https://invoiceninja.com/payments/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-24",
   "group": "Payments",
   "capability": "Accept deposits and partial payments",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/payments (partial)",
    "mcp": null,
    "cli": null,
    "ui": "Invoice > Require Deposit"
   },
   "check": "GET /api/v1/invoices/{id} shows partial amount paid and updated balance/due date",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-25",
   "group": "Payments",
   "capability": "Pass credit card processing fees to clients or offer ACH discount",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Online Payments > Surcharges"
   },
   "check": "Invoice total reflects added gateway fee line when paid by card vs. ACH",
   "source": "https://invoiceninja.com/features/"
  },
  {
   "id": "cap-26",
   "group": "Payments",
   "capability": "Refund a payment",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "postRefund payment",
    "mcp": null,
    "cli": null,
    "ui": "Payment detail > Refund"
   },
   "check": "GET /api/v1/payments/{id} shows refunded amount and status updated",
   "source": "https://api-docs.invoicing.co/"
  },
  {
   "id": "cap-27",
   "group": "Enterprise",
   "capability": "Sync bank transactions automatically (Yodlee/GoCardless)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Bank Accounts"
   },
   "check": "Imported transactions list appears under Expenses > Bank Transactions after linking",
   "source": "https://invoiceninja.com/features/, https://invoiceninja.com/pricing-plans/"
  },
  {
   "id": "cap-28",
   "group": "Enterprise",
   "capability": "Send e-invoices over the PEPPOL network",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Invoice > Send via PEPPOL"
   },
   "check": "Invoice activity log shows a PEPPOL delivery confirmation event",
   "source": "https://invoiceninja.com/pricing-plans/"
  },
  {
   "id": "cap-29",
   "group": "Enterprise",
   "capability": "Invite team members and set per-user access permissions",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/v1/users",
    "mcp": null,
    "cli": null,
    "ui": "Settings > User Management"
   },
   "check": "GET /api/v1/users/{id} shows assigned permissions matching what was configured",
   "source": "https://invoiceninja.com/pricing-plans/, https://invoiceninja.com/features/"
  },
  {
   "id": "cap-30",
   "group": "Branding",
   "capability": "Customize invoice design/templates and branded portal URL",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Invoice Design / White Label"
   },
   "check": "Generated invoice PDF and client portal URL reflect the custom template and branded domain",
   "source": "https://invoiceninja.com/features/, https://invoiceninja.com/pricing-plans/"
  },
  {
   "id": "cap-31",
   "group": "Branding",
   "capability": "Lock documents until after payment",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Client Portal > Lock Invoices"
   },
   "check": "Unpaid invoice PDF/documents are inaccessible in portal until payment is recorded",
   "source": "https://invoiceninja.com/pricing-plans/"
  },
  {
   "id": "cap-32",
   "group": "Admin",
   "capability": "Interlink multiple companies under one login",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Add Company"
   },
   "check": "Company switcher lists multiple linked companies accessible from the same login",
   "source": "https://invoiceninja.com/pricing-plans/"
  },
  {
   "id": "cap-33",
   "group": "Admin",
   "capability": "Use native desktop/mobile apps (macOS, Windows, Linux, iOS, Android)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Native app downloads"
   },
   "check": "App login succeeds and displays the same invoices as the web account",
   "source": "https://invoiceninja.com/apps/, https://invoiceninja.com/pricing-plans/"
  }
 ],
 "attempts": [
  {
   "t": "02:00",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Find API reference",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "api-docs.invoicing.co: Redoc with embedded OpenAPI 5.12.55, 365 operations; servers invoicing.co + demo.invoiceninja.com; no llms.txt (404 at invoiceninja.com/llms.txt)",
   "notes": "Auth via X-API-TOKEN from Settings > Account Management > Integrations > API tokens",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "03:20",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create hosted account at app.invoicing.co/#/register",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Register form (email/password/confirm) shows Cloudflare Turnstile \"Verify you are human\" checkbox after Register click; no /api/ request made; screenshot browser/shots/004.png. No documented signup API in OpenAPI (365 ops, no /signup).",
   "notes": "Visible Turnstile challenge judges the browser; per rules not attempted. Google/Microsoft OAuth also offered (no accounts for those).",
   "quality": {
    "error_legibility": "n/a",
    "recoverable": "no"
   }
  },
  {
   "t": "04:45",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Ask a human to do the Turnstile-gated sign-up in their own browser",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "",
   "notes": "Cloudflare Turnstile visible checkbox."
  },
  {
   "t": "04:45",
   "cap": "first_call",
   "capability": "First API call",
   "task": "Call documented demo sandbox https://demo.invoiceninja.com/api/v1/clients with documented demo token TOKEN",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "",
   "notes": "The sandbox advertised in the OpenAPI servers block is behind a Cloudflare JS challenge for agents; not retried.",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "04:45",
   "cap": "first_call",
   "capability": "First API call",
   "task": "Unauthenticated call to production API invoicing.co",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "GET https://invoicing.co/api/v1/clients -> 403 {\"message\":\"Invalid token\"} (JSON); POST /api/v1/login with unregistered email -> 400 {\"message\":\"Email not set or not found\"}",
   "notes": "Production API is reachable from a datacenter IP with no bot challenge; only credentials are missing.",
   "quality": {
    "error_legibility": "clear",
    "docs_match": "match"
   }
  },
  {
   "t": "04:45",
   "cap": "pay",
   "capability": "Pay step probe",
   "task": "Probe 402/x402/MPP/well-known/registries",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "No 402 on invoicing.co/api/v1/invoices (403 Invalid token, no WWW-Authenticate/PAYMENT-REQUIRED); x402./mpp./agents.invoiceninja.com -> 403 Cloudflare challenge HTML; /.well-known/ucp, oauth-protected-resource, oauth-authorization-server, /auth.md, /SKILL.md, llms.txt -> 404 HTML on invoiceninja.com and invoicing.co; OpenAPI has no x-payment-info/402; not in x402 Bazaar or mpp.dev services. Pricing page: Free $0 (5 clients, no REST API), Pro $14/mo, Enterprise from $18/mo; upgrade happens inside the account (no account reached).",
   "notes": "No agent-native rail; purchase path is in-app upgrade behind the sign-up wall, could not be reached."
  },
  {
   "t": "04:45",
   "cap": "cap-01",
   "capability": "Create an invoice",
   "task": "Create an invoice",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-02",
   "capability": "Send an invoice to a client",
   "task": "Send an invoice to a client",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-03",
   "capability": "Edit or delete an invoice",
   "task": "Edit or delete an invoice",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-04",
   "capability": "Collect an online payment on an invoice",
   "task": "Collect an online payment on an invoice",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-05",
   "capability": "Set up recurring invoices with auto-billing",
   "task": "Set up recurring invoices with auto-billing",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-06",
   "capability": "Create and manage a client",
   "task": "Create and manage a client",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-07",
   "capability": "Track time and convert tasks to invoices",
   "task": "Track time and convert tasks to invoices",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-08",
   "capability": "Send a quote for e-signature approval",
   "task": "Send a quote for e-signature approval",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-09",
   "capability": "Convert an approved quote to an invoice",
   "task": "Convert an approved quote to an invoice",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-10",
   "capability": "Log and categorize a business expense",
   "task": "Log and categorize a business expense",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-11",
   "capability": "Re-invoice an expense to a client",
   "task": "Re-invoice an expense to a client",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-12",
   "capability": "Manage vendors and purchase orders",
   "task": "Manage vendors and purchase orders",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-13",
   "capability": "Create a project and assign tasks on a Kanban board",
   "task": "Create a project and assign tasks on a Kanban board",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-14",
   "capability": "Maintain a product/service library with inventory levels",
   "task": "Maintain a product/service library with inventory levels",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-15",
   "capability": "View invoice/payment history and pay in the client portal",
   "task": "View invoice/payment history and pay in the client portal",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-16",
   "capability": "Upload documents to the client/vendor portal",
   "task": "Upload documents to the client/vendor portal",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-17",
   "capability": "Run financial reports (P&L, invoices, expenses) and export CSV",
   "task": "Run financial reports (P&L, invoices, expenses) and export CSV",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-18",
   "capability": "Generate a client account statement",
   "task": "Generate a client account statement",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-19",
   "capability": "Send automatic late-payment reminder emails",
   "task": "Send automatic late-payment reminder emails",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-20",
   "capability": "Automate workflows via Zapier/Make/n8n/Pabbly triggers",
   "task": "Automate workflows via Zapier/Make/n8n/Pabbly triggers",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-21",
   "capability": "Integrate via REST API with a generated API token",
   "task": "Integrate via REST API with a generated API token",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-22",
   "capability": "Send invoice emails via connected Gmail/Microsoft/SMTP account",
   "task": "Send invoice emails via connected Gmail/Microsoft/SMTP account",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-23",
   "capability": "Connect a payment gateway (Stripe, PayPal, Square, GoCardless, etc.)",
   "task": "Connect a payment gateway (Stripe, PayPal, Square, GoCardless, etc.)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-24",
   "capability": "Accept deposits and partial payments",
   "task": "Accept deposits and partial payments",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-25",
   "capability": "Pass credit card processing fees to clients or offer ACH discount",
   "task": "Pass credit card processing fees to clients or offer ACH discount",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-26",
   "capability": "Refund a payment",
   "task": "Refund a payment",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  },
  {
   "t": "04:45",
   "cap": "cap-27",
   "capability": "Sync bank transactions automatically (Yodlee/GoCardless)",
   "task": "Sync bank transactions automatically (Yodlee/GoCardless)",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-28",
   "capability": "Send e-invoices over the PEPPOL network",
   "task": "Send e-invoices over the PEPPOL network",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-29",
   "capability": "Invite team members and set per-user access permissions",
   "task": "Invite team members and set per-user access permissions",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-30",
   "capability": "Customize invoice design/templates and branded portal URL",
   "task": "Customize invoice design/templates and branded portal URL",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-31",
   "capability": "Lock documents until after payment",
   "task": "Lock documents until after payment",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-32",
   "capability": "Interlink multiple companies under one login",
   "task": "Interlink multiple companies under one login",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "invoiceninja.com/pricing-plans: feature only on Ninja Pro ($14/mo) or Enterprise; free plan lacks it (REST API access: Free \"\")",
   "notes": "Also unreachable: no account (sign-up behind Cloudflare Turnstile)."
  },
  {
   "t": "04:45",
   "cap": "cap-33",
   "capability": "Use native desktop/mobile apps (macOS, Windows, Linux, iOS, Android)",
   "task": "Use native desktop/mobile apps (macOS, Windows, Linux, iOS, Android)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by Cloudflare Turnstile (see signup attempt); documented demo sandbox blocked by Cloudflare challenge (the first call attempt).",
   "notes": "Not attempted against any account."
  }
 ],
 "stale": false,
 "icon": "/logos/invoiceninja.png",
 "monitored": false,
 "verdict": "Needs a person to get in: L1 · Needs a person. Our agent stopped at sign-up, where Invoice Ninja's web form shows a visible Cloudflare Turnstile challenge; the documented demo sandbox hit the same wall, so no credentials, no first call, and no work was ever driven. The API itself is well documented, with an OpenAPI reference covering a broad range of operations, and the production endpoint answers signed requests with a plain invalid-token response, no bot check. Once a person signs up, verifies and makes a key, REST access is a paid feature, so buying also needs a person at checkout. Our agent never saw the account past the Turnstile page, so cancelling and deleting were never reached either.",
 "page": "https://agentdrives.com/tools/invoiceninja?via=api"
}