@taskmagic/apps-prospeo
v0.0.2
Published
B2B contact data — email finding, mobile enrichment and prospect search — with [Prospeo](https://prospeo.io). API docs: https://prospeo.io/api-docs
Downloads
296
Readme
Prospeo
B2B contact data — email finding, mobile enrichment and prospect search — with Prospeo. API docs: https://prospeo.io/api-docs
The API is REST under https://api.prospeo.io with no version segment in the path, and every
endpoint is a POST except GET /account-information. Authentication is a custom
X-KEY: <api key> header — not Authorization: Bearer, not HTTP Basic.
- Actions: Enrich Person, Enrich Company, Bulk Enrich People, Bulk Enrich Companies, Search People, Search Companies, Get Search Suggestions, Get Account Information.
- Triggers: none — see below.
Connection: sign in at app.prospeo.io, open the API section
(app.prospeo.io/api), create a key and paste it in. An account can
hold several keys. TaskMagic checks the key against GET /account-information, which is free and
spends no credits.
Notes
- No triggers, and no webhooks to build them from. Prospeo publishes no subscription endpoint, no callback URL parameter on any request, and no "records added since" listing that a polling trigger could watch — enrichment is inherently pull-based. This piece ships actions only; drive them from a schedule or from another app's trigger.
NO_MATCHcomes back as HTTP 400, not 200 or 404. "No email found" is the single most common real outcome of an enrichment run, so the enrich actions catch it and returnfound: falsewitherror_code: "NO_MATCH"instead of failing the flow run. Branch onfoundin the flow. Everything else —INSUFFICIENT_CREDITS,INVALID_API_KEY,INVALID_DATAPOINTS,INVALID_REQUEST,INTERNAL_ERROR— throws with a message saying what to fix. Error bodies are{ "error": true, "error_code": "CODE" }; success bodies carry"error": false, which the request helper honours even on a 2xx.- Datapoint combinations are checked before the request is sent. Prospeo answers an unusable
combination with
INVALID_DATAPOINTSonly after you have spent the request, so Enrich Person validates locally: a LinkedIn URL, an email or a person ID is enough on its own, while a name (first + last, or full name) always needs a company name, company website or company LinkedIn URL alongside it. Enrich Company needs at least one of website / LinkedIn URL / name / company ID, and matches far more reliably on the first two than on a name. - What it costs. 1 credit per verified email, 10 per revealed mobile, 1 per company match,
and 1 per search request that returns at least one result. Nothing is charged for a no-match,
for re-enriching the same person within 90 days (
free_enrichment: trueon the response), or for repeating an identical search within 30 days (free: true). Get Search Suggestions and Get Account Information are always free. - Mobile lookups are opt-in. Also Find Mobile Number is off by default because a revealed mobile is ten times the price of an email. Turning on Only Return Verified Mobiles implies the lookup, exactly as Prospeo documents, so the actions switch it on for you rather than quietly sending a contradictory request.
- The three enrichment toggles are only sent when switched on. An untouched optional
checkbox in the builder persists as
false, notundefined, and posting an explicitfalsewould override whatever default Prospeo applies to the account instead of leaving it alone. - Bulk is capped at 50 records and is synchronous. Both bulk endpoints answer the whole
batch in one response — there is no job id, no polling and no callback. The actions reject a
longer list, and a duplicate Identifier, before sending anything: the identifier you set on
each row is the only thing that correlates a result back to its input. Rows that could not be
matched come back under
not_matched, and rows Prospeo could not interpret underinvalid_datapoints. - Search results are masked. Emails and mobile numbers in Search People results come back
obscured with
revealed: false. To read the real value, pipe the result'sperson_idinto Enrich Person — that is the call that spends the credit and reveals the data. The docs' sample responses show this masked state; a real paid enrichment returns unmasked values withrevealed: true. - Search filters match exact strings, and a wrong one fails silently. A filter value Prospeo
does not recognise returns zero results rather than an error, so Location and Industry are
searchable lookups backed by the free
/search-suggestionsendpoint (rate limited to 15 requests per second) rather than free-text boxes. Use the Get Search Suggestions action to find the exact strings for job titles, technologies, industries, NAICS and SIC codes too — it accepts exactly one search term of at least 2 characters per call and populates only the matching key in the response. - Seniority and department are free text. Prospeo exposes no suggestion endpoint for them, so those props take the labels used in Prospeo's own search UI verbatim. An unrecognised value matches nothing.
Additional Filters (JSON)is the escape hatch. Only the most useful filters have their own fields; anything else in Prospeo's filter surface can be passed straight through as JSON, e.g.{ "company_employee_count": { "min": 10, "max": 200 } }. Values from the visible fields win over the same key in the JSON. Search Companies leans on this more heavily: Prospeo documentscompany_industryby name for company search but not the rest, and inventing filter keys would just produce silent empty results.- Search paging. 25 results per page, up to page 1000; the actions reject anything outside that before spending a credit.
- Rate limits vary by plan and are separate for enrichment and search — on Starter that is
5/s, 300/min and 2000/day for enrichment, and 1/s, 30/min and 1000/day for search. Every
successful response reports the remaining budget, which the actions return as
rate_limit(daily_requests_left,minute_requests_left,daily_reset_seconds,minute_reset_seconds) from Prospeo'sx-daily-request-left/x-minute-request-left/x-daily-reset-seconds/x-minute-reset-secondsheaders. It isnullon a no-match result because a failed HTTP response does not carry its headers through to the action. - The removed v1 endpoints are deliberately absent.
/email-finder,/mobile-finder,/email-verifier,/domain-searchand/social-url-enrichmentwere retired on 1 March 2026 —/enrich-personand/enrich-companyreplace all of them. - No custom API call action. A passthrough would hand this connection's API key to any URL a flow supplies, and every live endpoint is already covered above.
