Reference · Operations
Limits and errors
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:
| Level | The question it answers | Set by |
|---|---|---|
| 1. Request rate | How fast may a program ask? | Your plan, with a per-organization override |
| 2. Daily data limits | How much may leave in one day? | Greenfinch, your admins, and each key — the lowest applies |
| 3. Records allowance | How 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.
| Plan | Requests per minute, per key | Status |
|---|---|---|
| Team | 120 | Live today |
| Enterprise | 300 | Live 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:
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:
{
"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-Afterseconds (the same number asmeta.retryAfterSeconds).X-RateLimit-Resetis when the window ends, in Unix seconds. These headers are sent on429responses. - If the rate limiter itself is unavailable, requests are refused rather than let through:
503withmeta.coderate_limit_unavailableand aRetry-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:
| Layer | Who sets it | Refusal code |
|---|---|---|
| Greenfinch account maximum | Greenfinch, 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 limit | Your own admin, on Org admin → Integrations → Limits & usage. | DAILY_CAP_EXCEEDED |
| Per-key limit | Your 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 data | What counts | Default | Status |
|---|---|---|---|
| Contact reveals | Contacts 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 one | Live today |
| Lead deliveries | Lead 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 one | Live today |
| Agent pipeline changes | Leads 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 allotment | Live today |
| Paid property unlocks | Property 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 one | Rolling out |
| Records taken, all doors | Every 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 own | Rolling 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_DISABLEDandDAILY_CAP_REACHED.greenfinch_update_lead_statusused 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,remainingTodayandresetsAt— so a job can plan rather than retry. - Check where you stand before a run:
greenfinch_describe_workspacereports the reveal and delivery limits, andgreenfinch_get_transition_capthe 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 taking | Why |
|---|---|
| Search and browse results, and any other summary — an id, an address, a one-line description, a count, a yes-or-no | Finding out what exists is not receiving it. Discovery is bounded by the request rate instead. |
| A link row that only says two records are connected | It carries the two ids, the role and the relationship's own facts — never a field of either record. |
| A removal instruction | Charging 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 you | You 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
| Where | What it shows | Status |
|---|---|---|
| Org admin → Integrations → Limits & usage in the app | Every 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/allowance | The 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_workspace | The 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.
{
"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"
}
}
}{
"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
}
}
}levelis 1 (request rate), 2 (daily data) or 3 (the records allowance).layerappears on level 2 only:greenfinch_admin,organizationorkey. When two layers hold the same lowest value,layerslists both. It tells you whether it was your own key or the whole organization that ran out.derivedappears on level 2 only, and only on a limit that can be worked out rather than typed in — today, records taken per day.truemeans 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 thanfalse, 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_enabledistrueand successful takings report the overage accrued so far. - The existing codes keep their names, so integrations written against them keep working; they gain the
limitobject. 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.
| Action | Credits | Notes |
|---|---|---|
| Unlock a property | 10 | Research and every attached contact. Once per property; free where your subscription covers the county. |
| Research a property | 10 | Fresh AI research on an unresearched property; includes the unlock. |
| Reveal a contact | 5 | A contact not already covered by an unlocked property. Once per contact. |
| Contact on an unlocked property | 0 | Included in the unlock. |
| Research a contact manually | 5 | |
| Research an organization | 2 | |
| Find an email address | 5 | |
| Deep research on a contact | 10 | A background run; charged when it starts. |
| Draft an outreach email | 5 | Per draft. |
| Lead bundle delivery | 1 | Team 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
| Status | Meaning | What to do |
|---|---|---|
400 | The request is malformed: bad JSON, a missing or invalid parameter. | Fix the request. The message names the field. |
401 | No key, a malformed key, or a revoked key. | Check the Authorization header; create a new key if it was revoked. |
402 | Not enough credits for a metered action. | Top up or wait for the next allowance, then retry. |
403 | The 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. |
404 | The item does not exist or is not visible to your organization. | Check the ID. |
409 | A 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. |
422 | The request is well-formed but a value is not allowed. | Fix the value. |
429 | A rate limit, a daily limit or the records allowance was reached. | Wait for Retry-After, or for the reset time in the limit object. |
503 | A safety check or the rate limiter was briefly unavailable. | Retry after Retry-After, with backoff. |
500 | An 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
| Code | HTTP | Meaning and action |
|---|---|---|
SCOPE_NOT_GRANTED | 403 | The key was not given the scope this call needs. Create a key with it. |
UPGRADE_REQUIRED | 403 | Your plan does not include this feature; feature and minimumTier say which. Upgrade, or contact sales for Enterprise. |
ORG_SUSPENDED | 403 | The organization is suspended. Contact support. |
ORG_SUSPENSION_UNAVAILABLE | 503 | Account status could not be confirmed. Retry after Retry-After. |
ACCOUNT_CLOSED | 403 | The account is closed. |
ACCOUNT_CLOSURE_CHECK_UNAVAILABLE | 503 | Account status could not be confirmed. Retry shortly. |
CREDENTIAL_LIMIT_REACHED | 409 | The organization already has 10 active keys. Revoke one first. |
rate_limited | 429 | Request rate limit. Wait Retry-After seconds. |
rate_limit_unavailable | 503 | The rate limiter is unavailable. Retry with backoff. |
INVALID_OAUTH_TOKEN | 401 | A per-user connection's sign-in token is invalid or expired. Reconnect. |
NOT_A_MEMBER | 403 | The signed-in person is not a member of the organization. |
MEMBER_CONNECT_DISABLED | 403 | The organization only lets admins connect assistants. |
GRANT_REVOKED | 403 | This connection was revoked. An admin must restore access. |
NO_ACTIVE_SEAT | MCP | The member has no active seat. |
ROLE_NOT_PERMITTED | MCP | The member's role is read-only; the tool writes or spends. |
ACTING_USER_REQUIRED | MCP / 403 | This action must be attributed to a person. Use a per-user connection. |
ACTING_USER_NOT_SUPPORTED | 403 | The search, read and unlock REST endpoints accept organization API keys only; a signed-in person's connection uses MCP. |
IDENTITY_UNRESOLVED | MCP / 503 | The member's account could not be resolved. Retry shortly. |
Credits and limits
| Code | HTTP | Meaning and action |
|---|---|---|
INSUFFICIENT_CREDITS | 402 / MCP | Not enough credits; required and available give the numbers. The same code covers a member's personal monthly credit limit. |
CREDITS_DORMANT | 402 | The organization's credits cannot be spent on its current plan. |
USER_CREDIT_LIMIT_EXCEEDED | 402 | A per-member credit limit was reached. |
DAILY_REQUEST_LIMIT_EXCEEDED | 429 | The 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_EXCEEDED | 429 / MCP | A 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_EXCEEDED | 429 / MCP | The organization's daily limit for this action is used. Wait for resetsAt, or an admin raises it. |
CREDENTIAL_DAILY_CAP_EXCEEDED | 429 / MCP | This key's or connection's daily limit is used. |
RECORDS_ALLOWANCE_EXCEEDED | 429 / MCP | This 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_REQUIRED | MCP | The call would cost more than maxCredits. Re-run with a ceiling at or above projectedCredits. |
ACTION_IN_PROGRESS | 409 / MCP | Another 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_FAILED | 402 / MCP | The 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_PROGRESS | MCP | The same paid action is already running. Retry after retryAfterSeconds. |
RATE_LIMITED | 429 / MCP | Too many requests of this kind (support, coverage or research requests). Slow down. |
SUBSCRIPTION_PAYMENT_FAILED | MCP | Billing needs attention before this paid action can run. |
BILLING_NOT_PROVISIONED | MCP | Billing is not set up for this organization yet. Contact support. |
Coverage and visibility
| Code | HTTP | Meaning and action |
|---|---|---|
OUT_OF_TERRITORY | 403 / MCP | The 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_TERRITORY | 403 / MCP | Nothing is visible to this caller at all; cause says why. Usually an admin setting. |
NOT_ENTITLED | 403 / MCP | The property is not unlocked or covered. Unlock it first. |
FEATURE_GATED | 403 / MCP | Your plan does not include this feature (for example lists or the pipeline). |
NOT_FOUND | 404 / MCP | No such item visible to you. |
PROPERTY_RETIRED | 409 / MCP | The property was merged after a county data refresh. Use successorPropertyId from now on. |
PROPERTY_NOT_AVAILABLE | 404 / MCP | A property in the request is missing or outside your territory. |
CONTACT_NOT_AVAILABLE | 404 / MCP | A contact in the request is not available to your organization. |
LIST_NOT_FOUND | MCP | No such list, or it is another member's private list. |
COMPLIANCE_CHECK_UNAVAILABLE | 503 / MCP | A safety check could not run. Retry shortly. |
Pipeline and write-back
| Code | HTTP | Meaning and action |
|---|---|---|
NO_PIPELINE_RECORD | 404 | Write-back only updates leads that were in your pipeline. |
CRM_MODE_NOT_EXTERNAL | 409 | Your organization manages stages in Greenfinch. An admin can switch CRM mode to external. |
CHANGED_IN_FLIGHT | 409 | The lead changed during the request. Retry. |
STAGE_CAPPED | MCP | Your external CRM owns this stage; record it there. |
MCP_QUALIFICATION_DISABLED | MCP | An admin switched off agent pipeline changes. |
SCOPE_REQUIRED | MCP | greenfinch_update_lead_status needs pipeline:transitions_full on the connection. |
DEAL_VALUE_REQUIRED | MCP | Won (and qualify) need a deal value above $1. |
INVALID_LOSS_REASON_CODE | MCP | Use a code from greenfinch_get_loss_reasons. |
SAME_STATUS | MCP | The lead is already in that stage. |
ALREADY_DISQUALIFIED | MCP | The lead is already disqualified. |
CLOSED_STAGE | MCP | Won or lost leads cannot be disqualified. |
Research, lists and search
| Code | Meaning and action |
|---|---|
NOT_RESEARCHED | The property has no research to unlock (409 on REST). Start research first. |
PROPERTY_UNLOCK_REQUIRED | Unlock the property before this contact action. |
CONTACT_REVEAL_REQUIRED | Reveal the contact before this action. |
STRATEGY_REQUIRED | Run deep research on the contact before drafting an email. |
ALREADY_RESEARCHING | Research is already running for this item. |
BATCH_ALREADY_RUNNING | A research batch is already running; wait or cancel it. |
RESEARCH_LAUNCH_BUSY | Another research launch for your organization is being recorded. Nothing was charged; retry in a few seconds. |
BATCH_TOO_LARGE | Too many properties in one research batch. Split it. |
EMPTY_SELECTION | The selection has no eligible properties. |
WRONG_LIST_TYPE | The list holds the other kind of item (properties versus contacts). |
NAME_IN_USE | A list with that name already exists. |
MISSING_QUERY_BOUNDS_OR_COUNTY | A search needs free text, a location filter or map bounds. |
AMBIGUOUS_SEARCH_MODE | Send free text or filters/bounds, not both. |
INVALID_CURSOR | The pagination cursor is invalid or expired. Start again from the first page. |
CURSOR_SORT_MISMATCH | A cursor must be used with the sort it came from. |
OFFSET_REQUIRES_SORT | Paging a saved search with offset needs an explicit sort. |
TEMPORARILY_UNAVAILABLE | A 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.