{
 "slug": "freshbooks",
 "name": "FreshBooks",
 "url": "https://freshbooks.com",
 "domain": "freshbooks.com",
 "category": "invoicing",
 "category_name": "Invoicing",
 "tested_at": "2026-10-06",
 "run": "20261006T073645Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261002T071243Z",
   "date": "2026-10-02",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261006T073645Z",
   "date": "2026-10-06",
   "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": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: an MCP server",
   "have": [
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "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": "signup",
 "core": "0/10",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 55,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 55,
  "security": "private",
  "standards": [
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "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": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Google reCAPTCHA Enterprise challenge page (waf=session) on auth.freshbooks.com",
  "visible": true,
  "type": "challenge",
  "human": null,
  "how": "Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "captcha"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-13"
  },
  "browser": {
   "state": "captcha",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "Public HTML docs at /api/start (59 /api/ pages), SDKs, Postman collection, webhooks. No llms.txt, no markdown, no OpenAPI found."
  },
  "signup": {
   "status": "human",
   "note": "Visible Google reCAPTCHA image puzzle on the auth.freshbooks.com 'Checking your browser' page."
  },
  "verify": {
   "status": "",
   "note": "No sign-up went through, so no verification mail.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "Documented route is an OAuth app on the developer page plus a logged-in user's consent; no account. DCR registered a client headless (201).",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "No user token; GET /auth/api/v1/users/me answers 401 with a clear JSON error.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "No user token or account id.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "note": "No 402, x402, MPP or UCP; not in x402 Bazaar or mpp.dev. 30-day trial needs no card, but trial and Buy Now both go through the reCAPTCHA-gated sign-up, so a human is needed before any purchase. Checkout not reached.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "note": "Nothing started. Docs: cancel in a web browser under Billing and Upgrade; no billing API.",
   "docs_grade": "",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account made. Docs: deletion by email to privacy@freshbooks.com from the account address.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": null
  },
  "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": false,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST JSON, OAuth2 bearer, 59 doc pages",
  "openapi": "none found; Postman documenter",
  "mcp": "official remote gateway, OAuth, legacy session-based",
  "sdk": "Node and Python (GitHub)",
  "webhooks": "X-FreshBooks-Hmac-SHA256 signature"
 },
 "can_do": [
  "Read the public API docs, SDK links and webhook docs",
  "Discover the official MCP endpoint and its OAuth metadata (401 -> PRM -> AS metadata)",
  "Register an OAuth client headless via Dynamic Client Registration"
 ],
 "cannot_do": [
  {
   "what": "Sign up for an account",
   "why": "Visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "what": "Get a user API token or use the MCP server",
   "why": "Needs a logged-in user's consent; no account"
  },
  {
   "what": "Any invoicing, expense, time or report task",
   "why": "No account"
  },
  {
   "what": "Delete an account without a human",
   "why": "Deletion is by email to privacy@freshbooks.com"
  }
 ],
 "blockers": [
  "Visible reCAPTCHA image challenge in front of sign-up on auth.freshbooks.com"
 ],
 "tips_for_owner": [
  "Let signed agents past the sign-up challenge",
  "Offer an agent sign-up and claim flow",
  "Support MCP (the 28 Jul 2026 spec) and server/discover",
  "Advertise CIMD in the AS metadata",
  "Publish OpenAPI, llms.txt and markdown docs",
  "Add an account delete route",
  "Expose a billing API for plan changes"
 ],
 "tips_for_agents": [
  "MCP endpoint is https://mcp.freshbooks.com/v1; request tokens with resource=https://mcp.freshbooks.com/v1 or the gateway rejects the audience. It is session-based: use initialize.",
  "DCR at https://auth.freshbooks.com/service/auth/oauth/registration works without an account; a human must still sign up and consent.",
  "The 30-day trial needs no card; after human sign-up and consent the whole API is open."
 ],
 "selfhost": null,
 "summary": "An agent cannot get into FreshBooks alone: the sign-up page on auth.freshbooks.com showed our agent's browser a visible reCAPTCHA image puzzle, so no capability was driven. Without an account an agent finds good HTML docs, SDKs, webhooks, an official OAuth-protected MCP server with correct Protected Resource Metadata, and can register its own OAuth client via DCR, but every data route needs a logged-in user.",
 "wall": "reCAPTCHA image puzzle on sign-up",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "FreshBooks is online invoicing and accounting software. An agent could read its public docs and even register itself as a developer app, but it could not create an account at all: the sign-up page showed a picture puzzle (CAPTCHA) that only a person can solve.",
  "can_do": [
   "Read the public help pages, software guides and webhook documentation",
   "Find the official connection point for AI assistants and its security settings",
   "Register itself as a developer app without needing an account first"
  ],
  "cannot_do": [
   {
    "what": "Create an account",
    "why": "A picture puzzle (CAPTCHA) blocks sign-up and only a person can solve it"
   },
   {
    "what": "Create invoices, track expenses, log time, or run reports",
    "why": "All of these need a logged-in account, which could not be created"
   },
   {
    "what": "Pay for or cancel a subscription",
    "why": "Buying also goes through the same blocked sign-up page"
   },
   {
    "what": "Delete an account",
    "why": "No account was ever created, and FreshBooks only deletes accounts by email request"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Invoicing",
   "capability": "Create and send an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /accounting/account/{id}/invoices/invoices",
    "mcp": null,
    "cli": null,
    "ui": "Invoices > New Invoice"
   },
   "check": "GET /accounting/account/{id}/invoices/invoices/{invoiceid} shows v3_status 'sent'",
   "source": "https://www.freshbooks.com/api/invoices; https://www.freshbooks.com/invoice"
  },
  {
   "id": "cap-03",
   "group": "Billing & Payments",
   "capability": "Accept online payment (card, ACH, Apple Pay, Google Pay, BNPL)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /payments/account/{id}/online_payments",
    "mcp": null,
    "cli": null,
    "ui": "Invoice > Online Payment Options"
   },
   "check": "Invoice status becomes 'paid'/'autopaid' and a payment record is created",
   "source": "https://www.freshbooks.com/accept-payments; https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-04",
   "group": "Billing & Payments",
   "capability": "Set up recurring billing / automated invoices",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /accounting/account/{id}/recurring_invoices/recurring_invoices",
    "mcp": null,
    "cli": null,
    "ui": "Invoices > Recurring"
   },
   "check": "GET recurring_invoices/{id} shows active recurring schedule and generated invoices",
   "source": "https://www.freshbooks.com/invoice (Put admin tasks on auto-pilot); https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-05",
   "group": "Expenses",
   "capability": "Track and categorize an expense",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /accounting/account/{id}/expenses/expenses",
    "mcp": null,
    "cli": null,
    "ui": "Expenses > New Expense"
   },
   "check": "GET expenses/{id} returns the created expense with category",
   "source": "https://www.freshbooks.com/expenses-and-receipts-tracking; https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-06",
   "group": "Expenses",
   "capability": "Scan a receipt to create an expense (mobile)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Mobile app > Scan Receipt"
   },
   "check": "Expense created from a scanned receipt image appears in Expenses list with attached image",
   "source": "https://www.freshbooks.com/pricing (Expense receipt scanning); https://www.freshbooks.com/mobile-apps"
  },
  {
   "id": "cap-07",
   "group": "Time & Projects",
   "capability": "Track time against a client/project",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /timetracking/business/{id}/time_entries",
    "mcp": null,
    "cli": null,
    "ui": "Time Tracking > Timer"
   },
   "check": "GET /timetracking/business/{id}/time_entries/{id} returns logged duration tied to project",
   "source": "https://www.freshbooks.com/timesheets-and-time-tracking"
  },
  {
   "id": "cap-08",
   "group": "Time & Projects",
   "capability": "Bill tracked time and expenses onto an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /accounting/account/{id}/invoices/invoices/{id} (lines with modern_time_entries/expenseid)",
    "mcp": null,
    "cli": null,
    "ui": "New Invoice > Add time/expenses"
   },
   "check": "Invoice line items reference expenseid/modern_time_entries and total reflects billed amounts",
   "source": "https://www.freshbooks.com/api/invoices; https://www.freshbooks.com/invoice"
  },
  {
   "id": "cap-09",
   "group": "Estimates & Proposals",
   "capability": "Create and send an estimate",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /accounting/account/{id}/estimates/estimates",
    "mcp": null,
    "cli": null,
    "ui": "Estimates > New Estimate"
   },
   "check": "GET estimates/{id} shows status 'sent'",
   "source": "https://www.freshbooks.com/estimating-software; https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-10",
   "group": "Estimates & Proposals",
   "capability": "Convert an estimate into an invoice",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /accounting/account/{id}/invoices/invoices (estimateid field)",
    "mcp": null,
    "cli": null,
    "ui": "Estimate > Convert to Invoice"
   },
   "check": "Created invoice has estimateid pointing to source estimate",
   "source": "https://www.freshbooks.com/api/invoices (estimateid field); https://www.freshbooks.com/estimating-software"
  },
  {
   "id": "cap-11",
   "group": "Accounting",
   "capability": "Run financial and accounting reports",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /accounting/account/{id}/reports/accounting/profitloss",
    "mcp": null,
    "cli": null,
    "ui": "Reports"
   },
   "check": "Report response returns computed profit/loss figures for the period",
   "source": "https://www.freshbooks.com/financial-reporting; https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-02",
   "group": "Invoicing",
   "capability": "Customize invoice appearance and templates",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /accounting/account/{id}/invoices/invoices/{id} (presentation field)",
    "mcp": null,
    "cli": null,
    "ui": "Invoice editor > Customize"
   },
   "check": "GET invoice with include=presentation reflects chosen template/theme",
   "source": "https://www.freshbooks.com/invoice; https://www.freshbooks.com/api/invoice_presentation_attachments"
  },
  {
   "id": "cap-12",
   "group": "Billing & Payments",
   "capability": "Request a deposit/retainer from a client",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /accounting/account/{id}/invoices/invoices/{id} (deposit_amount/deposit_percentage)",
    "mcp": null,
    "cli": null,
    "ui": "Invoice/Estimate > Request Deposit"
   },
   "check": "Invoice deposit_status field shows deposit requested/paid",
   "source": "https://www.freshbooks.com/api/invoices; https://www.freshbooks.com/pricing (client retainers)"
  },
  {
   "id": "cap-13",
   "group": "Billing & Payments",
   "capability": "Set up a client retainer",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /accounting/account/{id}/retainers/retainers",
    "mcp": null,
    "cli": null,
    "ui": "Retainers > New Retainer"
   },
   "check": "GET retainers/{id} shows active retainer with scheduled hours/amount",
   "source": "https://www.freshbooks.com/invoice (Establish a stable cashflow with retainers); https://www.freshbooks.com/pricing"
  },
  {
   "id": "cap-14",
   "group": "Accounting",
   "capability": "Reconcile bank transactions / import bank feed",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /accounting/account/{id}/bank_accounts/bank_accounts",
    "mcp": null,
    "cli": null,
    "ui": "Accounting > Bank Reconciliation"
   },
   "check": "Imported transaction is matched/marked reconciled against a journal entry",
   "source": "https://www.freshbooks.com/accounting; https://www.freshbooks.com/bookkeeping"
  },
  {
   "id": "cap-15",
   "group": "Mileage",
   "capability": "Track mileage for a trip",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Mobile app > Mileage Tracking"
   },
   "check": "Mileage log entry appears with trip distance and computed deduction",
   "source": "https://www.freshbooks.com/mileage-tracking-app"
  },
  {
   "id": "cap-16",
   "group": "Projects",
   "capability": "Manage a project and check profitability",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /projects/business/{id}/projects/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Projects"
   },
   "check": "Project detail view/API shows billed amount vs. cost (profitability)",
   "source": "https://www.freshbooks.com/projects-and-collaboration; https://www.freshbooks.com/pricing (Check project profitability)"
  },
  {
   "id": "cap-17",
   "group": "Clients",
   "capability": "Add and manage a client record",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /accounting/account/{id}/users/clients",
    "mcp": null,
    "cli": null,
    "ui": "Clients > New Client"
   },
   "check": "GET users/clients/{id} returns created client contact details",
   "source": "https://www.freshbooks.com/client-management-software"
  },
  {
   "id": "cap-18",
   "group": "Clients",
   "capability": "Send automated late-payment reminders and late fees",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /accounting/account/{id}/invoices/invoices/{id} (late_reminders/late_fee include)",
    "mcp": null,
    "cli": null,
    "ui": "Invoice Settings > Late Fees/Reminders"
   },
   "check": "Invoice include=late_fee,late_reminders shows configured reminder schedule/fee",
   "source": "https://www.freshbooks.com/invoice (Put admin tasks on auto-pilot); https://www.freshbooks.com/api/invoices"
  },
  {
   "id": "cap-19",
   "group": "Clients",
   "capability": "Customize email templates sent to clients",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Email Templates"
   },
   "check": "Email sent for invoice uses the customized subject/body",
   "source": "https://www.freshbooks.com/pricing (Customize your email templates)"
  },
  {
   "id": "cap-20",
   "group": "Team",
   "capability": "Invite and manage team members with roles",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /auth/api/v1/businesses/{id}/invite",
    "mcp": null,
    "cli": null,
    "ui": "Team Management"
   },
   "check": "Team member appears with assigned role and can log in to the business",
   "source": "https://www.freshbooks.com/team-management; https://www.freshbooks.com/pricing (Team Members add-on)"
  },
  {
   "id": "cap-21",
   "group": "Team",
   "capability": "Give accountant access to the account",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Team > Invite Accountant"
   },
   "check": "Accountant-role user appears in team list with access to accounting reports",
   "source": "https://www.freshbooks.com/pricing (Give your accountant access)"
  },
  {
   "id": "cap-22",
   "group": "Payroll",
   "capability": "Run payroll for self/employees",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Payroll"
   },
   "check": "Payroll run record shows employees paid for the pay period",
   "source": "https://www.freshbooks.com/payroll-software; https://www.freshbooks.com/pricing (FreshBooks Payroll add-on)"
  },
  {
   "id": "cap-23",
   "group": "Billing & Payments",
   "capability": "Pay vendor bills (Bill Pay)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Bill Pay"
   },
   "check": "Bill marked paid with payout confirmation shown in Bill Pay dashboard",
   "source": "https://www.freshbooks.com/bill-pay"
  },
  {
   "id": "cap-24",
   "group": "Billing & Payments",
   "capability": "Request instant payout of received funds",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Payments > Instant Payout"
   },
   "check": "Payout record shows funds transferred ahead of standard payout schedule",
   "source": "https://www.freshbooks.com/instant-payout"
  },
  {
   "id": "cap-26",
   "group": "Mobile",
   "capability": "Use iOS/Android app to manage the business on the go",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Mobile app"
   },
   "check": "Invoice/expense created on mobile app syncs to web account",
   "source": "https://www.freshbooks.com/mobile-apps"
  },
  {
   "id": "cap-25",
   "group": "Billing & Payments",
   "capability": "Apply for business financing",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Financing"
   },
   "check": "Financing application status visible in account dashboard",
   "source": "https://www.freshbooks.com/business-financing"
  },
  {
   "id": "cap-27",
   "group": "Integrations",
   "capability": "Install a third-party app from the FreshBooks App Store",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "AppStore"
   },
   "check": "Installed app (e.g. Zapier, Gusto) appears under connected apps with active status",
   "source": "https://appstore.freshbooks.com/"
  },
  {
   "id": "cap-28",
   "group": "Developer",
   "capability": "Build an OAuth2 integration via the public API",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "OAuth2 /auth/oauth/authorize, /auth/oauth/token",
    "mcp": null,
    "cli": null,
    "ui": "Developer portal > Create App"
   },
   "check": "App created in developer portal yields client id/secret that successfully exchanges auth code for bearer token",
   "source": "https://www.freshbooks.com/api/start; https://www.freshbooks.com/api/authentication"
  },
  {
   "id": "cap-29",
   "group": "Branding",
   "capability": "Become a referral/affiliate or accounting partner",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "/partner"
   },
   "check": "Partner dashboard shows referral/affiliate tracking once enrolled",
   "source": "https://www.freshbooks.com/partner"
  }
 ],
 "attempts": [
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "MCP server discovery",
   "task": "POST server/discover to https://mcp.freshbooks.com/v1 (endpoint from Claude connector listing)",
   "result": "partial",
   "evidence": "HTTP 401 WWW-Authenticate: Bearer resource_metadata=\"https://mcp.freshbooks.com/.well-known/oauth-protected-resource/v1\", scope=\"mcp:all:read offline_access mcp:revenue:write mcp:payables:write mcp:operations:write mcp:books:write\"",
   "notes": "Official 'FreshBooks Aggregated MCP Gateway'; auth required before discover answers. mcp.freshbooks.com/mcp and api.freshbooks.com/mcp 404."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "Protected Resource Metadata",
   "task": "GET /.well-known/oauth-protected-resource/v1",
   "result": "done",
   "evidence": "200 application/json resource=https://mcp.freshbooks.com/v1, authorization_servers=[https://auth.freshbooks.com/]",
   "notes": "RFC 9728 PRM present (path-suffixed). Root variant 404."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "Authorization server metadata",
   "task": "GET auth.freshbooks.com/.well-known/oauth-authorization-server",
   "result": "done",
   "evidence": "200 JSON; registration_endpoint https://auth.freshbooks.com/service/auth/oauth/registration; no client_id_metadata_document_supported; no device_authorization_endpoint; grant_types include password, implicit; code_challenge_methods plain,S256; no agent_auth block",
   "notes": "DCR only (deprecated path), no CIMD, no device flow."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "Cards and well-knowns",
   "task": "GET /.well-known/ai-catalog.json, agent-card.json, agent.json, mcp/server-card.json, ucp on www.freshbooks.com; <mcp>/server-card",
   "result": "failed",
   "evidence": "all 403 nginx text/html on www; mcp.freshbooks.com/v1/server-card 404",
   "notes": "No server card, no A2A card, no UCP profile."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "robots.txt and aipref",
   "task": "GET /robots.txt",
   "result": "done",
   "evidence": "200 text/plain; no Content-Usage or Content-signal lines; User-Agent: * group disallows only paths like /wp-admin/; ClaudeBot/Amazonbot/YandexBot Crawl-delay: 10",
   "notes": "No AI preference signals; no Content-Usage header on pages."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "llms.txt and markdown docs",
   "task": "GET /llms.txt, /api/llms.txt, Accept: text/markdown on /api/invoices, /api/invoices.md, /api/start.md",
   "result": "failed",
   "evidence": "llms.txt 404; Accept: text/markdown returned text/html, Vary: Accept-Encoding only; .md URLs 404",
   "notes": "No markdown docs route."
  },
  {
   "t": "01:59",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "verified": true,
   "capability": "auth.md / SKILL.md",
   "task": "GET /auth.md, /SKILL.md",
   "result": "failed",
   "evidence": "/auth.md 404; /SKILL.md 301 to /skill.md which 404s",
   "notes": ""
  },
  {
   "t": "02:11",
   "cap": "docs",
   "capability": "Find API docs",
   "task": "Fetch https://www.freshbooks.com/api/start",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 HTML docs: OAuth2 bearer tokens; create an app on the developer page after sign-up; Postman docs; SDK page",
   "notes": "Docs are public HTML, no OpenAPI link, no llms.txt.",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "03:13",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Open sign-up (my.freshbooks.com/#/signup -> auth.freshbooks.com/oauth/authorize?type=sign_up) in the browser",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Page title 'Checking your browser - reCAPTCHA' on auth.freshbooks.com; visible reCAPTCHA image puzzle ('Select all images with a bus'), screenshot browser/shots/002.png; did not clear after 15 s.",
   "notes": "Google reCAPTCHA Enterprise WAF challenge page (enterprise.js ...&waf=session) in front of auth.freshbooks.com.",
   "quality": {
    "error_legibility": "n/a",
    "recoverable": "no"
   }
  },
  {
   "t": "03:57",
   "cap": "discovery",
   "capability": "OAuth client registration (DCR)",
   "task": "POST https://auth.freshbooks.com/service/auth/oauth/registration (registration_endpoint from AS metadata) with client_name, redirect_uris, grant_types [authorization_code, refresh_token]",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "201 JSON client_id + client_secret, application_type web; X-RateLimit-Limit 600",
   "notes": "An agent can register an OAuth client headless with no account (DCR, RFC 7591). Still needs a FreshBooks user to authorize.",
   "quality": {
    "verify_route": "no",
    "docs_match": "match"
   }
  },
  {
   "t": "03:57",
   "cap": "discovery",
   "capability": "MCP server/discover and initialize",
   "task": "Token via client_credentials with resource=https://mcp.freshbooks.com/v1 (aud matches), then POST server/discover; fallback initialize offering 2026-07-28 then 2025-11-25",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "server/discover -> 400 text/plain 'missing session ID' (legacy, session-based server); initialize 2026-07-28 and 2025-11-25 -> 500 text/plain 'failed to create new session: failed to create MCP session to any backend'. Token without resource param -> 403 'Audiences in Jwt are not allowed'.",
   "notes": "Legacy Streamable HTTP server (needs Mcp-Session-Id). With a user-less client token the gateway cannot open a backend session; a user token needs a FreshBooks login, which the sign-up wall blocked. Errors are plain text, not JSON-RPC.",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "06:09",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Verify the sign-up email at the agent's inbox",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No sign-up submitted, so no mail to wait for",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Create an OAuth app on the developer page (documented route) / authorize the DCR client as a user",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Docs (/api/start): create an app on the developer page after logging in; authorization code flow needs a logged-in user. DCR client registered headless (201) but user consent impossible without an account.",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "first_call",
   "capability": "First authenticated API call",
   "task": "GET https://api.freshbooks.com/auth/api/v1/users/me",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "401 application/json {\"error\":\"unauthenticated\",\"error_description\":\"This action requires authentication to continue.\"} WWW-Authenticate: Bearer realm=\"FreshBooks\"",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "06:09",
   "cap": "first_action",
   "capability": "First create action",
   "task": "Create a client via POST /accounting/account/{id}/users/clients",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No user token and no account_id",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-01",
   "capability": "Create and send an invoice",
   "task": "Create and send an invoice via POST /accounting/account/{id}/invoices/invoices",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-03",
   "capability": "Accept online payment (card, ACH, Apple Pay, Google Pay, BNPL)",
   "task": "Accept online payment (card, ACH, Apple Pay, Google Pay, BNPL) via POST /payments/account/{id}/online_payments",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-04",
   "capability": "Set up recurring billing / automated invoices",
   "task": "Set up recurring billing / automated invoices via POST /accounting/account/{id}/recurring_invoices/recurring_invoices",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-05",
   "capability": "Track and categorize an expense",
   "task": "Track and categorize an expense via POST /accounting/account/{id}/expenses/expenses",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-06",
   "capability": "Scan a receipt to create an expense (mobile)",
   "task": "Scan a receipt to create an expense (mobile) via UI",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-07",
   "capability": "Track time against a client/project",
   "task": "Track time against a client/project via POST /timetracking/business/{id}/time_entries",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-08",
   "capability": "Bill tracked time and expenses onto an invoice",
   "task": "Bill tracked time and expenses onto an invoice via PUT /accounting/account/{id}/invoices/invoices/{id} (lines with modern_time_entries/expenseid)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-09",
   "capability": "Create and send an estimate",
   "task": "Create and send an estimate via POST /accounting/account/{id}/estimates/estimates",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-10",
   "capability": "Convert an estimate into an invoice",
   "task": "Convert an estimate into an invoice via POST /accounting/account/{id}/invoices/invoices (estimateid field)",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "cap-11",
   "capability": "Run financial and accounting reports",
   "task": "Run financial and accounting reports via GET /accounting/account/{id}/reports/accounting/profitloss",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account or user OAuth token; sign-up wall",
   "notes": "No FreshBooks account: sign-up blocked by a visible reCAPTCHA image challenge on auth.freshbooks.com"
  },
  {
   "t": "06:09",
   "cap": "pay",
   "capability": "Pay step probe",
   "task": "402 probes on api.freshbooks.com paths and x402./mpp./agents. subdomains; /.well-known/ucp; x402 Bazaar and mpp.dev registries; pricing page",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "api.freshbooks.com unauthenticated -> 404/401 JSON, no 402, no PAYMENT-REQUIRED or WWW-Authenticate: Payment; x402./mpp./agents.freshbooks.com 301 to www; /.well-known/ucp 403; Bazaar and mpp.dev: 0 matches for freshbooks; pricing page: '30-day free trial, with no contracts and no credit card required'; Buy Now -> my.freshbooks.com/#/signup/direct-buy (same reCAPTCHA-gated auth host)",
   "notes": "No agent payment rail; purchase is web checkout inside sign-up/app, behind the same reCAPTCHA challenge. Checkout itself not reached."
  },
  {
   "t": "06:09",
   "cap": "cancel",
   "capability": "Cancel plan",
   "task": "Check documented cancel route",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Support article 115011044847: 'On a web browser, select your profile picture ... Billing and Upgrade'; no billing API in the 59 /api/ doc pages",
   "notes": "Nothing started, nothing to cancel. Documented route is web UI only."
  },
  {
   "t": "06:09",
   "cap": "delete",
   "capability": "Delete account and data",
   "task": "Check documented delete route",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Support article 360031120891: 'please email privacy@freshbooks.com directly from your email address on file'",
   "notes": "No account created. Deletion is by email to the privacy team only."
  }
 ],
 "stale": false,
 "icon": "/logos/freshbooks.png",
 "monitored": false,
 "verdict": "Stops at L1 · Needs a person: our agent cannot get into FreshBooks on its own. At signup, auth.freshbooks.com showed a visible Google reCAPTCHA image puzzle, so a person has to sign up, verify and make the key before any work starts. Without an account our agent still found clear HTML docs, SDKs, webhooks, and an official OAuth-protected MCP server, and it registered its own OAuth client through dynamic client registration. But every data route needs a logged-in user, so no call, invoice, or billing check went through. A trial needs no card, but reaching it still means getting past that same signup page first.",
 "page": "https://agentdrives.com/tools/freshbooks?via=api"
}