Skip to content

feat(anymailfinder): add Anymail Finder email finder and verifier integration - #8563

Open
emma-anymailfinder wants to merge 2 commits into
simstudioai:mainfrom
emma-anymailfinder:feat/anymailfinder-integration
Open

emma-anymailfinder wants to merge 2 commits into
simstudioai:mainfrom
emma-anymailfinder:feat/anymailfinder-integration

Conversation

@emma-anymailfinder

Copy link
Copy Markdown

Summary

Adds Anymail Finder, a B2B work-email finder and verifier, as an integration: five tools, a block, hosted-key (BYOK) support with API-reported pricing, and provider slots in the Work Email and Email Verification enrichment waterfalls. Footprint mirrors the Findymail integration.

I work at Anymail Finder. Contact: team@anymailfinder.com.

If you want to judge the data quality yourselves before deciding anything, email that address and we will send test credits for a side-by-side run against the providers already in the waterfalls. We also publish a benchmark of email finders and verifiers, with method and domain list, at https://anymailfinder.com/email-finder-benchmark. Anymail Finder has been running since 2015.

If you then want to serve it on Sim's hosted keys, we will set up a funded account; the env vars are ANYMAILFINDER_API_KEY_COUNT and ANYMAILFINDER_API_KEY_1..N.

Tools (apps/sim/tools/anymailfinder/)

Tool Endpoint Hosted Charge
anymailfinder_find_person_email POST /v5.1/find-email/person yes 1 credit only when a verified email is found; takes name + company domain or name, a LinkedIn URL alone, or both
anymailfinder_find_decision_maker_email POST /v5.1/find-email/decision-maker yes 2 credits only on a verified hit; company + one to five departments, returns one person with title, LinkedIn URL and email
anymailfinder_find_company_emails POST /v5.1/find-email/company yes 1 credit for the whole list (up to 20), only when something is found
anymailfinder_verify_email POST /v5.1/verify-email yes 0.2 credits whatever the verdict (valid / invalid / risky)
anymailfinder_get_account GET /v5.1/account no (reads the user's own balance) free

Auth is the raw key in Authorization. Misses are HTTP 200 with email_status: not_found; valid_email is set only for a verified address, and that is the field the enrichments read, so a risky guess never fills a cell. Repeats of the same search or verification within 30 days are free. Response shapes come from the published OpenAPI document (https://api.anymailfinder.com/openapi.json) and were checked against live calls.

Pricing and throttling (per the add-hosted-key skill)

  • API charges: per verified result. 1 credit per verified email found, 2 per decision-maker find, 0.2 per verification; misses and 30-day repeats are 0.
  • Response reports cost? Yes. Every billable response carries credits_charged, the exact amount for that call (0 on a miss or a repeat). transformResponse passes it through and getCost bills credits_charged * ANYMAILFINDER_CREDIT_USD, throwing when the field is missing rather than guessing.
  • Credit rate: ANYMAILFINDER_CREDIT_USD = 0.02, from the $199/month 10,000-credit plan ($0.0199/credit), the same basis as FINDYMAIL_CREDIT_USD. Monthly plans run from $29/400 credits to $799/100k; one-time packs from $1,090/100k. Adjust to the plan Sim funds.
  • API rate limits: none published; capacity auto-scales. Most calls answer in a few seconds, a slow target mail server can take up to 180 s.
  • Our config: per_request, 60 requests per minute per workspace, matching Findymail.
  • Risk: none on cost, since the charge is read from the response. The only estimate is the dollar rate per credit.

Block

apps/sim/blocks/blocks/anymailfinder.ts: five operations, canvasPresentation sentences for each, the duplicate-apiKey pattern so the account-balance operation always uses the user's own key, tools.config.params coercing the department list from JSON or comma-separated text, seven templates and four skills grounded in the five operations.

Enrichments

  • work-email: an anymailfinder provider after Findymail (LinkedIn) and before Prospeo. One provider covers name + domain, LinkedIn URL alone, or both; mapOutput reads valid_email.
  • email-verification: an anymailfinder provider after MillionVerifier and before Enrow. valid and invalid are verdicts; risky falls through like unknown does for the other verifiers.

Both positions are deliberately conservative for a vendor-submitted provider. The cascade runner logs a hit per provider, so once you have a few weeks of hit rate and cost per hit, reorder on your own numbers; we will not argue for a slot we have not earned on your data.

BYOK and docs

  • BYOKProviderId union, byokProviderIdSchema, PROVIDERS and the Enrichment PROVIDER_SECTIONS in byok.tsx, a row in costs.mdx.
  • Icon: monochrome mark with fill='currentColor', block bgColor #0E2240.
  • Docs: integrations/anymailfinder.mdx with the MANUAL-CONTENT intro; the rest is generator output.

Tests

  • tools/enrichment-hosting.test.ts: a hit bills one credit, a miss and a 30-day repeat bill 0, decision maker 2, company list 1, verification 0.2, and a response without credits_charged throws.
  • enrichments/work-email/work-email.test.ts: the provider accepts name + domain, LinkedIn alone, or both, skips with neither, fills from valid_email only, and treats a risky result as a miss.

Checks run

  • bun run tool-metadata:generate, bun run scripts/generate-docs.ts, bun run generate:block-successors, bun run docs-manifest:generate, bun run deployment-config:generate (output committed)
  • bun run check:byok-providers, check:canvas-sentences --block=anymailfinder, check:bare-icons, check:tool-request-boundary
  • bun run integration-catalog:check, docs:check, deployment-config:check, tool-metadata:check
  • bun run type-check, bun run lint, bunx vitest run tools/enrichment-hosting.test.ts enrichments/

🤖 Generated with Claude Code

…egration

Five tools on https://api.anymailfinder.com/v5.1 (find person email by
name + company or LinkedIn URL, find decision maker email by department,
find company emails, verify email, get account), a block with canvas
sentences, templates and skills, and hosted-key support where getCost
bills the credits_charged the API reports (0 on a miss or a 30-day
repeat) at $0.02 per credit.

Adds an anymailfinder provider to the work-email and email-verification
enrichment waterfalls, reading valid_email so a risky guess never fills
a cell; registers the BYOK provider id, settings entry and costs row;
monochrome icon; docs intro; tests for pricing and the cascade provider;
regenerated tool metadata, docs, block names, docs manifest and
deployment config.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 2, 2026

Copy link
Copy Markdown

@emma-anymailfinder is attempting to deploy a commit to the Sim Team on Vercel.

A member of the Team first needs to authorize it.

@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[Medium risk] Adds a new third-party email finder integration.

The PR should not merge until operation changes cannot cause a lookup against a previously entered company.

Findings

  1. P1 Previous company reused after switching ▶
  2. P2 Missing charges become zero ▶

Summary

Adds Anymail Finder tools and a workflow block, hosted-key pricing and BYOK registration, documentation, and providers in the work-email and email-verification waterfalls.

  • The block’s cross-operation parameter mapping can reuse a stale company name.
  • Successful responses with no charge field are silently treated as free instead of triggering the intended metering safeguard.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Anymail Finder block or enrichment] --> B[Finder / verifier tool]
  B --> C[Anymail Finder API]
  C --> D[Transformed result]
  D --> E[Hosted-key cost calculation]
  D --> F[Enrichment waterfall result]
Loading

Reviews (1) · Last reviewed commit: "feat(anymailfinder): add Anymail Finder ..."

Comment thread apps/sim/blocks/blocks/anymailfinder.ts
Comment thread apps/sim/tools/anymailfinder/find_company_emails.ts Outdated
…t a missing charge to zero

Only the selected operation's subBlocks are forwarded to the tool, so a
company name left in another operation's field cannot leak into a lookup
through the shared company_name mapping. The four billable tools pass
credits_charged through untouched, so a response without it hits the
getCost guard instead of being recorded as free.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@emma-anymailfinder

emma-anymailfinder commented Oct 2, 2026 •

Copy link
Copy Markdown
Author

Both Greptile findings addressed in the follow-up commit: the block now forwards only the selected operation's fields (the three *_company_name subBlocks share one tool param, so a stale value could leak into another lookup), and the four billable tools pass credits_charged through untouched so a response without it hits the getCost guard instead of being recorded as free.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant