← All action domains

Leads

11 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.

Check a running search

leads.check_statuswrite

Poll a background Google-Maps or Yelp search and stage its results if Outscraper has finished. Costs nothing extra — the scrape was already billed when it was submitted; this only collects what was paid for.

Parameters

FieldTypeRequiredDescription
search_idstring (uuid)requiredThe background search to poll.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.check_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "search_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool leads_check_status at https://app.chirply.io/api/mcp, same bearer token, same input.

Import leads into the CRM

leads.importwriteconfirm

Import staged lead-search results into the CRM as contacts, and optionally run actions on them in the same pass. Pass result_ids for specific leads, or just search_id to import every not-yet-imported result of that search — which can create hundreds of contacts in one call and is not undoable in bulk. Deduped by phone and email: a lead matching an existing contact links to it instead of creating a duplicate. The import itself costs nothing extra (the search was already billed), BUT the optional `actions` run once per imported contact and are a real mass send — depending on the actions chosen they text, email, drop ringless voicemails, place automated or AI calls, or enroll people into campaigns, immediately and irreversibly, billed through the organization's own Twilio/Mailgun accounts. Actions also hit the existing contacts that leads deduped onto, not just the newly created ones. Optionally add every imported contact to a list.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
search_idstring (uuid)optionalThe search to import from. On its own, imports all of its not-yet-imported results.
result_idsarray of (string (uuid))optionalSpecific lead result ids to import. Already-imported ids are skipped.
list_idstring (uuid)optionalAlso add every imported contact to this list.
actionsobject[]optionalActions to run on every contact this import touches — the newly created ones AND the existing ones a lead deduped onto. Same action set as lists.run_actions; call lists.action_types for the valid types and their config keys. Omit for a plain import. Refused above 2,000 contacts.
actions[].type"send_sms" | "send_email" | "send_review_request" | "add_tag" | "remove_tag" | "add_to_list" | … 29 morerequiredWhich action to run (see lists.action_types).
actions[].configmap of string → objectoptionalThe action's settings — see its `fields` in lists.action_types. Default: {}

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.import \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "search_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "list_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool leads_import at https://app.chirply.io/api/mcp, same bearer token, same input.

Search and filter lead search results

leads.list_resultsread

Page through the businesses one lead search found — name, phone, email, website, rating, phone line type, and whether each is already in the CRM — narrowing them exactly as the results table does. Use the filters to isolate the leads actually worth importing: `q` free-text matches name, phone, email, address, city, category and website; `has_phone`/`has_email`/`has_website` drop the unreachable ones; `line_type: "mobile"` keeps only numbers that can receive a text or voicemail drop; `min_rating` keeps the well-reviewed ones. Reads staged results only — nothing is fetched from Outscraper, so this costs nothing. Feed the returned ids straight into leads.import.

Parameters

FieldTypeRequiredDescription
search_idstring (uuid)requiredThe lead search whose results to read.
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
imported"all" | "yes" | "no"optional'no' shows only leads not yet imported into the CRM. Default: "all"
qstringoptionalFree-text search across the business name, phone, email, address, city, state, postal code, category and website. Case-insensitive substring match.
has_phonebooleanoptionalKeep only leads that came back with a phone number.
has_emailbooleanoptionalKeep only leads with an email address (including enrichment emails).
has_websitebooleanoptionalKeep only leads that have a website.
line_type"mobile" | "landline" | "voip" | "tollFree" | "other" | "unknown"optionalKeep only leads whose phone the shared number cache classified this way — 'mobile' is the textable/voicemail-droppable set. Leads whose number has never been looked up have no line type and are excluded by this filter.
min_ratingnumberoptionalKeep only leads rated at least this (0–5). Leads with no rating are excluded.
sort"found" | "name" | "rating" | "reviews"optional'found' keeps the provider's own order; 'name' is A–Z; 'rating' and 'reviews' are highest-first with unrated leads last. Default: "found"

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.list_results \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "search_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool leads_list_results at https://app.chirply.io/api/mcp, same bearer token, same input.

List lead searches

leads.list_searchesread

List past lead searches, newest first, with each one's status, result count, duplicates skipped and estimated cost — plus the org's running totals. Purely historical; it runs nothing and spends nothing.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"pending" | "running" | "done" | "error"optionalOnly searches in this status.
search_type"maps" | "b2b" | "yelp"optional'maps' for Google Maps scrapes, 'b2b' for the business database, 'yelp' for Yelp scrapes.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.list_searches \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool leads_list_searches at https://app.chirply.io/api/mcp, same bearer token, same input.

Load more results

leads.load_morewriteconfirm

Fetch and append the next page of an existing business-database search using its stored cursor. THIS SPENDS THE TENANT'S MONEY exactly like a new search — another page of records is billed to the organization's Outscraper account. Only database ('b2b') searches can load more.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
search_idstring (uuid)requiredThe database search to extend.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.load_more \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "search_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool leads_load_more at https://app.chirply.io/api/mcp, same bearer token, same input.

Check the Outscraper connection

leads.outscraper_statusread

Report whether the organization has connected its own Outscraper account, plus its remaining credit and this cycle's usage. Read-only — call it before a paid search to see what the tenant has to spend.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.outscraper_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool leads_outscraper_status at https://app.chirply.io/api/mcp, same bearer token, same input.

Search the business database for leads

leads.search_databasewriteconfirm

Search Outscraper's B2B business database with structured filters (category, country/state/city/postal, name, minimum rating or review count, has-website/has-phone/verified). Instant and cursor-paginated. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per record returned (roughly $2 per 1,000 for the first 5,000 each cycle, more above that, plus a surcharge per record for the emails or insights enrichments), and duplicates already in the CRM are still billed. At least one filter or a keyword query is required so the whole database isn't scanned.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
querystringoptionalFree-text keyword query, used alongside the filters.
typesstring[]optionalBusiness categories, e.g. ['plumber','HVAC contractor']. Keep them broad.
country_codestringoptionalTwo-letter country code, e.g. 'US'.
statesstring[]optionalStates, e.g. ['TX','CA'].
citiesstring[]optionalCities, e.g. ['Austin','Dallas'].
postal_codesstring[]optionalZIP / postal codes.
namestringoptionalBusiness-name contains.
min_ratingnumberoptionalMinimum Google rating, e.g. 4.
min_reviewsintegeroptionalMinimum review count.
has_websitebooleanoptionalOnly businesses with a website. Default: false
has_phonebooleanoptionalOnly businesses with a phone number. Default: false
verifiedbooleanoptionalOnly verified listings. Default: false
emailsbooleanoptionalAdd decision-maker emails and contacts. Costs extra per record. Default: false
insightsbooleanoptionalAdd company size, revenue and founding year. Costs extra per record. Default: false
limitintegeroptionalMax businesses in this page (1–1000, default 100). Every one is billed.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.search_database \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "example",
    "country_code": "example"
  }'
Test with your API key

Over MCP the same operation is the tool leads_search_database at https://app.chirply.io/api/mcp, same bearer token, same input.

Search Google Maps for leads

leads.search_mapswriteconfirm

Scrape Google Maps for businesses matching a category and location, via the organization's OWN Outscraper account. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per record returned (roughly $3 per 1,000 Maps records after the first 500 free each cycle, more with the emails enrichment), and duplicates already in the CRM are still scraped and still billed. Set the limit deliberately. Jobs over 80 results, or any search with emails on, are submitted in the background and finish later — poll with leads.check_status.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
typestringoptionalBusiness type or category, e.g. 'plumbers'. Required unless location is given.
locationstringoptionalWhere to search, e.g. 'Austin, TX'. Required unless type is given.
termsstringoptionalExtra keywords to refine the query.
regionstringoptionalTwo-letter country code, e.g. 'US'.
emailsbooleanoptionalAlso scrape each business website for emails and contacts. Costs extra per record and forces the job to run in the background. Default: false
limitintegeroptionalMax businesses to return (1–500, default 50). Every one is billed.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.search_maps \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "example",
    "location": "example"
  }'
Test with your API key

Over MCP the same operation is the tool leads_search_maps at https://app.chirply.io/api/mcp, same bearer token, same input.

Search Yelp for leads

leads.search_yelpwriteconfirm

Scrape Yelp for local businesses matching a category and location, via the organization's OWN Outscraper account. THIS SPENDS THE TENANT'S MONEY: Outscraper bills per listing returned, and duplicates already in the CRM are still scraped and still billed. Know what you get: business name, phone, street address, rating, review count, categories, price range, neighborhood, a link to the Yelp listing, and the business's own website when Yelp has one on file — but NEVER an email address. Set `emails: true` to chain the website-finder and contact-scraper enrichments on top, which is the only way a Yelp lead becomes emailable; it costs several times more per record. EVERY Yelp search runs in the background — Yelp is slow (about 90 seconds for ten listings) — so this returns a search id immediately and you collect the results with leads.check_status or leads.list_results a couple of minutes later.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
termstringoptionalWhat to search for, as typed into Yelp's first box — e.g. 'plumbers'. Required unless location is given.
locationstringoptionalWhere to search, as typed into Yelp's second box — e.g. 'Austin, TX'. Required unless term is given.
emailsbooleanoptionalScrape each business's website for emails and contacts. Yelp never returns an email on its own, so leave this off and no lead is emailable. Costs several times more per record and makes the search take noticeably longer. Default: false
limitintegeroptionalMax listings to return (1–240, default 50). Every one is billed. Yelp itself stops at roughly 240 results for one search, so asking for more just pays for repeats.

Example

curl -X POST https://app.chirply.io/api/v1/actions/leads.search_yelp \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "term": "example",
    "location": "example"
  }'
Test with your API key

Over MCP the same operation is the tool leads_search_yelp at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=leads — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.