prospectapis-mcp 0.2.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +13 -3
- package/package.json +2 -2
- package/src/playbooks.js +3 -3
- package/src/server.js +7 -6
- package/src/tools.js +181 -9
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,30 @@ All notable changes to `prospectapis-mcp` are documented here. The format follow
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.4.0] - 2026-10-25
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `email_verify_stats` and `email_outcomes_report`: your verification mix, and bounced or delivered reports (a charged valid you report bounced within 30 days is credited back).
|
|
14
|
+
- `email_verify_job_create`, `email_verify_job_get`, `email_verify_job_results`, `email_verify_job_stop`: bulk verification jobs of up to 50,000 addresses with free retries for slow servers, list sampling (`sample`) and list monitoring (`monitor_days`).
|
|
15
|
+
- `email_find`: a person's work address from name and domain, $0.02 only when found.
|
|
16
|
+
- `email_domain_check`: what DNS and our recent checks know about a domain, free.
|
|
17
|
+
- `email_verify_calibration`: measured bounce rate per score band, free.
|
|
18
|
+
- `email_clean_list`: sort up to 1,000 addresses into keep, review and remove with quick checks.
|
|
19
|
+
- `email_verify` takes `depth: "quick"` ($0.001 per address, no mail server contacted). Twenty-five tools.
|
|
20
|
+
|
|
21
|
+
## [0.3.0] - 2026-10-25
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- `email_verify` (`POST /v1/email/verify`): check 1 to 25 email addresses for deliverability. Each result carries `status` (valid, invalid, catch-all or unknown), `reason`, `charged`, `flags`, `smtp_code` and `catch_all_tier`. A valid or invalid result costs $0.004; catch-all and unknown results are free. When the balance covers only some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free. Fifteen tools.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Pricing: every account starts with a free $1 balance (no card, no monthly reset) that each paid call draws from at its own price. The 100 free funding records a month are gone, so tool descriptions, the server instructions, the playbooks and the README no longer promise them. Watchlist deliveries cost $0.02 per delivered record from the balance.
|
|
30
|
+
- `pricing_get` and `account_balance` descriptions name the new fields (the signup balance, the email verification price and which statuses are charged).
|
|
31
|
+
- The 402 hint reads "out of credits for this call".
|
|
32
|
+
|
|
9
33
|
## [0.2.5] - 2026-10-20
|
|
10
34
|
|
|
11
35
|
### Added
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# prospectapis-mcp
|
|
2
2
|
|
|
3
|
-
prospectapis-mcp is the MCP server for ProspectAPIs (https://prospectapis.com), for sales and prospecting teams and the AI agents they run in Claude Code, Claude Desktop, Cursor and other MCP clients. It gives your agent
|
|
3
|
+
prospectapis-mcp is the MCP server for ProspectAPIs (https://prospectapis.com), for sales and prospecting teams and the AI agents they run in Claude Code, Claude Desktop, Cursor and other MCP clients. It gives your agent twenty-five tools over the ProspectAPIs API: search funding rounds by date, round, amount, company, investor and country, get new matching rounds pushed to your webhook, verify, find and bulk-check email addresses, report what bounced, and order a cited research brief on any company or person. Funding records carry the public announcement URL when there is one. Every account starts with a free $1 balance and no card: records cost $0.02, an email check $0.004 and a completed brief $0.15, with no seats and no subscription. It needs Node.js 22 or later.
|
|
4
4
|
|
|
5
5
|
Install (Claude Code): `claude mcp add prospectapis -e PROSPECTAPIS_API_KEY=pa_live_... -- npx -y prospectapis-mcp`
|
|
6
6
|
|
|
@@ -10,10 +10,16 @@ Website: https://prospectapis.com/mcp
|
|
|
10
10
|
|
|
11
11
|
| Tool | Endpoint | Cost |
|
|
12
12
|
|---|---|---|
|
|
13
|
-
| `funding_search` | `GET /v1/funding` | $0.02 per record returned
|
|
13
|
+
| `funding_search` | `GET /v1/funding` | $0.02 per record returned; no match is free |
|
|
14
14
|
| `funding_get` | `GET /v1/funding/:id` | $0.02 when found; a missing id is free |
|
|
15
15
|
| `research_submit` | `POST /v1/research` | one research at `research_price_usd` (see `account_balance`), charged only when the brief completes; refunded on failure |
|
|
16
16
|
| `research_get` | `GET /v1/research/:id` | free; poll until `status` is `completed` or `failed` |
|
|
17
|
+
| `email_verify` | `POST /v1/email/verify` | $0.004 per `valid` or `invalid` result; `catch-all` and `unknown` are free; 1 to 25 addresses a call |
|
|
18
|
+
| `email_verify_stats` | `GET /v1/email/verify/stats` | free |
|
|
19
|
+
| `email_outcomes_report` | `POST /v1/email/outcomes` | free; 1 to 100 outcomes a call |
|
|
20
|
+
| `email_verify_job_create` | `POST /v1/email/verify/jobs` | free to start; $0.004 per `valid` or `invalid` result as it is checked; up to 50,000 addresses |
|
|
21
|
+
| `email_verify_job_get` | `GET /v1/email/verify/jobs/:id` | free |
|
|
22
|
+
| `email_verify_job_results` | `GET /v1/email/verify/jobs/:id/results` | free; 1,000 a page |
|
|
17
23
|
| `watchlist_create`, `watchlist_list`, `watchlist_get`, `watchlist_deliveries`, `watchlist_test`, `watchlist_delete` | `/v1/watchlists` | free to manage; a delivered event costs one record, only when your webhook answers 2xx |
|
|
18
24
|
| `account_balance` | `GET /v1/account` | free |
|
|
19
25
|
| `feedback_send` | `POST /v1/feedback` | free; reports a bug, wrong field or missing capability to the team (10 an hour per key) |
|
|
@@ -29,6 +35,10 @@ Website: https://prospectapis.com/mcp
|
|
|
29
35
|
`context` (your own product, at most 1,000 characters) and `purpose` (`account_research`, `pre_call` or
|
|
30
36
|
`outreach`). It returns a `research_id` at once; a brief takes 20 to 90 seconds.
|
|
31
37
|
|
|
38
|
+
`email_verify` takes `emails`, a list of 1 to 25 addresses. Each result has `status` (`valid`, `invalid`,
|
|
39
|
+
`catch-all` or `unknown`), `reason`, `reason_text`, `score` (0 to 100), `recommendation` (`send`, `send_with_caution`, `retry_later` or `do_not_send`), `charged`, `flags`, `smtp_code` and `catch_all_tier`. If the balance covers only
|
|
40
|
+
some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits` and are not charged.
|
|
41
|
+
|
|
32
42
|
## Configure
|
|
33
43
|
|
|
34
44
|
| Variable | Required | Default |
|
|
@@ -56,7 +66,7 @@ Claude Code: `claude mcp add prospectapis -e PROSPECTAPIS_API_KEY=pa_live_... --
|
|
|
56
66
|
|
|
57
67
|
**Where does the funding data come from?** Records carry the public announcement URL when there is one.
|
|
58
68
|
|
|
59
|
-
**What is free?**
|
|
69
|
+
**What is free?** A $1 balance when you sign up (about 50 funding records, 250 email checks or 6 research briefs), any search that matches nothing, catch-all and unknown email results, watchlist management, and the balance, pricing and version tools.
|
|
60
70
|
|
|
61
71
|
**Which clients work?** Claude Code, Claude Desktop, Cursor and any client that reads an mcpServers config, through `npx -y prospectapis-mcp`.
|
|
62
72
|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prospectapis-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.ProspectAPIs/prospectapis-mcp",
|
|
5
|
-
"description": "MCP server for ProspectAPIs: search funding rounds, run paid prospect research briefs, manage funding watchlists, read your balance and the live price list.",
|
|
5
|
+
"description": "MCP server for ProspectAPIs: search funding rounds, verify email addresses, run paid prospect research briefs, manage funding watchlists, read your balance and the live price list.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"prospectapis-mcp": "src/index.js"
|
package/src/playbooks.js
CHANGED
|
@@ -20,8 +20,8 @@ const NEWLY_FUNDED = `# Newly funded prospects
|
|
|
20
20
|
|
|
21
21
|
Build a short list of companies that just raised, worth reaching out to while the round is fresh.
|
|
22
22
|
|
|
23
|
-
1. \`account_balance\` first. Each funding record returned costs $0.02
|
|
24
|
-
before you pull pages.
|
|
23
|
+
1. \`account_balance\` first. Each funding record returned costs $0.02, drawn from your balance (a new account starts
|
|
24
|
+
with $1, about 50 records), so know what is left before you pull pages.
|
|
25
25
|
2. \`funding_search\` with a tight window and the filters that describe the buyer: \`since\` (for example the last 30
|
|
26
26
|
days), \`round\` (such as \`seed,series_a\`), \`country\`, and \`min_amount_usd\` or \`max_amount_usd\`. Start with
|
|
27
27
|
\`limit\` 10 to 25. A search that matches nothing costs nothing, so narrow before you widen.
|
|
@@ -45,7 +45,7 @@ A cited brief on one company or person before a call or a first email.
|
|
|
45
45
|
2. It returns \`research_id\` at once. The brief takes 20 to 90 seconds: call \`research_get\` with that id every 10 to 15
|
|
46
46
|
seconds until \`status\` is \`completed\` or \`failed\`. Polling is free.
|
|
47
47
|
3. A brief is charged only when it completes, at the \`research_price_usd\` that \`account_balance\` reports, and refunded
|
|
48
|
-
in full if it fails.
|
|
48
|
+
in full if it fails.
|
|
49
49
|
4. Every field in \`result\` is \`{value, sources, confidence}\`. Quote the sources with the claims you use, and say when
|
|
50
50
|
a field came back empty rather than filling the gap.
|
|
51
51
|
`;
|
package/src/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// MCP server wiring: one registered tool per catalog entry, each a single
|
|
2
|
-
// authenticated request (a GET, or a POST with a JSON body for research_submit)
|
|
2
|
+
// authenticated request (a GET, or a POST with a JSON body for research_submit and email_verify)
|
|
3
3
|
// against the ProspectAPIs REST API. Exported as a factory
|
|
4
4
|
// (createServer) so tests inject a fake fetch and a host could inject auth.
|
|
5
5
|
|
|
@@ -15,11 +15,13 @@ export const { version: VERSION } = createRequire(import.meta.url)("../package.j
|
|
|
15
15
|
export const DEFAULT_BASE_URL = "https://api.prospectapis.com";
|
|
16
16
|
export const DEFAULT_TIMEOUT_MS = 30000;
|
|
17
17
|
export const SIGNUP_URL = "https://prospectapis.com/signup?utm_source=mcp";
|
|
18
|
-
export const TOP_UP_URL = "https://prospectapis.com/dashboard/
|
|
18
|
+
export const TOP_UP_URL = "https://prospectapis.com/dashboard/billing?utm_source=mcp";
|
|
19
19
|
|
|
20
20
|
export const INSTRUCTIONS =
|
|
21
|
-
"ProspectAPIs MCP server: funding rounds data and prospect research briefs.
|
|
22
|
-
"
|
|
21
|
+
"ProspectAPIs MCP server: funding rounds data, email verification and prospect research briefs. Every account starts with a free $1 balance " +
|
|
22
|
+
"(no card, no monthly reset), and each paid call draws from it at its own price. funding_search and funding_get cost $0.02 per record returned; " +
|
|
23
|
+
"a search that matches nothing costs nothing. email_verify checks 1 to 25 addresses for $0.004 per valid or invalid result; catch-all and " +
|
|
24
|
+
"unknown results are free. account_balance, pricing_get and api_version are free. " +
|
|
23
25
|
"Use filters (dates, round, amount, domain, investor, country) to keep result sets small, and call account_balance before a large paged search. " +
|
|
24
26
|
"research_submit starts a cited brief on one prospect and returns a research_id; poll research_get (free) until it is completed or failed. " +
|
|
25
27
|
"A research is charged only when it completes, at the research_price_usd account_balance reports. " +
|
|
@@ -28,8 +30,7 @@ export const INSTRUCTIONS =
|
|
|
28
30
|
|
|
29
31
|
export function hintFor(status) {
|
|
30
32
|
if (status === 401) return " (missing or invalid API key: set PROSPECTAPIS_API_KEY to a key from the dashboard)";
|
|
31
|
-
|
|
32
|
-
if (status === 402) return ` (not enough credit for this call; the body says what it costs: top up at ${TOP_UP_URL})`;
|
|
33
|
+
if (status === 402) return ` (out of credits for this call; the body says what it costs: top up at ${TOP_UP_URL})`;
|
|
33
34
|
if (status === 400) return " (an argument was rejected: the body says which one)";
|
|
34
35
|
if (status === 404) return " (not found: the id may be wrong, or the record is not published)";
|
|
35
36
|
if (status === 429) return " (rate limited: wait a few seconds and retry)";
|
package/src/tools.js
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
// except `{name}` placeholders in `path`, which are interpolated into the
|
|
7
7
|
// URL and removed from the query string;
|
|
8
8
|
// - `body: true` sends the arguments as a JSON body instead of a query
|
|
9
|
-
// string (research_submit,
|
|
9
|
+
// string (research_submit and email_verify, POSTs);
|
|
10
10
|
// - `write: true` marks a tool that changes state or spends credits
|
|
11
|
-
// (research_submit starts a paid job); the server turns `write` into MCP's
|
|
11
|
+
// (research_submit starts a paid job, email_verify spends credits); the server turns `write` into MCP's
|
|
12
12
|
// readOnlyHint, so every other tool is read-only;
|
|
13
13
|
// - `auth: false` marks the tools the API serves without a key (pricing_get, api_version);
|
|
14
14
|
// - `title` is the human name a client shows instead of the raw tool name;
|
|
@@ -48,7 +48,7 @@ export const TOOLS = [
|
|
|
48
48
|
write: false,
|
|
49
49
|
format: { min_amount_usd: formatAmount, max_amount_usd: formatAmount },
|
|
50
50
|
description:
|
|
51
|
-
"Search funding rounds (venture rounds, debt, grants, IPOs), newest announcement first. Costs $0.02 per record returned,
|
|
51
|
+
"Search funding rounds (venture rounds, debt, grants, IPOs), newest announcement first. Costs $0.02 per record returned, drawn from your balance (every account starts with a free $1); a search that matches nothing is free. " +
|
|
52
52
|
"Page with `cursor`: pass back `next_cursor` exactly as returned; a null `next_cursor` means there are no more matches. Narrow with filters before raising `limit`.",
|
|
53
53
|
shape: {
|
|
54
54
|
since: DATE.describe("Earliest announcement date, inclusive (YYYY-MM-DD)."),
|
|
@@ -73,7 +73,7 @@ export const TOOLS = [
|
|
|
73
73
|
path: "/v1/funding/{id}",
|
|
74
74
|
title: "Get Funding Round",
|
|
75
75
|
write: false,
|
|
76
|
-
description: "Read one funding record by id. Costs $0.02 when found
|
|
76
|
+
description: "Read one funding record by id. Costs $0.02 when found; a missing id is free.",
|
|
77
77
|
shape: {
|
|
78
78
|
id: z.string().uuid().describe("The funding record id from a `funding_search` result."),
|
|
79
79
|
},
|
|
@@ -92,7 +92,7 @@ export const TOOLS = [
|
|
|
92
92
|
"a work email, or linkedin_url), or person_name together with company_name. Returns `research_id` at once; the brief takes 20 to 90 seconds, " +
|
|
93
93
|
"so poll research_get every 10 to 15 seconds until `status` is `completed` or `failed`. " +
|
|
94
94
|
"Costs one research at the price account_balance reports as `research_price_usd`, held when you submit, charged only when the brief " +
|
|
95
|
-
"completes and refunded in full if it fails.
|
|
95
|
+
"completes and refunded in full if it fails.",
|
|
96
96
|
shape: {
|
|
97
97
|
domain: z.string().min(3).max(253).optional().describe("The company's domain, for example `acme.com`."),
|
|
98
98
|
website_url: URL_ARG.optional().describe("Any http(s) URL on the company's website."),
|
|
@@ -125,6 +125,177 @@ export const TOOLS = [
|
|
|
125
125
|
id: z.string().uuid().describe("The `research_id` from research_submit."),
|
|
126
126
|
},
|
|
127
127
|
},
|
|
128
|
+
{
|
|
129
|
+
name: "email_verify",
|
|
130
|
+
method: "POST",
|
|
131
|
+
path: "/v1/email/verify",
|
|
132
|
+
title: "Verify Email Addresses",
|
|
133
|
+
write: true,
|
|
134
|
+
body: true,
|
|
135
|
+
description:
|
|
136
|
+
"Check whether 1 to 25 email addresses can receive mail. Each result has `status` (valid, invalid, catch-all or unknown), " +
|
|
137
|
+
"`reason`, `reason_text`, `score` (0 to 100), `recommendation` (send, send_with_caution, retry_later or do_not_send), `charged`, `flags`, `smtp_code`, `catch_all_tier`, `did_you_mean` (a likely domain typo), `mail_provider` and `checked_at`. Costs $0.004 per valid or invalid result, drawn from your " +
|
|
138
|
+
"balance; catch-all and unknown results are free (pricing_get lists which statuses are charged). When the balance covers only " +
|
|
139
|
+
"some addresses, the rest come back `unknown` with reason `not_checked_insufficient_credits`, free. " +
|
|
140
|
+
"`depth: \"quick\"` never contacts the mail server: syntax, disposable and free lists, DNS, parked and new-domain flags " +
|
|
141
|
+
"and a recently measured catch-all verdict, at $0.001 per address whatever the status; an address that needs a mailbox " +
|
|
142
|
+
"check comes back `unknown` with reason `not_probed`.",
|
|
143
|
+
shape: {
|
|
144
|
+
depth: z.enum(["full", "quick"]).optional().describe("full (default) checks the mailbox; quick is DNS and lists only, $0.001 per address."),
|
|
145
|
+
emails: z
|
|
146
|
+
.array(z.union([
|
|
147
|
+
z.string().min(3).max(254),
|
|
148
|
+
z.object({ email: z.string().min(3).max(254), first_name: z.string().max(80).optional(), last_name: z.string().max(80).optional() }),
|
|
149
|
+
]))
|
|
150
|
+
.min(1)
|
|
151
|
+
.max(25)
|
|
152
|
+
.describe("The addresses to check, 1 to 25 per call. An item may be {email, first_name, last_name} to also check the address against the person's name."),
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: "email_domain_check",
|
|
157
|
+
method: "GET",
|
|
158
|
+
path: "/v1/email/domain/{domain}",
|
|
159
|
+
title: "Check Email Domain",
|
|
160
|
+
idempotent: true,
|
|
161
|
+
write: false,
|
|
162
|
+
description:
|
|
163
|
+
"What is known about one email domain without contacting its mail server: `exists`, `accepts_mail`, `null_mx`, `mx` hosts, " +
|
|
164
|
+
"`mail_provider`, `spf`, `dmarc`, `disposable`, `free_provider`, `parked`, `domain_age_days`, `new_domain`, `did_you_mean`, " +
|
|
165
|
+
"and `catch_all` (true or false only when our own check measured it recently, else null) with `catch_all_checked_at`. " +
|
|
166
|
+
"Free, up to 300 lookups an hour per account.",
|
|
167
|
+
shape: { domain: z.string().min(3).max(253).describe("A domain name such as example.com.") },
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "email_find",
|
|
171
|
+
method: "POST",
|
|
172
|
+
path: "/v1/email/find",
|
|
173
|
+
title: "Find Email Address",
|
|
174
|
+
write: true,
|
|
175
|
+
body: true,
|
|
176
|
+
description:
|
|
177
|
+
"Find a person's work email from `first_name`, `last_name` and company `domain`. The common patterns are checked in order " +
|
|
178
|
+
"against the mail server, most common first. Returns `status` (found, catch_all, unknown, not_found), `email`, `pattern`, " +
|
|
179
|
+
"`score`, `recommendation` and the addresses `checked`. Costs $0.02 only when an address is found; on a catch-all domain " +
|
|
180
|
+
"it returns the most likely address as `best_guess`, free.",
|
|
181
|
+
shape: {
|
|
182
|
+
first_name: z.string().min(1).max(80).describe("The person's first name."),
|
|
183
|
+
last_name: z.string().max(80).optional().describe("The person's last name."),
|
|
184
|
+
domain: z.string().min(3).max(253).describe("The company's email domain, such as example.com."),
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "email_verify_calibration",
|
|
189
|
+
method: "GET",
|
|
190
|
+
path: "/v1/email/verify/calibration",
|
|
191
|
+
title: "Email Score Calibration",
|
|
192
|
+
idempotent: true,
|
|
193
|
+
write: false,
|
|
194
|
+
description:
|
|
195
|
+
"What each verification score band has meant in practice: the measured bounce rate per band from delivery outcomes " +
|
|
196
|
+
"customers reported over the last 90 days. A band with fewer than 30 reports shows a null rate. Free.",
|
|
197
|
+
shape: {},
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "email_clean_list",
|
|
201
|
+
method: "POST",
|
|
202
|
+
path: "/v1/email/clean",
|
|
203
|
+
title: "Clean Email List",
|
|
204
|
+
write: true,
|
|
205
|
+
body: true,
|
|
206
|
+
description:
|
|
207
|
+
"Clean a list of up to 1,000 addresses in one call with quick checks (no mail server is contacted): returns `keep`, " +
|
|
208
|
+
"`review` (role, free, parked, new or typo addresses, with a reason) and `remove` (cannot receive mail), plus `counts`. " +
|
|
209
|
+
"$0.001 per well-formed address. Run email_verify on the kept addresses you will actually send to.",
|
|
210
|
+
shape: {
|
|
211
|
+
emails: z.array(z.string().min(3).max(254)).min(1).max(1000).describe("The addresses to clean, 1 to 1,000."),
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "email_verify_stats",
|
|
216
|
+
method: "GET",
|
|
217
|
+
path: "/v1/email/verify/stats",
|
|
218
|
+
title: "Email Verification Stats",
|
|
219
|
+
write: false,
|
|
220
|
+
description:
|
|
221
|
+
"Your own email verification mix over the last `days` (1 to 90, default 30): `total`, `by_status` (valid, invalid, " +
|
|
222
|
+
"catch-all, unknown), `charged`, `served_from_cache`, `catch_all_share` and `unknown_share`. Free.",
|
|
223
|
+
shape: {
|
|
224
|
+
days: z.number().int().min(1).max(90).optional().describe("Window in days, 1 to 90 (default 30)."),
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "email_outcomes_report",
|
|
229
|
+
method: "POST",
|
|
230
|
+
path: "/v1/email/outcomes",
|
|
231
|
+
title: "Report Email Outcomes",
|
|
232
|
+
write: true,
|
|
233
|
+
body: true,
|
|
234
|
+
description:
|
|
235
|
+
"Report what happened when you sent: `bounced` or `delivered`, 1 to 100 addresses per call. A bounce you report makes " +
|
|
236
|
+
"your later email_verify checks of that address come back invalid (reason `reported_bounce`); a delivered report on a " +
|
|
237
|
+
"catch-all address raises its score. Returns `stored`. Free.",
|
|
238
|
+
shape: {
|
|
239
|
+
outcomes: z
|
|
240
|
+
.array(z.object({ email: z.string().min(3).max(254), outcome: z.enum(["bounced", "delivered"]) }))
|
|
241
|
+
.min(1)
|
|
242
|
+
.max(100)
|
|
243
|
+
.describe("Each address and what happened when you sent to it."),
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: "email_verify_job_create",
|
|
248
|
+
method: "POST",
|
|
249
|
+
path: "/v1/email/verify/jobs",
|
|
250
|
+
title: "Start Email Verification Job",
|
|
251
|
+
write: true,
|
|
252
|
+
body: true,
|
|
253
|
+
description:
|
|
254
|
+
"Check up to 50,000 addresses in the background. Returns 202 with a job `id`; poll email_verify_job_get. A slow or " +
|
|
255
|
+
"greylisting server is retried about 5, 15 and 30 minutes later, free. Each valid or invalid result costs $0.004 as " +
|
|
256
|
+
"it is checked; catch-all and unknown are free. An optional https `callback_url` gets one signed POST when the job " +
|
|
257
|
+
"completes (verify with the returned `secret`). At most 5 jobs run at once per account.",
|
|
258
|
+
shape: {
|
|
259
|
+
sample: z.number().int().min(10).max(50000).optional().describe("Check only a random sample of this many addresses; the job then reports estimated shares for the whole list."),
|
|
260
|
+
monitor_days: z.number().int().min(7).max(90).optional().describe("Check the whole list again this many days after each run, billing each definite result again; the callback reports what changed."),
|
|
261
|
+
emails: z.array(z.string().min(1).max(254)).min(1).max(50000).describe("The addresses, 1 to 50,000."),
|
|
262
|
+
callback_url: z.string().url().max(2048).optional().describe("An https URL to POST to when the job completes."),
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: "email_verify_job_get",
|
|
267
|
+
method: "GET",
|
|
268
|
+
path: "/v1/email/verify/jobs/:id",
|
|
269
|
+
title: "Get Email Verification Job",
|
|
270
|
+
write: false,
|
|
271
|
+
description: "A job's `status` (queued, running, completed), `total`, `done`, `charged_count` and `amount_usd`. Free.",
|
|
272
|
+
shape: { id: z.string().uuid().describe("The job `id` from email_verify_job_create.") },
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: "email_verify_job_results",
|
|
276
|
+
method: "GET",
|
|
277
|
+
path: "/v1/email/verify/jobs/:id/results",
|
|
278
|
+
title: "Get Email Verification Job Results",
|
|
279
|
+
write: false,
|
|
280
|
+
description:
|
|
281
|
+
"A job's results in input order, up to 1,000 a page (`limit`), from `cursor`; `next_cursor` is null on the last page. " +
|
|
282
|
+
"An address not yet checked shows status `pending`. Free.",
|
|
283
|
+
shape: {
|
|
284
|
+
id: z.string().uuid().describe("The job `id`."),
|
|
285
|
+
cursor: z.number().int().min(0).optional().describe("Start at this position (0-based)."),
|
|
286
|
+
limit: z.number().int().min(1).max(1000).optional().describe("Results per page, 1 to 1,000 (default 1,000)."),
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: "email_verify_job_stop",
|
|
291
|
+
method: "POST",
|
|
292
|
+
path: "/v1/email/verify/jobs/{id}/stop",
|
|
293
|
+
title: "Stop Verification Job",
|
|
294
|
+
body: true,
|
|
295
|
+
write: true,
|
|
296
|
+
description: "Turn off a job's monitoring (its regular re-checks); a job still running is cancelled, and what it already checked stays readable. Free.",
|
|
297
|
+
shape: { id: z.string().uuid().describe("The job id.") },
|
|
298
|
+
},
|
|
128
299
|
{
|
|
129
300
|
name: "watchlist_create",
|
|
130
301
|
method: "POST",
|
|
@@ -135,7 +306,7 @@ export const TOOLS = [
|
|
|
135
306
|
description:
|
|
136
307
|
"Save a funding-signal alert: a set of funding_search filters plus an https webhook. Each NEW funding event that " +
|
|
137
308
|
"matches is POSTed to the webhook, signed with the returned `secret` (header Prospect-Signature: t=..,v1=HMAC-SHA256). " +
|
|
138
|
-
"Creating is free; each delivered event costs one record ($0.02
|
|
309
|
+
"Creating is free; each delivered event costs one record ($0.02), charged only when the webhook " +
|
|
139
310
|
"answers 2xx. The `secret` is shown once. Max 20 active per account.",
|
|
140
311
|
shape: {
|
|
141
312
|
name: z.string().min(1).max(100).describe("A label, such as 'Series A robotics'."),
|
|
@@ -210,7 +381,7 @@ export const TOOLS = [
|
|
|
210
381
|
title: "Get Account Balance",
|
|
211
382
|
idempotent: true,
|
|
212
383
|
write: false,
|
|
213
|
-
description: "Your credit balance and the
|
|
384
|
+
description: "Your credit balance and the prices you pay (record, research, email verification). Free. Check it before a large paged search.",
|
|
214
385
|
shape: {},
|
|
215
386
|
},
|
|
216
387
|
{
|
|
@@ -241,8 +412,9 @@ export const TOOLS = [
|
|
|
241
412
|
write: false,
|
|
242
413
|
auth: false,
|
|
243
414
|
description:
|
|
244
|
-
"The live price list: funding records (price per record
|
|
245
|
-
"available and its price per brief)
|
|
415
|
+
"The live price list: the balance a new account starts with, funding records (price per record), research (whether it is " +
|
|
416
|
+
"available and its price per brief), email verification (price per check, which statuses are charged and which are free) " +
|
|
417
|
+
"and watchlist deliveries. Free, needs no key. Use it to quote a cost before a large call.",
|
|
246
418
|
shape: {},
|
|
247
419
|
},
|
|
248
420
|
{
|