First-party app
Findymail

Findymail

Find and verify work emails, find phone numbers and companies, run Intellimatch searches, manage lists and exclusion lists, monitor buying signals and read credit usage on Findymail.

stable EmailMarketing

About

Findymail ships in the w6w first-party pack. It declares 35 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.findymail
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Email · Marketing

Overview

Findymail is an email finder and verifier for outbound prospecting. This app finds a verified work email from a name and company or from a LinkedIn profile, verifies an address, reverse-looks-up a profile from an email, finds a phone number, finds employees by job title, and looks up company data and technology stacks.

It runs Intellimatch (plain-language company search with optional contact enrichment, polled by hash), finds lookalike companies, manages contact lists and Intellimatch exclusion lists and their domains, manages signal monitors and reads the signals they raise, and reads credit balances and usage.

Health checks verify the API key, whether app.findymail.com is answering, and the credit balance. Findymail publishes no status page.

Build with Findymail

Three routes to the same 35 actions. The Workflow tab is generated from Findymail's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Add Excluded Domains

add-excluded-domains

Add up to 10,000 domains to an exclusion list (or to the global list when no list ID is given). Past 50 domains the first 50 are processed immediately and the rest are queued.

Create Exclusion List

create-exclusion-list

Create an Intellimatch exclusion list. The name must be unique per user.

Create Contact List

create-list

Create a new contact list.

Create Monitor

create-monitor

Create a signal monitor. The signal type cannot be changed afterwards.

Delete Exclusion List

delete-exclusion-list

Delete an exclusion list and all its domains. Only the owner may delete it.

Delete Contact List

delete-list

Delete a contact list.

Delete Monitor

delete-monitor

Soft-delete a signal monitor.

Find Email from LinkedIn Profile

find-email-by-linkedin

Find someone's verified email from their business profile (LinkedIn) URL. Uses one finder credit only if a verified email is found. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Find Email by Name

find-email-by-name

Find someone's verified email from their full name and company. Uses one finder credit only if a verified email is found. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Find Employees

find-employees

Find employees at a company website by job title. Costs 1 credit per contact found and returns NO email (use Find Email from LinkedIn Profile on the result). Findymail's response is a bare array, returned here as `employees`. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Find Phone

find-phone

Find someone's phone number from their LinkedIn URL. Costs 10 finder credits if a phone is found; requests for EU citizens return nothing for legal reasons. The 200 body is not shown in Findymail's reference, so it is returned verbatim as `result`. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Get Company Information

get-company

Retrieve company data from a LinkedIn company URL, a domain or a name — at least one is required. Costs 1 finder credit per hit; a miss answers 404.

Get Remaining Credits

get-credits

Get the finder and verifier credit balances. Free.

Get Exclusion List

get-exclusion-list

Get one exclusion list's details (without its domains — use List Excluded Domains for those).

Get Signal

get-signal

Get one signal with its contact, company and the caller's monitors.

Get Team Usage

get-team-usage

Credit usage per team member over a date range. Team owners only (403 otherwise). Defaults to the last 30 days.

Get Usage

get-usage

Daily (periods under 2 months) or monthly credit usage of the authenticated user. Defaults to the last 30 days.

Intellimatch Results

intellimatch-results

Fetch the paginated company and contact results of a completed Intellimatch task. A 404 means the export is not ready yet or has expired.

Intellimatch Search

intellimatch-search

Start an Intellimatch task: plain-language company search with optional contact, email and phone enrichment. Returns a `hash`; poll Intellimatch Status, then fetch Intellimatch Results. Email costs 1 credit per email found and phone 10 credits per phone found.

Intellimatch Status

intellimatch-status

Poll an Intellimatch task. `status` is `success`, `processing`, `pending`, `failed` or `not_found`; processing carries progress counts.

Get List Contacts

list-contacts

Get the contacts saved in a contact list. The response is a DataTables-style envelope (`draw`, `recordsTotal`, `recordsFiltered`, `data`).

List Excluded Domains

list-excluded-domains

List excluded domains (paginated), optionally filtered to one exclusion list or a search string. Without a list ID it returns the global exclusion list.

List Exclusion Lists

list-exclusion-lists

List every Intellimatch exclusion list the user owns or that is shared with their team.

List Contact Lists

list-lists

List the contact lists of the authenticated user.

List Monitors

list-monitors

List signal monitors the user owns or shares with the team, newest first, each with a `match_count`. Findymail's response is a bare array, returned here as `monitors`.

List Signals

list-signals

List signals raised by the monitors the user owns or shares with the team, filterable by type, monitor and date. A 404 with an empty body means the Signals feature is disabled on the account.

Search Lookalike Companies

lookalike-search

Find companies similar to a seed domain. Costs 1 finder credit per 10 results returned (rounded up). The 200 body is not shown in Findymail's reference, so it is returned verbatim as `result`. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Lookup Technologies by Domain

lookup-technologies

Get a company's technology stack by domain, optionally filtered to named technologies. Costs 1 finder credit when technologies are found, free otherwise. The 200 body is not shown in Findymail's reference, so it is returned verbatim as `result`. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Remove Excluded Domains

remove-excluded-domains

Remove excluded domains by their domain IDs (from List Excluded Domains). Only domains the caller may delete are removed.

Reverse Email Lookup

reverse-email-lookup

Find a business profile from an email address (work or personal). Costs 1 finder credit on a hit, 2 with full profile data. The 200 body is not shown in Findymail's reference, so it is returned verbatim as `result`. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

Search Technologies

search-technologies

Search Findymail's technology catalog by name (min 2 characters, up to 25 results). Free, rate-limited to 10 requests per minute.

Update Exclusion List

update-exclusion-list

Rename an exclusion list and/or change its sharing. Only the owner may update it; sharing needs a team.

Update Contact List

update-list

Rename a contact list and set whether it is shared with the team. Both fields are required by the API.

Update Monitor

update-monitor

Update a signal monitor. The name is required by the API; the signal type cannot change.

Verify Email

verify-email

Verify that an email address is deliverable. Uses one verifier credit on every attempted verification. Spends credits only on a hit; a 402 means the balance is empty and a 423 that the subscription is paused.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Findymail's real ids.

{
  "manifestVersion": "2",
  "name": "findymail-example",
  "steps": [
    {
      "id": "add-excluded-domains",
      "uses": {
        "app": "io.w6w.findymail",
        "action": "add-excluded-domains",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "domains": "<domains>"
      }
    }
  ]
}

Here are some of the things you can do

  • Add Excluded Domains

    perform
    add-excluded-domains
  • Create Exclusion List

    perform
    create-exclusion-list
  • Create Contact List

    perform
    create-list
  • Create Monitor

    perform
    create-monitor
  • Find Email from LinkedIn Profile

    search
    find-email-by-linkedin

+30 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Findymail, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Findymail. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "add-excluded-domains",
  payload: {
    domains: "<value>",
    // list_id: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action add-excluded-domains --payload '{"domains":"<value>"}'

Give an AI agent Findymail — without giving it Findymail's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.findymail#add-excluded-domains",
    "input": {
      "domains": "<domains>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Findymail connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Findymail's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Findymail itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Findymail declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Findymail platform status

dependency

API reachability

Unauthenticated GET of app.findymail.com/api/credits. The documented 401 `Unauthenticated.` envelope is the expected healthy answer; credential validity is the `auth:api-key` check's job.

quota

Credit balance

Finder and verifier credits left, read from the free `GET /api/credits`. `degraded` when either balance is 0.