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.