Get started
Authentication
API keys
Send the key as a bearer token on every request, to both the REST API and MCP:
Authorization: Bearer gfk_4mQx…- Created by an organization admin in the app under Org admin → Integrations → Create API key. Each key has a name (up to 120 characters) and a set of scopes.
- Shown once. Keys look like
gfk_followed by 43 random characters. Greenfinch stores only a SHA-256 hash of the secret, so it cannot show the key again; copy it when it is created. - Revocable. An admin can revoke a key at any time; the next request with it gets
401. To rotate, create the new key, deploy it, then revoke the old one. - Limited in number. An organization can hold up to 10 active keys. Creating an eleventh is refused with
CREDENTIAL_LIMIT_REACHEDuntil one is revoked. - Organization-level. A key acts for the organization as a whole, not for a person. It sees the whole service area of the organization, and actions it takes are recorded as made through that key. A few tools need a person behind them (writing a note, saving a search) and refuse keys — use a per-user connection for those.
curl "https://app.greenfinch.ai/api/v1/me" \
-H "Authorization: Bearer $GREENFINCH_API_KEY"GET /me answers for any live key regardless of scope, which makes it the right health check for a stored key.
Scopes
A key can only call what its scopes allow. Opt-in scopes are never pre-selected when a key is created; the admin has to tick them deliberately. A call without the scope is refused with 403 and SCOPE_NOT_GRANTED.
| Scope | Allows | Plan | Access | Opt-in |
|---|---|---|---|---|
events:subscribe | Subscribe and unsubscribe webhooks (POST /webhooks, DELETE /webhooks/{id}) and poll the qualified-lead feed (GET /leads). | Team | Write | No |
leads:read_single | Read one lead bundle at a time (GET /leads/{id}). Metered like an export. | Team | Read | No |
pipeline:write | Report won or lost from your CRM (POST /leads/{id}/status). | Team | Write | No |
accounts:sync | Mark properties as active or churned customers (POST /customer-accounts/sync). | Team | Write | No |
account:read | Credit balance, export allowance and licensed coverage (GET /account). | Team | Read | Yes |
events:read | The organization's outbound lead-event history (GET /events). | Team | Read | Yes |
notes:read | Notes your team left on a property (GET /notes). | Team | Read | Yes |
lists:read | Saved lists and their item counts (GET /lists). | Team | Read | Yes |
lists:write | Create lists and add items (POST /lists, POST /lists/{id}/items). | Team | Write | Yes |
property:read | One property's record and research state (GET /properties/{id}). Never returns contact details. | Team | Read | Yes |
data:read | Search and read properties, contacts and organizations (POST /properties/search, GET /properties/{id}/detail, the /contacts and /organizations endpoints). Viewing a contact your subscription covers but you have not revealed counts toward the daily contact limit. | Enterprise | Read | Yes |
data:unlock | Unlock a property (POST /properties/{id}/unlock, 10 credits) or reveal a contact (POST /contacts/{id}/reveal, 5 credits). Anything already unlocked is not charged again. | Enterprise | Write | Yes |
mcp | The MCP endpoint and all its tools — search, reveals, research, lists, pipeline and account — subject to your agent settings and daily limits. | Enterprise | Read and write | Yes |
pipeline:transitions_full | Lets greenfinch_update_lead_status move leads to attempted contact, active opportunity, won or lost. Not chosen at creation: an admin turns it on for an existing key on the Integrations page. | Enterprise (with mcp) | Write | Yes |
Scopes are checked against your live plan
Every request checks two things: that the key was granted the scope, and that your organization's plan today still includes it. Plans are never baked into keys. If your organization moves from Enterprise to Team, a key holding mcp starts receiving 403 on the next request:
{
"success": false,
"error": "API Access isn't included on your current plan. Contact sales for API access.",
"code": "UPGRADE_REQUIRED",
"feature": "apiAccess",
"minimumTier": "enterprise"
}The same live check covers account state: a suspended organization gets 403 ORG_SUSPENDED, and a closed account gets 403 ACCOUNT_CLOSED, whatever the key allows.
What your plan includes
Two plans reach the API. Team opens the integration surface — the channels that move leads between Greenfinch and the systems your team already runs. Enterprise adds the data surface: search, read and unlock over REST, and the full tool surface for AI assistants.
| Team | Enterprise | |
|---|---|---|
| Integrations | Webhooks, Zapier and CRM deliveries, single lead bundles, pipeline write-back, customer-account sync, and read access to events, notes, lists and property records | Everything in Team |
| Data over REST | No | Search, read, unlock and reveal properties, contacts and organizations (the data scopes) |
| MCP connector | No | The full tool surface for AI assistants and agents — search, research, lists, pipeline and account tools — as an organization key or a per-user connection |
| Request rate | 120 requests a minute, per key | 300 requests a minute, per key |
| Per-prospect deliveries | A free monthly allowance, then one credit per delivered bundle (Lead bundles) | Draw the records allowance, at no credit cost, rather than being metered per delivery |
| How much data may leave | Bounded by the daily limits your admins set | A records allowance sized to your order: how many distinct records may be taken per billing period, across every door, with the daily limits derived from it |
API and connector access is bounded by limits that scale with the size of your Enterprise plan; your order states the numbers. A larger licensed territory carries a larger records allowance, and the daily limits follow it rather than being chosen separately. Nothing is metered in the dark: every limit in force, and today's use against it, is readable from the app and from the API.
Availability — 15 September 2026
The plan features above are live today except the records allowance, which is rolling out from mid-September 2026 with each Enterprise order. Until the allowance reaches your organization, Enterprise per-prospect deliveries stay on the per-delivery meter described under Lead bundles. Team plans are not affected by it.
Connect an AI assistant
Besides organization keys, the MCP endpoint supports a per-user connection for AI assistants that implement MCP authorization (OAuth). Where it is available, a member adds Greenfinch as a connector in their assistant, signs in with their own Greenfinch account, and approves the connection — no key is copied anywhere.
- It acts as that member. The assistant sees what the member sees in the app: their assigned territory, the lists they can open, and the same role rules. An assistant connected by a read-only member cannot run tools that write or spend.
- It needs an active seat. A member without a seat cannot use Greenfinch through an assistant either (
NO_ACTIVE_SEAT). - Admins stay in control. An organization can limit connections to its admins (other members are refused with
MEMBER_CONNECT_DISABLED). A connection that has been revoked stays revoked — signing in again does not restore it — and is refused withGRANT_REVOKED. - Discovery. An unauthenticated request to the MCP endpoint is answered
401; when sign-in is enabled for your environment, the response carries aWWW-Authenticateheader pointing assistants at the protected-resource metadata, which is how they start the sign-in flow.
Availability
Per-user sign-in depends on the assistant supporting MCP authorization and on it being enabled for your organization. If your assistant cannot sign in, use an organization key with the mcp scope instead; everything except the few per-user tools works the same. Ask your Greenfinch contact if you are unsure which applies to you.
Keeping keys safe
- Give each system its own key, with only the scopes it needs.
- Store keys in a secrets manager, never in client-side code or a repository.
- Set daily limits per key on the Integrations page so a misbehaving job cannot reveal or export more than you expect — see Limits.
- Revoke keys you no longer use. The Integrations page shows when each key was last used.