Add CSuiteFinder to the catalog (work-email resolution + enrichment) - #402
Open
lbesecker195 wants to merge 2 commits into
Open
lbesecker195 wants to merge 2 commits into
lbesecker195 wants to merge 2 commits into
Conversation
CSuiteFinder resolves a name and a company domain to a work email, then verifies, enriches and identifies it. Ten endpoints across five capabilities that already exist in the taxonomy, so every one lands on a comparison shelf next to Hunter, Tomba and Findymail rather than starting a shelf of one. people.email.find /email/find 1 token ($0.0025), per success people.email.verify /email/deliverable included people.enrich /email/enrich included people.enrich /name/who included (narrow form) companies.email_pattern /email/pattern included companies.enrich /company/info included companies.enrich /company/find included (narrow form) account.usage /billing/balance free (registry probe) account.usage /billing/usage free account.usage /pricing free, unauthenticated rate card Billing is unusual enough to state plainly: tokens cost a flat, published $0.0025, and exactly one route spends them. The rest are included but still require a positive balance, so an exhausted key gets 402 rather than unlimited free enrichment. Every cost block cites the live rate card at /csuitefinder/pricing, which is public and needs no credential — a reviewer can machine-check every price before calling anything. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ng people.email.find Four endpoints, all mapped to existing capabilities so this routes the day it merges: people.email.find /email/linkedin $0.015 per success people.search /people/search $0.0025 per row companies.search /company/search $0.0025 per row companies.emails.list /email/company/people $0.0025 per row The billing preamble was also wrong and is rewritten. The listing described a token system that no longer exists — prices are in dollars per answer now, the trial is $1 for a month rather than 400 tokens, and there are four per-row routes where before there was one billable route. A review run against the live API would have caught it; better it reads true first. It also now says why the email price sits under this capability's floor, since that is the obvious reviewer question: the company's address FORMAT is bought once and every colleague is resolved from the stored pattern without another lookup. The per-address price is amortised across a company rather than the cost of one purchased find. Different unit economics, not a loss-leader. PROPOSAL, take it or leave it: `people.email.find` covers two jobs with different inputs, different prices and different buyers, and the router already distinguishes them (`domain+full_name` vs `linkedin_url`). Naming the split would give each its own comparison page and stop an agent holding a name and a domain being quoted a LinkedIn-only provider. It is not a shelf of one — both sides already have several providers, listed in the file. Every endpoint here is mapped to the existing capability regardless, so the PR stands either way. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds CSuiteFinder — work-email resolution, verification, person and company enrichment.
Contact: lbesecker195@gmail.com (for arranging a test credential; happy to send a credits grant too)
Eligibility
POST /csuitefinder/registerwith an email returns a key immediately — no dashboard, no sales callAuthorization: Bearer <key>(also acceptsX-API-Key)GET /billing/balance— 200 valid / 401 invalid, spends nothinghttps://csuitefinder.com/csuitefinder/pricing— live JSON rate card, no credential requiredhttps://csuitefinder.com/documents every route with worked examplesProbe bad-key behavior, observed on the wire 2026-09-09
A valid key on the same route returns
200.Billing model
Tokens at a flat, published $0.0025 each; bundles from $1,000 (400,000 tokens). New accounts self-register and get 400 trial tokens ($1).
Exactly one route spends tokens —
/email/find, 1 token per address resolved, nothing when it resolves nothing. Every other data route is included: 0 tokens, but still requires a positive balance, so an exhausted key gets402rather than unlimited free enrichment. That distinction is in each costnote.https://csuitefinder.com/csuitefinder/pricinghttps://csuitefinder.com/Self-verification ledger
Every
test_requestbelow was live-called on 2026-09-09 against a fresh trial key. The meter is thetoken_balancefield onGET /billing/balance, read immediately before and after each call.csuitefinder.people.email.findcsuitefinder.people.email.find(repeat)csuitefinder.people.email.find(miss)csuitefinder.people.email.verifycsuitefinder.people.enrichcsuitefinder.people.name.lookupcsuitefinder.companies.email_patterncsuitefinder.companies.enrichcsuitefinder.companies.identifycsuitefinder.account.usagecsuitefinder.account.usage.historycsuitefinder.account.pricingReconciliation: 400 granted − 2 finds billed = 398 remaining, which is the balance the account ended on. No deliberate-miss test targets are used as
test_requests — every cataloguedtest_requestis a real, resolving call. The miss row above was an extra probe run specifically to prove miss-is-free, and is not in the YAML.Two things worth flagging to whoever verifies:
/email/findcharges again. So an observed delta of 0 on this API always means "no result", never "cache hit" — the meter is unambiguous, and re-running verification on the same targets will cost the same as the first run.confidence: verifiedon the cost blocks reflects that live balance-delta measurement, not a docs transcription. I have deliberately not addedverified:stamps or example responses — those are yours.Full-surface map
Every documented operation. There are 15 in total; 10 catalogued.
GET/POST /email/findGET/POST /email/deliverableGET/POST /email/enrichGET/POST /email/patternGET/POST /name/whoGET/POST /company/findGET/POST /company/infoGET /billing/balanceGET /billing/usageGET /pricingPOST /registerPOST /billing/topupPOST /billing/capturePOST /billing/webhookGET /healthGET /admin,/admin/metrics.json,/ops/*Both rules of thumb from the vendor doc are covered: the free pre-flight routes (
/pricing,/billing/usage,/billing/balance) are in, and there is no cheaper tier of any operation to omit — the cheap tier is the default, since only one route bills at all.Capability mapping
All five capabilities already exist; nothing new is proposed. Every endpoint lands next to existing providers:
people.email.find— alongside hunter, tomba, trykitt, findymail, leadmagicpeople.email.verify— alongside hunter, tomba, trykitt, millionverifier, icypeaspeople.enrich— alongside hunter, tomba, apollo, pdlcompanies.email_pattern— alongside thecompaniesapi, tombacompanies.enrich— alongside thecompaniesapi, hunter, tomba, companyenrichTwo capabilities carry two endpoints each (
/email/enrich+/name/who;/company/info+/company/find). They are genuinely distinct routes sharing a price: the second of each pair returns only the identity fields, for callers who want a name rather than a full record.Data provenance — disclosure
CSuiteFinder sources some of its underlying data through treg itself, which your vendor docs explicitly permit and encourage ("Reselling treg inside your own product … allowed and encouraged with no special agreement"). Flagging it up front so it is not a surprise mid-review.
What CSuiteFinder adds on top, and why it is not a pass-through: it resolves a company's address pattern once and then applies it to every subsequent employee, so most lookups are answered without any upstream call. That is what makes a flat 1-token price possible where per-person lookups cost more, and it is why six of the seven data routes are included rather than metered.
Checks
The 4 failures are pre-existing on untouched
mainand unrelated to this PR — I confirmed by stashing this branch and re-running. They are all intests/test_usage_caps.py, and they are a timezone artifact rather than a real defect: the code dates usage in UTC while the tests assert against localdate.today(), so they fail on any machine whose local date differs from UTC at the time of the run.(Local clock was 2026-09-08 23:21 PDT = 2026-09-09 06:21 UTC.) Worth a
freeze_timeor a UTC-normalised assertion at some point; out of scope here.Rebased on
6e6ba3fimmediately before opening. Diff is the five expected files only — registry entry, catalog YAML, logo, two test lists. No credential value anywhere in the diff, noverified:stamps, no committed examples.