npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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_MATCH comes 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 return found: false with error_code: "NO_MATCH" instead of failing the flow run. Branch on found in 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_DATAPOINTS only 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: true on 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, not undefined, and posting an explicit false would 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 under invalid_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's person_id into 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 with revealed: 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-suggestions endpoint (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 documents company_industry by 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's x-daily-request-left / x-minute-request-left / x-daily-reset-seconds / x-minute-reset-seconds headers. It is null on 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-search and /social-url-enrichment were retired on 1 March 2026 — /enrich-person and /enrich-company replace 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.