Facebook Pixel

Zapier integration API

Last updated: October 14, 2026

Keystone Court Data delivers court-record real estate leads (foreclosure, probate, divorce and more) to a customer's CRM. This page documents every endpoint the Keystone Court Data Zapier integration calls. All endpoints are served over HTTPS from https://keystonecourtdata.com and return JSON.

Authentication

Every request carries the customer's Keystone API key in the X-API-Key header. A customer creates the key on their dashboard: CRM Connect → pick a CRM → Create a key. A missing or wrong key gets 401. A key whose account cannot send leads to a CRM (for example a free trial) gets 403 with a plain-English error.

GET /api/partner/v1/zapier/me

Tests the connection. Returns the account's name, used as the Zapier connection label.

200 {"ok": true, "account": "Acme Home Buyers", "email": "owner@example.com"}

POST /api/partner/v1/zapier/hooks

Subscribes a Zap (REST hook). Called by Zapier when the customer turns a Zap on.

Body (JSON): event = new_lead or lead_updated; targetUrl = the Zapier hook address (must be an https://hooks.zapier.com/ address); crm = the CRM the customer picked in the "Your CRM" field.

201 {"ok": true, "id": "new_lead:239", "integration_id": 239}
400 {"ok": false, "error": "targetUrl must be a Zapier hook address (https://hooks.zapier.com/...)"}

Each account has one connection per CRM. new_lead deliveries go to the New Lead Zap; lead_updated deliveries go only to the Lead Updated Zap.

DELETE /api/partner/v1/zapier/hooks/{id}

Unsubscribes a Zap. Called by Zapier when the customer turns a Zap off. {id} is the id returned by the subscribe call. The connection and its saved CRM record IDs are kept.

200 {"ok": true}
404 {"ok": false, "error": "subscription not found"}

GET /api/partner/v1/zapier/samples/{event}

Returns an example record for new_lead or lead_updated, built by the same code as a real delivery, so the fields shown while building a Zap are the fields that arrive. Optional query parameter: crm.

Deliveries (what the triggers receive)

New Lead: one JSON object per lead. Start with mail_to_name (the person or company to reach; split as mail_to_first_name / mail_to_last_name, with a company whole in the last name) and mail_to_address (their mailing address, or the property when no mailing address is known) — both are always filled. Other main fields: owner_full_name, owner_first_name, owner_last_name, phone_1…phone_4, email_1…email_3, property_address, mailing_address, lead_type, county, state, case_number, filing_date, current_stage, estimated_value, equity_dollars, court_lead_id, delivery_id, and keystone_record_link.

Lead Updated: the same lead fields plus event, previous_stage, new_stage, changed_summary and crm_record_id (the ID the customer's CRM gave this lead, so the Zap edits that same record). An update is only sent for a lead whose CRM record ID Keystone has.

POST {keystone_record_link} (Link CRM Record action)

Every New Lead carries keystone_record_link, a signed address for that one lead (https://keystonecourtdata.com/api/crm/record-link/…). The Link CRM Record action posts the ID the customer's CRM gave the new lead, so later updates edit that record. No API key is needed; the link itself is signed.

Body (JSON): crm_record_id (required), handles_updates (optional, 1).

200 {"ok": true, "message": "record id saved; updates for this lead will edit it"}
403 {"ok": false, "error": "this record link is not valid"}
429 {"ok": false, "error": "too many calls for this lead's record link"}

A sample lead's link answers 200 with "this was the test lead, nothing was saved".

Limits

Updates sent to a Zapier connection are limited to 1,000 per month by default (each one is a Zapier task); the customer can change this on their dashboard. New leads are never limited.

Support

Questions about the integration: carson@keystonecourtdata.com.