Developers · Limits and errors

Reference · Operations

Limits and errors

How fast you can call, how much data can leave, what your Enterprise order allows for the period, and what every error means — with the action to take.

How machine access is bounded

Looking and taking are bounded differently. A person reading a property, a firm or a person on screen in the Greenfinch app is doing what your plan or your geography licence already paid for, and is not rationed (see Fair use in the app). A taking — a record delivered to a program, over REST, through the MCP connector, to a webhook or Zapier — is bounded at three levels, which answer three different questions:

LevelThe question it answersSet by
1. Request rateHow fast may a program ask?Your plan, with a per-organization override
2. Daily data limitsHow much may leave in one day?Greenfinch, your admins, and each key — the lowest applies
3. Records allowanceHow many distinct records may leave in a billing period?Your Enterprise order

API and connector usage is bounded by limits that scale with the size of your Enterprise plan: a larger licensed territory carries a larger records allowance, and the daily limits are derived from it rather than chosen separately. Your order states the numbers, and you can read them back at any time — see Where you see your usage.

Availability — 15 September 2026

Live today, on every plan: the per-minute request rates, and the daily limits on contact reveals, lead deliveries and agent pipeline changes described below. The records allowance, the GET /api/v1/allowance endpoint, the daily request ceiling, the two new daily kinds (paid property unlocks, and records taken across every door), the structured limit object on refusals and the fair-use view limits in the app are rolling out from mid-September 2026. Your Enterprise order states your allowance; the endpoint and codes below answer once the rollout reaches your organization. Until then, nothing your integration does today starts failing: the new limits arrive with your order, not before it.

Level 1 · Request rate

Each API key has one counter covering every REST endpoint and the MCP endpoint together. Windows are fixed 60-second periods.

PlanRequests per minute, per keyStatus
Team120Live today
Enterprise300Live today
  • The limit follows your organization's current plan, checked on every request.
  • An organization can hold 10 active keys, so its combined ceiling is 10 times the per-key limit.
  • Greenfinch can set a different per-minute rate for your organization, which then replaces the plan default on every key and assistant connection you hold. (Rolling out.)
  • Before a key is checked, requests are also limited to 1,000 per minute from one IP address. It only matters if many keys share one outbound address.
  • Searching is bounded here and nowhere else. A search result is a summary — an identifier, an address, a one-line description, a count — so it is never a taking and never draws your records allowance. Discovery is throttled; looking something up is not.
  • A daily request ceiling also applies to Enterprise keys and assistant connections: 50,000 requests per UTC day across all of them together, which Greenfinch can raise, lower or clear for your organization. A request past it is refused with DAILY_REQUEST_LIMIT_EXCEEDED. A Team organization has no daily ceiling unless one is set for it. Your Limits and usage page shows the ceiling in force and today's count. (Rolling out.)

A request over the per-minute limit is answered 429:

429 Too Many Requests
HTTP/1.1 429 Too Many Requests
Retry-After: 23
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1789402860
Cache-Control: no-store
Content-Type: application/json

{
  "success": false,
  "error": "Too many requests — this key's limit of 300 requests a minute is spent. Retry in 23s.",
  "meta": {
    "code": "rate_limited",
    "retryAfterSeconds": 23,
    "limit": {
      "name": "requests_per_minute",
      "level": 1,
      "value": 300,
      "used": 300,
      "resets_at": "2026-09-15T06:01:00Z"
    }
  }
}

A request over the daily ceiling is also 429, with a different code, because retrying sooner cannot help — the count restarts at midnight UTC:

429 Too Many Requests — the day's ceiling
{
  "success": false,
  "error": "Requests per day: this organization's limit of 50,000 requests a day, across every API key and AI assistant connection, is used (50,000 today). Resets 2026-09-16T00:00:00.000Z.",
  "meta": {
    "code": "DAILY_REQUEST_LIMIT_EXCEEDED",
    "retryAfterSeconds": 21600,
    "limit": {
      "name": "requests_per_day",
      "level": 1,
      "value": 50000,
      "used": 50000,
      "resets_at": "2026-09-16T00:00:00.000Z"
    }
  }
}
  • Wait Retry-After seconds (the same number as meta.retryAfterSeconds). X-RateLimit-Reset is when the window ends, in Unix seconds. These headers are sent on 429 responses.
  • If the rate limiter itself is unavailable, requests are refused rather than let through: 503 with meta.code rate_limit_unavailable and a Retry-After. Retry with backoff.

Level 2 · Daily data limits

Separate from request rates, each kind of data that leaves has a daily limit, so an automation that goes wrong cannot take out or change more than your organization expects. Days are UTC and reset at midnight UTC.

Three layers can apply to each kind, and the lowest one in force wins:

LayerWho sets itRefusal code
Greenfinch account maximumGreenfinch, per organization; your admins can only set lower values beneath it. One kind is not typed in by anyone: the daily maximum on records taken is normally worked out from your records allowance, and a refusal says which it was — see derived under what every refusal says. A typed maximum can only be changed by Greenfinch; a derived one is raised by raising the allowance it comes from. (Rolling out.)ACCOUNT_DAILY_CAP_EXCEEDED
Organization limitYour own admin, on Org admin → Integrations → Limits & usage.DAILY_CAP_EXCEEDED
Per-key limitYour own admin, in a key's details. It can only lower the organization limit; 0 pauses a key without revoking it.CREDENTIAL_DAILY_CAP_EXCEEDED
Kind of dataWhat countsDefaultStatus
Contact revealsContacts disclosed through the contact and property endpoints or the MCP tools — paid reveals, and contacts shown because your subscription covers their county. Re-reading a contact you already paid for does not count.No limit until an admin sets oneLive today
Lead deliveriesLead bundles delivered on any channel: GET /leads/{id}, the MCP bundle tools, and webhook deliveries. Named lead_export in the limit figures the API and the workspace tool report.No limit until an admin sets oneLive today
Agent pipeline changesLeads qualified or disqualified through the API, plus attempted-contact, active opportunity, won and lost changes made by greenfinch_update_lead_status. CRM write-backs through POST /leads/{id}/status do not count.On. The organization limit is the larger of 25 or one-thirtieth of the monthly credit allotmentLive today
Paid property unlocksProperty unlocks charged through an API key or an assistant connection (POST /properties/{id}/unlock and its MCP twin). Unlocks a person makes in the app do not count.No limit until an admin sets oneRolling out
Records taken, all doorsEvery taking, by whichever door — the same thing the records allowance counts, summed per UTC day instead of per billing period.On for Enterprise, and derived rather than chosen: three days' share of your allowance per day, applied both to your organization as a whole and to any one key or assistant connection on its ownRolling out
  • The two daily figures for records taken move with your allowance, so a larger allowance raises them automatically. The per-key figure stops one runaway program inside a day; the organization figure means spreading a pull across many keys does not outrun it either.
  • An admin can also switch agent pipeline changes off entirely; tools then refuse with MCP_QUALIFICATION_DISABLED.
  • Retired 14 September 2026: AGENT_QUALIFICATION_DISABLED and DAILY_CAP_REACHED. greenfinch_update_lead_status used to answer this same limit with codes of its own; it now returns the standard codes, like every other pipeline tool. Nothing returns the retired pair any more.
  • Refusals include the numbers — usedToday, cap, remainingToday and resetsAt — so a job can plan rather than retry.
  • Check where you stand before a run: greenfinch_describe_workspace reports the reveal and delivery limits, and greenfinch_get_transition_cap the pipeline limit.

Daily limits are advisory under heavy concurrency

Limits are counted when a call starts. Many simultaneous calls can each pass before any of them is recorded, so a burst can go slightly over. Run large jobs sequentially if the exact number matters.

Level 3 · The records allowance

Every Enterprise order states a records allowance: how many distinct records your programs may take per billing period. It is the commercial bound on machine access, it is sized to your plan, and it is the one limit of the three that your order — not a setting — carries. Your period is the one in your contract; where none is recorded, it is the UTC calendar month.

What counts as a record

A record is one property, one firm or one person, delivered in full. A taking is a record delivered to a program. A record is taken when it is:

  • returned in full by a REST API call;
  • returned in full by an MCP tool — whether the assistant signed in as a person or with an API key, because the same data leaves either way;
  • pushed to your CRM, to a webhook, or through Zapier;

A lead bundle is a taking of the property plus each distinct firm and person inside it. A bundle carrying two firms and two people is five records — the property, both firms, both people.

These never count, and never draw the allowance:

Not a takingWhy
Search and browse results, and any other summary — an id, an address, a one-line description, a count, a yes-or-noFinding out what exists is not receiving it. Discovery is bounded by the request rate instead.
A link row that only says two records are connectedIt carries the two ids, the role and the relationship's own facts — never a field of either record.
A removal instructionCharging for removals would make it cheaper to skip the sync that carries them, which is the opposite of what the data-protection rules need.
A delivery that failed before it reached youYou did not receive it.

How it is counted

  • Once per record, per period, across every door. A record taken twice in the same period — re-read by an assistant, re-synced nightly, re-exported in a full run — counts once. Repetition inside the period is free, and at the period boundary the count starts again from zero.
  • One allowance, every door. REST, the MCP connector, CRM pushes, webhooks and Zapier all draw the same number. There is no door through which a record leaves uncounted, and so no cheaper door to move a job to.
  • The allowance never widens a licence. A record outside your licensed area still has to be unlocked with credits first, exactly as in the app; once unlocked, taking it counts like any other record. The allowance governs how much may leave, never what you may see.
  • An initial load is a separate, one-time allowance. If your contract loads a whole territory in its first period, the order can carry a one-time initial-load allowance alongside the recurring one. It is shown separately and is spent before the recurring allowance.
  • No credits are charged for taking. Credits keep paying for seeing — research, unlocking a record outside your licensed area, revealing a person on their own, deep research, email drafts.

What happens at the allowance

Your order says which of two things happens, and the allowance endpoint tells you which applies to you:

  • Taking stops until the period resets. Calls that would deliver a record are refused with RECORDS_ALLOWANCE_EXCEEDED, naming the allowance, what has been used and the reset time. Looking in the app is completely unaffected — your people carry on reading properties, firms and people as before, because that is what the licence bought. Search, lists and the pipeline keep working too.
  • Or the excess is invoiced at the per-record price your order states, up to the ceiling it states. Nothing is charged without your order saying so, and every response to a successful taking reports how much overage the period has accrued, so an invoice can never arrive unseen.

Team plans have no order and no records allowance. Their per-prospect deliveries keep the existing meter — a free monthly allowance, then one credit each — described under Lead bundles.

Availability — 15 September 2026

The records allowance is rolling out from mid-September 2026, with each Enterprise order. Your order states your allowance, your period, whether overage applies and at what price; the GET /api/v1/allowance endpoint below and the RECORDS_ALLOWANCE_EXCEEDED refusal answer once the rollout reaches your organization. Until it does, nothing is counted against an allowance and nothing your integration does today is refused for one. Enterprise per-prospect deliveries move from per-delivery credits to the allowance in the same rollout; Team plans do not change.

Where you see your usage

WhereWhat it showsStatus
Org admin → Integrations → Limits & usage in the appEvery limit in force with today's use against it, per organization and per key; the period's records allowance, used and remaining, broken down by door (REST, the connector, CRM/webhook/Zapier deliveries); the initial-load allowance where your order has one; and the app's fair-use view counts.Live today for the daily limits and key usage; the allowance and fair-use rows arrive with the rollout
GET /api/v1/allowanceThe same figures for a program: allowance, used, remaining, when the period resets, whether overage applies and at what price, the initial-load allowance and what is left of it, every daily limit in force with its level and layer. Any Enterprise key may read it — no extra scope.Rolling out
greenfinch_describe_workspaceThe same numbers for an AI assistant, so it can plan a night's work against what a program would read. Both read one ledger, so they cannot disagree.Live today for the reveal and delivery limits; the allowance figures arrive with the rollout

What every refusal says

Every refusal caused by a limit names the limit, its level and when it resets — in the message a person reads and in a structured limit object a program can branch on. The shape is the same on REST, on MCP tools and in the status of an export job.

429 · a daily limit
{
  "success": false,
  "code": "ACCOUNT_DAILY_CAP_EXCEEDED",
  "error": "Records taken per day: a daily maximum of 1,000, derived from your records allowance, is used (1,000 today). Resets 2026-09-16T00:00:00Z.",
  "meta": {
    "code": "ACCOUNT_DAILY_CAP_EXCEEDED",
    "limit": {
      "name": "records_taken_per_day",
      "level": 2,
      "layer": "greenfinch_admin",
      "derived": true,
      "value": 1000,
      "used": 1000,
      "resets_at": "2026-09-16T00:00:00Z"
    }
  }
}
429 · the records allowance
{
  "success": false,
  "code": "RECORDS_ALLOWANCE_EXCEEDED",
  "error": "Records allowance: the period ending 2026-09-30T23:59:59Z is fully used. Taking is paused until the allowance resets; looking in the app is unaffected. Overage is not enabled on this order.",
  "meta": {
    "code": "RECORDS_ALLOWANCE_EXCEEDED",
    "limit": {
      "name": "records_allowance",
      "level": 3,
      "value": 10000,
      "used": 10000,
      "remaining": 0,
      "period_ends_at": "2026-09-30T23:59:59Z",
      "overage_enabled": false,
      "overage_price_per_record_usd": null
    }
  }
}
  • level is 1 (request rate), 2 (daily data) or 3 (the records allowance).
  • layer appears on level 2 only: greenfinch_admin, organization or key. When two layers hold the same lowest value, layers lists both. It tells you whether it was your own key or the whole organization that ran out.
  • derived appears on level 2 only, and only on a limit that can be worked out rather than typed in — today, records taken per day. true means the number that stopped you was computed from your records allowance, so the way to raise it is a larger allowance rather than asking for the number itself to be changed. It is omitted, rather than false, on limits that have no derived form at all.
  • On an organization with overage enabled, a level-3 refusal arrives only at the ceiling the order states; below it, overage_enabled is true and successful takings report the overage accrued so far.
  • The existing codes keep their names, so integrations written against them keep working; they gain the limit object. MCP tools carry the same object in their structured result and the same sentence in their text.
  • Values shown here are illustrative. The numbers that apply to you are your order's and your admins', and are readable from the allowance endpoint.

Fair use in the app

The three levels above bound what a program takes. The Greenfinch app applies a separate fair-use bound on what one signed-in person opens: it counts the distinct property detail pages a person opens, warns when the pace stops looking like reading, and pauses property detail pages if it continues. Searching, lists, the pipeline and the API keep working throughout, and a pause lifts by itself.

  • A person doing their job never meets it. The thresholds are set from how long it takes to actually read a property page, and a heavy prospecting day sits comfortably below them. They exist for one case only: a browser driven by a script, signed in as a person, used to read a territory page by page.
  • Search results, map tiles and list views are not counted — those are how people find things.
  • Your admins and Greenfinch are both notified if a pause ever fires, so nobody discovers it from a confused salesperson, and Greenfinch can clear it.
  • The supported way to read a lot of properties is this API, within your allowance — not a browser driven by a script, which your order does not permit.

Availability — 15 September 2026

The app's view limits are rolling out from mid-September 2026. The current thresholds for your organization, today's counts and any warning in effect are shown on Org admin → Integrations → Limits & usage when they reach you.

Credits

Credits pay for seeing a record you are not already licensed for, and for research. They are shared by your whole organization and charged the same whether an action happens in the app, through the API, or through an AI assistant. Nothing below is charged for delivering a record to a program — that is what the records allowance bounds instead.

ActionCreditsNotes
Unlock a property10Research and every attached contact. Once per property; free where your subscription covers the county.
Research a property10Fresh AI research on an unresearched property; includes the unlock.
Reveal a contact5A contact not already covered by an unlocked property. Once per contact.
Contact on an unlocked property0Included in the unlock.
Research a contact manually5
Research an organization2
Find an email address5
Deep research on a contact10A background run; charged when it starts.
Draft an outreach email5Per draft.
Lead bundle delivery1Team plans only, after the free monthly allowance is used. Enterprise deliveries draw the records allowance instead, at no credit cost, as that rolls out.

greenfinch_get_price_sheet returns this list, greenfinch_get_credit_balance and GET /account the balance, and greenfinch_price_research quotes a research job before you run it. Running out of credits never triggers an automatic charge: the action is refused.

HTTP statuses

StatusMeaningWhat to do
400The request is malformed: bad JSON, a missing or invalid parameter.Fix the request. The message names the field.
401No key, a malformed key, or a revoked key.Check the Authorization header; create a new key if it was revoked.
402Not enough credits for a metered action.Top up or wait for the next allowance, then retry.
403The key lacks the scope, the plan lacks the feature, the account is suspended or closed, or the item is outside your territory.Read the code; most need an admin or a plan change, not a retry.
404The item does not exist or is not visible to your organization.Check the ID.
409A conflict: a limit on keys or endpoints, a merged property, or a change during the request.Read the code; CHANGED_IN_FLIGHT can be retried.
422The request is well-formed but a value is not allowed.Fix the value.
429A rate limit, a daily limit or the records allowance was reached.Wait for Retry-After, or for the reset time in the limit object.
503A safety check or the rate limiter was briefly unavailable.Retry after Retry-After, with backoff.
500An unexpected server error.Retry with backoff; contact support if it persists.

Error and refusal codes

On REST, read the code from meta.code, or from the top-level code for errors raised before the endpoint runs. On MCP, access errors use the same HTTP bodies, and tool refusals put the code in result.structuredContent.code with HTTP 200.

Access and account

CodeHTTPMeaning and action
SCOPE_NOT_GRANTED403The key was not given the scope this call needs. Create a key with it.
UPGRADE_REQUIRED403Your plan does not include this feature; feature and minimumTier say which. Upgrade, or contact sales for Enterprise.
ORG_SUSPENDED403The organization is suspended. Contact support.
ORG_SUSPENSION_UNAVAILABLE503Account status could not be confirmed. Retry after Retry-After.
ACCOUNT_CLOSED403The account is closed.
ACCOUNT_CLOSURE_CHECK_UNAVAILABLE503Account status could not be confirmed. Retry shortly.
CREDENTIAL_LIMIT_REACHED409The organization already has 10 active keys. Revoke one first.
rate_limited429Request rate limit. Wait Retry-After seconds.
rate_limit_unavailable503The rate limiter is unavailable. Retry with backoff.
INVALID_OAUTH_TOKEN401A per-user connection's sign-in token is invalid or expired. Reconnect.
NOT_A_MEMBER403The signed-in person is not a member of the organization.
MEMBER_CONNECT_DISABLED403The organization only lets admins connect assistants.
GRANT_REVOKED403This connection was revoked. An admin must restore access.
NO_ACTIVE_SEATMCPThe member has no active seat.
ROLE_NOT_PERMITTEDMCPThe member's role is read-only; the tool writes or spends.
ACTING_USER_REQUIREDMCP / 403This action must be attributed to a person. Use a per-user connection.
ACTING_USER_NOT_SUPPORTED403The search, read and unlock REST endpoints accept organization API keys only; a signed-in person's connection uses MCP.
IDENTITY_UNRESOLVEDMCP / 503The member's account could not be resolved. Retry shortly.

Credits and limits

CodeHTTPMeaning and action
INSUFFICIENT_CREDITS402 / MCPNot enough credits; required and available give the numbers. The same code covers a member's personal monthly credit limit.
CREDITS_DORMANT402The organization's credits cannot be spent on its current plan.
USER_CREDIT_LIMIT_EXCEEDED402A per-member credit limit was reached.
DAILY_REQUEST_LIMIT_EXCEEDED429The organization's daily request ceiling is used (level 1). Resume after the reset time in the limit object. Rolling out from mid-September 2026.
ACCOUNT_DAILY_CAP_EXCEEDED429 / MCPA Greenfinch account maximum for this kind of data is used (level 2). Your own admins cannot raise it. When the refusal carries derived true the number was worked out from your records allowance rather than typed in by anyone, and a larger allowance raises it; otherwise contact your Greenfinch contact. Rolling out from mid-September 2026.
DAILY_CAP_EXCEEDED429 / MCPThe organization's daily limit for this action is used. Wait for resetsAt, or an admin raises it.
CREDENTIAL_DAILY_CAP_EXCEEDED429 / MCPThis key's or connection's daily limit is used.
RECORDS_ALLOWANCE_EXCEEDED429 / MCPThis taking, or an export's estimated records, exceeds what remains of the records allowance (level 3). Looking in the app is unaffected. Rolling out from mid-September 2026.
COST_CONFIRMATION_REQUIREDMCPThe call would cost more than maxCredits. Re-run with a ceiling at or above projectedCredits.
ACTION_IN_PROGRESS409 / MCPAnother request is already unlocking or revealing the same item. Nothing was charged. Retry after Retry-After (1 second) or retryAfterSeconds; if the first finished, the repeat is free.
PAYMENT_FAILED402 / MCPThe subscription payment failed, so unlocks and reveals cannot spend credits. Nothing was charged; an admin updates the payment method on the Billing page.
CREDIT_ACTION_IN_PROGRESSMCPThe same paid action is already running. Retry after retryAfterSeconds.
RATE_LIMITED429 / MCPToo many requests of this kind (support, coverage or research requests). Slow down.
SUBSCRIPTION_PAYMENT_FAILEDMCPBilling needs attention before this paid action can run.
BILLING_NOT_PROVISIONEDMCPBilling is not set up for this organization yet. Contact support.

Coverage and visibility

CodeHTTPMeaning and action
OUT_OF_TERRITORY403 / MCPThe item exists but is outside your service area (reason subscription) or the member's assigned territory (reason territory). The message names the county.
NO_VISIBLE_TERRITORY403 / MCPNothing is visible to this caller at all; cause says why. Usually an admin setting.
NOT_ENTITLED403 / MCPThe property is not unlocked or covered. Unlock it first.
FEATURE_GATED403 / MCPYour plan does not include this feature (for example lists or the pipeline).
NOT_FOUND404 / MCPNo such item visible to you.
PROPERTY_RETIRED409 / MCPThe property was merged after a county data refresh. Use successorPropertyId from now on.
PROPERTY_NOT_AVAILABLE404 / MCPA property in the request is missing or outside your territory.
CONTACT_NOT_AVAILABLE404 / MCPA contact in the request is not available to your organization.
LIST_NOT_FOUNDMCPNo such list, or it is another member's private list.
COMPLIANCE_CHECK_UNAVAILABLE503 / MCPA safety check could not run. Retry shortly.

Pipeline and write-back

CodeHTTPMeaning and action
NO_PIPELINE_RECORD404Write-back only updates leads that were in your pipeline.
CRM_MODE_NOT_EXTERNAL409Your organization manages stages in Greenfinch. An admin can switch CRM mode to external.
CHANGED_IN_FLIGHT409The lead changed during the request. Retry.
STAGE_CAPPEDMCPYour external CRM owns this stage; record it there.
MCP_QUALIFICATION_DISABLEDMCPAn admin switched off agent pipeline changes.
SCOPE_REQUIREDMCPgreenfinch_update_lead_status needs pipeline:transitions_full on the connection.
DEAL_VALUE_REQUIREDMCPWon (and qualify) need a deal value above $1.
INVALID_LOSS_REASON_CODEMCPUse a code from greenfinch_get_loss_reasons.
SAME_STATUSMCPThe lead is already in that stage.
ALREADY_DISQUALIFIEDMCPThe lead is already disqualified.
CLOSED_STAGEMCPWon or lost leads cannot be disqualified.
CodeMeaning and action
NOT_RESEARCHEDThe property has no research to unlock (409 on REST). Start research first.
PROPERTY_UNLOCK_REQUIREDUnlock the property before this contact action.
CONTACT_REVEAL_REQUIREDReveal the contact before this action.
STRATEGY_REQUIREDRun deep research on the contact before drafting an email.
ALREADY_RESEARCHINGResearch is already running for this item.
BATCH_ALREADY_RUNNINGA research batch is already running; wait or cancel it.
RESEARCH_LAUNCH_BUSYAnother research launch for your organization is being recorded. Nothing was charged; retry in a few seconds.
BATCH_TOO_LARGEToo many properties in one research batch. Split it.
EMPTY_SELECTIONThe selection has no eligible properties.
WRONG_LIST_TYPEThe list holds the other kind of item (properties versus contacts).
NAME_IN_USEA list with that name already exists.
MISSING_QUERY_BOUNDS_OR_COUNTYA search needs free text, a location filter or map bounds.
AMBIGUOUS_SEARCH_MODESend free text or filters/bounds, not both.
INVALID_CURSORThe pagination cursor is invalid or expired. Start again from the first page.
CURSOR_SORT_MISMATCHA cursor must be used with the sort it came from.
OFFSET_REQUIRES_SORTPaging a saved search with offset needs an explicit sort.
TEMPORARILY_UNAVAILABLEA dependency is briefly unavailable. Retry shortly.

Each tool's full list of refusal codes is on its card in the MCP tool reference. Protocol-level errors (invalid JSON, unknown tool, invalid arguments) are described on MCP connector.