# WhoLayer: full text > WhoLayer identifies website visitors and enriches them with verified emails and mobiles, then sends them to Slack, HubSpot, Klaviyo, signed webhooks, or an AI agent. One tag powers Visitor ID (people and companies visiting a B2B site; person-level for US traffic only, company-level free and unlimited) and Shopper ID (anonymous US shoppers sent to Klaviyo). The Data API and MCP server give code and AI agents the same identity and contact data with per-key spend caps, and Identity Cloud licenses identity data to platforms. Every product draws from one credit wallet. Opted-out people are never returned or charged. Website visitor identification for B2B and ecommerce # Every visitor has a name. WhoLayer shows you the people and companies visiting your website, finds a verified way to reach them, and sends them to Slack, your CRM, Klaviyo, or your AI agent. [Start free](https://wholayer.com/signup) [See it on your site](https://wholayer.com/#site-check) 100 free credits a month · No card · Never charged for a miss · Cancel any time Use it in the app, by API, or by MCP in Claude or Cursor. AI reads your public homepage and builds a plan. Takes about 10 seconds. Or [estimate your cost](https://wholayer.com/calculator) from your traffic, or [try the API](https://wholayer.com/#try-the-api) with no key. Works with the stack you already run Also native: Microsoft Teams on every plan, Pipedrive and Attio from Starter and above. Salesforce (Scale and above) is coming soon. Native: Slack, Teams, HubSpot, Pipedrive, Attio, Klaviyo, Claude, Cursor. Via signed webhooks or the API: Shopify (theme tag), Zapier, n8n. Logos are trademarks of their owners and indicate compatibility, not endorsement. ## From anonymous to known, in about a minute The same four steps run for every visit. Pick your business to see what they look like for you. Step 1 of 4 · Visit ### Someone reads your pricing page yoursite.com/pricing Pricing Plans for every team size Compare plans {"event":"pageview","path":"/pricing","country":"US"} The WhoLayer tag sees an anonymous US visit on a high-intent page. [Explore Visitor ID](https://wholayer.com/products/visitor-id) Live sandbox, no key needed ## Try the API right here. The real request shape for `POST /v1/people/enrich`, answered by our sandbox. Every result is fictional, nothing is stored, and it costs nothing. POST /v1/people/enrichsandbox ``` curl https://api.wholayer.com/v1/people/enrich \ -H "Authorization: Bearer wl_test_..." \ -H "Content-Type: application/json" \ -d '{"name":"Avery Sample","company_domain":"samplefieldworks.example.com","reveal":["work_email","mobile"]}' ``` response ``` // Press Run request. Results are fictional sandbox data on example.com, and nothing is stored or charged. ``` [Read the API reference →](https://wholayer.com/docs/api) ## Every identified visitor, in one place Names, titles, companies, fit scores, pages viewed, and where each person was sent. Filter it, export it, or ask the assistant about it. ![The WhoLayer dashboard: credits, identified people, and recent visitors](https://wholayer.com/_next/image?url=%2Fproduct%2Foverview.webp&w=3840&q=75&dpl=dpl_65eR71oQwNaJsUPcpQmcwSQwGKmh) [Open your dashboard free](https://wholayer.com/signup) ### Pay for people, not seats 1 credit buys one identified person or one verified work email. Company-level ID is free, and misses cost nothing. [See pricing →](https://wholayer.com/pricing) ### Routed before they forget you Hot leads reach Slack, Teams, HubSpot, Pipedrive, Attio, Klaviyo, or a signed webhook about a minute after the visit, with a fit score and a plain-English reason. [See destinations →](https://wholayer.com/docs/integrations) ### Opt-outs on every path Every lookup checks our suppression list and yours. US-only for people, and never on sensitive pages. [How we handle data →](https://wholayer.com/trust) Check our work ## No logo wall. Just things you can verify. - ### One tag One async script runs Visitor ID and Shopper ID. Check my install names the problem if something's wrong. [Install guide →](https://wholayer.com/help/quickstart) - ### One wallet, published prices Every product draws from the same credits, and every credit cost is on the pricing page. [Every rate →](https://wholayer.com/pricing) - ### Fair billing Misses, repeat visits in a month, bots, and opted-out people are never charged. Bad results are refunded within a published limit. [The rules →](https://wholayer.com/fair-billing) - ### Readable by agents A data MCP server with 13 tools, a docs MCP server, llms.txt, an OpenAPI spec, and a markdown copy of every public page. [For AI agents →](https://wholayer.com/for-agents) - ### Compliance you can query GET /v1/policy returns the rules we enforce as JSON: US-only person data, consent elsewhere, Global Privacy Control, and blocked sensitive pages. [Policy API →](https://wholayer.com/help/compliance-policy-api) - ### Shipped in the open A dated changelog of what we built, and a live status page. [Changelog →](https://wholayer.com/changelog) ## Built for what you're selling ### See the people behind your pipeline traffic. Install one tag and get the name, title, LinkedIn, and verified work email of US visitors, plus the company for everyone else. Then send hot leads to Slack, Microsoft Teams, your CRM, or any tool that takes a webhook, automatically. What's included - Person and company ID - ICP scoring with a reason - High-intent alerts - Daily or weekly digest - Companies view [Explore Visitor ID](https://wholayer.com/products/visitor-id) slack · #hot-leads ``` Dana Okafor · VP Revenue · Fieldline (210 staff) Viewed /pricing → /compare → /integrations/hubspot Work email: dana@fieldline.io (verified) LinkedIn: linkedin.com/in/danaokafor Visits this month: 3 ``` Try it ## Your traffic, out of focus. Until now. Move the scanner up and down the list to see who these visitors are. They're fictional; on your site, it's your traffic. Visitors on your site right nowMove your cursor up and down the list Illustration: rows of anonymous website visitors. Inside the lens, each visitor is resolved to a named person. Pricing ## Pay for people, not seats. One credit wallet across every product. If we don't find someone, you don't pay, and the rules are published on Fair billing. [Compare plans](https://wholayer.com/pricing) [Estimate your cost](https://wholayer.com/calculator) Per identified person on Growth $0.04 Company-level visitor ID Free Free credits every month 100 Charged when there's no match $0 For AI agents ## Your agent gets a spend cap before it gets a key. Add the WhoLayer MCP server to Claude, Cursor, or VS Code. Every key has its own daily credit cap, every call has a ceiling, and asking what a call would cost is free. The docs MCP server (5 tools) needs no key at all. - enrich\_person - search\_people - verify\_emails - lookup\_phone - get\_company - list\_visitors - get\_balance - estimate\_cost - +5 more [For AI agents →](https://wholayer.com/for-agents) [MCP setup →](https://wholayer.com/docs/mcp) [llms.txt →](https://wholayer.com/llms.txt) claude code · add WhoLayer ``` claude mcp add --transport http wholayer https://mcp.wholayer.com/mcp \ --header "Authorization: Bearer wl_live_YOUR_KEY" ``` ## Built to be used responsibly - ### Opt-outs come first Every lookup checks our suppression list. Anyone can opt out in two minutes, and we process California's deletion platform every 45 days. - ### Global Privacy Control honored Browsers that send a Global Privacy Control signal are not identified. The rule is in our published policy, not just our privacy notice. - ### No LinkedIn scraping Our data comes from consent-aware publisher networks and licensed partners, not from scraping profiles. - ### Never on sensitive pages We don't identify people on pages about health, reproductive care, religion, financial hardship, and other sensitive topics, and you can keep the tag off any page you choose. - ### US-only for people Person-level ID runs on US traffic only. Outside the US we identify companies, and only after consent. - ### Accuracy you can check We'll publish measured match and accuracy rates every quarter, against a holdout set of known visitors. [Read how we handle data →](https://wholayer.com/trust) Ready when you are ## Find out who's already visiting. Install one tag. 100 free credits every month, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Products # One identity layer, four ways to use it. Every WhoLayer product runs on the same identity graph and draws from the same credit wallet. Start with the one you need and add the others whenever you like, without a new contract. [For B2B sales, marketing, and RevOpsVisitor IDInstall one tag and get the name, title, LinkedIn, and verified work email of US visitors, plus the company for everyone else. Then send hot leads to Slack, Microsoft Teams, your CRM, or any tool that takes a webhook, automatically.1 credit per identified person per month. Company-level ID is free.](https://wholayer.com/products/visitor-id) [For DTC and ecommerce brandsShopper IDShopper ID recognizes anonymous US shoppers on your store and sends verified emails to your Klaviyo flows, so abandoned carts and browse sessions turn into revenue.2 credits per new shopper sent to Klaviyo. Shoppers already on your list cost half (1 credit). Holdout shoppers and Returning Shopper events are free.](https://wholayer.com/products/shopper-id) [For developers, Clay users, and AI agentsData API and MCPVerified work and personal emails, carrier-checked mobiles, people and company search, and reverse email lookup, through a REST API and an MCP server that work with Clay, n8n, Zapier, and any AI agent. No seats, no UI required.1 credit per work email, 2 per personal email, 5 per mobile, 10 per reverse email lookup, 0.25 per verification, 1 per company profile. Nothing when there's no result.](https://wholayer.com/products/data-api) [For retailers, publishers, ad tech, data companies, and platformsIdentity CloudEarly access. Resolve anonymous traffic to people, add hashed emails, mobile ad IDs, and IPs, and layer on demographic, professional, and firmographic attributes. Each contract is scoped with a free match test, and delivery is set up by our team.Volume pricing from $0.02 a credit with an annual commitment of 250,000+ credits a month. Free match test before you sign.](https://wholayer.com/products/identity-cloud) How it works ## Watch the identity layer work Visits come in on the left and leave as named people in your tools on the right. Hover any stage to see exactly what goes in and what comes out. Visits seen 0 People identified 0 Sent to your tools 0 Incoming visits - anonymous/careers · Seattle, WA - anonymous/docs/api · Boulder, CO - Jordan PikeFounder/docs/mcp · Raleigh, NC - Priya NatarajanHead of RevOps/integrations/hubspot · Chicago, IL - No match · not charged/blog/visitor-id · Columbus, OH - Dana OkaforVP Revenue/pricing · Austin, TX Your tools Event log 1. 15:41:09visitor.identified Lena Whitcomb → Slack #hot-leads 2. 15:41:04visit.unmatched /careers · Seattle, WA · not charged 3. 15:40:58visitor.identified Sam Ortega → HubSpot Hover a stage to see the data it takes in and sends out. Hover a dot to follow one visitor. Live demo with fictional traffic Slack#hot-leads HubSpotNew contact WebhookSigned POST AI agentvia MCP Tap a stage to see what it produces. Fictional data. ## How the layers stack Each layer does one job, and every product uses all of them. 1. 05Your toolsSlack, CRM, Klaviyo, Meta, Clay, warehouses, and AI agents 2. 04ProductsVisitor ID, Shopper ID, Data API and MCP, Identity Cloud 3. 03WalletOne credit balance, one bill, one set of spend caps 4. 02ComplianceSuppression, opt-outs, DROP deletions, consent, US-only person matching 5. 01Identity graphConsent-aware publisher signals, licensed partners, verification Ready when you are ## See who's on your site this week Install one tag. Your first 100 identified people are free, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Visitor ID # See the people behind your pipeline traffic. Install one tag and get the name, title, LinkedIn, and verified work email of US visitors, plus the company for everyone else. Then send hot leads to Slack, Microsoft Teams, your CRM, or any tool that takes a webhook, automatically. [Start free](https://wholayer.com/signup?product=visitor-id) [See it on your site](https://wholayer.com/for) Free plan: 100 credits a month · 1 credit per identified person · company-level ID and misses are free ![Visitor ID in the WhoLayer dashboard](https://wholayer.com/_next/image?url=%2Fproduct%2Fpeople.webp&w=3840&q=75&dpl=dpl_65eR71oQwNaJsUPcpQmcwSQwGKmh) ## One visitor, from pricing page to pipeline Four steps WhoLayer runs for every visit. Click a step to see what it adds. yourcompany.com**/pricing**0:00 ?Anonymous visitoranon\_8f2c · on /pricing Contact Work email Risk grade LinkedIn Sent to [Explore Visitor ID](https://wholayer.com/products/visitor-id) ## What Visitor ID does for you For B2B sales, marketing, and RevOps ### Follow up while they're still interested Alerts arrive within about a minute of the visit, so reps reach out the same day instead of waiting for a form fill that never comes. ### Only the visitors who matter Score every visitor against your ideal customer, then route by fit score, job title, company size, and the pages they viewed. Everyone else is still logged in your dashboard, just not pushed. ### Fewer dead ends Work emails come with a risk grade. Look up carrier-checked mobiles for any identified person through the API. ## How it works 1. Step 01 ### Paste the tag One async script in your site header, or install through Google Tag Manager, Webflow, WordPress, or Framer. 2. Step 02 ### Set your hot-lead rules Pick the titles, company sizes, and pages that signal buying intent, and exclude pages like careers or login. 3. Step 03 ### Route and reach out Send matches to Slack or Teams, HubSpot, Pipedrive, or Attio, or a signed webhook into Clay, Zapier, Make, n8n, or your sequencer. Salesforce sync is coming soon. ## Features Person and company ID Person-level for US traffic, company-level worldwide. Company-level is free and unlimited on every plan. [Learn more](https://wholayer.com/help/visitor-id-how-it-works) ICP scoring with a reason Describe your ideal customer in a sentence. Every identified person and company gets a 0 to 100 fit score and a one-line reason, on every plan, with no AI cost per visitor. Set a minimum score on any destination. [Learn more](https://wholayer.com/help/icp-scoring) High-intent alerts Pick your key pages, like pricing, comparisons, and demo. When someone you've identified opens one, the Slack or Teams alert is tagged and webhooks get a visitor.high\_intent event, at most once a day per visitor. [Learn more](https://wholayer.com/help/high-intent-pages) Daily or weekly digest A short email for your team with who visited, the top people and companies, and how many high-intent visits there were. Free on every plan. [Learn more](https://wholayer.com/help/email-digest) Companies view Every company seen on your sites, with the people identified there, visits, and key-page views. [Learn more](https://wholayer.com/help/companies-view) Repeat visits are free A person is charged once a month no matter how often they return. You see every return visit at no cost. [Learn more](https://wholayer.com/help/how-credits-work) Refunds for wrong matches Report a wrong person or a bounced email from their page in the dashboard. Credits charged in the last 30 days come back, up to 10% of what you spent in that window, and the result is never sent again. [Learn more](https://wholayer.com/help/report-bad-data) Opt-outs and your own suppression list Anyone who opted out with us is never returned. Upload people you never want to see, and exclude whole sections of your site from the tag. [Learn more](https://wholayer.com/help/your-suppression-list) Delivery log and CSV export See the last 50 deliveries for each destination and resend failures. Export every identified person and company whenever you like. [Learn more](https://wholayer.com/help/destination-webhook) Available onEvery plan, including FreeHot-lead filters: Starter and aboveHubSpot, Pipedrive, and Attio sync: Starter and aboveSalesforce sync: Scale and above, coming soon ## Works with your stack - Slack Native - HubSpot Native - Signed webhooks Native - Zapier Via webhook - n8n Via webhook - Microsoft Teams - Pipedrive - Attio - Salesforce (coming soon) - Email digest - Clay (webhook) - Make (webhook) Logos are trademarks of their owners and indicate compatibility, not endorsement. Pricing 1 credit per identified person per month. Company-level ID is free. [See plans](https://wholayer.com/pricing) [Fair billing](https://wholayer.com/fair-billing) [Estimate your cost](https://wholayer.com/calculator) ## Questions How many of my visitors will you identify? It depends on your traffic: US share, device mix, and how much comes from logged-in professional audiences. Install the free plan and you'll see your own rate within a few days. We publish our measured match and accuracy rates quarterly on the Trust page. Does it work outside the US? Company-level ID works worldwide. Person-level ID is US-only, because EU, UK, and Canadian law require opt-in consent first. Will it slow my site down? No. The tag loads asynchronously after your page renders and is under 6 KB. Do I need a cookie banner? For US traffic, your privacy policy must disclose that you use a visitor identification service; sample wording is on our customer notice templates page (/legal/customer-notice). Outside the US you need a consent banner, and the tag waits for consent before it runs. Which plans include this? Every plan, including Free. Hot-lead filters: Starter and above. HubSpot, Pipedrive, and Attio sync: Starter and above. Salesforce sync: Scale and above, coming soon. See every plan on the pricing page. ### Comparing tools? - [WhoLayer vs Warmly](https://wholayer.com/compare/warmly) - [WhoLayer vs Leadfeeder (Dealfront)](https://wholayer.com/compare/leadfeeder) - [WhoLayer vs Snitcher](https://wholayer.com/compare/snitcher) - [WhoLayer vs Vector](https://wholayer.com/compare/vector) - [WhoLayer vs Koala](https://wholayer.com/compare/koala) - [Switching from Koala](https://wholayer.com/switch/koala) - [WhoLayer vs Clearbit Reveal](https://wholayer.com/compare/clearbit-reveal) - [Switching from Clearbit Reveal](https://wholayer.com/switch/clearbit-reveal) - [All comparisons](https://wholayer.com/compare) ## Same wallet, three more products [Shopper ID →For DTC and ecommerce brands](https://wholayer.com/products/shopper-id) [Data API and MCP →For developers, Clay users, and AI agents](https://wholayer.com/products/data-api) [Identity Cloud →For retailers, publishers, ad tech, data companies, and platforms](https://wholayer.com/products/identity-cloud) Ready when you are ## See who's on your site this week Install one tag. Your first 100 identified people are free, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Shopper ID # Email the shoppers who never gave you their email. Shopper ID recognizes anonymous US shoppers on your store and sends verified emails to your Klaviyo flows, so abandoned carts and browse sessions turn into revenue. [Start free](https://wholayer.com/signup?product=shopper-id) [See it on your store](https://wholayer.com/for) 2 credits per new shopper · 1 for shoppers already in your Klaviyo · bounce and complaint refunds ![Shopper ID in the WhoLayer dashboard](https://wholayer.com/_next/image?url=%2Fproduct%2Fpeople.webp&w=3840&q=75&dpl=dpl_65eR71oQwNaJsUPcpQmcwSQwGKmh) ## One shopper, from browse to inbox Four steps WhoLayer runs for every visit. Click a step to see what it adds. yourstore.com**/products/linen-shirt**0:00 ?Anonymous visitoranon\_41d9 · on /products/linen-shirt Contact Email Risk grade Viewed Sent to [Explore Shopper ID](https://wholayer.com/products/shopper-id) ## What Shopper ID does for you For DTC and ecommerce brands ### Bigger abandoned-cart flows Trigger your existing Klaviyo flows for shoppers who left without signing in or giving an email. ### Know who browsed See every identified shopper with the pages they viewed and how often they came back, and export the list any time. ### Protect your sender reputation Every email is checked against our suppression list and carries a risk grade, so you can keep risky addresses out of your flows. ## How it works 1. Step 01 ### Add the tag Paste one script into your Shopify theme, or into the header of any other store platform. 2. Step 02 ### Connect Klaviyo Add your Klaviyo private key. Each identified shopper arrives as a profile plus a "WhoLayer Shopper Identified" event you can trigger flows from, filtered by the pages they viewed. 3. Step 03 ### Measure the lift A built-in holdout keeps a share of new shoppers out of your flows, then compares their Klaviyo orders with the shoppers we sent, with the method and sample sizes shown. ## Features Shoppers already on your list cost half We check your Klaviyo before charging. A new shopper costs 2 credits; existing subscribers and customers cost 1 and are never duplicated. Opted-out people are never returned. [Learn more](https://wholayer.com/help/shopper-id-klaviyo-guarantees) Refunds for bounces and spam complaints If a shopper we sent bounces or marks your email as spam within 30 days, the credits come back automatically, within the same refund limit as reported results, and we never send them again. [Learn more](https://wholayer.com/help/shopper-id-klaviyo-guarantees) Deliverability Guard A daily cap on new contacts that lowers itself when your Klaviyo complaint rate tops 0.08% or bounces top 2%, and recovers when they're healthy. [Learn more](https://wholayer.com/help/shopper-id-klaviyo-guarantees) Holdout report By default 10% of new shoppers are held out, never sent or charged. The Sites page compares their Klaviyo orders with the shoppers we sent, with a 95% range and sample sizes, once each group is big enough. It's an estimate, not a guarantee. [Learn more](https://wholayer.com/help/shopper-id-klaviyo-guarantees) Returning Shopper events Shoppers already on your list who come back trigger a "WhoLayer Returning Shopper" event with the products they viewed, for your browse-abandonment flows. Return visits we recognize by our own cookie are free. Page-based routing Send shoppers who viewed checkout, cart, or specific collections to different destinations. [Learn more](https://wholayer.com/help/filters-and-hot-leads) Monthly spend cap Set a hard limit on what you spend each month so volume and cost stay predictable. [Learn more](https://wholayer.com/help/overage-and-spend-caps) Consent records Every contact carries a source and timestamp, so you can answer any compliance question. Documented Klaviyo schema Profiles we create carry wl\_source, wl\_match\_type, wl\_first\_seen, and, when the data supplier provides them, wl\_consent\_ref and wl\_confidence. The schema is published in our docs. [Learn more](https://wholayer.com/help/klaviyo-schema) Available onShopper ID and Klaviyo sync: Growth and aboveSandbox stores for testing: every plan ## Works with your stack - Klaviyo Native - Shopify Install via theme tag - Signed webhooks Native - Meta Custom Audiences (coming soon) - Google Customer Match (coming soon) - Attentive (coming soon) Logos are trademarks of their owners and indicate compatibility, not endorsement. Pricing 2 credits per new shopper sent to Klaviyo. Shoppers already on your list cost half (1 credit). Holdout shoppers and Returning Shopper events are free. [See plans](https://wholayer.com/pricing) [Fair billing](https://wholayer.com/fair-billing) [Estimate your cost](https://wholayer.com/calculator) ## Questions Is it legal to email these shoppers? In the US, CAN-SPAM allows commercial email without prior opt-in as long as you identify yourself, include a working unsubscribe, and honor opt-outs. Every Shopper ID email also passes our suppression checks. Outside the US, Shopper ID is off. Will this hurt my deliverability? Every address carries a risk grade, and opted-out people are never returned. The Deliverability Guard lowers your daily cap when your Klaviyo complaint or bounce rate runs high, and bounces and complaints are refunded within the refund limit. We recommend using Shopper ID contacts in triggered flows, not mass campaigns, and starting with your highest-intent pages. How is this different from a pop-up? Pop-ups capture the few shoppers who opt in. Shopper ID reaches the much larger group who browse and leave without giving you anything. How do I know it's working? Leave the built-in holdout on (10% of new shoppers by default). We count Placed Order events in your Klaviyo for both groups within 30 days of each shopper's first match and show the difference with a 95% range on the Sites page. The report waits until each group has at least 50 shoppers, and it's an estimate, not a guarantee. Which plans include this? Shopper ID and Klaviyo sync: Growth and above. Sandbox stores for testing: every plan. See every plan on the pricing page. ### Comparing tools? - [WhoLayer vs Customers.ai](https://wholayer.com/compare/customers-ai) - [WhoLayer vs Opensend](https://wholayer.com/compare/opensend) - [WhoLayer vs Wunderkind](https://wholayer.com/compare/wunderkind) - [All comparisons](https://wholayer.com/compare) ## Same wallet, three more products [Visitor ID →For B2B sales, marketing, and RevOps](https://wholayer.com/products/visitor-id) [Data API and MCP →For developers, Clay users, and AI agents](https://wholayer.com/products/data-api) [Identity Cloud →For retailers, publishers, ad tech, data companies, and platforms](https://wholayer.com/products/identity-cloud) Ready when you are ## See who's on your site this week Install one tag. Your first 100 identified people are free, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Data API and MCP # Contact data your agent can actually use. Verified work and personal emails, carrier-checked mobiles, people and company search, and reverse email lookup, through a REST API and an MCP server that work with Clay, n8n, Zapier, and any AI agent. No seats, no UI required. [Start free](https://wholayer.com/signup?product=data-api) [Try the API](https://wholayer.com/products/data-api#playground) Free plan: 100 credits a month · charged only when we return a result · per-key spend caps claude code · mcp ``` > get a verified email for Dana Okafor at fieldline.io wholayer.enrich_person({ name: "Dana Okafor", company_domain: "fieldline.io" }) ✓ Dana Okafor, VP Revenue dana@fieldline.io risk A verified 2026-10-28 credits used: 1 · daily cap remaining: 499 ``` Live sandbox, no key needed Every result is fictional, nothing is stored, and it costs nothing. POST /v1/people/enrichsandbox ``` curl https://api.wholayer.com/v1/people/enrich \ -H "Authorization: Bearer wl_test_..." \ -H "Content-Type: application/json" \ -d '{"name":"Avery Sample","company_domain":"samplefieldworks.example.com","reveal":["work_email","mobile"]}' ``` response ``` // Press Run request. Results are fictional sandbox data on example.com, and nothing is stored or charged. ``` ## What Data API and MCP does for you For developers, Clay users, and AI agents ### Pay per result, not per seat Agents run thousands of lookups. You pay a credit when we return data and nothing when we don't. ### Safe for autonomous spending Per-key daily caps, per-call ceilings, and read-only keys keep an agent from spending more than you planned. ### Fewer bounces Every email runs through a validation waterfall and comes back with a risk grade from A to D. ## How it works 1. Step 01 ### Create a key Sign up and copy an API key. Free accounts get 100 credits a month. 2. Step 02 ### Connect your tool Add the MCP server to Claude, Cursor, or any MCP client, or call the REST API from your code, Clay, or n8n. 3. Step 03 ### Set a spend cap Pick a daily credit limit for each key. When an agent hits it, calls stop until the next day. ## Features Email finder and verifier Work and personal emails, each with a risk grade and the date it was last verified. Mobile numbers Carrier and line-type checked, so you know it's a real mobile before you dial. People and company search Company profiles by domain are live. People search by title, seniority, department, country, company size, industry, and company domain works with test keys today; live results are coming soon (1 credit per 10 results). Reverse email lookup Turn an email into a person and company profile. Bulk requests and async jobs Send up to 1,000 rows per call to /bulk, or start an async job of up to 100,000 rows with /jobs (or the create\_job MCP tool) and get a signed webhook when it's done. For larger files, Identity Cloud delivers by flat file or warehouse share. [Learn more](https://wholayer.com/help/async-bulk-jobs) Free cost quotes and refunds Ask what a call could cost with POST /v1/estimate or the estimate\_cost tool, free. Every response says what it charged. Report a wrong result with POST /v1/report or report\_bad\_data and credits from the last 30 days come back, up to 10% of your spend in that window. [Learn more](https://wholayer.com/help/report-bad-data) Compliance endpoints for agents GET /v1/policy and the get\_compliance\_policy tool return the rules we enforce as JSON: US-only person data, consent elsewhere, Global Privacy Control, blocked sensitive pages, and retention. Add people to your own suppression list with POST /v1/suppression or add\_to\_suppression. [Learn more](https://wholayer.com/help/compliance-policy-api) Spend caps per key Every key gets its own daily credit cap, and no call spends more than 250 credits unless you raise its ceiling. Read-only keys can't reveal contact details. [Learn more](https://wholayer.com/help/agent-spend-caps) Idempotent calls Retrying the same request within 30 days returns the saved result at no extra charge. Available onEvery plan, including FreeMobile numbers on live keys: Growth and aboveTest keys with sandbox data: every plan ## Every MCP tool, and what it costs The same tools and prices your agent sees. Free tools never touch your credits. | Tool | What it does | Cost | | --- | --- | --- | | enrich\_person | Enrich a person | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. | | search\_people | Search people | 1 credit per 10 results returned, rounded up; nothing if none. | | verify\_emails | Verify emails | 0.25 credits per address. | | lookup\_phone | Look up a mobile | 5 credits when a mobile is returned; nothing if not found. | | get\_company | Get a company profile | 1 credit when a profile is returned; nothing if not found. | | list\_visitors | List identified visitors | Free. | | get\_balance | Get credit balance | Free. | | estimate\_cost | Estimate the cost of a call | Free. | | get\_compliance\_policy | Get the compliance policy | Free. | | report\_bad\_data | Report a bad result | Free. | | create\_job | Start an async bulk job | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. Verify rows: 0.25 per address. | | get\_job | Get an async job | Free. | | add\_to\_suppression | Add people to your suppression list | Free. | claude code · add the server ``` claude mcp add --transport http wholayer https://mcp.wholayer.com/mcp \ --header "Authorization: Bearer wl_live_YOUR_KEY" ``` Setup for Cursor, VS Code, and Claude Desktop is in the [MCP docs](https://wholayer.com/docs/mcp). The [API reference](https://wholayer.com/docs/api) and [OpenAPI spec](https://wholayer.com/openapi.json) cover the REST endpoints, and [For AI agents](https://wholayer.com/for-agents) lists everything an agent can read. ## Works with your stack - Claude MCP server - Cursor MCP server - Zapier Via HTTP API - n8n Via HTTP request - VS Code - Any MCP client - Clay (HTTP API) - Make (HTTP) Logos are trademarks of their owners and indicate compatibility, not endorsement. Pricing 1 credit per work email, 2 per personal email, 5 per mobile, 10 per reverse email lookup, 0.25 per verification, 1 per company profile. Nothing when there's no result. [See plans](https://wholayer.com/pricing) [Fair billing](https://wholayer.com/fair-billing) [Estimate your cost](https://wholayer.com/calculator) ## Questions Is it really unlimited? No, and we think you should be wary of anyone who says so. Every plan includes a set number of credits, with overage at a published rate, so you always know what a job will cost. Where does the data come from? Licensed data partners, consent-aware publisher networks, and our own verification. We do not scrape LinkedIn. What about phone calls and texts? You're responsible for TCPA compliance when you call or text a mobile number, including checking the Do Not Call registry. Our numbers come with line-type data to help. Which plans include this? Every plan, including Free. Mobile numbers on live keys: Growth and above. Test keys with sandbox data: every plan. See every plan on the pricing page. ### Comparing tools? - [WhoLayer vs Apollo](https://wholayer.com/compare/apollo) - [WhoLayer vs Clay](https://wholayer.com/compare/clay) - [WhoLayer vs Hunter](https://wholayer.com/compare/hunter) - [WhoLayer vs Lusha](https://wholayer.com/compare/lusha) - [WhoLayer vs ZoomInfo](https://wholayer.com/compare/zoominfo) - [WhoLayer vs Explorium](https://wholayer.com/compare/explorium) - [Switching from Explorium](https://wholayer.com/switch/explorium) - [All comparisons](https://wholayer.com/compare) ## Same wallet, three more products [Visitor ID →For B2B sales, marketing, and RevOps](https://wholayer.com/products/visitor-id) [Shopper ID →For DTC and ecommerce brands](https://wholayer.com/products/shopper-id) [Identity Cloud →For retailers, publishers, ad tech, data companies, and platforms](https://wholayer.com/products/identity-cloud) Ready when you are ## See who's on your site this week Install one tag. Your first 100 identified people are free, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Identity Cloud · Early access # Person-level identity for your whole stack. Early access. Resolve anonymous traffic to people, add hashed emails, mobile ad IDs, and IPs, and layer on demographic, professional, and firmographic attributes. Each contract is scoped with a free match test, and delivery is set up by our team. [Request a match test](https://wholayer.com/contact?topic=sales) [How it works](https://wholayer.com/help/identity-cloud-overview) Early access · free match test before you sign · delivery set up by our team example query · warehouse share (illustrative) ``` SELECT hem_sha256, maid, age_range, hh_income, job_function, seniority, intent_topics FROM wholayer.identity.resolved_visitors WHERE site_id = 'acme-retail' AND resolved_at > dateadd(day, -1, current_date); -- 48,212 rows ``` ## What Identity Cloud does for you For retailers, publishers, ad tech, data companies, and platforms ### Fill in your CDP Turn anonymous profiles into known ones so personalization, suppression, and attribution work on people, not sessions. ### Monetize your audience Publishers can enrich bidstream and audience segments with person-level signals to raise CPMs. ### Embed identity in your product Platforms can offer visitor ID and enrichment to their own customers under their own brand. ## How it works 1. Step 01 ### Scope your use case Tell us what you need to resolve and how you'll use it. We confirm it fits our Acceptable Use Policy. 2. Step 02 ### Run a free match test Send a sample file or tag a test property. We return match rates and accuracy against your known records before you sign. 3. Step 03 ### Go live Agree the delivery method in your contract: real-time API, scheduled flat files, a warehouse share, or managed audiences. Our team sets it up with you. ## Features Identify Resolve anonymous traffic to a person using consent-aware signals. Enrich identifiers Add or refresh hashed emails (HEMs), mobile ad IDs (MAIDs), IPs, and postal data, as scoped in your contract. Expand attributes Demographic, professional, and firmographic attributes. The exact fields depend on your use case and are confirmed in the match test. Delivery set up at contract Files or a warehouse share (for example Snowflake, BigQuery, S3, or GCS), configured by our data team for your contract during early access. It isn't a self-serve feature. Into your CDP Load deliveries into the CDP or activation tools you already use, through your warehouse or file pipeline. Contracts that hold up DPA, security review, data provenance warranties, and suppression sync. SOC 2 is in progress; we share current status on request. Available onPlatform contract, early access ## Works with your stack During early access, delivery is agreed in your contract: an API, scheduled files, or a warehouse share, set up by our data team. Pricing Volume pricing from $0.02 a credit with an annual commitment of 250,000+ credits a month. Free match test before you sign. [See plans](https://wholayer.com/pricing) [Fair billing](https://wholayer.com/fair-billing) ## Questions How big is the graph? We'll share coverage for your specific audience in the match test. That number tells you more than a headline total. Can we use it for credit, employment, insurance, or housing decisions? No. WhoLayer is not a consumer reporting agency, and our data can't be used for any purpose covered by the Fair Credit Reporting Act. How do you handle opt-outs? We sync suppression to your delivery, process California's deletion platform every 45 days, and contractually require you to honor opt-outs downstream. Which plans include this? Platform contract, early access. See every plan on the pricing page. ## Same wallet, three more products [Visitor ID →For B2B sales, marketing, and RevOps](https://wholayer.com/products/visitor-id) [Shopper ID →For DTC and ecommerce brands](https://wholayer.com/products/shopper-id) [Data API and MCP →For developers, Clay users, and AI agents](https://wholayer.com/products/data-api) Ready when you are ## See who's on your site this week Install one tag. Your first 100 identified people are free, no card needed. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Pricing # Pay for people, not seats. One wallet for Visitor ID, Shopper ID, the Data API and MCP, and Identity Cloud. Company-level visitor ID is free and unlimited, and you're never charged when we don't find someone. - Free plan, 100 credits a month, no card - Monthly plans, cancel any time - Hard spend limits - No per-seat fees - Never charged for a miss ## Free $0/ month 100 credits / mo · 1 site No card needed See it work on your own traffic. [Start free](https://wholayer.com/signup) - Unlimited company-level visitor ID - 100 credits every month - Slack and Microsoft Teams alerts, and signed webhooks - Data API and MCP access - Page exclusions to keep the tag off any page - AI ICP scoring with plain-English reasons ## Starter $49/ month 1,000 credits / mo · 1 site ≈ $0.049 per credit For founders and small sales teams. [Choose Starter](https://wholayer.com/signup?plan=starter) - Everything in Free - 1,000 credits a month - HubSpot, Pipedrive, and Attio sync - Hot-lead filters by title, company size, and page ## Growth Popular $199/ month 5,000 credits / mo · 3 sites ≈ $0.040 per credit For teams running outbound and ecommerce flows. [Choose Growth](https://wholayer.com/signup?plan=growth) - Everything in Starter - 5,000 credits a month - Shopper ID with Klaviyo sync - Webhooks for Clay, Zapier, Make, and n8n - Mobile numbers with carrier check ## Scale $799/ month 20,000 credits / mo · 10 sites ≈ $0.040 per credit For agencies, AI agents, and high-traffic stores. [Choose Scale](https://wholayer.com/signup?plan=scale) - Everything in Growth - 20,000 credits a month - Team members in one shared workspace - Agency client workspaces with per-client budgets - Salesforce sync (coming soon) - 100 API requests a second for agents - Priority support with a named contact ## Platform Custom Volume credits · Unlimited Embed WhoLayer identity in your own product. [Talk to sales](https://wholayer.com/contact?topic=sales) - Volume pricing from $0.02 a credit with an annual commitment of 250,000+ credits a month - Bulk file and warehouse delivery, set up by our team - Custom DPA and security review - 99.9% uptime SLA Secure checkout by Stripe Visa Mastercard American Express Prices in USD. Paying yearly saves about 16% compared with monthly. Taxes may apply. Overage is billed monthly at your plan's rate, and you can set a hard limit. ## Never charged for Every item here is how billing works in the code today. - ### Misses A visit or lookup we can't match costs nothing. Credits are charged only when we return a result. - ### Company-level ID Knowing which companies visit is free and unlimited on every plan. - ### Repeat visits in a month A person costs 1 credit the first time we identify them in a calendar month. Their return visits that month are free. - ### Bots and crawlers Crawlers, uptime monitors, and headless browsers are dropped before anything is stored or matched. - ### Opted-out and withheld people People who opted out, asked to be deleted, are on your suppression list, browse with Global Privacy Control, or were on a sensitive page are never returned or charged. - ### Retries Repeat an API request with the same Idempotency-Key within 30 days and you get the saved result free. Identical MCP calls are free too. - ### Holdout and returning shoppers Shopper ID's holdout group (10% of new shoppers by default) is never charged, and return visits we recognize by our own cookie are free. - ### Bad results, within the cap Report a wrong person, a bounced email, or out-of-date details and we refund the credits charged in the last 30 days, up to 10% of what you spent in that window. Above that, our team reviews it. - ### Cost quotes Asking what a call would cost is free, and no single call spends more than 250 credits unless you raise its ceiling. [Read every billing rule on Fair billing →](https://wholayer.com/fair-billing) ## Estimate your cost Move the numbers to match your traffic. We show a range because match rates vary, and the estimate assumes every lookup finds a result, so you'll pay the same or less. Prefer a full page? Open the [cost calculator](https://wholayer.com/calculator), or answer five questions in the [product quiz](https://wholayer.com/quiz). ## Compare plans Generated from the same plan rules the product enforces. | Feature | Free | Starter | Growth | Scale | Platform | | --- | --- | --- | --- | --- | --- | | Price and credits | | Monthly price | $0 | $49 | $199 | $799 | Custom | | Per month, billed yearly | $0 | $41 | $166 | $666 | Contract | | Credits each month | 100 | 1,000 | 5,000 | 20,000 | Volume | | Cost per identified personIncluded credits, 1 credit per person | Free | $0.049 | $0.040 | $0.040 | from $0.020 | | Overage per extra credit | None: pauses at zero | $0.060 | $0.050 | $0.045 | Contract | | Unused credits roll over a month | — | ✓ | ✓ | ✓ | Contract | | Hard monthly overage limit | Never billed | ✓ | ✓ | ✓ | Contract | | Identification | | Company-level visitor ID, unlimited | ✓ | ✓ | ✓ | ✓ | ✓ | | Person-level visitor ID (US traffic) | ✓ | ✓ | ✓ | ✓ | ✓ | | AI ICP scoring with reasons | ✓ | ✓ | ✓ | ✓ | ✓ | | High-intent alerts and digest email | ✓ | ✓ | ✓ | ✓ | ✓ | | Page exclusions | ✓ | ✓ | ✓ | ✓ | ✓ | | Hot-lead filters (title, size, page) | — | ✓ | ✓ | ✓ | ✓ | | Shopper ID for online stores | — | — | ✓ | ✓ | ✓ | | Destinations | | Slack, Microsoft Teams, signed webhooks | ✓ | ✓ | ✓ | ✓ | ✓ | | HubSpot sync | — | ✓ | ✓ | ✓ | ✓ | | Pipedrive and Attio sync | — | ✓ | ✓ | ✓ | ✓ | | Klaviyo sync | — | — | ✓ | ✓ | ✓ | | Salesforce sync | — | — | — | Coming soon | Coming soon | | Data API and MCP | | REST API and MCP server | ✓ | ✓ | ✓ | ✓ | ✓ | | Requests per second, per key | 2 | 10 | 25 | 100 | 1,000 | | Daily credit cap per key | ✓ | ✓ | ✓ | ✓ | ✓ | | Async bulk jobs | ✓ | ✓ | ✓ | ✓ | ✓ | | Mobile numbers | — | — | ✓ | ✓ | ✓ | | Workspace and support | | Sites | 1 site | 1 site | 3 sites | 10 sites | Unlimited | | Team members, no per-seat fee | — | — | — | ✓ | ✓ | | Agency client workspaces with budgets | — | — | — | ✓ | ✓ | | Priority support with a named contact | — | — | — | ✓ | ✓ | | Custom DPA, security review, uptime SLA | — | — | — | — | ✓ | Salesforce sync shows as coming soon until our Salesforce app is switched on; until then, use a signed webhook with Zapier, Make, or n8n. Downgrading never deletes anything: existing sites and destinations keep working. ## What a credit buys Same rate on every plan. Charged only when we return a result. | Action | Credits | Good to know | | --- | --- | --- | | Company identified (who's visiting, at the account level) | Free | Unlimited on every plan | | Person identified on your site (name, title, LinkedIn, work email) | 1 | Only charged when we return a person. Repeat visits by the same person in a month are free. | | Shopper identified for ecommerce (new to your list: verified personal email, sent to Klaviyo) | 2 | With Klaviyo connected, charged once per new shopper and refunded (within the refund limit) if they bounce or mark you as spam within 30 days; without Klaviyo, once per shopper per month. Opted-out people are never returned. | | Shopper recognized who is already in your Klaviyo (no duplicate created; triggers a Returning Shopper event) | 1 | Half the price of a new shopper. Return visits we recognize by our own cookie or your site's hashed email are free, and so are holdout shoppers. | | Work email found and verified | 1 | No charge if we don't find one. | | Personal email found and verified | 2 | No charge if we don't find one. | | Reverse email lookup (send an email, get the person: name, title, company, LinkedIn) | 10 | Only when you send an email alone and we find the person. No charge if we don't. | | Mobile number with carrier and line-type check | 5 | No charge if we don't find one. | | Email verification only | 0.25 | 4 verifications per credit. | | People search results (name, title, company; no contact details) | 1 per 10 | Charged per 10 results returned, rounded up. Contact details are charged separately when you enrich a result. | | Company profile (size, revenue, industry) | 1 | No charge if we don't have one. | Starter overage $0.060 per extra credit Growth overage $0.050 per extra credit Scale overage $0.045 per extra credit Paid plans keep working past their credits unless you set a limit, so you're never cut off mid-month by surprise. ## See it before you pay [Check your site →Paste your URL and get a plan, install steps, and a cost range for your site.](https://wholayer.com/for) [Try the API →Send a real request to our sandbox. Fictional results, no key, no cost.](https://wholayer.com/products/data-api#playground) [Compare tools →Side-by-side with other tools, every fact dated and linked to its source.](https://wholayer.com/compare) [Switching from another tool →Step-by-step guides for tools that shut down or changed.](https://wholayer.com/switch) Security and data handling: [Trust](https://wholayer.com/trust) · [DPA](https://wholayer.com/legal/dpa) · [Subprocessors](https://wholayer.com/legal/subprocessors) · [Status](https://wholayer.com/status) ## Pricing questions ### Billing What happens when I run out of credits? Paid plans keep working and bill overage at your plan's rate at the end of the month. You can set a hard monthly cap on the Usage page so you never pay more than you planned. On the Free plan, person-level results pause until the next month while company-level ID keeps working. Do you charge per seat? No. Plans are priced by credits, not seats. Team members are included on Scale and above, with no charge per person. Can I cap what an API key or AI agent spends? Yes. Give each API key its own daily credit cap, and every call has a default ceiling on what it can spend unless you raise it for that call. On paid plans you can also set a hard monthly overage limit, or set it to zero to pause when your credits run out. Asking what a call would cost is free. Can I have more than one workspace? Yes. Each workspace has its own sites, keys, plan, and billing. Free credits go to one workspace per person (the first you create); extra workspaces start at zero on Free. On Scale, agencies can also create client workspaces that spend from the agency's credits, each with its own monthly budget. Can I cancel any time? Yes. Monthly plans stop at the end of the billing period. Annual plans can be cancelled for a prorated refund in the first 30 days. What's your refund policy? There are two kinds. Bad results: if we return the wrong person, an email that bounces, or out-of-date details, report it and we refund the credits if they were charged in the last 30 days. Automatic refunds in any rolling 30 days are limited to 10% of the credits you spent in that window; reports above that wait for our team to review them. Plan fees: monthly plans run to the end of the period you paid for, and annual plans cancelled in the first 30 days get a prorated refund. How is this different from an annual contract? You can start on a monthly plan without talking to sales, see every price on this page, and cancel from the dashboard. Yearly billing is optional and saves about 16% compared with monthly. Only Platform, for very high volume, needs a contract. ### Credits What counts as an identified person? A visitor we match to a specific person and return to you, with the details we have, like name, title, company, LinkedIn, and work email. It costs 1 credit, once per person per calendar month, however often they come back. A match to a company only is free. Will every visitor be identified? No. Person-level ID works on US traffic only, and only for a share of it. How much depends on your audience, devices, and traffic sources. The calculator shows a cautious-to-strong range, and the free plan shows your real rate on your own traffic. You're never charged for the visitors we don't identify. Do unused credits roll over? Yes, for one month on paid plans. Credits expire at the end of the month after the one they were issued in. Is it really one wallet for every product? Yes. Visitor ID, Shopper ID, and the Data API and MCP all draw from the same credits. No separate subscriptions. ### Data and privacy Why is person-level ID US-only? Privacy law in the EU, UK, and Canada requires opt-in consent before identifying an individual visitor. Company-level ID works worldwide, and we turn it on outside the US only after your consent banner has recorded consent. Am I charged for people who opted out? No. People who opted out, asked to be deleted, are on your own suppression list, or were browsing a sensitive page are never returned, delivered, or charged. Browsers that send a Global Privacy Control signal are not identified. How accurate is it? We will publish measured match and accuracy rates on the Trust page every quarter, tested against a holdout set of known visitors. The first report comes after our first 90 days live. Until then, the free plan lets you measure it on your own traffic. Need very high volume, bulk files, or warehouse delivery? [See Identity Cloud](https://wholayer.com/products/identity-cloud) or [talk to a person](https://wholayer.com/contact?topic=sales). Ready when you are ## Start with 100 free credits No card needed. Upgrade when you see who's on your site. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- Fair billing # Pay for what you get. Nothing else. Every rule on this page is how our billing works today, in plain English. ## You pay for results, not attempts ### Only when we return something Credits are charged when we return a person, an email, a mobile, or a company profile. A lookup that finds nothing costs nothing. ### Company-level ID is free Knowing which companies visit your site never uses credits, on any plan, with no monthly limit. ### Repeat visits in a month are free A person costs 1 credit the first time we identify them in a calendar month. Every return visit that month is free, including from a new device when we can tell it's the same person. Shopper ID with Klaviyo connected: a new shopper costs 2 credits once, a shopper already in your Klaviyo costs 1 credit, and return visits we recognize by our own cookie are free; a match of the same shopper on a new device costs 1 credit. Without Klaviyo, a shopper costs 2 credits the first time we identify them in a calendar month. ### Bots are filtered out Crawlers, uptime monitors, and headless browsers are dropped before anything is stored or matched, so they never cost you a credit. ### Withheld people are never charged People who opted out, asked to be deleted (including through California's DROP), are on your own suppression list, or were browsing a sensitive page are never returned and never charged. ## Limits you control ### Daily caps per API key Give every key, and every AI agent, its own maximum credits per day. When it's reached, calls stop until the next UTC day. ### A ceiling on every call One API or MCP call can't spend more than 250 credits unless you raise it for that call (up to 10,000). ### A monthly overage limit On paid plans, set a hard limit on overage from the Usage page, or set it to zero to pause when your credits run out. The Free plan never bills overage; it pauses at zero. ### Free quotes before you spend Ask what a call could cost with `POST /v1/estimate` or the `estimate_cost` MCP tool. It's free, and every API response tells you what it charged in the `X-Credits-Used` header. ### Retries never charge twice Send an Idempotency-Key and repeating the same request within 30 days returns the saved result for free. Identical MCP tool calls are free for 30 days too. ## When something goes wrong ### Refunds for bad results If we gave you the wrong person, an email that bounced, or out-of-date details, report it from the person's page in the dashboard, with `POST /v1/report`, or with the `report_bad_data` MCP tool. We refund the credits charged for that result if it was charged in the last 30 days, once per result, and we don't deliver it again. ### The refund limit, stated plainly Automatic refunds in any rolling 30 days are limited to 10% of the credits your workspace spent in those 30 days. Reports above that limit wait for our team to review them, and nothing is refunded until then. ## Your plan, your call ### Cancel monthly plans any time Cancel from Billing in the dashboard, which opens the Stripe billing portal. Your plan runs to the end of the period you paid for, then moves to Free. Nothing is deleted. ### Unused credits roll over a month On paid plans, credits you don't use roll over for one month. They expire at the end of the month after the one they were issued in. See what each action costs on [Pricing](https://wholayer.com/pricing), and how refunds work step by step in the [help center](https://wholayer.com/help/report-bad-data). Questions about a charge? [Contact us](https://wholayer.com/contact). Ready when you are ## Try it on your own traffic Start free with 100 credits a month. Company-level ID is free on every plan. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- # Docs Everything you need to install the tag, understand what you're charged for, and send identified people where they're useful. ## REST API Enrich people, verify emails, look up mobiles, and pull identified visitors. [https://wholayer.com/docs/api](https://wholayer.com/docs/api) ## MCP server Give Claude, Cursor, or your own agent WhoLayer tools with spend caps. [https://wholayer.com/docs/mcp](https://wholayer.com/docs/mcp) ## Integrations Send people to Slack, HubSpot, Klaviyo, and signed webhooks. [https://wholayer.com/docs/integrations](https://wholayer.com/docs/integrations) ## Quickstart 1. [Create an account](https://wholayer.com/signup). You get 100 free credits every month and unlimited company-level ID. 2. Copy your site ID from **Sites** and paste this tag into the `` of every page: ``` ``` 3. Connect a destination, such as Slack or HubSpot, under **Integrations**. 4. Visit your own site from a new browser. Company matches usually appear within a minute; person matches within five. Using a consent banner? Load the tag only after the visitor accepts analytics or marketing cookies, or call `wholayer("consent", true)` once consent is given. Outside the US we never attempt person-level matches. ### Shopify In Shopify admin, open Online Store, Themes, Edit code, and paste the snippet into `theme.liquid` just before ``. A one-click Shopify app is coming soon. ### Google Tag Manager Add a Custom HTML tag containing the snippet above, triggered on All Pages, and gate it on your consent variable if you use one. ### Step-by-step guides by platform - [Google Tag Manager](https://wholayer.com/help/install-gtm) - [Shopify](https://wholayer.com/help/install-shopify) - [WordPress](https://wholayer.com/help/install-wordpress) - [Webflow](https://wholayer.com/help/install-webflow) - [Framer](https://wholayer.com/help/install-framer) - [Next.js](https://wholayer.com/help/install-nextjs) Logos are trademarks of their owners and indicate compatibility, not endorsement. ## Concepts ### Credits Every product draws from one monthly wallet. You're charged only when we return something, never for a lookup that comes back empty. | Action | Credits | | --- | --- | | Company identified (who's visiting, at the account level)
Unlimited on every plan | Free | | Person identified on your site (name, title, LinkedIn, work email)
Only charged when we return a person. Repeat visits by the same person in a month are free. | 1 | | Shopper identified for ecommerce (new to your list: verified personal email, sent to Klaviyo)
With Klaviyo connected, charged once per new shopper and refunded (within the refund limit) if they bounce or mark you as spam within 30 days; without Klaviyo, once per shopper per month. Opted-out people are never returned. | 2 | | Shopper recognized who is already in your Klaviyo (no duplicate created; triggers a Returning Shopper event)
Half the price of a new shopper. Return visits we recognize by our own cookie or your site's hashed email are free, and so are holdout shoppers. | 1 | | Work email found and verified
No charge if we don't find one. | 1 | | Personal email found and verified
No charge if we don't find one. | 2 | | Reverse email lookup (send an email, get the person: name, title, company, LinkedIn)
Only when you send an email alone and we find the person. No charge if we don't. | 10 | | Mobile number with carrier and line-type check
No charge if we don't find one. | 5 | | Email verification only
4 verifications per credit. | 0.25 | | People search results (name, title, company; no contact details)
Charged per 10 results returned, rounded up. Contact details are charged separately when you enrich a result. | 1 per 10 | | Company profile (size, revenue, industry)
No charge if we don't have one. | 1 | Got a wrong match, a bounce, or out-of-date details? Report it and we refund the credits for that result. See [Fair billing](https://wholayer.com/fair-billing) for every rule, including the refund limit. ### Resolution When a visitor loads a page, the tag sends a first-party event with the page URL, referrer, a first-party cookie ID, and the browser's IP and user agent. We match that event at two levels: - **Company level**: the visitor's network is matched to an organization. Works worldwide and is free. - **Person level**: the visitor is matched to an individual in our permissioned US identity graph. One credit per person per month, however many times they come back. We don't add your visitors' browsing behavior to a shared graph that other customers can query. Your traffic is used to resolve identities for you. ### Suppression Before any person is returned or delivered, by the tag, your dashboard, a destination, the API, or the MCP server, we check our global suppression list. It holds everyone who has opted out or asked for deletion through our [privacy request page](https://wholayer.com/privacy-request) or by email, and everyone on California's DROP deletion lists. Suppressed people are never returned and you are never charged for them. The API and MCP server answer `451 person_not_available` with a `reason` (`opted_out`, `drop_deleted`, or `customer_suppressed`). See [suppressed people](https://wholayer.com/docs/api#suppression). You can also keep your own list (existing customers, employees, do-not-contact) under **Settings, Suppression list**: paste or upload emails or SHA-256 hashes, up to 100,000 at a time, or add them with `POST /v1/suppression`. It applies to your workspace only: listed people are matched at company level only and are never shown, delivered, returned, or charged. We store hashes, never the addresses. [`GET /v1/policy`](https://wholayer.com/docs/api#policy) returns the rules we enforce (US-only person-level matching, consent, Global Privacy Control, blocked sensitive pages, suppression sources, retention) as JSON. ### Webhooks Add a webhook destination under **Destinations** in your dashboard to receive `visitor.identified`, `shopper.identified`, and `visitor.high_intent` (an identified visitor opened one of your key pages, like pricing) events in real time, and a `suppression.added` event (hashed identifiers only) if someone we sent you later opts out or is deleted. Each request is signed with an HMAC-SHA256 signature in the `WhoLayer-Signature` header. Failed deliveries are retried with exponential backoff (5 minutes, then doubling), checked by an hourly job, for up to 24 hours. See the [payload reference](https://wholayer.com/docs/api#webhooks). ## For AI agents Everything on this site is readable by agents without scraping: - **Markdown for every public page**: add `.md` to any URL ([/pricing.md](https://wholayer.com/pricing.md), home is [/index.md](https://wholayer.com/index.md)), or request the page with `Accept: text/markdown`. - **llms.txt**: an index of every page at [/llms.txt](https://wholayer.com/llms.txt), and the full text of products, pricing, docs, help, and legal pages at [/llms-full.txt](https://wholayer.com/llms-full.txt). - **OpenAPI 3.1**: the REST API spec at [/openapi.json](https://wholayer.com/openapi.json). - **Docs MCP server**: search and read these docs from any MCP client at `https://mcp.wholayer.com/docs`, no API key. See [MCP server](https://wholayer.com/docs/mcp#docs-server). ## Need help? [Send us a message](https://wholayer.com/contact?topic=support), or ask the assistant in the corner of any page. We read every message and reply as soon as we can. --- # REST API reference JSON over HTTPS. Every endpoint is also available as a tool on the MCP server. ## Basics Base URL: `https://api.wholayer.com/v1` Machine-readable spec: [OpenAPI 3.1 at wholayer.com/openapi.json](https://wholayer.com/openapi.json) (also served at `https://api.wholayer.com/v1/openapi.json`). It is generated from the same schemas and credit costs the API uses, so you can import it into Postman, generate a client, or hand it to an agent. Authenticate with a secret key from **Settings, API keys**, sent as a Bearer token. Keys are scoped to one workspace. Never put them in browser code. ``` curl https://api.wholayer.com/v1/people/enrich \ -H "Authorization: Bearer wl_live_..." \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 4f1d9c2e-order-123" \ -d '{"linkedin_url":"https://www.linkedin.com/in/dana-okafor","reveal":["work_email"]}' ``` Send an `Idempotency-Key` header on POST requests. Retrying with the same key returns the original result and never charges twice. Every response includes `credits_used`, an `X-Credits-Used` header (0 when the call was free, failed, or was a replay), and an `X-Credits-Remaining` header. To see what a call could cost before you make it, use [`POST /estimate`](https://wholayer.com/docs/api#estimate) (free). One call can spend at most 250 credits. To allow more, send `X-Max-Credits: 1000` (up to 10,000). Test keys (`wl_test_...`) return sandbox data on every endpoint, never spend credits, and add `"test_mode": true` to responses. ## Endpoints ### `POST` /people/enrich Find a person's work email, personal email, mobile, and profile from any identifier you have. Cost: 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. Mobile is available on Growth and above. When you send only an email, the reverse lookup returns the person's profile (at least their LinkedIn URL) even if nothing you asked to reveal is found. **Request** ``` { "linkedin_url": "https://www.linkedin.com/in/dana-okafor", "email": null, "name": "Dana Okafor", "company_domain": "fieldline.com", "reveal": ["work_email", "personal_email", "mobile"] } ``` **Response** ``` { "id": "per_8f2c1a", "name": "Dana Okafor", "title": "VP Revenue", "seniority": "vp", "department": "sales", "linkedin_url": "https://www.linkedin.com/in/dana-okafor", "company": { "name": "Fieldline", "domain": "fieldline.com", "employees": 210 }, "work_email": { "address": "dana@fieldline.com", "risk": "A", "verified_at": "2026-11-01T18:22:04Z" }, "personal_email": { "address": "dana.okafor@gmail.com", "risk": "B", "verified_at": "2026-10-28T09:10:51Z" }, "mobile": { "number": "+15125550134", "line_type": "mobile", "carrier": "T-Mobile", "checked_at": "2026-11-02T14:03:11Z" }, "credits_used": 8 } ``` ### `POST` /people/search Search people by title, seniority, department, company size, industry, and location. Returns profiles without contact details. Cost: 1 credit per 10 results returned, rounded up. Reveal contacts with /people/enrich. Live people search is switched off until we've confirmed its supplier cost: live keys get 503 provider\_unavailable (you're not charged); test keys work now. **Request** ``` { "titles": ["head of revops", "vp revenue"], "company_employees": { "min": 50, "max": 500 }, "industries": ["software"], "countries": ["US"], "limit": 25, "cursor": null } ``` **Response** ``` { "results": [ { "id": "per_8f2c1a", "name": "Dana Okafor", "title": "VP Revenue", "company_domain": "fieldline.com" } ], "next_cursor": "c_01HXZ...", "credits_used": 1 } ``` ### `POST` /emails/verify Check whether up to 1,000 email addresses will deliver, with a risk grade from A (safe) to F (will bounce). Cost: 0.25 credit per address. **Request** ``` { "emails": ["dana@fieldline.com", "old.address@example.com"] } ``` **Response** ``` { "results": [ { "email": "dana@fieldline.com", "status": "deliverable", "risk": "A", "catch_all": false }, { "email": "old.address@example.com", "status": "undeliverable", "risk": "F", "reason": "mailbox_not_found" } ], "credits_used": 0.5 } ``` ### `POST` /phones/lookup Find a mobile number for a person, with a live carrier and line-type check. Cost: 5 credits when a mobile is returned. Nothing if not found. Available on Growth and above. **Request** ``` { "person_id": "per_8f2c1a" } ``` **Response** ``` { "id": "per_8f2c1a", "number": "+15125550134", "line_type": "mobile", "carrier": "T-Mobile", "checked_at": "2026-11-02T14:03:11Z", "credits_used": 5 } ``` ### `GET` /companies/{domain} Company profile: size, revenue range, industry, and location. Cost: 1 credit per company returned. Nothing if we don't have a profile. **Response** ``` { "domain": "fieldline.com", "name": "Fieldline", "employees": 210, "revenue_range": "$10M-$50M", "industry": "Software", "hq": { "city": "Austin", "region": "TX", "country": "US" }, "credits_used": 1 } ``` ### `GET` /balance Credits remaining, plan, monthly spend cap, and this key's daily cap. Cost: Free. **Response** ``` { "credits_remaining": 4210.5, "plan": "growth", "monthly_spend_cap": 500, "key_daily_cap": 1000, "key_mode": "live" } ``` ### `POST` /estimate Quote the most an operation could cost before you run it. operation is enrich, phones, verify, company, search, or bulk. Add reveal (enrich, bulk), email\_only (enrich, bulk: rows carry only an email), rows (bulk, verify, phones, company), or limit (search). We only charge on hits, so the real cost is the same or lower. Never calls a data supplier. Works with read-only and test keys. Cost: Free. **Request** ``` { "operation": "bulk", "rows": 200, "reveal": ["work_email", "mobile"] } ``` **Response** ``` { "operation": "bulk", "max_credits": 1200, "breakdown": [ { "item": "work_email", "credits_each": 1, "quantity": 200, "credits": 200 }, { "item": "mobile", "credits_each": 5, "quantity": 200, "credits": 1000 } ], "within_default_ceiling": false, "note": "Maximum if every lookup is a hit. Misses, suppressed people, and idempotent retries cost nothing. Free to call." } ``` ### `POST` /report Report a bad result: reason is wrong\_person, bounced, or outdated, with an optional note. Send result\_id (the per\_ id from /people/enrich or /phones/lookup) or identity\_id (a visitor's person\_id from /visitors). Credits charged for a reported result are refunded if it was charged in the last 30 days, once per result. Refunds in any rolling 30 days are capped at 10% of the credits the workspace spent in that window; reports above the cap wait for review by our team and nothing is refunded automatically. The result is flagged and never returned or delivered again. Reporting the same result twice returns the first report. Needs a key that isn't read-only. Cost: Free. **Request** ``` { "result_id": "per_8f2c1a0b9d3e4f51", "reason": "bounced", "note": "Hard bounce on 2026-11-03" } ``` **Response** ``` { "report_id": 412, "status": "refunded", "credits_charged": 1, "credits_refunded": 1, "already_reported": false, "message": "Thanks. We refunded 1 credit and won't deliver this result again.", "credits_used": 0 } ``` ### `POST` /bulk Enrich or verify up to 1,000 rows in one synchronous request. Each row is billed like a single call. Stops early if your wallet runs out. Cost: Same as the single endpoints. Raise the 250-credit per-call ceiling with X-Max-Credits. Quote a batch first with /estimate. **Request** ``` { "operation": "enrich", "rows": [ { "name": "Dana Okafor", "company_domain": "fieldline.com", "reveal": ["work_email"] }, { "linkedin_url": "https://www.linkedin.com/in/priya-n", "reveal": ["work_email", "mobile"] } ] } ``` **Response** ``` { "results": [ { "ok": true, "id": "per_8f2c1a", "work_email": { "address": "dana@fieldline.com", "risk": "A" }, "credits_used": 1 }, { "ok": false, "error": { "code": "person_not_available", "message": "No match for this person. You were not charged." } } ], "credits_used": 1 } ``` ### `POST` /jobs Queue up to 100,000 enrich or verify rows and process them in the background, with the same prices, plan gates, and suppression checks as /bulk. Returns 202 with a job id right away. Each row may carry external\_id, returned with its result. Optional webhook\_url gets a signed job.completed or job.failed event. Up to 2 jobs can be queued or running per workspace. Bodies over 4 MB can be gzipped (Content-Encoding: gzip). Cost: Same as the single endpoints, charged as rows are processed (verify: each address once per job). max\_credits (in the body or the X-Max-Credits header; default 250, up to 2,000,000) covers the whole job: it's refused if its worst case is above it, and it never spends more. Quote it first with /estimate. Test keys run sandbox jobs and never spend. **Request** ``` { "operation": "enrich", "max_credits": 20000, "webhook_url": "https://hooks.example.com/wholayer", "rows": [ { "external_id": "crm-1042", "name": "Dana Okafor", "company_domain": "fieldline.com", "reveal": ["work_email"] }, { "external_id": "crm-1043", "linkedin_url": "https://www.linkedin.com/in/priya-n", "reveal": ["work_email"] } ] } ``` **Response** ``` { "id": "job_5c0f3e9a1b2d4c6e8f00a1b2", "object": "job", "operation": "enrich", "status": "queued", "total_rows": 2, "processed_rows": 0, "estimate_credits": 2, "max_credits": 20000, "job_credits_used": 0, "results_url": "/v1/jobs/job_5c0f3e9a1b2d4c6e8f00a1b2/results", "expires_at": "2026-12-04T15:02:11.000Z", "credits_used": 0 } ``` ### `GET` /jobs/{id} A job's status (queued, running, completed, failed), progress, row counts, and credits used. A failed job carries error.code: credits\_exhausted (wallet, spend cap, key daily cap, or client budget), forbidden (the key was revoked), or max\_credits\_reached. Works with read-only keys. Cost: Free. **Response** ``` { "id": "job_5c0f3e9a1b2d4c6e8f00a1b2", "status": "running", "total_rows": 48000, "processed_rows": 12500, "succeeded_rows": 9310, "failed_rows": 3190, "progress": 0.2604, "job_credits_used": 9310, "error": null, "credits_used": 0 } ``` ### `GET` /jobs/{id}/results?limit=100&cursor=… (or ?format=csv) Results in row order, up to 1,000 per page, or every row as a CSV download with ?format=csv. Enrich rows look like /bulk rows; verify rows look like /emails/verify results. Rows not reached yet say pending (not\_processed once a job has stopped). People are re-checked against every suppression list and your bad-data reports each time you read, so someone who opted out after the job ran comes back withheld (status 451 with a reason). Results are deleted 30 days after the job was created. Cost: Free. **Response** ``` { "job": { "id": "job_5c0f3e9a1b2d4c6e8f00a1b2", "status": "completed", ... }, "results": [ { "index": 0, "external_id": "crm-1042", "ok": true, "id": "per_8f2c1a", "work_email": { "address": "dana@fieldline.com", "risk": "A" }, "credits_used": 1 }, { "index": 1, "external_id": "crm-1043", "ok": false, "status": 451, "error": { "code": "person_not_available", "reason": "opted_out", "message": "This person has opted out of WhoLayer. No data is returned and you were not charged." } } ], "next_cursor": null, "credits_used": 0 } ``` ### `GET` /visitors?site\_id=site\_123&since=2026-11-01T00:00:00Z&level=person List people and companies identified on your sites. Paginated with cursor. Cost: Free. Credits were spent when each visitor was identified. **Response** ``` { "results": [ { "id": "vis_77a1", "level": "person", "person_id": "per_8f2c1a", "company_domain": "fieldline.com", "first_seen": "2026-11-02T15:41:09Z", "pages": [{ "url": "/pricing" }, { "url": "/compare" }], "visits_this_month": 3, "icp_score": 86, "icp_reason": "VP Revenue at a 210-person software company; viewed pricing, compared alternatives, 3 visits" } ], "next_cursor": null } ``` ### `GET` /policy The rules WhoLayer enforces, as JSON: person-level identification in the US only, consent outside the US, Global Privacy Control, the sensitive-page categories we never identify people on, suppression sources and reason codes, and retention periods. Works with read-only keys. Cost: Free. **Response** ``` { "version": "2026-11-04", "docs_url": "https://wholayer.com/docs/api#policy", "visitor_identification": { "person_level_countries": ["US"], "person_level_outside_us": "never, even with consent", "global_privacy_control": { "honored": true, "effect": "requests sent with Sec-GPC: 1 are dropped: nothing is stored or matched" }, ... }, "sensitive_pages": { "person_level": "blocked", "company_level": "allowed", "categories": [{ "id": "health", "label": "Health and medical conditions", "keywords": ["health", "medical", ...] }, ...] }, "suppression": { "sources": [ { "source": "privacy_request", "scope": "global", "reason": "opted_out", ... }, { "source": "ca_drop", "scope": "global", "reason": "drop_deleted", ... }, { "source": "customer_list", "scope": "workspace", "reason": "customer_suppressed", ... } ], "reasons": ["opted_out", "drop_deleted", "customer_suppressed"], "webhook_event": "suppression.added", ... }, "retention": { "page_events_months": 13, "delivery_log_months": 13, "revealed_api_people_days": 90, "idempotency_cache_days": 30, "async_job_results_days": 30, ... }, "customer_obligations": { "phone_numbers": "Phone numbers are returned for lookup only. Under the TCPA, don't use them for calls or texts ...", ... } } ``` ### `POST` /suppression Add people to your workspace's suppression list by email or SHA-256 hash of the trimmed, lowercased email. Emails are hashed on arrival; we store hashes only. Up to 10,000 entries per request. Needs a key that isn't read-only. Entries can be removed only from the dashboard. Cost: Free. **Request** ``` { "emails": ["dana@fieldline.com"], "email_sha256": ["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"] } ``` **Response** ``` { "added": 2, "already_listed": 0, "invalid": 0, "total": 1842 } ``` ### `GET` /suppression/count How many people are on your workspace's suppression list. Works with read-only keys. Cost: Free. **Response** ``` { "count": 1842 } ``` ## Suppressed and opted-out people Before returning a person, `/people/enrich`, `/phones/lookup`, and each `/bulk` row check the identifiers you sent and the ones we found against our global suppression lists and your workspace's own list. A withheld person gets `HTTP 451` with the same `person_not_available` code as a miss, plus a `reason`. No contact data is returned and you are never charged. In `/bulk` and `/jobs` results, the row's `error` carries the same `reason`; stored job results are checked again every time you read them. `/people/search` and `/visitors` leave withheld people out of the results. ``` HTTP/1.1 451 Unavailable For Legal Reasons { "error": { "code": "person_not_available", "reason": "opted_out", "message": "This person has opted out of WhoLayer. No data is returned and you were not charged." } } ``` | reason | Meaning | | --- | --- | | `opted_out` | The person opted out of sale or sharing, or asked us to delete or limit their data, through our privacy request page or by email. | | `drop_deleted` | The person asked to be deleted through California's Delete Request and Opt-out Platform (DROP). | | `customer_suppressed` | The person is on your workspace's own suppression list. | Only `404` means "no match". Treat `opted_out` and `drop_deleted` as do-not-contact signals for the person in your own systems too. The MCP server returns the same `error.reason` in its tool errors. ### Your suppression list Add existing customers, employees, or anyone who asked you not to contact them under **Settings, Suppression list** (paste or upload a CSV of emails or SHA-256 hashes, up to 100,000 per upload; emails are hashed in your browser), with [`POST /suppression`](https://wholayer.com/docs/api#suppression-add), or with the `add_to_suppression` MCP tool. We store SHA-256 hashes of trimmed, lowercased emails, never the addresses. Listed people are never identified at person level on your sites (their visits still count at company level), never sent to your destinations, never shown in your dashboard or exports, and never returned or charged by the API or MCP server. The list applies to your workspace only and holds up to 1,000,000 entries. Owners and admins can download the hashes or remove the whole list in Settings. ## Fair billing You pay only for results we return. Misses, withheld people, and idempotent retries are free. If a result is wrong, report it with [`POST /report`](https://wholayer.com/docs/api#report), the `report_bad_data` MCP tool, or the “Report a wrong match” button on a person in the dashboard. Credits charged for a reported result are refunded if it was charged in the last 30 days, once per result. Refunds in any rolling 30 days are capped at 10% of the credits the workspace spent in that window; reports above the cap wait for review by our team and nothing is refunded automatically. See [Fair billing](https://wholayer.com/fair-billing) for every rule. ## Compliance policy [`GET /policy`](https://wholayer.com/docs/api#policy-endpoint) (and the `get_compliance_policy` MCP tool) returns the rules above as JSON, generated from the same code that enforces them, with a `version` you can pin. Use it to show your users or your agent what WhoLayer will and won't do. ## Webhooks Events are POSTed as JSON to your endpoint. Every request carries a `WhoLayer-Signature` header in the form `t=,v1=`, where `v1` is the HMAC-SHA256 of `t + "." + rawBody` using your workspace webhook secret (Destinations page). Recompute it, compare in constant time, and reject timestamps more than 5 minutes old to block replays. Respond with any 2xx within 10 seconds; failed deliveries are retried with exponential backoff (5 minutes, then doubling), checked by an hourly job, for up to 24 hours. Each destination on the Destinations page has a delivery log of its last 50 deliveries (status, response code, error), and owners and admins can resend a failed one. Company-level matches use the same `visitor.identified` event with `data.level` set to `"company"` and `data.person` set to `null`. ``` // Node.js verification import { createHmac, timingSafeEqual } from "node:crypto"; function verify(rawBody, header, secret) { const { t, v1 } = Object.fromEntries(header.split(",").map((kv) => kv.split("="))); if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); return timingSafeEqual(Buffer.from(expected), Buffer.from(v1)); } ``` ### `visitor.identified` ``` { "type": "visitor.identified", "id": "evt_19ab", "created": "2026-11-02T15:41:12Z", "site_id": "site_123", "data": { "identity_id": "8f2c1a7e-…", "level": "person", "person": { "id": "8f2c1a7e-…", "name": "Dana Okafor", "title": "VP Revenue", "linkedin_url": "https://www.linkedin.com/in/dana-okafor", "work_email": "dana@fieldline.com", "location": "Austin, TX" }, "company": { "name": "Fieldline", "domain": "fieldline.com", "employees": 210 }, "page": { "url": "/pricing", "referrer": null }, "pages": [{ "url": "/compare" }, { "url": "/pricing" }], "visits_this_month": 3, "first_seen": "2026-11-01T18:20:04Z", "last_seen": "2026-11-02T15:41:12Z", "icp_score": 86, "icp_reason": "VP Revenue at a 210-person software company; viewed pricing, compared alternatives, 3 visits", "source": "wholayer" } } ``` ### `icp_score` and `icp_reason` `visitor.identified` and `visitor.high_intent` carry `data.icp_score` (0 to 100) and `data.icp_reason`, a one-line plain-English reason. They score the visitor against the ideal customer you describe on the dashboard's Ideal customer page, using fixed rules (title, seniority, department, industry, company size, country, key-page views, visits, and recency). No AI runs per visitor. Both are `null` until you describe an ideal customer, and always for shoppers. Destinations can require a minimum score. `GET /visitors` returns the same two fields. ### `visitor.high_intent` Sent when someone you've already identified (a person, shopper, or company) opens one of the site's key pages. Key pages are path prefixes you set per site on the Sites page; the defaults are `/pricing`, `/compare`, `/vs`, `/alternatives`, `/demo`, `/contact`, `/security`, and `/trust`. At most one per identity per site every 24 hours. It carries no contact details: match it to the earlier `visitor.identified` or `shopper.identified` event by `data.identity_id`. Sent to webhook and Slack destinations whose filters match. A destination set to “High-intent only” receives only this event. ``` { "type": "visitor.high_intent", "id": "evt_7c1e", "created": "2026-11-03T14:05:51Z", "site_id": "site_123", "livemode": true, "data": { "identity_id": "8f2c1a7e-…", "level": "person", "page": { "path": "/pricing/enterprise" }, "key_page": "/pricing", "signal": "Viewed pricing", "company": { "name": "Fieldline", "domain": "fieldline.com" }, "visits_this_month": 4, "viewed_at": "2026-11-03T14:05:50Z", "icp_score": 88, "icp_reason": "VP Revenue at a 210-person software company; viewed pricing twice, 4 visits", "source": "wholayer" } } ``` `data.level` is `"person"`, `"shopper"`, or `"company"`. Failed deliveries are retried like other events. ### `shopper.identified` ``` { "type": "shopper.identified", "id": "evt_19ac", "created": "2026-11-02T16:02:40Z", "site_id": "site_456", "data": { "identity_id": "c41d09b2-…", "email": "marco.reyes@example.com", "email_risk": "A", "first_name": "Marco", "pages": [{ "url": "/products/linen-shirt" }, { "url": "/cart" }], "visits_this_month": 2, "source": "wholayer" } } ``` ### `suppression.added` Sent to your signed webhook destinations when someone we previously delivered to one of your destinations opts out, asks for deletion, or appears on a California DROP deletion list. It carries hashed identifiers only: the `identity_id` from the original `visitor.identified` or `shopper.identified` event and the SHA-256 of the person's lowercased email, so you can find and remove or suppress the record in your own systems. It is signed the same way as every other event and sent when the opt-out is applied to stored data (right away for DROP imports, otherwise within a day), with the same retries. Deduplicate on `id`. It is not sent for your own suppression list. ``` { "type": "suppression.added", "id": "evt_5e0c9a12b7d4f3a1", "created": "2026-11-03T14:00:07Z", "livemode": true, "test": false, "data": { "identity_id": "8f2c1a7e-…", "email_sha256": "4a1e…(64 hex characters)", "reason": "opted_out", "suppressed_at": "2026-11-03T14:00:07Z" } } ``` ## Errors | Status | Code | Meaning | | --- | --- | --- | | 400 | `invalid_request` | A field is missing or malformed. The message says which. | | 401 | `unauthorized` | Missing or invalid API key. | | 402 | `credits_exhausted` | Your wallet is empty, you've hit your spend cap or a key's daily cap, or (client workspaces) the client's monthly budget is used up. | | 403 | `forbidden` | Read-only key used on an endpoint that reveals contact details or adds to your suppression list. | | 403 | `plan_restricted` | Your plan doesn't include this feature (for example, mobile numbers). The error includes required\_plan; upgrade in Billing. | | 404 | `person_not_available` | No match for this person. You are not charged. | | 409 | `duplicate_request` | Same Idempotency-Key reused with a different body. | | 409 | `request_in_progress` | A request with this Idempotency-Key is still running. Retry after a few seconds to get its stored result. | | 413 | `payload_too_large` | More than 1,000 rows sent to /bulk or 100,000 to /jobs, a body over 4 MB (gzip /jobs bodies), or a suppression list over 1,000,000 entries. | | 451 | `person_not_available` | The person is withheld: error.reason says why (opted\_out, drop\_deleted, customer\_suppressed). No data is returned and you are not charged. | | 429 | `rate_limited` | Too many requests, or two jobs already queued or running in this workspace. Retry after the Retry-After header. | | 500 | `internal_error` | Our fault. Retry with the same Idempotency-Key. | | 503 | `provider_unavailable` | A data source is temporarily unavailable, or the lookup is switched off on live keys (live people search, for now). You are not charged. Retry later; test keys always work. | Error bodies look like `{"error":{"code":"rate_limited","message":"..."}}`. A `451` also carries `reason`; see [suppressed people](https://wholayer.com/docs/api#suppression). ## Rate limits | Plan | Requests per second | | --- | --- | | Free | 2 | | Starter | 10 | | Growth | 25 | | Scale | 100 | | Platform | Custom, up to 1,000 | For more than 1,000 records, start an async job with `POST /jobs` (up to 100,000 rows) or send several `POST /bulk` requests in sequence. [Ask us](https://wholayer.com/contact?topic=sales) about file and warehouse delivery on the Platform plan. --- # MCP server Two servers for AI agents: a public docs server anyone can connect without a key, and a data server with the same identity and contact data as the API, behind a spend cap the agent can't exceed. ## Servers | Server | URL | Auth | | --- | --- | --- | | Data (people, emails, mobiles, companies, visitors) | `https://mcp.wholayer.com/mcp` | `Authorization: Bearer wl_live_...` | | Docs (this website, pricing, help center) | `https://mcp.wholayer.com/docs` | None | Both use the Streamable HTTP transport and are stateless. For the data server, create a key under **Settings, API keys**. Use a `wl_test_...` key to try every tool with sandbox data that never spends credits. Replace `wl_live_YOUR_KEY` in the snippets below with your key, and never paste a live key into a shared file. ## Connect the data server ### Claude Code ``` claude mcp add --transport http wholayer https://mcp.wholayer.com/mcp \ --header "Authorization: Bearer wl_live_YOUR_KEY" ``` ### Claude Desktop Add it to `claude_desktop_config.json` (Settings, Developer, Edit config), then restart Claude Desktop. This uses the `mcp-remote` bridge so the API key header is sent: ``` { "mcpServers": { "wholayer": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.wholayer.com/mcp", "--header", "Authorization: Bearer wl_live_YOUR_KEY"] } } } ``` ### Cursor [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=wholayer&config=eyJ1cmwiOiJodHRwczovL21jcC53aG9sYXllci5jb20vbWNwIiwiaGVhZGVycyI6eyJBdXRob3JpemF0aW9uIjoiQmVhcmVyIHdsX2xpdmVfWU9VUl9LRVkifX0=) The button installs the server with a placeholder key; open Cursor Settings, MCP, and replace `wl_live_YOUR_KEY`. Or add it to `~/.cursor/mcp.json` yourself: ``` { "mcpServers": { "wholayer": { "url": "https://mcp.wholayer.com/mcp", "headers": { "Authorization": "Bearer wl_live_YOUR_KEY" } } } } ``` ### VS Code From a terminal, with your key in place of the placeholder: ``` code --add-mcp '{"name":"wholayer","type":"http","url":"https://mcp.wholayer.com/mcp","headers":{"Authorization":"Bearer wl_live_YOUR_KEY"}}' ``` Or add this to your `mcp.json` so VS Code prompts for the key and stores it securely instead of in the file: ``` { "inputs": [ { "type": "promptString", "id": "wholayer-key", "description": "WhoLayer API key", "password": true } ], "servers": { "wholayer": { "type": "http", "url": "https://mcp.wholayer.com/mcp", "headers": { "Authorization": "Bearer ${input:wholayer-key}" } } } } ``` ### Claude.ai and ChatGPT connectors Custom connectors in claude.ai and ChatGPT connect by URL and authenticate with OAuth or no authentication. The data server authenticates with an API key header only, so it can't be added there. Use Claude Desktop, Claude Code, Cursor, VS Code, or your own agent instead. The [docs server](https://wholayer.com/docs/mcp#docs-server) works in both. ### Any other client Most MCP clients accept this shape: ``` { "mcpServers": { "wholayer": { "type": "http", "url": "https://mcp.wholayer.com/mcp", "headers": { "Authorization": "Bearer wl_live_YOUR_KEY" } } } } ``` Logos are trademarks of their owners and indicate compatibility, not endorsement. ## Data server tools | Tool | What it does | Credits | | --- | --- | --- | | `enrich_person` | Find a person's verified work email, personal email, and/or mobile from a LinkedIn URL, an email, or name + company domain.
Mobile numbers need the Growth plan or above on live keys (403 plan\_restricted otherwise); test keys work on any plan. | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. | | `search_people` | Find people by title, seniority, department, company size, industry, and country. Returns profiles without contact details (use enrich\_person to reveal).
Live keys return 503 provider\_unavailable until live people search is switched on; test keys always work. | 1 credit per 10 results returned, rounded up; nothing if none. | | `verify_emails` | Check deliverability for up to 1,000 email addresses, graded A (safe) to F (will bounce). | 0.25 credits per address. | | `lookup_phone` | Find a mobile number with a live carrier and line-type check, by person\_id, email, LinkedIn URL, or name + company domain.
Mobile numbers need the Growth plan or above on live keys (403 plan\_restricted otherwise); test keys work on any plan. | 5 credits when a mobile is returned; nothing if not found. | | `get_company` | Company profile from a domain: size, revenue range, industry, HQ.
Works with read-only keys. | 1 credit when a profile is returned; nothing if not found. | | `list_visitors` | People and companies identified on your sites, newest first. | Free. | | `get_balance` | Credits remaining, plan, monthly spend cap, and this key's daily cap. | Free. | | `estimate_cost` | Quote the most credits an operation could spend before running it: enrich (with reveal), phones, verify (with rows), company, search (with limit), or bulk (with rows and reveal). We only charge on hits, so the real cost is the same or lower.
Works with read-only and test keys. | Free. | | `get_compliance_policy` | Machine-readable rules WhoLayer enforces: US-only person-level identification, consent outside the US, Global Privacy Control, blocked sensitive-page categories, suppression sources and reason codes, and retention periods.
Works with read-only keys. | Free. | | `report_bad_data` | Report a wrong person, a bounced email, or outdated data, by result\_id (the per\_… id from enrich\_person) or identity\_id (a visitor's person\_id from list\_visitors). Credits charged for a reported result are refunded if it was charged in the last 30 days, once per result. Refunds in any rolling 30 days are capped at 10% of the credits the workspace spent in that window; reports above the cap wait for review by our team and nothing is refunded automatically. The result is not delivered again.
Needs a key that isn't read-only. | Free. | | `create_job` | Queue an enrich or verify job of up to 100,000 rows that runs in the background. Returns a job id right away; poll it with get\_job. Each row is billed like a single call, and the whole job never spends more than max\_credits (default 250). Optional webhook\_url gets a signed job.completed or job.failed event. Results are kept 30 days.
At most 2 jobs queued or running per workspace. Test keys run sandbox jobs and never spend. | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. Verify rows: 0.25 per address. | | `get_job` | Status, progress, and credits used for a job from create\_job, plus a page of results (up to 100 rows per call; pass cursor for the next page). Withheld people come back as rows with error.code person\_not\_available and a reason.
Works with read-only keys. | Free. | | `add_to_suppression` | Adds emails or SHA-256 email hashes to this workspace's suppression list. Listed people are never returned, delivered, or charged for in this workspace. Emails are hashed on arrival; only hashes are stored. Removing entries is only possible from the dashboard (Settings, Suppression list), so confirm with the user before calling.
Needs a key that isn't read-only. | Free. | Every tool returns `credits_used` and `credits_remaining`, so the agent can see what it's spending. Inputs and outputs match the [REST API](https://wholayer.com/docs/api). ## Spend caps for agents Agents loop. Set limits before you hand one a key: - **Per-key daily cap**: create a key for each agent under **Settings, API keys** and give it a maximum credits per day. When it's reached, tools return `credits_exhausted`. - **Per-call ceiling**: a single tool call can't spend more than 250 credits unless you pass a higher `max_credits` argument (up to 10,000). - **Read-only keys**: allow only `list_visitors`, `get_company`, `get_balance`, `estimate_cost`, and `get_compliance_policy` for agents that should never reveal contact details. - **Free quotes**: `estimate_cost` returns the most a call could spend, with a breakdown, before the agent runs it. - **Idempotency**: repeated identical calls to the paid tools within 30 days return the cached result for free. - **Tool annotations**: every tool declares `readOnlyHint`, `destructiveHint`, `idempotentHint`, and `openWorldHint`, so clients can ask you before paid or irreversible calls. - **Refunds**: `report_bad_data` reports a wrong person, bounced email, or outdated result. Credits charged for a reported result are refunded if it was charged in the last 30 days, once per result. Refunds in any rolling 30 days are capped at 10% of the credits the workspace spent in that window; reports above the cap wait for review by our team and nothing is refunded automatically. Contacting people is your responsibility. If your agent emails, calls, or texts the people it finds, follow the [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), including CAN-SPAM and TCPA consent rules for calls and texts to mobile numbers. ## Connect the docs server A read-only server over WhoLayer's public website: product pages, pricing, API and MCP docs, help articles, and legal pages. No key, no credits, and it never sees customer data. Requests are rate-limited per IP address. ### Claude Code ``` claude mcp add --transport http wholayer-docs https://mcp.wholayer.com/docs ``` ### Claude.ai and Claude Desktop Open **Settings, Connectors**, choose **Add custom connector**, and paste the URL. Custom connectors depend on your Claude plan. ``` https://mcp.wholayer.com/docs ``` ### ChatGPT Turn on developer mode (in Settings, under Apps and Connectors, Advanced), create a connector, paste the URL, and choose **No authentication**. Availability depends on your ChatGPT plan and workspace settings. ``` https://mcp.wholayer.com/docs ``` ### Cursor [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=wholayer-docs&config=eyJ1cmwiOiJodHRwczovL21jcC53aG9sYXllci5jb20vZG9jcyJ9) ``` { "mcpServers": { "wholayer-docs": { "url": "https://mcp.wholayer.com/docs" } } } ``` ### VS Code ``` code --add-mcp '{"name":"wholayer-docs","type":"http","url":"https://mcp.wholayer.com/docs"}' ``` ### Any other client ``` { "mcpServers": { "wholayer-docs": { "type": "http", "url": "https://mcp.wholayer.com/docs" } } } ``` ### Docs server tools | Tool | What it does | | --- | --- | | `search_docs` | Search every public WhoLayer page and help article. Returns paths, titles, and snippets. | | `read_page` | Return the markdown of any public wholayer.com page, e.g. /pricing or /help/mcp-setup. | | `get_pricing` | Plans, monthly prices, included credits, overage rates, and credit costs per action. | | `get_products` | The four WhoLayer products with what each does, features, integrations, and pricing notes. | | `list_help_articles` | Every help center article with its category, summary, and markdown URL. | Prefer plain HTTP? Every page is also available as markdown (add `.md` to the URL), indexed at [/llms.txt](https://wholayer.com/llms.txt), with the REST API described at [/openapi.json](https://wholayer.com/openapi.json). ## Example prompt ``` Find heads of RevOps at US software companies with 50-500 employees who visited our pricing page this week. Get their work emails, skip anyone graded below B, and add them to the "Pricing visitors" list in HubSpot. ``` The last step needs a HubSpot tool connected to the same agent; WhoLayer's MCP server doesn't write to HubSpot. --- # Integrations Identified people are only useful where your team already works. Connect a destination in a few clicks. ## Available now | Integration | What it does | Plan | | --- | --- | --- | | **Slack** | Posts each identified person or company to a channel through an incoming webhook, with the pages they viewed. Visits to your key pages are tagged, like "Viewed pricing", and you can set a channel to high-intent alerts only. Add several Slack destinations with different filters to post to different channels. | All plans | | **Microsoft Teams** | Posts the same alert as Slack, as an Adaptive Card, to a channel through a Teams Workflows webhook. Key-page visits are tagged, and a channel can be set to high-intent alerts only. | All plans | | **HubSpot** | Creates or updates a contact by email with name, job title, company, and website, using a private app token. Also finds or creates the company by domain, links the contact to it, and adds a timeline note with the pages viewed. | Starter and above | | **Pipedrive** | Finds the person by email or creates them, with name, job title, and organization (found by name or created), then adds a note with the pages viewed. Uses your API token; you can set the owner of new records. | Starter and above | | **Attio** | Creates or updates the person by email with name and job title, links them to the company by domain, and adds a note with the pages viewed. Uses an Attio access token. | Starter and above | | **Salesforce** | Connects with Salesforce sign-in. Updates the Contact if one already has the email and logs the visit as a completed activity; otherwise creates or updates a Lead with name, title, company, website, Lead Source "WhoLayer", and the pages viewed. It relies on an OAuth app that WhoLayer sets up; until that is done, the option shows as "coming soon, needs setup" in the dashboard. | Scale and above | | **Klaviyo** | Creates the shopper's profile with documented wl\_ properties and records a "WhoLayer Shopper Identified" event, so your browse and cart flows can trigger on it. Shoppers already in your Klaviyo cost half and are never duplicated; they get a "WhoLayer Returning Shopper" event instead. Bounces and spam complaints within 30 days are refunded. See the schema below. | Growth and above | | Signed webhooks **Webhooks** | Signed JSON events (visitor.identified, shopper.identified, visitor.high\_intent) to any HTTPS endpoint, verified with an HMAC-SHA256 signature. | All plans | | **Email digest** | A daily or weekly email to the teammates you choose: people, companies, and high-intent visits, plus the top 10 people and companies by visits. | All plans | ## Through webhooks or the API | Integration | What it does | Plan | | --- | --- | --- | | **Clay** | Send identified visitors into a Clay table with a webhook destination, or call the Data API from an HTTP API column. | All plans | | **Zapier and Make** | Use a "Catch hook" trigger with a webhook destination; call the Data API with an HTTP action. | All plans | | **n8n** | Use the Webhook trigger node; call the Data API with the HTTP Request node. | All plans | | **Shopify** | Paste the tag into your theme (Online Store, Themes, Edit code, theme.liquid, before ). | All plans | ## Coming soon | Integration | What it does | Plan | | --- | --- | --- | | **Two-way CRM sync** | Reading deal and opportunity stages back from your CRM. | Planned | | **Meta Custom Audiences and Google Customer Match** | Hashed audience sync for retargeting. | Planned | | **Shopify app** | One-click install with cart value on shopper events. | Planned | Logos are trademarks of their owners and indicate compatibility, not endorsement. ## Filters and routing Every destination can have its own filter: identity type (person, company, or shopper), job title keywords, minimum company size, and the pages viewed. A common setup sends visitors with "VP" or "Head" in their title who viewed pricing to Slack, every identified person to your CRM, and companies nowhere. CRM destinations only receive people with an email address. The identity type filter works on every plan; title, company size, and page filters are on Starter and above. ## Klaviyo schema What WhoLayer writes to your Klaviyo account for Shopper ID. Use a private API key with Profiles (read and write), Events (read and write), and Metrics (read) access. The read scopes let us check whether a shopper is already in your Klaviyo, refund bounces and spam complaints, run the Deliverability Guard, and report holdout results. ### Profile properties Set on profiles we create for new shoppers. We don't add them to profiles that were already in your Klaviyo. | Property | Value | | --- | --- | | `wl_source` | "WhoLayer Shopper ID" (or "WhoLayer Visitor ID" for B2B people, "WhoLayer (sandbox)" for sandbox data). | | `wl_match_type` | How we matched: "first\_party\_hashed\_email" when the email matches the hashed email your site passed with wholayer("identify"), the match type our identity resolver reports (for example "deterministic" or "probabilistic") when it reports one, otherwise "identity\_graph". | | `wl_confidence` | A number from 0 to 1. Only sent when the resolver returns one; otherwise left off. | | `wl_first_seen` | When we first identified this shopper on your site (ISO 8601, UTC). | | `wl_consent_ref` | The data supplier's consent reference for this record. Left off when there isn't one. | ### Events | Event (metric) | When | Properties | | --- | --- | --- | | **WhoLayer Shopper Identified** | A new shopper (not already in your Klaviyo) is identified and charged 2 credits, once per shopper. | pages (last 10 paths), visits, site, source, test | | **WhoLayer Returning Shopper** | A shopper already in your Klaviyo is matched (charged 1 credit, half price), or comes back and is recognized by our first-party cookie or the hashed email your site passed (free). At most once per shopper per day. | viewed\_urls (last 10), viewed\_products (URLs containing /products/), last\_viewed\_url, visits, site, source | ### What we read Once a day: the counts of Received Email, Bounced Email, and Marked Email as Spam over the last 7 days (for the Deliverability Guard), and Bounced Email, Marked Email as Spam, and Placed Order events with the profile's email (to refund bounces and complaints and to count orders for the holdout report). We hash each email and match it against shoppers we sent or held out; we store only the hash, the date, and order amounts for matches. Details: [Klaviyo schema](https://wholayer.com/help/klaviyo-schema) and [Shopper ID guarantees](https://wholayer.com/help/shopper-id-klaviyo-guarantees). ## Don't see your tool? Use [webhooks](https://wholayer.com/docs/api#webhooks) or the [API](https://wholayer.com/docs/api), or [tell us what you need](https://wholayer.com/contact?topic=support). --- For agents # WhoLayer for AI agents Everything an agent can use today: two MCP servers, a REST API with an OpenAPI spec, markdown for every page, and limits that keep an agent's spending where you set it. ## What WhoLayer is WhoLayer identifies website visitors and enriches them with verified emails and mobiles, then sends them to Slack, HubSpot, Klaviyo, signed webhooks, or an AI agent. One tag powers Visitor ID (people and companies visiting a B2B site; person-level for US traffic only, company-level free and unlimited) and Shopper ID (anonymous US shoppers sent to Klaviyo). The Data API and MCP server give code and AI agents the same identity and contact data with per-key spend caps, and Identity Cloud licenses identity data to platforms. Every product draws from one credit wallet. Opted-out people are never returned or charged. ## Surfaces at a glance | Surface | URL | Auth | | --- | --- | --- | | Data MCP server (13 tools) | `https://mcp.wholayer.com/mcp` | API key (Bearer) | | Docs MCP server (5 tools) | `https://mcp.wholayer.com/docs` | None | | REST API | `https://api.wholayer.com/v1` | API key (Bearer) | | OpenAPI 3.1 spec | [/openapi.json](https://wholayer.com/openapi.json) | None | | Site index for LLMs | [/llms.txt](https://wholayer.com/llms.txt) and [/llms-full.txt](https://wholayer.com/llms-full.txt) | None | | Markdown version of any public page | Add `.md` to the URL (home is [/index.md](https://wholayer.com/index.md)), or send `Accept: text/markdown` | None | ## Data MCP server The same identity and contact data as the REST API. Create a key under **Settings, API keys**. A `wl_test_...` key returns sandbox data from every tool and never spends credits, so start there. ``` claude mcp add --transport http wholayer https://mcp.wholayer.com/mcp \ --header "Authorization: Bearer wl_test_YOUR_KEY" ``` Install snippets for Claude Desktop, Cursor (one click), VS Code, and other clients are on the [MCP docs](https://wholayer.com/docs/mcp). | Tool | What it does | Credits | Read-only key | | --- | --- | --- | --- | | `enrich_person` | Find a person's verified work email, personal email, and/or mobile from a LinkedIn URL, an email, or name + company domain. | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. | No | | `search_people` | Find people by title, seniority, department, company size, industry, and country. Returns profiles without contact details (use enrich\_person to reveal). | 1 credit per 10 results returned, rounded up; nothing if none. | No | | `verify_emails` | Check deliverability for up to 1,000 email addresses, graded A (safe) to F (will bounce). | 0.25 credits per address. | No | | `lookup_phone` | Find a mobile number with a live carrier and line-type check, by person\_id, email, LinkedIn URL, or name + company domain. | 5 credits when a mobile is returned; nothing if not found. | No | | `get_company` | Company profile from a domain: size, revenue range, industry, HQ. | 1 credit when a profile is returned; nothing if not found. | Allowed | | `list_visitors` | People and companies identified on your sites, newest first. | Free. | Allowed | | `get_balance` | Credits remaining, plan, monthly spend cap, and this key's daily cap. | Free. | Allowed | | `estimate_cost` | Quote the most credits an operation could spend before running it: enrich (with reveal), phones, verify (with rows), company, search (with limit), or bulk (with rows and reveal). We only charge on hits, so the real cost is the same or lower. | Free. | Allowed | | `get_compliance_policy` | Machine-readable rules WhoLayer enforces: US-only person-level identification, consent outside the US, Global Privacy Control, blocked sensitive-page categories, suppression sources and reason codes, and retention periods. | Free. | Allowed | | `report_bad_data` | Report a wrong person, a bounced email, or outdated data, by result\_id (the per\_… id from enrich\_person) or identity\_id (a visitor's person\_id from list\_visitors). Credits charged for a reported result are refunded if it was charged in the last 30 days, once per result. Refunds in any rolling 30 days are capped at 10% of the credits the workspace spent in that window; reports above the cap wait for review by our team and nothing is refunded automatically. The result is not delivered again. | Free. | No | | `create_job` | Queue an enrich or verify job of up to 100,000 rows that runs in the background. Returns a job id right away; poll it with get\_job. Each row is billed like a single call, and the whole job never spends more than max\_credits (default 250). Optional webhook\_url gets a signed job.completed or job.failed event. Results are kept 30 days. | 1 credit per work email, 2 per personal email, and 5 per mobile returned, plus 10 for a reverse lookup when you send only an email and we find the person. Nothing if no match. Verify rows: 0.25 per address. | No | | `get_job` | Status, progress, and credits used for a job from create\_job, plus a page of results (up to 100 rows per call; pass cursor for the next page). Withheld people come back as rows with error.code person\_not\_available and a reason. | Free. | Allowed | | `add_to_suppression` | Adds emails or SHA-256 email hashes to this workspace's suppression list. Listed people are never returned, delivered, or charged for in this workspace. Emails are hashed on arrival; only hashes are stored. Removing entries is only possible from the dashboard (Settings, Suppression list), so confirm with the user before calling. | Free. | No | Every tool returns `credits_used` and `credits_remaining`. REST responses carry an `X-Credits-Remaining` header. ## Docs MCP server Read-only access to WhoLayer's public website, pricing, and help center. No key, no credits, and it never sees customer data. ``` claude mcp add --transport http wholayer-docs https://mcp.wholayer.com/docs ``` | Tool | What it does | | --- | --- | | `search_docs` | Search every public WhoLayer page and help article. Returns paths, titles, and snippets. | | `read_page` | Return the markdown of any public wholayer.com page, e.g. /pricing or /help/mcp-setup. | | `get_pricing` | Plans, monthly prices, included credits, overage rates, and credit costs per action. | | `get_products` | The four WhoLayer products with what each does, features, integrations, and pricing notes. | | `list_help_articles` | Every help center article with its category, summary, and markdown URL. | ## Spend controls and safe retries - **Per-key daily cap.** Give each agent its own key with a maximum number of credits per day. When it's reached, calls return `credits_exhausted` until the next day. - **Monthly spend cap.** A workspace-wide hard limit, set on the Usage page. - **Per-call ceiling.** One call can't spend more than 250 credits unless you raise it with the `X-Max-Credits` header (REST) or the `max_credits` argument (MCP), up to 10,000. - **Read-only keys.** Limited to the tools marked “Allowed” above, for agents that should never reveal contact details. - **Idempotency.** Send an `Idempotency-Key` header on REST POST requests; a retry within 30 days returns the stored result without charging again. On the MCP server, repeated identical calls to paid tools within 30 days return the cached result for free. - **Rate limits per key.** Free 2, Starter 10, Growth 25, Scale 100, Platform 1,000 requests a second. Bulk calls take up to 1,000 rows. ## Compliance rules agents can read The rules WhoLayer enforces are published as JSON at `GET /v1/policy` (any API key, including read-only) and through the `get_compliance_policy` MCP tool: US-only person-level identification, consent outside the US, Global Privacy Control, blocked sensitive-page categories, suppression sources, and retention periods. When a person can't be returned, the API answers HTTP 451 with `error.code` `person_not_available` and one of these reasons. You're never charged for them: | Reason | Meaning | | --- | --- | | `opted_out` | This person has opted out of WhoLayer. No data is returned and you were not charged. | | `drop_deleted` | This person asked to be deleted through California's Delete Request and Opt-out Platform (DROP). No data is returned and you were not charged. | | `customer_suppressed` | This person is on your workspace's suppression list. No data is returned and you were not charged. | | `non_us` | Person-level data is available for US visitors only. No data is returned and you were not charged. | | `sensitive` | People are never identified on sensitive pages. No data is returned and you were not charged. | Agents can add people to your workspace's suppression list with `add_to_suppression` or `POST /v1/suppression`. Contacting people is your responsibility. If your agent emails, calls, or texts the people it finds, follow the [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), including CAN-SPAM and TCPA consent rules for calls and texts. ## Credit costs | Action | Credits | Note | | --- | --- | --- | | Company identified (who's visiting, at the account level) | Free | Unlimited on every plan | | Person identified on your site (name, title, LinkedIn, work email) | 1 | Only charged when we return a person. Repeat visits by the same person in a month are free. | | Shopper identified for ecommerce (new to your list: verified personal email, sent to Klaviyo) | 2 | With Klaviyo connected, charged once per new shopper and refunded (within the refund limit) if they bounce or mark you as spam within 30 days; without Klaviyo, once per shopper per month. Opted-out people are never returned. | | Shopper recognized who is already in your Klaviyo (no duplicate created; triggers a Returning Shopper event) | 1 | Half the price of a new shopper. Return visits we recognize by our own cookie or your site's hashed email are free, and so are holdout shoppers. | | Work email found and verified | 1 | No charge if we don't find one. | | Personal email found and verified | 2 | No charge if we don't find one. | | Reverse email lookup (send an email, get the person: name, title, company, LinkedIn) | 10 | Only when you send an email alone and we find the person. No charge if we don't. | | Mobile number with carrier and line-type check | 5 | No charge if we don't find one. | | Email verification only | 0.25 | 4 verifications per credit. | | People search results (name, title, company; no contact details) | 1 per 10 | Charged per 10 results returned, rounded up. Contact details are charged separately when you enrich a result. | | Company profile (size, revenue, industry) | 1 | No charge if we don't have one. | Plans and overage rates are on [pricing](https://wholayer.com/pricing). Everything on this page is generated from the same constants the code charges and enforces. ## Related - [MCP server docs and install snippets](https://wholayer.com/docs/mcp) - [REST API reference](https://wholayer.com/docs/api) - [Data API and MCP product page](https://wholayer.com/products/data-api) - [Moving off Explorium](https://wholayer.com/switch/explorium) --- Changelog # What's new Features, improvements, and fixes, as they reach production. Newest first. Follow along with the [RSS feed](https://wholayer.com/changelog.xml). ## November 4, 2026 ### New: ICP scoring: a fit score and a plain-English reason for every visitor Describe your ideal customer in a sentence or two on the new Ideal customer page. We turn it into scoring rules you can read and edit, then score every identified person and company from 0 to 100 with a one-line reason, like "VP Sales at a 210-person SaaS company; viewed pricing twice". Scoring uses those rules directly, with no AI per visitor, so it's instant and free on every plan. Sort and filter People and Companies by score, set a minimum score on any destination, and see the score in Slack and Teams alerts, CRM notes, webhooks, and the API. Mark people as Good fit or Not ICP, then re-tune the rules with your feedback. [How ICP scoring works](https://wholayer.com/help/icp-scoring) · [Webhook fields](https://wholayer.com/docs/api#icp-score) ### New: Microsoft Teams, Pipedrive, Attio, and Salesforce destinations, and a deeper HubSpot sync Send alerts to a Microsoft Teams channel on every plan, with the same high-intent tags as Slack. On Starter and up, identified people sync to Pipedrive (person and organization, with a note of the pages they viewed) and Attio (person and company, linked, with a note). HubSpot contacts are now linked to their company by domain and get a note summarizing the visit. Salesforce sync (Scale and up) shows as coming soon until our Salesforce app is switched on. [Teams](https://wholayer.com/help/destination-teams) · [Pipedrive](https://wholayer.com/help/destination-pipedrive) · [Attio](https://wholayer.com/help/destination-attio) · [HubSpot](https://wholayer.com/help/destination-hubspot) ### New: Check my install, and a live first-visit check Onboarding and the Sites page have a Check my install button. We load your homepage and name the problem if there is one: the tag is missing, it has the wrong site ID or another site's ID, it's on the page twice, your homepage redirects to a different domain, or your Content Security Policy blocks it. We also spot common cookie banners and explain how consent works. Below it, Waiting for your first visit… switches on as soon as your first visit is stored. [Quickstart](https://wholayer.com/help/quickstart) ### New: Setup for API and MCP builders If you're building with the API or MCP, onboarding skips the tag. Create a free test key in one click, run a ready-made curl call with your key filled in, copy the setup for Claude Code, Cursor, VS Code, or Claude Desktop, and watch the page confirm your first call. Creating a key on the API keys page now shows the same setup with the new key filled in. [MCP docs](https://wholayer.com/docs/mcp) ### New: Delivery log and Resend for destinations Every destination, including the new Teams and CRM destinations, shows its last 50 deliveries with the time, event, status, response code, and error, filterable by status. Owners and admins can resend a failed delivery. People who opted out, and results you reported as a wrong match, are never resent. [Webhooks](https://wholayer.com/help/destination-webhook) ### New: Status page and security.txt /status shows whether our database is reachable right now and which services are set up, and /api/health returns the same checks as JSON. Security researchers can find how to reach us at /.well-known/security.txt. [Current status](https://wholayer.com/status) ### New: Fair billing: refunds for bad results and free cost quotes If a returned email, mobile, or person is wrong, report it from the API (POST /v1/report), the MCP server (report\_bad\_data), or the button on a person's page. Charges from the last 30 days are refunded once per result, up to a cap based on your recent spend (above it, our team reviews the report), and the result is never returned or delivered again. POST /v1/estimate and the MCP estimate\_cost tool quote the most a call could cost, for free, and every API response now carries an X-Credits-Used header. The Usage page shows the work we did this month without charging you, and the new Fair Billing page explains what you pay for and what you don't. [Fair Billing](https://wholayer.com/fair-billing) · [How refunds work](https://wholayer.com/docs/api#fair-billing) ### New: Docs for AI agents: markdown pages, llms.txt, OpenAPI, and a docs MCP server Every public page has a markdown version (add .md to the address). /llms.txt and /llms-full.txt index the site, /openapi.json describes the whole API, and a public docs MCP server at mcp.wholayer.com/docs answers questions about WhoLayer with no key. The MCP docs page has one-click install for Cursor and copy-paste setup for Claude Code, Claude Desktop, and VS Code. [For AI agents](https://wholayer.com/for-agents) · [MCP docs](https://wholayer.com/docs/mcp) ### New: Comparison, alternatives, and switch guides, plus a page for AI agents Side-by-side comparisons with other tools, each fact linked to its source and dated, alternatives pages, and step-by-step guides for switching to WhoLayer. The new For AI agents page lists what an agent can use today: both MCP servers and their tools with credit costs, llms.txt, markdown pages, the OpenAPI spec, the compliance policy endpoint, and spend caps. [Compare](https://wholayer.com/compare) · [Alternatives](https://wholayer.com/alternatives) · [Switch guides](https://wholayer.com/switch) · [For AI agents](https://wholayer.com/for-agents) ### New: Your own suppression list, and clearer answers for withheld people Upload people you never want to see under Settings, Suppression list (we keep only hashed emails), or add them with POST /v1/suppression or the MCP add\_to\_suppression tool. They're excluded everywhere: the tag, the dashboard, destinations, and the API. When the API withholds a person who opted out or is on your list, it now answers 451 with a reason and never charges. GET /v1/policy returns our privacy rules in a machine-readable form, and signed webhooks receive a suppression.added event when someone they were sent opts out. [Suppression list](https://wholayer.com/docs/api#suppression-list) ### New: High-intent alerts, digest email, Companies view, and a coverage card Choose key pages for each site (pricing, comparison, demo, and contact pages by default). When someone you've identified opens one, we send a visitor.high\_intent webhook and tag the Slack alert, at most once a day per visitor. Add a daily or weekly digest email for your team, browse identified companies on their own page, and see on the Overview how much of your traffic we identified and what we filtered out, which you're never charged for. [Webhook events](https://wholayer.com/docs/api#webhooks) ### Improved: Destination secrets encrypted at rest Slack and webhook URLs, HubSpot tokens, and Klaviyo keys are now encrypted in our database and only decrypted at the moment we send. The dashboard shows a masked hint instead of the full value. ### Fixed: Bots and crawlers are filtered out before anything is stored Crawlers, headless browsers, link previews, uptime monitors, and scripts are dropped by the tag's collector, so they never appear in your data or cost credits. --- Help / Glossary # The words, in plain English. Identity data has a lot of jargon. Here's what each term means for you. CAN-SPAM The US commercial email law: identify yourself, don't mislead, include a postal address and unsubscribe link, honor opt-outs. CCPA / CPRA California's privacy law, which gives residents the right to know, delete, correct, and opt out of the sale or sharing of their data. Company-level ID Identifying the organization a visitor's network belongs to. Free, and works worldwide with consent. Credit The unit you spend on any WhoLayer product. One credit buys one identified person or one found email. Destination Where identified people are sent: Slack, a webhook, Klaviyo, or HubSpot. DROP California's Delete Request and Opt-out Platform, where residents ask every registered data broker to delete their data at once. FCRA The Fair Credit Reporting Act. WhoLayer data can't be used for credit, employment, insurance, or housing decisions. First-party cookie A cookie set on your own domain. Our tag uses only these: \_wl\_vid, \_wl\_sess, and \_wl\_opt. GPC Global Privacy Control: a browser signal meaning "don't sell or share my data". When it's on, our tag sends nothing. HEM Hashed email: an email address turned into a fixed-length code (SHA-256) so it can be matched without sharing the address itself. Idempotency key A unique ID you send with an API request so a retry returns the saved result instead of charging again. MAID Mobile advertising ID: the resettable ID phones provide to apps for advertising. Match rate The share of visitors or records we can identify. Depends heavily on traffic mix. Independent industry tests of person-level ID have measured roughly 2% to 20% of traffic. We publish our own measured rates on the Trust page. MCP Model Context Protocol: the standard way AI assistants like Claude and Cursor connect to tools such as WhoLayer. Person-level ID Identifying the individual behind a visit: name, title, and contact details. US traffic only. Resolution Matching an anonymous visit or record to a known person or company. Reverse IP Looking up which organization owns the network a visit came from. It powers company-level ID. Risk grade A letter from A (safest) to D on how likely an email is to deliver. F means it won't. Sandbox Test mode that returns clearly fictional people on example.com addresses and never spends credits. Suppression list Everyone who has opted out. We check it before returning any person, and never charge for suppressed people. TCPA The US law on calls and texts. Automated calls or texts to mobiles generally need prior consent. Waterfall Trying several data sources in order until one returns a verified result, so you get better coverage than any single source. --- # Trust is the product Identity data only works if the people in it are treated fairly and the businesses using it can defend how they got it. Here is exactly how we do it. ## Our commitments ### We don't scrape LinkedIn Our data comes from licensed suppliers and consent-aware publisher networks, never from logged-in scraping or fake accounts. Every supplier signs a written promise about how its data was collected. This is a deliberate choice: scraped data is the fastest way to lose a supply line overnight. ### Every lookup checks the suppression list Before we return a person through any product, the tag, the API, MCP, or a bulk file, we check a single global list of everyone who has opted out or asked to be deleted. An opt-out with one customer is an opt-out with all of them. ### California DROP, on a schedule Once our California registration is complete, we'll download deletion requests from California's Delete Request and Opt-out Platform at least every 45 days (every 30 from 2027), match them against the emails and phone numbers we hold, delete what matches, and report the result of each request back. Ops gets a reminder before each download is due. ### People only in the US Person-level identification is limited to US traffic. Outside the US we identify companies only, and only after the site's consent banner records consent where the law requires it. ### Global Privacy Control honored If a browser sends a GPC signal, our tag does not identify that visitor. No settings to change, nothing for the customer to forget. ### No sensitive sites Our Acceptable Use Policy forbids using WhoLayer on sites or pages about health, sexual health, religion, sexual orientation, immigration, or financial hardship, or on sites for children. We suspend accounts that break this rule, and we never sell precise location. ## How we measure accuracy Most vendors quote match rates nobody can check. We will publish ours every quarter, with the method, so you can. 1. **Holdout set.** We keep a set of real visits where the visitor's identity is already known with certainty, for example people who later filled in a form or logged in, contributed by customers who opt in to benchmarking. 2. **Blind resolution.** We run those visits through WhoLayer as if they were anonymous, without the known answer. 3. **Two numbers, never one.** We report the *match rate* (share of visits where we returned a person) and the *accuracy* (share of returned people who were the right person). A high match rate with low accuracy is noise you pay for. 4. **Broken out** by B2B and ecommerce traffic, and by device type. Our first report publishes after 90 days of operation. Until then we don't quote a match rate, because we won't quote one we haven't measured. ## Built on The infrastructure WhoLayer runs on. Each one is listed on our subprocessors page. - Vercel Hosting and edge network - Neon Postgres database - Stripe Payments and billing - Resend Transactional email - Anthropic AI assistant (via Vercel AI Gateway) ### Standards we honor - Global Privacy Control Honored by our tag and server - California Delete Act (DROP) processing built in - CCPA / CPRA consumer rights These describe practices, not certifications. Logos are trademarks of their owners and indicate compatibility, not endorsement. ## Privacy request metrics How many privacy requests we received, how we answered them, and how long it took. Calculated from our request records, the same figures as our Privacy Policy. **No requests yet.** We haven't received any privacy requests or DROP deletion requests so far. This table fills in automatically as requests arrive. Earlier years and how we count are in our [Privacy Policy](https://wholayer.com/legal/privacy#metrics). ## Security ### SOC 2 Type II Our audit is in progress. Customers can request our security questionnaire and controls summary now. ### Encryption and access TLS in transit, AES-256 at rest, hashed identifiers for suppression, SSO and MFA for all production access, quarterly access reviews. ### Report a vulnerability Use our [contact form](https://wholayer.com/contact?topic=security) and choose “Security or a vulnerability report.” We acknowledge within 2 business days and won't pursue good-faith research that follows this policy. ## For your legal team [Terms of ServiceThe agreement between you and us when you use WhoLayer.](https://wholayer.com/legal/terms) [Privacy PolicyWhat personal information we collect, where it comes from, and your rights.](https://wholayer.com/legal/privacy) [Data Processing AddendumHow we process personal information on behalf of customers.](https://wholayer.com/legal/dpa) [Acceptable Use PolicyWhat you may and may not do with WhoLayer data.](https://wholayer.com/legal/acceptable-use) [Cookie PolicyCookies on our site, and how the WhoLayer tag works on yours.](https://wholayer.com/legal/cookies) [SubprocessorsThe vendors that help us run the service.](https://wholayer.com/legal/subprocessors) [Fair Use PolicyRate limits and fair use for credits, the API, and AI agents.](https://wholayer.com/legal/fair-use) [Customer notice templatesSample privacy-notice wording for websites that use the WhoLayer tag.](https://wholayer.com/legal/customer-notice) [Consumer privacy requestsOpt out, delete, access, correct.](https://wholayer.com/privacy-request) Need a security review, a signed DPA, or our supplier list under NDA? Email [legal@wholayer.com](mailto:legal@wholayer.com). Ready when you are ## Compliant by default, not by add-on Install the tag with GPC, suppression, and US-only person matching already on. [Start free](https://wholayer.com/signup) [Talk to sales](https://wholayer.com/contact?topic=sales) --- # Your privacy choices Opt out of the sale or sharing of your information, delete it, or see what we have. You don't need an account, and it's free. ## Why you might be in our data WhoLayer helps businesses recognize who visits their websites and reach them with accurate contact details. To do that, we work with data partners that link browsers and devices to people, and we keep business contact information such as names, job titles, and work email addresses. So if you've visited a website that uses WhoLayer, or your work details are published or licensed by a business data provider, we may hold some information about you. Our [Privacy Policy](https://wholayer.com/legal/privacy) lists exactly what and where it comes from. ## What happens when you submit - **Opt-outs take effect immediately.** We add your email address, and your phone number if you give it, to our suppression list the moment you submit, so WhoLayer stops returning you to every customer. We then remove what we already hold. You don't need to prove who you are to opt out. - **Deletion starts right away too.** We stop selling and start deleting at once, then email you a link to confirm you control the email address. - **To see or correct what we have, confirm it's you.** We email you a one-time link, valid for 7 days. We never ask you to create an account. - **We finish within 45 days**, and tell you if we need more time. - **It sticks.** We keep only a one-way hash of your email or phone number on the suppression list, which is checked before any information about you is returned or delivered, so it doesn't come back. ## Asking for someone else An authorized agent can submit a request for someone else: tick the box at the end of the form. We'll email the agent to ask for the person's signed permission or a power of attorney, and we may ask the person to confirm their identity directly. Opt-outs from an agent take effect immediately. ## Other ways to reach us - Email: [privacy@wholayer.com](mailto:privacy@wholayer.com) - Mail: WhoLayer, Inc., Attn: Privacy, 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801 ## Stop it automatically Turn on [Global Privacy Control](https://globalprivacycontrol.org/) in your browser. WhoLayer treats it as an opt-out for that browser, and our tag won't identify you on any customer's website. GPC can't reach information that isn't tied to your browser, so use this form to opt out everywhere. California residents can also ask every registered data broker to delete their information at once through [California's DROP](https://privacy.ca.gov/drop/). See [how we process DROP requests](https://wholayer.com/legal/privacy#drop). ## Make a request We only use what you enter here to find and act on your information. What would you like us to do? Send one request for each email address you use. Add it to opt out or delete by phone number too. We keep only a one-way hash of it. --- [Legal](https://wholayer.com/legal) # Terms of Service Effective November 16, 2026. WhoLayer, Inc. These Terms of Service (the “Terms”) are an agreement between WhoLayer, Inc. (“WhoLayer,” “we,” “us”) and the business that creates an account or signs an order form (“Customer,” “you”). By creating an account, installing the WhoLayer tag, or calling the WhoLayer API, you agree to these Terms on behalf of your business. If you do not have authority to bind your business, do not use the service. WhoLayer is sold to businesses only and is not for personal, family, or household use. ## 1\. The service WhoLayer provides identity data products, which may include: - **Visitor ID:** a JavaScript tag that identifies companies and, in the United States, individual people visiting your website. - **Shopper ID:** identification of anonymous visitors to ecommerce sites and delivery of verified email addresses to your marketing tools. - **Data API and MCP:** lookup, search, enrichment, and verification of business and contact data through our API, MCP server, integrations, and browser extension. - **Identity Cloud:** licensed identity data delivered by API, file, or warehouse share under a signed order form. Together these are the “Service,” and the data we return to you is “Output Data.” We may change, add, or remove features. If we remove a feature you pay for in a way that materially reduces the Service, you may cancel and receive a prorated refund of prepaid fees for the remaining term. ## 2\. Your account You are responsible for everything done under your account, including by your users, contractors, and any AI agent or automation you connect with your API key. Keep credentials secret. Tell us promptly through [our contact form](https://wholayer.com/contact?topic=security) if you believe your account has been compromised. ## 3\. Your obligations when using the Service You are responsible for using the Service lawfully. In particular, you agree that you will: 1. **Give notice on your website.** Keep a privacy policy on every site where the WhoLayer tag is installed that discloses, in clear terms, that you use third-party technology to identify visitors and that visitor information is disclosed to third parties such as WhoLayer. Sample wording you can adapt is on our [customer notice templates](https://wholayer.com/legal/customer-notice) page. 2. **Honor privacy choices.** Provide a “Do Not Sell or Share My Personal Information” link where required, honor Global Privacy Control signals, and configure the tag so it does not fire for visitors who have opted out. 3. **Collect consent outside the United States.** Person-level identification is only available for US traffic. For any visitors outside the United States, you must obtain consent through a consent banner or consent management platform before enabling company-level identification, where the law of the visitor's location requires it. 4. **Have a lawful basis for every outreach.** Comply with the CAN-SPAM Act and all other email laws, including accurate sender information, a working unsubscribe link, and your postal address in every commercial email, and honor unsubscribes within 10 business days. 5. **Comply with telemarketing laws.** You are solely responsible for compliance with the Telephone Consumer Protection Act, the Telemarketing Sales Rule, state telemarketing and “mini-TCPA” laws, and the National Do Not Call Registry. WhoLayer does not provide consent to call or text anyone. Do not use mobile numbers from WhoLayer for autodialed, prerecorded, or artificial-voice calls or for marketing text messages unless you have obtained the consent the law requires directly from the person. 6. **Not use Output Data for eligibility decisions.** WhoLayer is not a consumer reporting agency, and Output Data is not a “consumer report” under the Fair Credit Reporting Act. You will not use Output Data, in whole or in part, to determine anyone's eligibility for credit, insurance, employment, housing, education, government benefits, or any other purpose covered by the FCRA or similar laws. 7. **Not install the tag on sensitive sites.** Do not install the tag on pages that relate to health conditions, reproductive or sexual health, sexual orientation, religion, immigration status, criminal history, financial hardship, or content directed to children under 16, as described in our [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use). 8. **Follow the Acceptable Use Policy and Fair Use Policy,** which are part of these Terms. ## 4\. Our obligations - We check every person we return against our global suppression list, which includes every consumer who has opted out of or requested deletion from WhoLayer and every deletion request we receive through the California Delete Request and Opt-out Platform. - We do not return person-level identities for visitors outside the United States. - We maintain the security measures described in our [Data Processing Addendum](https://wholayer.com/legal/dpa). - We maintain the data broker registrations required by law in the states where we operate. ## 5\. Data you send us “Customer Data” means data you or your website visitors send to the Service, including tag events and records you upload or submit through the API. You own Customer Data. You grant us a limited license to use Customer Data to provide, secure, and support the Service for you, and to compute aggregated, de-identified statistics (for example, match-rate benchmarks) that do not identify you or any individual. **We do not add your Customer Data to a shared database that is sold or provided to other customers.** Our processing of personal information in Customer Data is governed by the [Data Processing Addendum](https://wholayer.com/legal/dpa). ## 6\. Output Data license Subject to these Terms and payment of fees, we grant you a non-exclusive, non-transferable license to use Output Data for your internal business purposes, including sales, marketing, and analytics. You may not sell, license, publish, or distribute Output Data to third parties, or use it to build a competing database, unless you have a signed Platform agreement with us. When a person asks you to stop contacting them, or we notify you that a person has opted out or requested deletion, you will stop using and delete that person's Output Data within 15 days. Identity data is probabilistic. We work to make Output Data accurate and publish our measured accuracy on our [Trust page](https://wholayer.com/trust), but we do not guarantee that any particular record is complete, current, or correct. ## 7\. Plans, credits, and billing - **Subscriptions.** Paid plans are billed in advance, monthly or annually, and renew automatically for the same period until cancelled. We will remind you by email at least 7 days before an annual plan renews. - **Credits.** Each plan includes a monthly allotment of credits. Credits are consumed as described on our [pricing page](https://wholayer.com/pricing). We only charge credits when we return a result; we do not charge for lookups that find nothing. - **Rollover.** Unused credits on paid plans roll over for one month and expire at the end of the month after the one in which they were issued. - **Overage.** If you use more credits than your plan includes, paid plans continue and we bill the overage at your plan's per-credit rate at the end of the billing month. You can set a hard monthly spending cap on the Usage page of your account. On the Free plan, person-level results pause until the next month; company-level ID continues. - **Cancellation.** You can cancel at any time from the Billing page of your account. Monthly plans remain active until the end of the paid period. Annual plans cancelled within the first 30 days receive a prorated refund for the unused portion. Otherwise fees are non-refundable except as these Terms or the law require. - **Price changes.** We will give you at least 30 days' notice of price increases, which take effect at your next renewal. - **Taxes.** Fees exclude taxes. You are responsible for applicable sales, use, and similar taxes, other than taxes on our income. - **Late payment.** If payment fails, we will notify you and may suspend the Service if it remains unpaid 10 days after notice. ## 8\. Suspension We may suspend your access, in whole or in part, if we reasonably believe your use violates these Terms or the law, creates a security risk, or exposes WhoLayer or any person to harm. We will tell you why and give you a chance to fix the problem unless the law or the risk prevents it. ## 9\. Confidentiality Each party will protect the other's non-public information with at least reasonable care and use it only to perform under these Terms. This does not apply to information that is public, already known to the recipient, independently developed, or rightfully received from a third party. A party may disclose confidential information when legally required, after giving notice where allowed. ## 10\. Intellectual property We own the Service, our software, our identity graph, and all improvements to them. You may not reverse engineer, scrape, or copy the Service, or use it to build a competing product. If you send us feedback, we may use it without obligation to you. ## 11\. Warranties and disclaimers Each party warrants that it has authority to enter into these Terms. We warrant that the Service will perform materially as described in our documentation. Your sole remedy for breach of this warranty is for us to fix the issue or, if we cannot, to let you terminate and refund prepaid fees for the affected period. Except as expressly stated, the Service and Output Data are provided “as is,” and we disclaim all implied warranties, including merchantability, fitness for a particular purpose, accuracy, and non-infringement. ## 12\. Indemnification **You will defend and indemnify WhoLayer** against third-party claims, and resulting fines, damages, and reasonable legal fees, arising from (a) your websites, privacy notices, and consent practices; (b) your emails, calls, texts, and other outreach, including claims under the CAN-SPAM Act, the TCPA, and state telemarketing laws; (c) your use of Output Data in violation of these Terms or the law; or (d) Customer Data. **We will defend and indemnify you** against third-party claims alleging that the Service, as provided by us, infringes intellectual property rights, or that we obtained the data we supply to you in violation of law or of our suppliers' contracts. The indemnified party must give prompt notice, allow the indemnifying party to control the defense, and cooperate reasonably. No settlement that imposes obligations on the indemnified party may be made without its consent. ## 13\. Limitation of liability Except for your payment obligations, your indemnity obligations, and either party's breach of confidentiality: (a) neither party is liable for indirect, incidental, special, consequential, or punitive damages, or lost profits or revenue; and (b) each party's total liability arising out of these Terms will not exceed the fees you paid or owed to WhoLayer in the 12 months before the event giving rise to the claim. ## 14\. Term and termination These Terms apply while you have an account or a subscription. Either party may terminate for material breach that is not cured within 30 days of written notice. When these Terms end, your right to use the Service ends, and you must delete Output Data that you obtained during the term within 30 days, except data you are required by law to keep. Sections 5, 6 (deletion duties), 9, 10, 11, 12, 13, 15, and 16 survive. ## 15\. Disputes These Terms are governed by the laws of the State of Delaware, without regard to conflict of laws rules. **Any dispute arising out of these Terms or the Service will be resolved by binding individual arbitration administered by JAMS under its Streamlined Arbitration Rules, and not in a class or representative action.** Either party may bring an individual claim in small claims court or seek injunctive relief in court for misuse of intellectual property or confidential information. Before starting arbitration, a party must send written notice of the dispute and attempt in good faith to resolve it for 30 days. ## 16\. General - **Changes to these Terms.** We may update these Terms. We will give at least 30 days' notice of material changes by email or in the product. Continued use after the effective date means you accept the changes. - **Assignment.** Neither party may assign these Terms without consent, except to a successor in a merger, acquisition, or sale of substantially all of its assets. - **Order forms.** If you sign an order form with us, it controls over these Terms where they conflict. - **Notices.** We send notices to the email address on your account. Send notices to us at [legal@wholayer.com](mailto:legal@wholayer.com). - **Force majeure.** Neither party is liable for delay caused by events beyond its reasonable control. - **Entire agreement.** These Terms, the policies they reference, and any order form are the entire agreement on this subject. If a provision is unenforceable, the rest remains in effect. - **Publicity.** We will not use your name or logo without your permission. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Privacy Policy Effective November 16, 2026. WhoLayer, Inc. WhoLayer, Inc. (“WhoLayer,” “we”) is an identity data company. We help businesses recognize the people and companies who visit their websites and reach them with accurate contact information. This policy explains what personal information we collect, where it comes from, what we do with it, and the choices you have. **If you want us to stop selling or sharing your information, or to delete it,** use our [privacy request page](https://wholayer.com/privacy-request) or email [privacy@wholayer.com](mailto:privacy@wholayer.com). You do not need an account. ## 1\. Who this policy covers - **Consumers in our identity data.** People whose information is in the database we use to provide our services, including people who visit websites that use the WhoLayer tag. You probably do not have a direct relationship with us, which is why the law treats us as a data broker. - **Our customers and prospects.** People who use, buy, or ask about WhoLayer. - **Visitors to wholayer.com.** ## 2\. What we collect and where it comes from In the last 12 months we collected the following categories of personal information: | Category | Examples | Sources | Why we use it | Sold or shared to | Disclosed to service providers | How long we keep it | | --- | --- | --- | --- | --- | --- | --- | | IdentifiersA. Identifiers | Name, email addresses, hashed email addresses, phone number, IP address, cookie and device identifiers | Data suppliers, publisher partners, the WhoLayer tag on customer websites | Identifying website visitors for the customer whose site was visited; providing contact data to customers; verifying and correcting data; honoring opt-outs | Our business customers (sold or shared) | Yes: hosting and database, email delivery, email and phone verification | Contact details revealed through the Data API: 90 days. Cached API responses: 30 days. People identified on a customer's website: kept in that customer's workspace until the workspace is deleted. Everything is removed as soon as the person opts out or asks us to delete it. | | Professional informationI. Professional or employment-related information | Job title, seniority, department, employer, professional profile URL | Data suppliers, public business sources | Business-to-business sales and marketing data for customers | Our business customers (sold or shared) | Yes: hosting and database | Contact details revealed through the Data API: 90 days. Cached API responses: 30 days. People identified on a customer's website: kept in that customer's workspace until the workspace is deleted. Everything is removed as soon as the person opts out or asks us to delete it. | | Commercial informationD. Commercial information | Products or pages viewed on a customer's website, inferred purchase interest, and for Shopper ID, whether and how much a shopper later bought from that store (read from the store's own Klaviyo) | The WhoLayer tag on customer websites | Reporting visits to the customer whose website was visited | Only the customer whose website you visited | Yes: hosting and database | Page events: 13 months. High-intent signals: 13 months. Shopper ID order amounts: 13 months. | | Internet or network activityF. Internet or other electronic network activity | Pages visited, referrer, time of visit, browser and device type | The WhoLayer tag on customer websites | Reporting visits to the customer whose website was visited; security and fraud prevention | Only the customer whose website you visited | Yes: hosting and database | Page events: 13 months. Log of what we sent to a customer's tools: 13 months. | | General geolocationG. Geolocation data | City, state, and country derived from IP address. We do not collect precise geolocation. | IP address lookup | Limiting person-level identification to the United States; reporting visits | Our business customers (sold or shared) | Yes: IP-to-location lookup, hosting and database | Kept with the page event (13 months) or identity record it belongs to. | | InferencesK. Inferences | Inferred seniority, company size, likely interests | Derived by us | Helping customers prioritize who to contact | Our business customers (sold or shared) | Yes: hosting and database | Kept with the identity record it belongs to, and deleted with it. | | Customer account dataA. Identifiers and B. Customer records | Name, work email, company, billing details, support conversations | You, when you create an account or contact us | Providing, billing, and supporting the service; communicating with you | Not sold or shared | Yes: hosting, email delivery, payment processing | For the life of the account, plus 7 years for tax and accounting. | Our sources include: - **Data suppliers** that license identity and business contact data to us under contracts requiring that the data was collected lawfully and with the notices the law requires. - **Publisher partners** that operate consent-aware networks of websites and share device-to-person links with us. - **The WhoLayer tag**, which our customers install on their websites. When you visit such a site, the tag sends us the page you viewed, your IP address, your browser and device type, and cookie identifiers. - **Public business sources**, such as company websites, press releases, and government business registries. - **You**, when you contact us, create an account, or submit a privacy request. **We do not scrape LinkedIn or other sites in violation of their terms.** We require our suppliers to promise the same. ## 3\. Sensitive personal information We do not knowingly collect, sell, or share sensitive personal information such as Social Security numbers, financial account numbers, precise geolocation, health information, racial or ethnic origin, religious beliefs, sexual orientation, citizenship or immigration status, or information about children. Our customers are prohibited from installing the WhoLayer tag on websites relating to these topics or directed to children, and we block person-level identification on pages whose web address indicates these topics. We do not knowingly collect or sell personal information of consumers under 16. ## 4\. How we use personal information - To identify the companies and, in the United States, the people visiting our customers' websites, and report that to the customer whose site was visited. - To provide contact and company data, such as verified email addresses and phone numbers, to our customers for business-to-business sales and marketing and for ecommerce marketing. - To verify, correct, and keep our data accurate, including checking whether email addresses are deliverable. - To honor opt-out and deletion requests across all of our products. - To run, secure, and improve our services, prevent fraud and abuse, and comply with law. - For our customers and prospects: to provide the service, bill, support, and communicate with you, including marketing you can unsubscribe from. We do not use personal information to make decisions about anyone's eligibility for credit, insurance, employment, or housing, and we prohibit our customers from doing so. ## 5\. Who we disclose personal information to - **Our customers.** Businesses that subscribe to WhoLayer receive identity and contact data. This is a “sale” or “sharing” of personal information under California law and similar state laws. - **Service providers** that host, store, email, and process payments for us, listed on our [subprocessors page](https://wholayer.com/legal/subprocessors). They may only use personal information to provide services to us. - **Data suppliers**, with whom we exchange limited identifiers, such as hashed email addresses, to match and verify records. When you opt out or are deleted, we record hashed identifiers to pass to the suppliers and service providers that hold your information, so they can act on your request too. - **Authorities**, when required by law or to protect rights, safety, and property. - **A successor business**, if we are involved in a merger, acquisition, financing, reorganization, or sale of assets. Any successor will be bound by this policy for the information it receives, and we will give notice before personal information becomes subject to a different policy. ## 6\. How long we keep it - Website visit events from the WhoLayer tag: 13 months, then deleted. - Contact details revealed through the Data API: 90 days, then deleted. - Cached Data API responses (for safe retries): 30 days, then deleted. - Async Data API jobs: the rows a customer sent and the results we returned: 30 days after the job is created, then deleted; a person's data is removed from results immediately when they opt out or ask us to delete it. - Log of what we delivered to a customer's tools: 13 months, then deleted. - High-intent signals, daily ingest counters, and digest send records: 13 months, then deleted. - People identified on a customer's website: Until the customer's workspace is deleted, or immediately when the person opts out or asks us to delete it. - Shopper ID decisions for a customer's store (a one-way hash of the shopper's email, whether they were sent, held out, or already the store's subscriber): Kept with the identified person's record and deleted with it, or immediately when the person opts out or asks us to delete it. - Shopper ID check of whether a hashed email is already in the store's Klaviyo: 30 days, then deleted. - Email of a shopper waiting on a Klaviyo check (encrypted): 8 days at most, then deleted. - Shopper ID Returning Shopper send log and holdout order amounts (hashed email, dates, amounts): 13 months, then deleted. - Suppression records (a one-way hash of your email address, phone number, or other identifier): As long as we operate, so we keep honoring your request. We can't honor an opt-out if we forget it.. - California DROP deletion requests (hashed identifiers): As long as the request stands, only to keep honoring it. - Privacy request records: At least 24 months. - Customer account and billing records: for the life of the account plus 7 years for tax and accounting. When you opt out or ask us to delete your information, we remove what we hold about you right away, and a daily job catches anything collected later. ## 7\. Your privacy rights Depending on where you live, including California, Colorado, Connecticut, Delaware, Indiana, Iowa, Kentucky, Maryland, Minnesota, Montana, Nebraska, New Hampshire, New Jersey, Oregon, Rhode Island, Tennessee, Texas, Utah, and Virginia, you may have the right to: - **Opt out** of the sale or sharing of your personal information, and of targeted advertising and profiling. - **Delete** personal information we hold about you. - **Know and access** the categories and specific pieces of personal information we hold, the sources, the purposes, and who we disclosed it to, and receive a portable copy. - **Correct** inaccurate personal information. - **Limit** the use of sensitive personal information. - **Appeal** our decision on your request. Email [privacy@wholayer.com](mailto:privacy@wholayer.com) with the subject “Appeal” and your request number. If we deny your appeal, you can contact your state attorney general. **We offer these rights to everyone in the United States, regardless of state.** We will not discriminate against you for exercising them. ### How to make a request - Online: [wholayer.com/privacy-request](https://wholayer.com/privacy-request) - Email: [privacy@wholayer.com](mailto:privacy@wholayer.com) ### How we verify requests - **Opt out and limit:** no verification. They take effect on our suppression list the moment you submit, and we remove what we already hold. - **Delete:** we treat it as an opt-out at once and start deleting, then email you a one-time link to confirm you control the email address. - **Know, access, know what we sold or shared, and correct:** we email you a one-time link to confirm you control the email address before we respond. The link works for 7 days. - **DROP deletion requests:** California verifies them; we never contact you to verify one. We respond within 45 days and will tell you if we need up to 45 more days. We never require you to create an account. ### Authorized agents You can have someone else make a request for you: on our [request form](https://wholayer.com/privacy-request), the agent ticks “I'm an authorized agent” and enters their own name and email. We will ask the agent for your signed permission and may ask you to confirm your identity directly, unless the agent holds a power of attorney. Opt-outs from an agent take effect immediately. ### Global Privacy Control We treat a Global Privacy Control (GPC) signal from your browser as a request to opt out of sale and sharing for that browser. The WhoLayer tag on customer websites sends nothing for a browser with GPC turned on, so we never identify it. wholayer.com itself doesn't sell or share information about its visitors. When your browser sends GPC, our site footer shows “Opt-out preference signal honored.” GPC works per browser. It can't reach information we hold about you that isn't tied to that browser, such as a work email address from a business data provider. To opt out everywhere, use our [request form](https://wholayer.com/privacy-request). ### California Delete Act (DROP) California residents can ask every registered data broker, including WhoLayer, to delete their information at once through the [California Delete Request and Opt-out Platform (DROP)](https://privacy.ca.gov/drop/). Once our California registration is complete, we will: - Download our DROP deletion lists at least every 45 days, and every 30 days from January 1, 2027. - Match them against the email addresses and phone numbers we hold, which DROP provides only as one-way hashes. - Delete what we hold about everyone who matches, and stop selling or sharing it. - Keep requests that match nothing on our suppression list, so we never sell information about you that we collect later. - Report the result of every request back to DROP. We never contact you to verify a DROP request. ### New Jersey residents (Daniel's Law) If you are a covered person under New Jersey's Daniel's Law, or an authorized person acting for one, email [privacy@wholayer.com](mailto:privacy@wholayer.com) with the subject “Daniel's Law.” We will stop disclosing your home address and unpublished phone number within 10 business days. ### Other jurisdictions We do not identify individual visitors outside the United States. If you live outside the US and believe we hold your personal information, email [privacy@wholayer.com](mailto:privacy@wholayer.com) and we will respond under the laws that apply to you. ## 8\. Data broker registration | State | Status | | --- | --- | | california | Registration pending (California Delete Act) | | vermont | Registration pending | | texas | Registration pending | | oregon | Registration pending | ## 9\. Request metrics Each calendar year we publish how many privacy requests we received, how many we complied with in whole or in part, how many we denied and why, and how many days we took to respond. The figures below are calculated from our request records. **No requests yet.** We haven't received any privacy requests or DROP deletion requests so far. This table fills in automatically as requests arrive. ## 10\. Security We protect personal information with encryption in transit and at rest, access controls, logging, and vendor reviews, as described in our [Trust page](https://wholayer.com/trust). No system is perfectly secure. If a breach affects your information, we will notify you as the law requires. ## 11\. Our website On wholayer.com we use essential cookies and privacy-friendly analytics. See our [Cookie Policy](https://wholayer.com/legal/cookies). ## 12\. Changes We review this policy at least once a year. If we make material changes, we will update the effective date and, for customers, notify you by email. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Data Processing Addendum Effective November 16, 2026. WhoLayer, Inc. This Data Processing Addendum (“DPA”) forms part of the [Terms of Service](https://wholayer.com/legal/terms) between WhoLayer, Inc. (“WhoLayer”) and Customer. It applies automatically when Customer accepts the Terms. Customers who need a countersigned copy can request one from [legal@wholayer.com](mailto:legal@wholayer.com). ## 1\. Definitions “Data Protection Laws” means all privacy and data protection laws that apply to the processing of personal information under the Terms, including the California Consumer Privacy Act as amended (“CCPA”), other US state privacy laws, and, where applicable, the EU and UK GDPR. “Customer Personal Data” means personal information in Customer Data that WhoLayer processes on Customer's behalf. Terms such as “controller,” “processor,” “service provider,” “sell,” and “share” have the meanings given in Data Protection Laws. ## 2\. Roles - **Customer Personal Data.** For personal information Customer sends to the Service, such as tag events from Customer's website and records Customer uploads, Customer is the business or controller and WhoLayer is the service provider or processor. - **Output Data.** For identity and contact data that WhoLayer supplies to Customer from its own database, WhoLayer and Customer are each independent businesses or controllers, and each is responsible for its own compliance. ## 3\. Processing instructions WhoLayer will process Customer Personal Data only to provide the Service under the Terms, on Customer's documented instructions (including through Customer's configuration of the Service), and as required by law. The subject matter, nature, purpose, categories of data, and categories of data subjects are described in Annex 1. WhoLayer will tell Customer if it believes an instruction violates Data Protection Laws. ## 4\. CCPA service provider terms With respect to Customer Personal Data, WhoLayer will not: - sell or share it; - retain, use, or disclose it for any purpose other than the business purposes in the Terms, including for its own commercial purposes or to build or improve profiles for other customers; - retain, use, or disclose it outside the direct business relationship with Customer; - combine it with personal information WhoLayer receives from other sources, except as the CCPA permits to perform the business purposes for Customer. WhoLayer will comply with the CCPA, provide the same level of privacy protection the CCPA requires, notify Customer if it can no longer meet its obligations, and allow Customer to take reasonable steps to stop and remediate unauthorized use. WhoLayer certifies that it understands these restrictions. ## 5\. Confidentiality and personnel WhoLayer will ensure that anyone authorized to process Customer Personal Data is bound by confidentiality obligations and receives appropriate privacy and security training. ## 6\. Security WhoLayer will maintain the technical and organizational measures in Annex 2 and may update them as long as protection is not materially reduced. ## 7\. Subprocessors Customer authorizes WhoLayer to use the subprocessors listed on our [subprocessors page](https://wholayer.com/legal/subprocessors). WhoLayer will impose data protection terms on each subprocessor that are at least as protective as this DPA and remains responsible for their performance. We will give at least 30 days' notice of a new subprocessor by updating that page and emailing customers who subscribe to updates. Customer may object on reasonable data protection grounds; if we cannot resolve the objection, Customer may terminate the affected Service and receive a prorated refund. ## 8\. Consumer requests WhoLayer will help Customer respond to requests from individuals exercising their privacy rights, taking into account the nature of the processing. If WhoLayer receives a request about Customer Personal Data, it will direct the individual to Customer unless the request also concerns WhoLayer's own data, in which case WhoLayer will handle that part directly. Opt-outs and deletions WhoLayer receives are added to its global suppression list across all customers. ## 9\. Security incidents WhoLayer will notify Customer without undue delay, and in any event within 72 hours, after becoming aware of a breach of security leading to the accidental or unlawful destruction, loss, alteration, unauthorized disclosure of, or access to Customer Personal Data. The notice will describe the incident, the data affected, the likely consequences, and the measures taken, and WhoLayer will update Customer as more information becomes available. Notice is not an admission of fault. ## 10\. Audits On request no more than once a year, WhoLayer will provide its most recent third-party security audit report or, until one is available, a completed security questionnaire. If that is not enough to show compliance, Customer may conduct an audit on 30 days' notice, during business hours, at its own cost, under confidentiality terms, and without access to other customers' data. ## 11\. International transfers WhoLayer stores and processes data in the United States. Person-level identification is not provided for visitors outside the United States. Where company-level identification involves personal data from the EEA, UK, or Switzerland, the parties agree to the EU Standard Contractual Clauses (Module 2, controller to processor), with the UK Addendum and Swiss amendments as applicable, which are incorporated by reference. Customer is responsible for obtaining any consent required before such data is collected. ## 12\. Deletion and return Within 30 days after the Terms end, WhoLayer will delete Customer Personal Data, except copies it must keep by law, which remain protected by this DPA. Customer may export its data before termination. ## 13\. Customer responsibilities Customer is responsible for providing the notices and obtaining the consents Data Protection Laws require for WhoLayer to process Customer Personal Data, including a privacy policy that discloses use of WhoLayer and a mechanism to opt out of sale and sharing that suppresses the WhoLayer tag. ## Annex 1: Description of processing
Data subjectsVisitors to Customer websites; individuals in records Customer submits; Customer's users.
Categories of dataIP address, cookie and device identifiers, browser and device type, pages viewed, referrer, timestamps; names, email addresses, phone numbers, job titles and companies in submitted records; user account details.
Sensitive dataNone. Customer must not send sensitive data or install the tag on sensitive pages.
PurposeIdentifying website visitors, enriching and verifying records, delivering results to Customer's tools, and operating and securing the Service.
DurationThe term of the Terms, plus the deletion period in section 12. Tag events are kept up to 13 months.
FrequencyContinuous.
## Annex 2: Security measures - Encryption in transit (TLS 1.2 or higher) and at rest (AES-256). - Single sign-on and multi-factor authentication for all staff access to production systems; least-privilege access reviewed quarterly. - Hashing of email addresses used for suppression and matching. - Logical separation of each customer's data. - Centralized logging of administrative access, retained 12 months. - Automated dependency and vulnerability scanning; critical vulnerabilities patched within 7 days. - Daily encrypted backups with point-in-time recovery; restore tested at least twice a year. - Vendor security review before onboarding any subprocessor. - A written incident response plan tested at least once a year. - A SOC 2 Type II audit program, with the audit currently in progress. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Acceptable Use Policy Effective November 16, 2026. WhoLayer, Inc. WhoLayer is for business-to-business sales and marketing, ecommerce marketing, and analytics. This policy is part of our [Terms of Service](https://wholayer.com/legal/terms). If you are unsure whether a use is allowed, ask us at [legal@wholayer.com](mailto:legal@wholayer.com) before you start. ## Where you may not install the WhoLayer tag Do not install the tag on any page, app, or site that relates to: - physical or mental health conditions, treatments, medications, or providers, including telehealth and pharmacy; - reproductive or sexual health, including fertility, pregnancy, abortion, and contraception; - sexual orientation, gender identity, or sex life; - religious beliefs or places of worship; - immigration or citizenship status; - criminal records, arrests, bail, or legal defense; - debt relief, bankruptcy, payday lending, or other financial hardship; - addiction and recovery services; - union membership or political affiliation; - content directed to, or known to be used by, children under 16; - domestic violence or victim services. We block person-level identification on web pages about these topics. Installing the tag on sites in these categories is a material breach. ## What you may not do with WhoLayer data - **Eligibility decisions.** Use data to decide anyone's eligibility for credit, insurance, employment, housing, education, or benefits, or for any other purpose covered by the Fair Credit Reporting Act. - **Discrimination.** Use data to discriminate on the basis of a protected characteristic, or to exclude people from housing, employment, or credit advertising. - **Harassment and stalking.** Locate, track, surveil, harass, threaten, or intimidate anyone, or find a specific person for a personal reason. - **Law enforcement and immigration.** Provide data to law enforcement, immigration, or intelligence agencies except as required by valid legal process served on you. - **Political targeting.** Use data for political campaigns, voter targeting, or issue advocacy unless you have a signed agreement with us that allows it. - **Illegal outreach.** Send email that violates CAN-SPAM or similar laws, or make calls or texts that violate the TCPA, the Telemarketing Sales Rule, Do Not Call rules, or state law. Do not send marketing texts or autodialed calls to mobile numbers from WhoLayer without consent you obtained yourself. - **Ignoring opt-outs.** Contact anyone who has unsubscribed from you or asked you to stop, or continue to use data about anyone we have told you has opted out or requested deletion. - **Resale.** Sell, license, publish, or otherwise give WhoLayer data to third parties, or combine it into a list or database for others, without a signed Platform agreement. - **Sensitive inferences.** Combine WhoLayer data with other data to infer sensitive characteristics about a person. - **Fraud and deception.** Impersonate anyone, send phishing, or otherwise deceive people. ## What you may not do to the Service - Scrape, crawl, or bulk-download the Service other than through our documented API and exports. - Share API keys or create multiple free accounts to avoid limits. - Probe, scan, or test the security of the Service without our written permission. Report vulnerabilities through [our contact form](https://wholayer.com/contact?topic=security). - Interfere with the Service, other customers, or our suppliers. - Use the Service to build a competing identity or contact data product. - Exceed the limits in our [Fair Use Policy](https://wholayer.com/legal/fair-use). ## AI agents and automation You may connect AI agents, workflows, and scripts to WhoLayer through the API or MCP server. Everything they do counts as your use and must follow this policy. Do not let an agent send outreach on your behalf without the opt-out, sender identity, and suppression controls the law requires. ## Enforcement If we believe you have violated this policy, we may remove data, suspend features, suspend your account, or terminate the Terms. Where the violation creates legal risk for people in our data, we may act immediately and tell you afterward. Report suspected misuse to [legal@wholayer.com](mailto:legal@wholayer.com). --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Cookie Policy Effective November 16, 2026. WhoLayer, Inc. This policy covers two things: the cookies on wholayer.com, and how the WhoLayer tag works when one of our customers installs it on their website. ## Cookies on wholayer.com We keep this site light. We do not use advertising cookies or third-party tracking pixels on wholayer.com. | Cookie | Type | Purpose | Duration | | --- | --- | --- | --- | | `__Secure-better-auth.session_token` | Essential | Keeps you signed in to your WhoLayer account. Set only when you log in. | 7 days, renewed while you use the dashboard | | `better-auth.dont_remember` | Essential | Set only if you choose not to stay signed in, so your session ends when you close the browser. | Session | | `_wl_ref` | Referral (first-party) | Set only when you arrive through a partner's referral link (?ref=). Holds that partner's code so we can credit them if you create an account. Read only by WhoLayer; not used for advertising or shared. | 90 days | | `Vercel Web Analytics` | Analytics | Counts page views without cookies or cross-site identifiers. | No cookie set | Essential cookies are needed for the site to work, so they cannot be turned off. You can block cookies in your browser, but you may not be able to sign in. ## The WhoLayer tag on customer websites Our customers install a small piece of JavaScript, the WhoLayer tag, on their websites. When you visit one of those sites, the tag sends us the page you are viewing, the referring page, your IP address, your browser and device type, and the identifiers below. We use that information to tell the website owner which company, and in the United States which person, is likely visiting, so they can follow up. | Cookie (set on the customer's domain) | Purpose | Duration | | --- | --- | --- | | `_wl_vid` | Random visitor identifier for the customer's site, so repeat visits are not billed twice. | 13 months | | `_wl_sess` | Groups page views into a visit. | 30 minutes | | `_wl_opt` | Records that this browser has opted out, so the tag stays off. | 5 years | ### Built-in limits on the tag - **Global Privacy Control.** If your browser sends a GPC signal, the tag does not identify you and sends us nothing beyond what is needed to recognize the opt-out. - **Opt-outs.** If you have opted out with us or with the website, the tag stays off for your browser and we suppress your identity everywhere. - **United States only for people.** Visitors outside the United States are never identified as individuals. Outside the US, company-level identification only runs after the site's consent banner records your consent where the law requires it. - **No sensitive pages.** Customers may not install the tag on pages about health, religion, sexual orientation, and other sensitive topics, or on sites for children. See our [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use). - **No form contents.** The tag does not read what you type into forms, and it does not record your screen. ### How to opt out - Turn on Global Privacy Control in your browser or use a browser that sends it by default. - Use the “Do Not Sell or Share” link on the website you are visiting. - Submit a request on our [privacy request page](https://wholayer.com/privacy-request). This opts you out across every WhoLayer customer, not only one website. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Subprocessors Effective November 16, 2026. WhoLayer, Inc. These are the third parties that process personal information on our behalf to provide the WhoLayer service. Each one is bound by a written agreement with data protection terms at least as protective as our Data Processing Addendum. ## Infrastructure | Vendor | Purpose | Location | | --- | --- | --- | | Vercel Inc. | Application hosting, content delivery, serverless compute | United States | | Neon, Inc. (a Databricks company) | Managed Postgres database | United States | | Resend, Inc. | Transactional email delivery | United States | | Stripe, Inc. | Payment processing and billing | United States | | Anthropic, PBC (via Vercel AI Gateway) | AI assistant responses: the chat text, plus, for signed-in customers, the workspace data the assistant reads to answer. ICP scoring setup: the customer's ideal-customer description and, when they re-tune it, the job titles and company facts (never names or contact details) of up to 50 records they marked as a good or poor fit | United States | Logos are trademarks of their owners and indicate compatibility, not endorsement. ## Identity data partners We work with a small number of data partners in each category below. Because supplier relationships are commercially sensitive, we list them by category here and provide names to customers under a confidentiality agreement. Request the list at [legal@wholayer.com](mailto:legal@wholayer.com). | Category | Purpose | Location | | --- | --- | --- | | Identity network partners | Consent-aware publisher networks that link browser and device identifiers to people, used for person-level visitor identification | United States | | Business data partners | Company and professional contact data used for enrichment | United States | | Reverse-IP partners | Mapping IP addresses to companies for company-level identification | United States | | Verification partners | Checking email deliverability and phone line type and carrier | United States | Every data partner must promise in writing that its data was collected lawfully, with the notices the law requires, and not by scraping sites in violation of their terms. Every partner receives and applies our opt-out and deletion requests. ## Changes We give at least 30 days' notice before adding a subprocessor. To get an email when this list changes, write to [legal@wholayer.com](mailto:legal@wholayer.com) with the subject “Subprocessor updates.” --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Fair Use Policy](https://wholayer.com/legal/fair-use), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Fair Use Policy Effective November 16, 2026. WhoLayer, Inc. WhoLayer is priced on credits, so you pay for what you use. This policy keeps the service fast for everyone, including customers who connect AI agents that make thousands of calls. It is part of our [Terms of Service](https://wholayer.com/legal/terms). ## Credits are the limit, not a hidden cap There is no secret ceiling on paid plans. You can use as many credits as you are willing to pay for, at the rates on our [pricing page](https://wholayer.com/pricing). Set a monthly spend cap on the Usage page of your dashboard if you want a hard stop, and a daily cap on any API key. ## API and MCP rate limits | Plan | Requests per second, per API key | Rows per /bulk request | | --- | --- | --- | | Free | 2 | 1,000 | | Starter | 10 | 1,000 | | Growth | 25 | 1,000 | | Scale | 100 | 1,000 | | Platform | Up to 1,000 | Custom | When you hit a limit, the API returns HTTP 429 with a `Retry-After` header. Requests that are rate-limited are never charged. Need more? Ask about Platform. ## What counts as unfair use - Using several accounts or API keys to get around limits or free credits. - Repeating the same lookup in a tight loop. Send an `Idempotency-Key` header and retries of the same request are free for 30 days, so there is no reason to. - Systematically downloading our database, for example by walking search results across every company or title. - Reselling results or exposing the API to third parties without a Platform agreement. ## Agents Agents are welcome. Give each agent its own API key so you can see and cap its usage separately. If an agent misbehaves, for example by looping, we may pause that key and email you rather than suspend your account. ## What we do about it We will contact you first and work with you to fix the problem. If abuse continues or puts the service at risk, we may throttle or suspend the affected key or account. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Customer notice templates](https://wholayer.com/legal/customer-notice). --- [Legal](https://wholayer.com/legal) # Customer notice templates Effective November 16, 2026. WhoLayer, Inc. If you install the WhoLayer tag, your privacy policy must tell visitors about it before the tag runs (see section 3 of our [Terms](https://wholayer.com/legal/terms)). This page gives you sample wording to start from, and the links and code that go with it. **These are starting points, not legal advice.** Using them does not by itself make your website compliant with any law. Have your own lawyer review and adapt them for your business, the states and countries your visitors come from, and any consent requirements that apply to you. ## 1\. Privacy policy paragraph: Visitor ID (B2B) Add this to your privacy policy, and replace \[YOUR OPT-OUT LINK\] with your own opt-out page. ``` Visitor identification We use WhoLayer, a third-party service, to understand which companies and people visit our website. When you visit, WhoLayer's tag collects information such as the pages you view, your IP address, your browser and device type, and an identifier stored in a cookie. WhoLayer uses this information, together with information it obtains from its own data partners, to tell us which company you work for and, for visitors in the United States, who you may be and how to contact you, such as your name, job title, and business email address. We use this to follow up with people who show interest in our products. Under California law and some other state laws, this may be a "sale" or "sharing" of personal information. You can opt out on our website at [YOUR OPT-OUT LINK], and you can opt out of WhoLayer for every website that uses it at https://wholayer.com/privacy-request. We honor Global Privacy Control: if your browser sends it, the WhoLayer tag does not collect or send anything. Outside the United States, WhoLayer identifies companies only, never individual people, and only after you agree through our cookie banner. ``` ## 2\. Privacy policy paragraph: Shopper ID (ecommerce) Use this instead if you send identified shoppers to your email marketing tools. ``` Shopper identification We use WhoLayer, a third-party service, to recognize visitors to our store. When you visit, WhoLayer's tag collects information such as the pages and products you view, your IP address, your browser and device type, and an identifier stored in a cookie. For visitors in the United States, WhoLayer may match this to an email address from its data partners and send it to our email marketing tools, so we may email you about products you viewed. Every email we send includes a way to unsubscribe. Under California law and some other state laws, this may be a "sale" or "sharing" of personal information. You can opt out on our website at [YOUR OPT-OUT LINK], and you can opt out of WhoLayer for every website that uses it at https://wholayer.com/privacy-request. We honor Global Privacy Control: if your browser sends it, the WhoLayer tag does not collect or send anything. ``` ## 3\. A “Your privacy choices” link Put a link like this in the footer of every page where the tag runs. Point it at your own opt-out page if you have one, and link to WhoLayer's opt-out from there. ``` Your privacy choices ``` To let visitors stop the tag in their own browser on your site, add a button that calls the tag's opt-out: ```

To opt out of WhoLayer on every website, visit https://wholayer.com/privacy-request.

``` ## 4\. If you use a cookie banner Outside the US the tag does nothing until your banner records consent. If you set your site to **Require consent everywhere** under Sites in your dashboard, the same applies to US visitors. Call the tag from your banner's accept and decline handlers: ``` ``` See [consent banners and non-US visitors](https://wholayer.com/help/consent-banners) for how the tag treats each visitor. ## 5\. Before you go live - Your privacy policy describes the tag (section 1 or 2 above) before the tag goes on your site. - Your footer has a “Your privacy choices” or “Do Not Sell or Share My Personal Information” link. - Sensitive pages are excluded, such as health, financial hardship, or anything for children. See [excluded paths](https://wholayer.com/help/excluded-paths). - Your cookie banner calls `wholayer("consent", …)` if you use one. - You only install the tag on websites you own or control. Last reviewed: draft, pending attorney review. --- ## Questions Email [legal@wholayer.com](mailto:legal@wholayer.com) or write to WhoLayer, Inc., 1309 Coffeen Avenue, Suite 1200, Sheridan, WY 82801. For privacy requests, use our [privacy request page](https://wholayer.com/privacy-request). Other policies: [Terms of Service](https://wholayer.com/legal/terms), [Privacy Policy](https://wholayer.com/legal/privacy), [Data Processing Addendum](https://wholayer.com/legal/dpa), [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use), [Cookie Policy](https://wholayer.com/legal/cookies), [Subprocessors](https://wholayer.com/legal/subprocessors), [Fair Use Policy](https://wholayer.com/legal/fair-use). --- # What WhoLayer does, in one minute > WhoLayer tells you who is visiting your website and gives you a verified way to reach them. Category: Getting started Most people who visit a website leave without filling in a form. WhoLayer recognizes some of those visitors and tells you who they are. ## Four products, one account - **Visitor ID** (B2B): the name, title, LinkedIn, and work email of US visitors, plus the company for everyone else. Sent to Slack, Teams, a webhook, or your CRM (HubSpot, Pipedrive, Attio, or Salesforce). - **Shopper ID** (ecommerce): a verified personal email for US shoppers who browse without signing in, sent to Klaviyo. - **Data API and MCP**: look up emails, mobiles, and company data from your own code, Clay, or an AI agent. - **Identity Cloud**: enterprise identity data by contract, for retailers, publishers, ad tech, and platforms. ## How you pay Everything draws from one credit wallet. One credit buys one identified person or one found email. Company-level visitor ID is free. If we don't find someone, you don't pay. See [how credits work](https://wholayer.com/help/how-credits-work). ## What we don't do - We don't identify individual people outside the US. - We don't scrape LinkedIn. - We don't return anyone who has opted out. Ready? Follow the [quickstart](https://wholayer.com/help/quickstart). ## Related - [Quickstart: your first identified visitor in 10 minutes](https://wholayer.com/help/quickstart.md) - [Which WhoLayer product do I need?](https://wholayer.com/help/choose-a-product.md) - [How credits work](https://wholayer.com/help/how-credits-work.md) --- # Quickstart: your first identified visitor in 10 minutes > Create an account, add your site, paste one tag, and connect a destination. Category: Getting started ## 1. Create an account Go to [Start free](https://wholayer.com/register). You get 100 credits every month and unlimited company-level ID. No card needed. ## 2. Add your site Onboarding asks for your domain and whether you're B2B or ecommerce. You'll get a site key that starts with `site_`. ## 3. Paste the tag Put this in the `` of every page, replacing the key with yours: ```html ``` Using a site builder? See the guides for [Google Tag Manager](https://wholayer.com/help/install-gtm), [Shopify](https://wholayer.com/help/install-shopify), [WordPress](https://wholayer.com/help/install-wordpress), [Webflow](https://wholayer.com/help/install-webflow), [Framer](https://wholayer.com/help/install-framer), or [Next.js](https://wholayer.com/help/install-nextjs). Then click **Check my install** (in onboarding, or under each site on **Sites**). We load your homepage and tell you if the tag is missing, has the wrong site ID, is on the page twice, or is blocked by your Content Security Policy, and we point out cookie banners that hold it until consent. Below that, **Waiting for your first visit…** switches on as soon as your first visit is stored. ## 4. Try it in sandbox mode New sites start in **sandbox mode**, which shows clearly fictional test people (on example.com addresses) so you can see the whole flow without spending credits. Visit your own site and open **People** in the dashboard. Read [sandbox vs live](https://wholayer.com/help/sandbox-vs-live). ## 5. Connect a destination Under **Destinations**, add [Slack](https://wholayer.com/help/destination-slack), [Microsoft Teams](https://wholayer.com/help/destination-teams), a [webhook](https://wholayer.com/help/destination-webhook), [Klaviyo](https://wholayer.com/help/destination-klaviyo), or a CRM: [HubSpot](https://wholayer.com/help/destination-hubspot), [Pipedrive](https://wholayer.com/help/destination-pipedrive), [Attio](https://wholayer.com/help/destination-attio), or [Salesforce](https://wholayer.com/help/destination-salesforce). Use **Send test** to check it. ## 6. Go live On **Sites**, turn sandbox off. From then on, real matches appear and spend credits. ## Related - [Sandbox mode vs live mode](https://wholayer.com/help/sandbox-vs-live.md) - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) - [Send identified visitors to Slack](https://wholayer.com/help/destination-slack.md) --- # Sandbox mode vs live mode > Sandbox shows fictional test data and spends nothing; live returns real people and spends credits. Category: Getting started ## Sandbox - Every new site starts in sandbox mode. - Matches are fictional people and companies on `example.com` and `example.org` addresses, labeled with the source "sandbox". - No credits are spent. - Use it to check your tag, filters, and destinations end to end. ## Live - Turn sandbox off for a site under **Sites**. - Matches are real and spend credits (one per person per calendar month). - Live sites only accept events sent from your own domain or its subdomains, so nobody else can spend your credits by copying your tag. ## For the API API keys work the same way: `wl_test_` keys return sandbox data and never spend credits; `wl_live_` keys return real data. See [test API keys](https://wholayer.com/help/test-api-keys). ## Related - [Quickstart: your first identified visitor in 10 minutes](https://wholayer.com/help/quickstart.md) - [Test keys and live keys](https://wholayer.com/help/test-api-keys.md) - [I don't see any visitors](https://wholayer.com/help/no-visitors.md) --- # Which WhoLayer product do I need? > A quick guide to picking Visitor ID, Shopper ID, the Data API, or Identity Cloud. Category: Getting started - **You sell to businesses** and want to know which companies and decision makers visit your site: **Visitor ID**. - **You run an online store** and want to email shoppers who browse without giving you an address: **Shopper ID**. - **You already have a list** of names or companies and need emails, mobiles, or company data: **Data API and MCP**. - **You need identity data at volume**, delivered by file or warehouse share, under a contract: **Identity Cloud**. You don't have to choose just one. Every product uses the same credits, so you can start with one and add another later. Not sure? Take the [two-minute quiz](https://wholayer.com/quiz) or use the [cost calculator](https://wholayer.com/calculator). ## Related - [What WhoLayer does, in one minute](https://wholayer.com/help/what-is-wholayer.md) - [How credits work](https://wholayer.com/help/how-credits-work.md) --- # Install the tag on any website (HTML) > Paste one script into the head of every page. Category: Install the tag 1. In the dashboard, open **Sites** and copy your site key. 2. Paste this just before `` on every page: ```html ``` 3. Publish, then visit your site in a new browser window. 4. Check **People** in the dashboard. In sandbox mode, test matches appear within a minute or two. ## Good to know - The tag is about 2 KB and loads asynchronously, so it doesn't slow your page down. - It uses first-party cookies only: `_wl_vid` (13 months) and `_wl_sess` (30 minutes). - It never reads form fields or records the screen. - It sends nothing for visitors whose browser sends Global Privacy Control. ## Related - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) - [I don't see any visitors](https://wholayer.com/help/no-visitors.md) - [Exclude pages (careers, account, checkout)](https://wholayer.com/help/excluded-paths.md) --- # Install with Google Tag Manager > Add the tag as a Custom HTML tag that fires on all pages. Category: Install the tag 1. In Tag Manager, go to **Tags**, then **New**. 2. Choose **Custom HTML** and paste: ```html ``` 3. Set the trigger to **All Pages**. 4. If you use a consent banner, add your marketing or analytics consent condition to the trigger, or follow [consent banners](https://wholayer.com/help/consent-banners). 5. Click **Submit**, then **Publish**. Use **Preview** in Tag Manager to confirm the tag fires, then check **People** in the WhoLayer dashboard. ## Related - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) --- # Install on Shopify > Add the tag to your theme so it loads on every storefront page. Category: Install the tag There isn't a WhoLayer app in the Shopify App Store yet, so you add the tag to your theme. It takes about two minutes. 1. In Shopify admin, go to **Online Store**, then **Themes**. 2. On your live theme, click the **...** menu and choose **Edit code**. 3. Open `layout/theme.liquid`. 4. Paste this just before ``: ```html ``` 5. Click **Save**. ## Tips - When you add the site in WhoLayer, choose **ecommerce** so matches are treated as shoppers for [Shopper ID](https://wholayer.com/help/shopper-id-how-it-works). - If you use Shopify's cookie banner or another consent app, see [consent banners](https://wholayer.com/help/consent-banners). - Switching themes? Paste the tag into the new theme too. ## Related - [How Shopper ID works](https://wholayer.com/help/shopper-id-how-it-works.md) - [Send shoppers to Klaviyo](https://wholayer.com/help/destination-klaviyo.md) - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) --- # Install on WordPress > Use a header-scripts plugin or your theme's header. Category: Install the tag ## Easiest: a header-scripts plugin 1. In WordPress, go to **Plugins**, then **Add New**. 2. Install a plugin that adds code to the site header, such as WPCode. 3. Paste the tag into the **Header** box and save: ```html ``` ## If you already use Google Tag Manager Add the tag through GTM instead. See [Google Tag Manager](https://wholayer.com/help/install-gtm). ## Caching plugins If you use a caching plugin, clear the cache after adding the tag so every page includes it. ## Related - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) - [Install with Google Tag Manager](https://wholayer.com/help/install-gtm.md) --- # Install on Webflow > Add the tag in Site settings under Custom code. Category: Install the tag 1. In Webflow, open **Site settings**, then **Custom code**. 2. Paste the tag into **Head code**: ```html ``` 3. Click **Save changes**, then **Publish** your site. Custom code only runs on the published site, not in the Webflow Designer preview. ## Related - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) --- # Install on Framer > Add the tag in Site settings under Custom Code. Category: Install the tag 1. In Framer, open **Site Settings**, then **General**, then **Custom Code**. 2. Paste the tag in **End of tag**: ```html ``` 3. Publish your site. Framer sites change pages without a full reload. The tag notices those page changes automatically, so every page view is counted. ## Related - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) - [Single-page apps (React, Vue, Svelte)](https://wholayer.com/help/install-spa.md) --- # Install on Next.js > Use next/script in your root layout. Category: Install the tag Add the tag to your root layout with `next/script`: ```tsx // app/layout.tsx import Script from "next/script"; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} ``` ## The command queue If you need to call the tag before it has loaded (for example, from a consent banner that renders first), queue the call: ```js window.wholayer = window.wholayer || function () { (window.wholayer.q = window.wholayer.q || []).push(arguments); }; window.wholayer("consent", true); ``` Queued calls run as soon as the tag loads. ## Related - [Install on Next.js](https://wholayer.com/help/install-nextjs.md) - [Tell WhoLayer about logged-in users](https://wholayer.com/help/identify-known-users.md) --- # Consent banners and non-US visitors > Tell the tag when a visitor gives consent; outside the US nothing runs without it. Category: Install the tag ## How the tag treats each visitor - **US visitors:** person-level and company-level matching run by default. - **Visitors outside the US:** nothing is stored or matched unless your banner records consent. With consent, we identify the **company only**, never the person. - **Global Privacy Control:** if the browser sends it, the tag sends nothing at all. ## Telling the tag about consent When a visitor accepts marketing or analytics cookies, call: ```js wholayer("consent", true); ``` If they decline or withdraw, call `wholayer("consent", false)`. ## Require consent everywhere If you'd rather ask everyone, including US visitors, set the site's consent mode to **Require consent everywhere** under **Sites**. Person-level matching then only runs for US visitors who consented. ## Letting visitors opt out of WhoLayer on your site Call `wholayer("optout")`. It sets a `_wl_opt` cookie for five years and the tag stops sending anything from that browser. ## Related - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) --- # Tell WhoLayer about logged-in users > Send a hashed email for visitors you already know to improve matching. Category: Install the tag If a visitor signs in or gives you their email, you can tell the tag: ```js wholayer("identify", "jane@example.com"); ``` The tag turns the email into a SHA-256 hash in the browser before sending it, so the plain address never leaves the page. The hash helps us match that visitor more reliably. Only call this for people who gave you their email directly, and make sure your privacy policy covers it. ## Related - [Single-page apps (React, Vue, Svelte)](https://wholayer.com/help/install-spa.md) --- # Exclude pages (careers, account, checkout) > Stop the tag from recording visits to certain paths. Category: Visitor ID Page exclusions are included on every plan, including Free. Under **Sites**, add **Pages to ignore**. Any page whose path starts with one of them is ignored: no event is stored, nothing is matched, and no credits are spent. On every plan, pages about health and other sensitive topics are never matched to a person. On the Free plan, keep the tag off any other pages you don't want recorded. Common exclusions: - `/careers` and `/jobs`, so job seekers don't show up as leads - `/account` and `/login`, for existing customers - Pages about sensitive topics, such as health conditions. Our [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use) requires this. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) --- # How Visitor ID identifies people and companies > Person-level matches for US visitors, company-level for everyone else, charged once per person per month. Category: Visitor ID ## What happens on each page view 1. The tag sends the page URL, referrer, a first-party cookie ID, and the browser's IP address and user agent. 2. If the visitor is in the US, we try a **person-level** match against our consent-aware identity network. 3. If there's no person match, or the visitor is outside the US and consented, we try a **company-level** match from the visitor's network. 4. We check every person against our suppression list. Anyone who has opted out is never returned. 5. The match appears under **People** and is sent to your destinations. ## What you get - **Person:** name, title, company, LinkedIn URL, location, and a verified work email when we have one. - **Company:** name, domain, industry, and size. ## What it costs - Company-level matches are **free and unlimited**. - A person costs **1 credit the first time they're identified in a calendar month**. Return visits that month are free and still show up in their visit history. ## How many visitors will you identify? It depends on how much of your traffic is from the US, from work networks, and from desktop browsers. Independent tests of person-level tools in this industry have measured roughly 2% to 20% of traffic, well below most vendors' headline claims. The honest way to know is to try it on your own traffic: the free plan is enough. See [low match rate](https://wholayer.com/help/low-match-rate). ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [Why is my match rate low?](https://wholayer.com/help/low-match-rate.md) - [How credits work](https://wholayer.com/help/how-credits-work.md) --- # Send only your best visitors (filters) > Each destination can filter by match type, pages viewed, job title keywords, and company size. Category: Visitor ID Every destination has its own filters. A person is sent only if they pass all the filters you set. - **Match types:** person, shopper, or company. - **Pages viewed contain:** for example `/pricing` or `/demo`. Matches if any page they viewed contains the text. - **Title keywords:** for example `vp`, `head`, `director`, `founder`. Matches if their title contains any keyword. - **Minimum employees:** only companies at or above this size. - **High-intent only** (Slack, Teams, and webhooks): only alert when someone already identified opens one of your [key pages](https://wholayer.com/help/high-intent-pages), like pricing. - **Minimum ICP score:** only people and companies that score at or above this against your [ideal customer](https://wholayer.com/help/icp-scoring). The match type and minimum ICP score filters work on every plan. Page, title, and company size filters are included on **Starter** and above. ## A common setup - Slack: persons, title keywords `vp, head, chief, founder`, pages containing `/pricing`. - HubSpot, Pipedrive, Attio, or Salesforce: all persons. - Webhook: everything, for your own warehouse. Filters decide where people are **sent**. Everyone matched still appears under **People**, and credits are spent when a person is identified, whether or not any destination receives them. ## Related - [Send identified visitors to Slack](https://wholayer.com/help/destination-slack.md) - [Exclude pages (careers, account, checkout)](https://wholayer.com/help/excluded-paths.md) - [How Visitor ID identifies people and companies](https://wholayer.com/help/visitor-id-how-it-works.md) --- # High-intent alerts: key pages like pricing > Get a tagged alert when someone you've identified opens pricing, comparison, demo, or other key pages. Category: Visitor ID Some pages say more than others. When someone you've already identified opens one of your **key pages**, we send a high-intent alert. ## Key pages Set them per site on the **Sites** page, one path per line. A page counts if its path starts with one of them. The defaults are: `/pricing`, `/compare`, `/vs`, `/alternatives`, `/demo`, `/contact`, `/security`, `/trust`. Leave the box empty to turn alerts off for that site. ## What you get - **Slack:** alerts are tagged, like "Viewed pricing" or "Compared alternatives". If the first visit itself is on a key page, the identification alert carries the tag, so you don't get two messages. - **Webhooks:** a separate `visitor.high_intent` event with the identity id, match level, page, and visit count. See the [payload](https://wholayer.com/docs/api#webhooks). - **Digest email** and **Overview:** high-intent visits are counted. To route only these to a channel, turn on **High-intent only** for that Slack or webhook destination. ## Limits - At most one high-intent alert per visitor per site every 24 hours. - Only for visitors we've already identified and are allowed to identify. Never for people who opted out, never on sensitive pages, and it costs no credits. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [Send identified visitors to Slack](https://wholayer.com/help/destination-slack.md) - [Webhooks: receive matches in your own system](https://wholayer.com/help/destination-webhook.md) - [Daily or weekly digest email](https://wholayer.com/help/email-digest.md) --- # The Companies page > Every company seen on your sites, with the people identified there, visits, and key-page views. Category: Visitor ID **Companies** in the dashboard groups everything we've matched by company: company-level matches (free) plus the company of each person identified. For each company you'll see its domain, size and industry when we have them, how many people were identified there, total visits, key-page views, and when they were last seen. Search by name or domain, or filter by site. Open a company to see the people identified there and the latest pages its visitors viewed. People who have opted out are never shown or counted. ## Related - [How Visitor ID identifies people and companies](https://wholayer.com/help/visitor-id-how-it-works.md) - [High-intent alerts: key pages like pricing](https://wholayer.com/help/high-intent-pages.md) - [Daily or weekly digest email](https://wholayer.com/help/email-digest.md) --- # ICP scoring: a fit score and a reason for every visitor > Describe your ideal customer in a sentence, and every identified person and company gets a 0-100 fit score with a plain-English reason. Category: Visitor ID Tell WhoLayer who you sell to, and it scores everyone it identifies from 0 to 100, with a one-line reason like "VP Sales at a 210-person SaaS company; viewed pricing twice". ## Set it up 1. Open **Ideal customer** in the dashboard. 2. Describe your best customers in one or two sentences, for example: "VP+ sales or marketing leaders at B2B SaaS companies with 50–1,000 employees in the US." 3. Save. A small AI model turns your sentence into scoring rules **once**. Check the rules it shows you in plain English, and edit any of them by hand. ## How a score is worked out Scoring uses those rules directly, with no AI per visitor, so it's instant and free. Each rule has a weight from 0 to 5: - **Job title** keywords, **seniority** (for example VP and above), and **department** (people only; they don't apply to company-level matches). - **Industry** and **company size** (employees). - **Country** the visit came from. - **Buying signals:** views of your key pages (like pricing), repeat visits, and how recently they came by. The score is the weighted share of rules a visitor matches. When we don't know something, like a company's size, it counts as a partial match rather than a miss. Titles with words you mark as "never a fit" (like intern) are capped at 15. Open any person to see **Why this score**, rule by rule. Visitors are scored when they're identified and again on every visit, so the score and reason are ready before an alert goes out. To score people identified before you set this up, or after you change the rules, use **Score everyone now**. Shoppers aren't scored. ## Use it - **People** and **Companies:** sort by ICP score and set a minimum score. A company's score is the best score among it and the people identified there. - **Destinations:** set a **Minimum ICP score** on any Slack, Teams, webhook, HubSpot, Pipedrive, Attio, or Salesforce destination. People and companies without a score aren't sent there. - **Slack and Teams alerts** show the score and reason, and so do the notes we add in HubSpot, Pipedrive, Attio, and Salesforce (no custom fields needed). **Webhooks** carry `icp_score` and `icp_reason` on `visitor.identified` and `visitor.high_intent`, and `GET /v1/visitors` returns them too. See the [payload](https://wholayer.com/docs/api#icp-score). ## Teach it with feedback On a person's page, mark them **Good fit** or **Not ICP**. Then use **Re-tune with feedback** on the Ideal customer page: we send your description, the current rules, and up to 50 of your most recent examples to the AI model once, and show you the new rules. Examples include job titles and company facts only, never names or contact details. You can re-tune 5 times a day, and rebuild from a new description 5 times a day. ## Good to know - It's on every plan and costs no credits. - Scores never use personal traits like age or gender, and the model is told to ignore them if a description mentions them. - A score helps you prioritize. It isn't a prediction that someone will buy. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [High-intent alerts: key pages like pricing](https://wholayer.com/help/high-intent-pages.md) - [The Companies page](https://wholayer.com/help/companies-view.md) - [Webhooks: receive matches in your own system](https://wholayer.com/help/destination-webhook.md) --- # How Shopper ID works > Recognizes anonymous US shoppers and sends a verified personal email to Klaviyo. Category: Shopper ID ## Setup 1. Add your store under **Sites** and choose **ecommerce**. 2. Install the tag on your store. See [Shopify](https://wholayer.com/help/install-shopify) or [HTML](https://wholayer.com/help/install-html). 3. Add a [Klaviyo destination](https://wholayer.com/help/destination-klaviyo). ## What happens When a US shopper we recognize visits your store, we first check whether they're already in your Klaviyo. If they're new to you, we send Klaviyo an event called **WhoLayer Shopper Identified** with their email and the pages they viewed. If they're already in your Klaviyo, we charge half price and don't create anything; we send a **WhoLayer Returning Shopper** event with the products they viewed instead. In Klaviyo, use these events as flow triggers, for example a browse-abandonment flow. See [what we guarantee with Klaviyo](https://wholayer.com/help/shopper-id-klaviyo-guarantees). ## Plan and costs Shopper ID with Klaviyo sync is included on the **Growth** plan and above. Each new shopper costs 2 credits, once, and is refunded if they bounce or mark you as spam within 30 days. Shoppers already on your list cost half: 1 credit. Holdout shoppers, and return visits we recognize by our own cookie, are free. Without a Klaviyo destination, each shopper costs 2 credits the first time they're identified in a calendar month. ## Use it in flows, not blasts These shoppers didn't sign up for your list. Send them a relevant, honest message tied to what they browsed, include your business address and a working unsubscribe link (CAN-SPAM requires both), and honor opt-outs right away. See [your responsibilities](https://wholayer.com/help/customer-obligations). ## Related - [Shopper ID and Klaviyo: what you're charged for, refunds, the daily cap, and the holdout](https://wholayer.com/help/shopper-id-klaviyo-guarantees.md) - [Klaviyo schema: WhoLayer profile properties and events](https://wholayer.com/help/klaviyo-schema.md) - [Send shoppers to Klaviyo](https://wholayer.com/help/destination-klaviyo.md) - [Install on Shopify](https://wholayer.com/help/install-shopify.md) - [Emails are bouncing](https://wholayer.com/help/emails-bouncing.md) - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) --- # Shopper ID and Klaviyo: what you're charged for, refunds, the daily cap, and the holdout > Half price for shoppers already in your Klaviyo, refunds for bounces and complaints, a self-adjusting daily cap, and a built-in holdout. Category: Shopper ID These apply to live ecommerce sites once you've added a [Klaviyo destination](https://wholayer.com/help/destination-klaviyo). Your Klaviyo key needs Profiles (read and write), Events (read and write), and Metrics (read). ## Shoppers already on your list cost half Before we charge for a shopper, we look their email up in your Klaviyo: - **New to you:** we create the profile, send **WhoLayer Shopper Identified**, and charge 2 credits, once. - **Already a profile:** we don't create a duplicate, send **WhoLayer Returning Shopper**, and charge 1 credit, half price, because finding them still costs us a match. We remember the answer by a hash of the email for 30 days (24 hours when they weren't found), so we don't ask Klaviyo again on every visit. If we match the same person again on another device, that match is charged at the half price. We only match new shoppers while your Klaviyo key has worked in the last 24 hours. If Klaviyo has a short outage after we've matched someone, we don't charge or send yet: the shopper waits, hidden from your People list, we retry every hour, and once Klaviyo answers they're charged as above. We pause new matching while 20 or more shoppers are waiting. ## Returning Shopper events When a shopper who is already in your Klaviyo, or one we sent you before, comes back, we send a **WhoLayer Returning Shopper** event with the product pages they viewed, at most once per shopper per day. Use it to trigger your browse-abandonment flow for people who are already opted in. Return visits we recognize by our own first-party cookie, or by the hashed email your site passes with `wholayer("identify")`, are free, because they need no paid lookup. ## Refunds for bounces and spam complaints Every day we read your Klaviyo's Bounced Email and Marked Email as Spam events. If a shopper we sent you bounces (soft bounces, like a full inbox, don't count) or marks your email as spam within 30 days of delivery, we refund the credits automatically and never send that shopper again. Refunds show on the **Usage** page. They share the [refund limit](https://wholayer.com/help/how-credits-work) with reported results: up to 10% of the credits you spent in the last 30 days; above that, our team reviews them. ## Deliverability Guard: a daily cap that adjusts itself Each store has a daily limit on new contacts (200 by default; change it under **Sites**). Once a day we read your Klaviyo account's last 7 days of email: - **Spam complaint rate** = spam complaints ÷ emails received. - **Bounce rate** = bounces ÷ (emails received + bounces). If complaints are over 0.08% or bounces over 2%, we halve today's cap (it pauses below 5). When both are healthy, it rises 10% a day back to your setting. With fewer than 200 emails a week the rates are too noisy to act on, so the cap follows your setting. When the cap is full, we stop matching new shoppers for the day, so you're never charged for someone we can't send. The **Sites** page shows the current rates, the cap, and why. ## Built-in holdout By default 10% of new shoppers (not already in your Klaviyo) go into a holdout group, chosen by a fixed hash of their email. We never send or charge for them, and keep only a hash of their email. Each day we count Placed Order events in your Klaviyo for both groups, within 30 days of each shopper's first match, and the **Sites** page compares purchase rates and revenue per shopper. The report waits until each group has at least 50 shoppers with a full 30 days, shows a 95% range for the difference, and is an estimate, not a guarantee. Set the holdout to 0% (up to 20%) under **Sites**; shoppers already in the holdout stay out. ## How the holdout is paid for Holdout shoppers are free for you, but each one still costs us a paid match. We never sell below cost, so the holdout is paid for out of the shoppers you're charged for: each new-shopper charge covers 0.12 of a holdout shopper and each half-price charge 0.06, over the last 30 days. When that doesn't cover the next one, the shopper who would have gone to the holdout is sent and charged as usual instead. A new store starts this way, and the holdout begins once enough charges cover it. The **Sites** page tells you when the holdout is paused. ## Related - [How Shopper ID works](https://wholayer.com/help/shopper-id-how-it-works.md) - [Klaviyo schema: WhoLayer profile properties and events](https://wholayer.com/help/klaviyo-schema.md) - [Send shoppers to Klaviyo](https://wholayer.com/help/destination-klaviyo.md) - [Emails are bouncing](https://wholayer.com/help/emails-bouncing.md) --- # Klaviyo schema: WhoLayer profile properties and events > The wl_ profile properties and the two WhoLayer events we write to Klaviyo, and what we read. Category: Shopper ID ## Profile properties Set on profiles we create for new shoppers (never added to profiles that were already in your Klaviyo): - `wl_source`: "WhoLayer Shopper ID". - `wl_match_type`: "first_party_hashed_email" when the email matches the hashed email your site passed with `wholayer("identify")`; the resolver's match type (for example "deterministic" or "probabilistic") when it reports one; otherwise "identity_graph". - `wl_confidence`: 0 to 1. Only when the resolver returns one; otherwise left off. - `wl_first_seen`: when we first identified the shopper on your site (ISO 8601, UTC). - `wl_consent_ref`: the data supplier's consent reference for this record. Left off when there isn't one. Use them in segments, for example `wl_source` equals "WhoLayer Shopper ID". ## Events - **WhoLayer Shopper Identified**: a new shopper, once. Properties: `pages` (last 10 paths), `visits`, `site`, `source`, `test`. - **WhoLayer Returning Shopper**: a shopper already in your Klaviyo (or one we sent before) came back, or a paid match turned out to be already in your Klaviyo (charged half price). At most once a day per shopper; the event itself is free. Properties: `viewed_urls` (last 10), `viewed_products` (URLs containing /products/), `last_viewed_url`, `visits`, `site`, `source`. ## What we read Once a day: 7-day counts of Received Email, Bounced Email, and Marked Email as Spam, plus Bounced Email, Marked Email as Spam, and Placed Order events with the profile's email. We hash each email to match shoppers we sent or held out, and store only the hash, the date, and order amounts for matches. Full table: [Klaviyo schema](https://wholayer.com/docs/integrations#klaviyo-schema). ## Related - [Shopper ID and Klaviyo: what you're charged for, refunds, the daily cap, and the holdout](https://wholayer.com/help/shopper-id-klaviyo-guarantees.md) - [Send shoppers to Klaviyo](https://wholayer.com/help/destination-klaviyo.md) --- # Data API quickstart > Create a key and make your first enrichment call with curl. Category: Data API and MCP ## 1. Create a key In the dashboard, open **API keys** and create a key. Choose **test** to start: test keys return sandbox data and never spend credits. The full key is shown once, so copy it somewhere safe. ## 2. Call the API ```bash curl https://api.wholayer.com/v1/people/enrich \ -H "Authorization: Bearer wl_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"domain":"fieldline.example.com","first_name":"Dana","last_name":"Okafor"}' ``` ## 3. Check your balance ```bash curl https://api.wholayer.com/v1/balance -H "Authorization: Bearer wl_test_YOUR_KEY" ``` ## Endpoints - `POST /v1/people/enrich`: emails, and a mobile if you ask for one - `POST /v1/people/search`: find people by title, seniority, company, location (test keys today; live results coming soon) - `POST /v1/emails/verify`: check deliverability - `POST /v1/phones/lookup`: mobile with carrier and line type (Growth and above) - `GET /v1/companies/{domain}`: company profile - `GET /v1/visitors`: people and companies identified on your sites - `POST /v1/bulk`: up to 1,000 rows per call - `POST /v1/jobs`: up to 100,000 rows, processed in the background ([async jobs](https://wholayer.com/help/async-bulk-jobs)) - `GET /v1/balance`: credits remaining - `POST /v1/estimate`: free quote of the most a call could cost - `POST /v1/report`: report a bad result and get its credits back ([how refunds work](https://wholayer.com/help/report-bad-data)) Every response carries an `X-Credits-Used` header, 0 when the call was free. Full reference: [API docs](https://wholayer.com/docs/api). Try one in your browser on the [Data API page](https://wholayer.com/products/data-api). ## Related - [Test keys and live keys](https://wholayer.com/help/test-api-keys.md) - [API error codes and what to do](https://wholayer.com/help/api-errors.md) - [Connect Claude, ChatGPT, Cursor, or any MCP client](https://wholayer.com/help/mcp-setup.md) - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) --- # Test keys and live keys > wl_test_ keys return fictional data for free; wl_live_ keys return real data and spend credits. Category: Data API and MCP - **`wl_test_...`**: every endpoint and MCP tool works, returns fictional data on `example.com` addresses, and never spends credits. Responses include `"test_mode": true`. - **`wl_live_...`**: real data, and credits are spent only when a result is returned. Build and test your integration with a test key, then swap in a live key. Nothing else changes. ## Related - [Data API quickstart](https://wholayer.com/help/api-quickstart.md) - [Sandbox mode vs live mode](https://wholayer.com/help/sandbox-vs-live.md) - [Keep your API keys safe](https://wholayer.com/help/api-key-security.md) --- # Connect Claude, ChatGPT, Cursor, or any MCP client > Add the WhoLayer MCP server so your AI agent can enrich contacts. claude.ai and ChatGPT connect by signing in, no key needed. Category: Data API and MCP **Server URL:** `https://mcp.wholayer.com/mcp` (Streamable HTTP). Connect by signing in (OAuth), or send an API key in the `Authorization: Bearer` header. ## claude.ai, Claude Desktop, and Claude mobile 1. Go to **Customize, Connectors** and click **Add custom connector** (on Team and Enterprise plans, an Owner adds it under **Organization settings, Connectors**). 2. Paste `https://mcp.wholayer.com/mcp`. If asked, choose **Sign in now** and **Use Claude's published identity**. Leave the client ID and secret empty. 3. Click **Add**, then **Connect**. Log in to WhoLayer, choose the workspace, the access, and the daily credit cap, and click **Connect**. ## ChatGPT 1. Open **chatgpt.com/plugins**, select **+**, then **Add custom MCP server**. 2. Name it WhoLayer, paste the URL, and choose **OAuth** for authentication. 3. Sign in to WhoLayer when asked and approve. In a new chat, type `@` and pick WhoLayer. Availability of custom connectors depends on your Claude or ChatGPT plan. ## What you approve when an app signs in - **Workspace:** the app sees only that workspace's data and spends only its credits. Owners and admins can connect apps. - **Access:** look people up and spend credits (default), or read only (free tools only). - **Daily credit cap:** 100 credits by default. Change it, or leave it empty for no cap. Connected apps are listed under **API keys, Connected apps**, where you can disconnect one at any time. It stops working immediately. ## Claude Code with an API key ```bash claude mcp add --transport http wholayer https://mcp.wholayer.com/mcp --header "Authorization: Bearer wl_test_YOUR_KEY" ``` ## Cursor Add to `~/.cursor/mcp.json`: ```json { "mcpServers": { "wholayer": { "url": "https://mcp.wholayer.com/mcp", "headers": { "Authorization": "Bearer wl_test_YOUR_KEY" } } } } ``` ## Tools `enrich_person`, `search_people`, `verify_emails`, `lookup_phone`, `get_company`, `list_visitors`, `get_balance`, `estimate_cost` (free quote), `get_compliance_policy`, `report_bad_data` (refund for a bad result), and `add_to_suppression`. Every tool reports the credits it used and how many remain, and declares MCP annotations (read-only, destructive, idempotent, open-world) so your client can ask before paid calls. Start with a test key so your agent can practice for free, then set [spend caps](https://wholayer.com/help/agent-spend-caps) before giving it a live key. ## VS Code, Claude Desktop, and other clients The [MCP server docs](https://wholayer.com/docs/mcp) have copy-ready config for Claude Desktop, VS Code, and any other client, plus an Add to Cursor button. ## Docs-only server, no sign-in To let an assistant read WhoLayer's docs, pricing, and help center without an account, connect `https://mcp.wholayer.com/docs`. It has `search_docs`, `read_page`, `get_pricing`, `get_products`, and `list_help_articles`, and works as a custom connector in claude.ai and ChatGPT with no authentication. ## Related - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) - [Test keys and live keys](https://wholayer.com/help/test-api-keys.md) - [Data API quickstart](https://wholayer.com/help/api-quickstart.md) --- # Keep an AI agent from overspending > Daily caps per key, a per-call ceiling, read-only keys, and free retries. Category: Data API and MCP Agents loop. Set limits before you hand one a live key. - **Daily cap per key:** when creating a key, set a maximum number of credits per day. Once reached, calls fail with `credits_exhausted` until the next UTC day. - **Daily cap per connected app:** apps that sign in (claude.ai, ChatGPT) get the cap chosen on the consent screen, 100 credits a day by default, enforced the same way. You can also connect them read only. - **Per-call ceiling:** one call can't spend more than 250 credits unless you raise it with the `X-Max-Credits` header (REST) or `max_credits` argument (MCP), up to 10,000. - **Read-only keys:** can only list visitors, look up companies, check the balance, get cost quotes, and read the compliance policy and your suppression-list count. They can't reveal contact details or change your suppression list. - **Free quotes:** `POST /v1/estimate` (REST) or `estimate_cost` (MCP) returns the most a call could spend before the agent runs it. - **Free retries:** send an `Idempotency-Key` header (REST) and repeated identical requests within 30 days return the saved result at no charge. Identical MCP tool calls are also free within 30 days. - **Workspace overage limit:** set under **Usage** so the whole workspace can't go past a limit you choose. ## Related - [Connect Claude, ChatGPT, Cursor, or any MCP client](https://wholayer.com/help/mcp-setup.md) - [Running out of credits, overage, and limits](https://wholayer.com/help/overage-and-spend-caps.md) - [API error codes and what to do](https://wholayer.com/help/api-errors.md) --- # Enrich or verify big lists with async jobs > POST /v1/jobs takes up to 100,000 rows, runs them in the background, and caps the whole job's spend. Category: Data API and MCP `POST /v1/bulk` handles up to 1,000 rows while you wait. For bigger lists, start a job and come back for the results. ## Start a job ```bash curl https://api.wholayer.com/v1/jobs \ -H "Authorization: Bearer wl_test_YOUR_KEY" -H "Content-Type: application/json" \ -d '{"operation":"enrich","max_credits":5000,"rows":[{"external_id":"crm-1","name":"Dana Okafor","company_domain":"fieldline.com","reveal":["work_email"]}]}' ``` - `operation`: `enrich` (each row is a `/people/enrich` body) or `verify` (each row is `{"email": "..."}`). - Up to 100,000 rows. Add `external_id` to any row to match results back to your CRM. - Files over 4 MB: gzip the body and send `Content-Encoding: gzip`. - The MCP server has the same thing as `create_job` and `get_job`. ## What it costs Each row is billed exactly like a single call, and only on hits. Verify jobs charge each address once per job. Credit costs are on the [pricing page](https://wholayer.com/pricing). `max_credits` (default 250, up to 2,000,000) caps the whole job. If the job could cost more than that in the worst case, it's refused before anything runs, and it never spends past it while running. Quote it first for free with `POST /v1/estimate` (`operation` `bulk` or `verify`, plus `rows`). Test keys (`wl_test_...`) run sandbox jobs and never spend. ## Follow progress - `GET /v1/jobs/{id}`: status (queued, running, completed, failed), progress, and credits used. - Or pass `webhook_url` when you create it: we send a signed `job.completed` or `job.failed` event, with the same signature headers as our other webhooks. - Up to 2 jobs can be queued or running per workspace at once. A job stops early if your wallet, overage limit, or a key's daily cap runs out, or if the key that created it is revoked. Rows it didn't reach come back as `not_processed`; send them in a new job. ## Get the results `GET /v1/jobs/{id}/results` returns rows in order, 100 per page by default (`limit` up to 1,000, then `cursor`). Add `?format=csv` to download everything as a spreadsheet. People who opted out, are on a deletion list, or are on [your suppression list](https://wholayer.com/help/your-suppression-list) are never returned: the row says `person_not_available` with a reason and isn't charged. We check again every time you read results, so someone who opts out after the job ran is withheld too. Results are deleted 30 days after the job was created. ## Related - [Data API quickstart](https://wholayer.com/help/api-quickstart.md) - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) - [API error codes and what to do](https://wholayer.com/help/api-errors.md) - [Upload your own suppression list](https://wholayer.com/help/your-suppression-list.md) --- # API error codes and what to do > Every error the API returns, and how to fix it. Category: Data API and MCP Errors look like `{"error": {"code": "...", "message": "..."}}`. - **400 `invalid_request`**: a field is missing or malformed. The message names the field. - **401 `unauthorized`**: missing, wrong, or revoked key. Send `Authorization: Bearer wl_live_...`. - **402 `credits_exhausted`**: out of credits on the free plan, a key's daily cap or your overage limit was reached, or (agency client workspaces) the client's monthly budget is used up. - **403 `forbidden`**: a read-only key tried an endpoint that reveals contact details or adds to your suppression list. - **403 `plan_restricted`**: your plan doesn't include this feature, such as mobile numbers (Growth and above). The error's `required_plan` says which plan does. Upgrade under **Billing**. - **404 `person_not_available`**: no match for this person. You're not charged. - **409 `duplicate_request`**: you reused an `Idempotency-Key` with a different request body. - **413 `payload_too_large`**: more than 1,000 rows in one `/bulk` call (use an [async job](https://wholayer.com/help/async-bulk-jobs) instead), more than 100,000 rows in one job, or your suppression list would pass 1,000,000 entries. - **451 `person_not_available`**: the person is withheld. `error.reason` says why: `opted_out` (opted out or asked for deletion), `drop_deleted` (California DROP deletion list), or `customer_suppressed` (on your own suppression list). No data is returned and you're not charged. - **429 `rate_limited`**: too many requests per second, or two async jobs are already queued or running in your workspace. Wait for the `Retry-After` seconds. Limits per second: Free 2, Starter 10, Growth 25, Scale 100. - **503 `provider_unavailable`**: a data source is temporarily unavailable, or the lookup is switched off on live keys. Live people search is off until we've confirmed its supplier cost (1 credit per 10 results once it's on); test keys work now. Retry later; you weren't charged. ## Related - [Data API quickstart](https://wholayer.com/help/api-quickstart.md) - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) - [Upload your own suppression list](https://wholayer.com/help/your-suppression-list.md) --- # Read our compliance rules from the API > GET /v1/policy and the get_compliance_policy MCP tool return the rules WhoLayer enforces, as JSON. Free. Category: Data API and MCP `GET https://api.wholayer.com/v1/policy` (or the `get_compliance_policy` MCP tool) returns a versioned JSON document generated from the same code that enforces it. It's free and works with read-only keys. It covers: - Person-level identification in the US only; outside the US, company level only and only after consent; sites set to wait for consent everywhere. - Global Privacy Control: requests with `Sec-GPC: 1` are dropped. - The sensitive-page categories and keywords where we never identify people. - Where suppression is checked, the suppression sources, and the `451` reason codes. - Retention periods for page events, the delivery log, revealed API people, and the idempotency cache. - A reminder that phone numbers mustn't be used for calls or texts without the consent the TCPA requires. Give it to your agent so it knows what WhoLayer will and won't do before it calls other tools. ## Related - [API error codes and what to do](https://wholayer.com/help/api-errors.md) - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) - [Upload your own suppression list](https://wholayer.com/help/your-suppression-list.md) --- # Identity Cloud: data licensing for enterprises > Person-level resolution, identifiers, and attributes under contract, with a free match test first. Category: Identity Cloud Identity Cloud is for companies that need identity data at volume: retailers filling in their CDP, publishers enriching audiences, ad tech platforms, and products that want to embed identity. ## How it starts 1. [Tell sales](https://wholayer.com/contact?topic=sales) what you need to resolve and how you'll use it. We confirm it fits our [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use). 2. We run a **free match test** on a sample of your records so you see real coverage before you sign. 3. Delivery is set up by contract: API, files, warehouse share, or managed audiences. ## Pricing Volume pricing from $0.02 a credit with an annual commitment of 250,000+ credits a month. ## What it can't be used for Credit, employment, insurance, or housing decisions, or anything else covered by the Fair Credit Reporting Act. WhoLayer is not a consumer reporting agency. ## Related - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) --- # Report a wrong match and get a refund > Report a wrong person, a bounced email, or outdated details within 30 days and we refund the credits for that result. Category: Credits and billing If we gave you a wrong person, an email that bounced, or details that are out of date, tell us and we'll give the credits back. ## How to report - **Dashboard:** open the person under **People** and use **Report a wrong match**. - **API:** `POST /v1/report` with `result_id` (the `per_` id from `/people/enrich` or `/phones/lookup`) or `identity_id` (a visitor's `person_id` from `/visitors`), plus a `reason`: `wrong_person`, `bounced`, or `outdated`. - **MCP:** the `report_bad_data` tool takes the same fields. ## What happens - We refund the credits charged for that result if it was charged in the last 30 days. Each result can be refunded once. - We flag it, so it's never delivered to your destinations or returned by the API again. - Refunds in any rolling 30 days are capped at 10% of the credits your workspace spent in that window. Above the cap, the report waits for our team to review it, and nothing is refunded automatically until then. Refunds show in your **Usage** ledger as "Refund for a reported result". See [Fair billing](https://wholayer.com/fair-billing) for every billing rule. ## Related - [How credits work](https://wholayer.com/help/how-credits-work.md) - [Running out of credits, overage, and limits](https://wholayer.com/help/overage-and-spend-caps.md) - [API error codes and what to do](https://wholayer.com/help/api-errors.md) --- # How credits work > One wallet for every product; you pay only when we return something. Category: Credits and billing Every product draws from the same monthly credit balance. ## What a credit buys - Company identified on your site: **free** - Person identified on your site: **1 credit**, once per person per calendar month - Shopper identified for ecommerce (new to your list): **2 credits**; with a Klaviyo destination once per new shopper and refunded if they bounce or complain within 30 days, without one once per shopper per calendar month - Shopper recognized who is already in your Klaviyo: **1 credit** (half price, never duplicated) - Work email found and verified: **1 credit** - Personal email found and verified: **2 credits** - Reverse email lookup (send an email, get the person): **10 credits**, only when we find them - Mobile number with carrier check: **5 credits** - Email verification only: **0.25 credits** per address - Company profile: **1 credit** - People search: **1 credit per 10 results** (test keys today; live results coming soon) You're never charged when nothing is found, or for anyone who has opted out. If a result is wrong, [report it for a refund](https://wholayer.com/help/report-bad-data). Every rule is on [Fair billing](https://wholayer.com/fair-billing). ## When credits arrive Plan credits are added on the 1st of each month. On paid plans, unused credits roll over for one month. Free plan credits don't roll over. See [Pricing](https://wholayer.com/pricing) or estimate your cost with the [calculator](https://wholayer.com/calculator). ## Related - [Plans, upgrading, and annual billing](https://wholayer.com/help/plans-and-upgrades.md) - [Running out of credits, overage, and limits](https://wholayer.com/help/overage-and-spend-caps.md) - [How Visitor ID identifies people and companies](https://wholayer.com/help/visitor-id-how-it-works.md) --- # Plans, upgrading, and annual billing > Free, Starter $49, Growth $199, Scale $799, or Platform by contract. Upgrade any time. Category: Credits and billing ## Plans (monthly) - **Free:** $0, 100 credits, 1 site - **Starter:** $49, 1,000 credits, 1 site - **Growth:** $199, 5,000 credits, 3 sites - **Scale:** $799, 20,000 credits, 10 sites - **Platform:** custom contract, volume pricing from $0.02 a credit with an annual commitment of 250,000+ credits a month Paying yearly saves about 16% compared with monthly. ## Upgrading Open **Billing** in the dashboard and choose a plan. You'll pay through a secure Stripe checkout page. The new plan's credits are added as soon as the payment goes through, so you can use them right away. ## Invoices and payment method Use **Manage billing** on the Billing page to update your card or download invoices. ## Related - [How credits work](https://wholayer.com/help/how-credits-work.md) - [Cancel or downgrade](https://wholayer.com/help/cancel-or-downgrade.md) - [Running out of credits, overage, and limits](https://wholayer.com/help/overage-and-spend-caps.md) --- # Running out of credits, overage, and limits > Free accounts pause; paid accounts keep working and pay overage, unless you set a limit. Category: Credits and billing ## Free plan When credits run out, person-level matching pauses until the 1st of next month. Company-level matching keeps working because it's free. ## Paid plans Matching keeps working. Extra credits are billed at your plan's overage rate and added to your next invoice: - Starter: $0.06 a credit - Growth: $0.05 a credit - Scale: $0.045 a credit ## Set a limit On **Usage**, set an **overage limit**. When it's reached, paid matching stops until next month, so you never pay more than you planned. For API keys you can also set a [daily cap per key](https://wholayer.com/help/agent-spend-caps). ## Related - [How credits work](https://wholayer.com/help/how-credits-work.md) - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) - [Plans, upgrading, and annual billing](https://wholayer.com/help/plans-and-upgrades.md) --- # Cancel or downgrade > Cancel any time from Billing; your plan runs until the end of the period. Category: Credits and billing 1. Open **Billing** and choose **Manage billing**. 2. Cancel or switch plans in the Stripe billing page. Monthly plans stay active until the end of the period you've paid for, then move to the free plan. Annual plans can be cancelled for a prorated refund in the first 30 days; after that they run to the end of the year. Your sites, people, and settings are kept on the free plan. Nothing is deleted or switched off when you move to a smaller plan. Extra sites, HubSpot or Klaviyo destinations, filters, page exclusions, and teammates keep working. You just can't add new ones, or change those settings, until you upgrade again. To remove everything instead, see [delete your workspace](https://wholayer.com/help/delete-workspace). ## Related - [Plans, upgrading, and annual billing](https://wholayer.com/help/plans-and-upgrades.md) - [Delete your workspace](https://wholayer.com/help/delete-workspace.md) --- # The affiliate program > Share your referral link and earn 25% of what your referrals pay, excluding tax, for 24 months. Category: Credits and billing ## Join Partner sign-up in the dashboard isn't open yet. [Apply on the Partners page](https://wholayer.com/partners) and we'll tell you when it opens. Once it does, you join from **Partners** in the dashboard and get your referral link right away. ## How referrals are counted - A click on your link sets a first-party cookie, `_wl_ref`, on wholayer.com for 90 days. It holds only your code. - If the visitor clicks another partner's link later, that link replaces yours (last click wins). - If they create a WhoLayer account within 90 days, their new workspace is credited to you. That's permanent: later clicks don't change it. - People who already have an account, or who join a teammate's workspace by invitation, aren't counted as referrals. - Clicks are counted as a daily total per link. We don't store IP addresses or anything else about the visitor. ## What you earn - **25%** of every payment a referred workspace makes, excluding tax, for **24 months** from its first payment. Upgrades count. - Commission is based on what we actually collect. If a payment is refunded or charged back, we deduct the matching commission. - Self-referrals don't earn commission: your own workspaces, sign-ups using your company email domain, and workspaces that share your billing account. ## Getting paid - Commission is **pending** for 30 days after each payment, then becomes **payable**. - We pay once a month, by hand, when your payable balance is at least **$50**. Below that it rolls over to the next month. - Choose **PayPal** (enter your PayPal email) or **bank transfer** (we'll contact you for your details) under **Payout method** on the Partners page. ## Your dashboard The **Partners** page shows your links with copy buttons, clicks, sign-ups, paying customers, pending, payable, and paid commission, and a statement of every commission, deduction, and payout. Agencies running WhoLayer for clients: see [Partners](https://wholayer.com/partners). ## Related - [Plans, upgrading, and annual billing](https://wholayer.com/help/plans-and-upgrades.md) - [How credits work](https://wholayer.com/help/how-credits-work.md) --- # Send identified visitors to Slack > Post each match to a Slack channel with a Slack incoming webhook. Category: Destinations 1. In Slack, create an **incoming webhook** for the channel you want (Slack's help center explains how: search "incoming webhooks"). Copy the URL, which starts with `https://hooks.slack.com/`. 2. In WhoLayer, open **Destinations**, choose **Slack**, and paste the URL. 3. Add [filters](https://wholayer.com/help/filters-and-hot-leads) so only the visitors you care about post to the channel. 4. Click **Send test**. A sample message should appear in Slack within seconds. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) --- # Webhooks: receive matches in your own system > We POST signed JSON to your HTTPS endpoint for every match. Category: Destinations ## Setup 1. Open **Destinations**, choose **Webhook**, and enter your HTTPS URL. 2. Copy the **webhook signing secret** shown on the same page. 3. Click **Send test**. ## Events - `visitor.identified`: a person or company identified on a B2B site. Company matches have `data.level = "company"`. - `shopper.identified`: a shopper identified on an ecommerce site. - `visitor.high_intent`: someone already identified opened one of your [key pages](https://wholayer.com/help/high-intent-pages), like pricing. At most once a day per visitor. It has no contact details; match it to the earlier event by `data.identity_id`. Turn on **High-intent only** on a webhook to receive just `visitor.high_intent`. ## Verify the signature Each request has a `WhoLayer-Signature` header in the form `t=,v1=`, where `v1` is the HMAC-SHA256 of `.` using your signing secret. Reject requests where `t` is more than 5 minutes old. A legacy `X-Wholayer-Signature` header (HMAC of the body only) is also sent for older integrations. ```js import { createHmac, timingSafeEqual } from "node:crypto"; function isFromWhoLayer(rawBody, header, secret) { const expected = createHmac("sha256", secret).update(rawBody).digest("hex"); return header && expected.length === header.length && timingSafeEqual(Buffer.from(expected), Buffer.from(header)); } ``` ## Retries Respond with any 2xx status within 10 seconds. Failed deliveries are retried with increasing delays for up to 24 hours. Open **Delivery log** under a destination on the Destinations page to see its last 50 deliveries with the status, response code, and error. Owners and admins can click **Resend** on a failed row to send the same event again. People who opted out, or results you reported as a wrong match, are never resent. Webhooks also work with Zapier, Make, and n8n: use their "catch webhook" trigger as the URL. ## Related - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) --- # Send shoppers to Klaviyo > Create a Klaviyo private API key and use the WhoLayer event to trigger flows. Category: Destinations 1. In Klaviyo, go to **Settings**, then **API keys**, and create a **private key** with **Profiles: Full** (read and write), **Events: Full** (read and write), and **Metrics: Read**. The read access lets us recognize shoppers already in your Klaviyo (half price, no duplicates), refund bounces and spam complaints, and run the Deliverability Guard. We only match new shoppers while the key has worked in the last 24 hours, so without read access Shopper ID doesn't match anyone new (and charges nothing). 2. In WhoLayer, open **Destinations**, choose **Klaviyo**, and paste the key. 3. Click **Send test**, then look for the **WhoLayer Shopper Identified** metric in Klaviyo. 4. Build a flow triggered by that metric. Browse-abandonment and cart-reminder flows work best. Build a second one on **WhoLayer Returning Shopper** for people already on your list. The event includes the shopper's email, name when known, and the pages they viewed, so you can personalize the message. Profiles we create carry `wl_` properties; see the [Klaviyo schema](https://wholayer.com/help/klaviyo-schema). ## Related - [How Shopper ID works](https://wholayer.com/help/shopper-id-how-it-works.md) - [Shopper ID and Klaviyo: what you're charged for, refunds, the daily cap, and the holdout](https://wholayer.com/help/shopper-id-klaviyo-guarantees.md) - [Klaviyo schema: WhoLayer profile properties and events](https://wholayer.com/help/klaviyo-schema.md) - [Emails are bouncing](https://wholayer.com/help/emails-bouncing.md) - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) --- # Send identified visitors to Microsoft Teams > Post each match to a Teams channel through a Teams Workflows webhook. Free on every plan. Category: Destinations Teams alerts look like the Slack ones: who it is, their company, email, the pages they viewed, and a tag like "Viewed pricing" when they hit one of your key pages. Free on every plan. ## Set it up 1. In Microsoft Teams, open the channel, select **More options (...)** next to it, then **Workflows**. 2. Pick the **Send webhook alerts to a channel** template, choose the team and channel, and select **Save**. 3. Copy the webhook URL the workflow shows. It usually ends in `environment.api.powerplatform.com` (older workflows use `logic.azure.com`). 4. In WhoLayer, open **Destinations**, choose **Microsoft Teams channel**, and paste the URL. 5. Click **Send test**. A sample card for "Avery Sample" should appear in the channel within a minute. ## Good to know - Old Office 365 connector URLs (`webhook.office.com`) no longer work. Microsoft retired them, so we don't accept them. - Turn on **High-intent only** to post only when someone already identified opens a key page, like pricing. - A workflow belongs to the person who created it. If they leave your company, ask your Teams admin to add a co-owner so the workflow keeps running. - The URL works like a password. We encrypt it when you save it and only ever show its first part. ## Related - [Send identified visitors to Slack](https://wholayer.com/help/destination-slack.md) - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [High-intent alerts: key pages like pricing](https://wholayer.com/help/high-intent-pages.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) --- # Send people to HubSpot > Create or update HubSpot contacts, link them to their company, and add a note with the pages they viewed. Category: Destinations HubSpot sync is included on the **Starter** plan and above. ## Set it up 1. In HubSpot, go to **Settings**, then **Integrations**, then **Private apps**, and create an app with these scopes: **crm.objects.contacts.read**, **crm.objects.contacts.write**, **crm.objects.companies.read**, and **crm.objects.companies.write**. Copy its access token. 2. In WhoLayer, open **Destinations**, choose **HubSpot**, and paste the token. 3. Click **Send test**. Look for a sample contact named Avery Sample, then delete it. ## What we write - **Contact:** created, or updated if the email already exists, with first and last name, job title, company name, and website. - **Company:** found by domain, or created with its name and domain, and linked to the contact. - **Note:** a timeline note on the contact with the pages viewed and the number of visits. Only people with an email address are sent. If your token only has the contact scope, contacts still sync and the delivery log says the company link was skipped. Your token is encrypted when you save it, and the dashboard only ever shows its first and last few characters. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) - [Send people to Pipedrive](https://wholayer.com/help/destination-pipedrive.md) - [Send people to Salesforce](https://wholayer.com/help/destination-salesforce.md) --- # Send people to Pipedrive > Create or update Pipedrive people and organizations, and add a note with the pages they viewed. Category: Destinations Pipedrive sync is included on the **Starter** plan and above. ## Set it up 1. In Pipedrive, open your account menu, then **Personal preferences**, then the **API** tab, and copy your personal API token. Records are created as the user who owns that token. 2. Note your company domain: the "yourcompany" in `yourcompany.pipedrive.com`. 3. In WhoLayer, open **Destinations**, choose **Pipedrive**, and paste the token and company domain. Optionally enter an **owner id**: the Pipedrive user who should own new people and organizations. 4. Click **Send test**. Look for a sample person named Avery Sample, then delete it. ## What we write - **Organization:** found by exact name, or created. - **Person:** found by exact email, or created, with name, job title, and the organization. - **Note:** on the person, with the pages viewed and the number of visits. Pipedrive only accepts job titles when its contact sync setting is on. If it's off, we save the person without the title and say so in the delivery log. Pipedrive allows one active API token per user: if you regenerate it, paste the new one into WhoLayer. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) - [Send people to HubSpot](https://wholayer.com/help/destination-hubspot.md) --- # Send people to Attio > Create or update Attio people by email, link them to their company, and add a note with the pages they viewed. Category: Destinations Attio sync is included on the **Starter** plan and above. ## Set it up 1. In Attio, open **Workspace settings**, then **Developers**, and create an access token. Give it read-write access to **records** and **notes**, and read access to **object configuration**. 2. In WhoLayer, open **Destinations**, choose **Attio**, and paste the token. 3. Click **Send test**. Look for a sample person named Avery Sample, then delete it. ## What we write - **Company:** found by domain, or created with that domain (Attio fills in the rest). Existing company names aren't changed. - **Person:** found by email address, or created, with name, job title, and the company link. - **Note:** on the person, with the pages viewed and the number of visits. Only people with an email address are sent. The token is encrypted when you save it. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) - [Send people to HubSpot](https://wholayer.com/help/destination-hubspot.md) --- # Send people to Salesforce > Connect Salesforce with a sign-in. We update matching Contacts or create and update Leads by email. Category: Destinations Salesforce sync is included on the **Scale** plan and above. If the option says **coming soon, needs setup**, our Salesforce app isn't switched on yet. Until it is, use a [webhook](https://wholayer.com/help/destination-webhook) with Zapier, Make, or n8n. ## Set it up 1. In WhoLayer, open **Destinations**, choose **Salesforce**, and pick your org type: **Production or Developer Edition**, or **Sandbox**. 2. Click **Connect Salesforce**, sign in with a Salesforce user that can create Leads and edit Contacts, and approve access. 3. You're sent back to Destinations. Click **Send test**, then look for Avery Sample under Leads and delete it. ## What we write - If a **Contact** already has the email: we update its title and log a completed activity with the pages viewed. We never create duplicate leads for your existing contacts. - Otherwise, a **Lead** is found by email (unconverted) or created, with first and last name, title, company, website, **Lead Source "WhoLayer"** (new leads only), and a description listing the pages viewed. ## Good to know - We store only an encrypted refresh token, and get short-lived access from it when we send. To disconnect, delete the destination here, and revoke WhoLayer under **Connected Apps OAuth Usage** in Salesforce. - If your Lead Source picklist is restricted, add a "WhoLayer" value, or we create leads without a source and say so in the delivery log. - If access is revoked, deliveries fail with a reconnect message. Edit the destination, tick **Reconnect**, and save. ## Related - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [My destination isn't receiving anything](https://wholayer.com/help/webhook-not-firing.md) - [Send people to HubSpot](https://wholayer.com/help/destination-hubspot.md) --- # Daily or weekly digest email > A short summary email of who visited, sent to the teammates you choose. Free on every plan. Category: Destinations ## Set it up 1. Open **Destinations** and scroll to **Email digest**. Owners and admins can add one. 2. Pick **Daily** (every morning, about 13:00 UTC) or **Weekly** (Monday mornings). 3. Tick who should get it, up to 10 people. Recipients must be members of your workspace with a verified email. Invite teammates under **Settings**. ## What's in it - How many people, shoppers, and companies were identified in the period, and how many high-intent visits there were. - The top 10 people and top 10 companies by visits, each linking to the dashboard. ## Good to know - We skip the email when nothing happened. - People who have opted out never appear. - No email addresses of the people identified are included, and there are no tracking pixels. - If someone leaves your workspace, they stop getting it automatically. ## Related - [High-intent alerts: key pages like pricing](https://wholayer.com/help/high-intent-pages.md) - [The Companies page](https://wholayer.com/help/companies-view.md) - [Invite your team](https://wholayer.com/help/team-members.md) --- # Your responsibilities when you use WhoLayer > Disclose it in your privacy policy, honor opt-outs, follow email and calling laws, and avoid prohibited uses. Category: Privacy and compliance This is a plain-language summary, not legal advice. The binding rules are in our [Terms](https://wholayer.com/legal/terms) and [Acceptable Use Policy](https://wholayer.com/legal/acceptable-use). Talk to your own lawyer about your situation. ## On your website - Say in your privacy policy that you use a visitor identification service. Sample wording is on our [customer notice templates](https://wholayer.com/legal/customer-notice) page. - Outside the US, use a consent banner and tell the tag about consent. See [consent banners](https://wholayer.com/help/consent-banners). - Exclude sensitive pages, such as health, financial hardship, or anything about children. See [excluded paths](https://wholayer.com/help/excluded-paths). ## When you contact people - **Email (CAN-SPAM):** identify your business, use honest subject lines, include your postal address and a working unsubscribe link, and honor unsubscribes within 10 business days. - **Calls and texts (TCPA):** calling or texting mobiles with automated systems requires consent, and you must check the Do Not Call registry. You're responsible for this. - If someone asks you to stop, stop, and delete their data within 15 days. ## Never use WhoLayer for Decisions about credit, employment, insurance, or housing; targeting children; stalking or harassment; or reselling raw data without a Platform contract. ## Related - [Privacy policy wording for the WhoLayer tag](https://wholayer.com/help/privacy-notice-template.md) - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) - [Exclude pages (careers, account, checkout)](https://wholayer.com/help/excluded-paths.md) --- # Privacy policy wording for the WhoLayer tag > Sample notice text, a privacy-choices link, and consent-banner code to adapt for your site. Category: Privacy and compliance Our [Terms](https://wholayer.com/legal/terms) require a privacy policy that tells visitors about the tag before it runs. Sample wording is on our [customer notice templates](https://wholayer.com/legal/customer-notice) page: - **Visitor ID (B2B)** and **Shopper ID (ecommerce)** paragraphs for your privacy policy, with WhoLayer's opt-out link (wholayer.com/privacy-request). - A **"Your privacy choices"** footer link, and a button that stops the tag in the visitor's browser (`wholayer("optout")`). - **Cookie banner** code: `wholayer("consent", true)` when a visitor accepts, `wholayer("consent", false)` when they decline. - A **checklist** for before you go live. These are starting points, not legal advice, and using them doesn't by itself make your site compliant. Have your own lawyer adapt them. ## Related - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) - [Exclude pages (careers, account, checkout)](https://wholayer.com/help/excluded-paths.md) --- # How opt-outs and suppression work > Everyone who opts out is removed from every product, immediately. Category: Privacy and compliance - When someone opts out on our [privacy request page](https://wholayer.com/privacy-request), their email (and phone number, if they give one) goes onto our global suppression list right away, and we remove what we already hold. Opt-outs need no verification. - California's deletion platform (DROP): once our registration is complete, its email and phone deletion lists are imported at least every 45 days (30 from 2027), and those people are added too, even if we held nothing about them yet. - Every person-level result, from the tag, the API, and the MCP server, is checked against the list first. Suppressed people are never returned and you're never charged for them. The API and MCP server answer `451 person_not_available` with a reason: `opted_out` or `drop_deleted`. - A daily job removes anyone on the list from identities already stored in customer workspaces (DROP lists are applied as soon as they're imported). - If we had already sent that person to one of your webhook destinations, you get a signed `suppression.added` event with only the identity ID, the SHA-256 of their email, and the reason, so you can remove them on your side too. - You can add your own people (customers, employees, do-not-contact) to a list for your workspace only. See [your suppression list](https://wholayer.com/help/your-suppression-list). ## Related - [Am I in WhoLayer's data? How to find out or opt out](https://wholayer.com/help/am-i-in-your-data.md) - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) - [Upload your own suppression list](https://wholayer.com/help/your-suppression-list.md) --- # Upload your own suppression list > Stop WhoLayer from returning or sending you existing customers, employees, or anyone on your do-not-contact list. Category: Privacy and compliance Your suppression list applies to your workspace only, on top of our global opt-out list. ## Add people - **Dashboard:** go to **Settings, Suppression list**. Paste emails or SHA-256 hashes, or upload a CSV or text file. We pick out every email address or 64-character hash and ignore other columns. Up to 100,000 people per upload. - **API:** `POST /v1/suppression` with `{"emails": [...]}` and/or `{"email_sha256": [...]}`, up to 10,000 per request. Read-only keys can't add. `GET /v1/suppression/count` returns the size of your list. - **MCP:** the `add_to_suppression` tool does the same. Emails are trimmed and lowercased, then hashed with SHA-256. We store only the hashes. Dashboard uploads are hashed in your browser. A list holds up to 1,000,000 people. ## What changes - Listed people are never identified at person level on your sites. Their visits still count at company level. - They're never sent to Slack, Teams, webhooks, your CRM, or Klaviyo, and never shown in your People list or CSV export. - The API and MCP server never return or charge for them: you get `451 person_not_available` with reason `customer_suppressed`. ## Remove people Owners and admins can download the list as hashes or remove the whole list in **Settings, Suppression list**. Members can see the count and download it. Removing single entries isn't available yet. ## Related - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) - [API error codes and what to do](https://wholayer.com/help/api-errors.md) - [Your responsibilities when you use WhoLayer](https://wholayer.com/help/customer-obligations.md) --- # Where WhoLayer's data comes from, and how accurate it is > Licensed suppliers and consent-aware publisher networks, never LinkedIn scraping; accuracy measured on a holdout set. Category: Privacy and compliance ## Sources - **Licensed data suppliers** and **consent-aware publisher networks.** Every supplier signs a written promise about how its data was collected. - **Never** logged-in scraping, fake accounts, or LinkedIn scraping. - Your own site's visitors are used to identify people **for you**. We don't add your visitors' browsing to a shared graph other customers can query. ## How we measure accuracy - We keep a **holdout set** of real visits where the visitor's identity is already known (for example, people who later filled in a form), from customers who opt in to benchmarking. - We run those visits through WhoLayer blind, then report **two numbers**: the match rate (how often we returned a person) and the accuracy (how often that person was right), broken out by B2B vs ecommerce and by device. - The first report publishes after 90 days of operation. Until then we don't quote a match rate we haven't measured. See the [Trust page](https://wholayer.com/trust). ## Security - TLS in transit, AES-256 at rest, hashed identifiers for suppression, SSO and MFA on all production access. - SOC 2 Type II audit **in progress**. Customers can request our security questionnaire, a signed DPA, or the supplier list under NDA through the contact form (choose "Security"). ## Where we never operate Sites or pages about health, sexual health, religion, sexual orientation, immigration, or financial hardship, and sites for children. We never sell precise location. ## Related - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) - [Why is my match rate low?](https://wholayer.com/help/low-match-rate.md) --- # Am I in WhoLayer's data? How to find out or opt out > Submit a free request; opt-outs take effect immediately and we reply within 45 days. Category: Am I in your data? You don't need an account, and it's free. ## What WhoLayer is WhoLayer helps businesses recognize visitors to their own websites. If you visited a site that uses WhoLayer, that business may have seen your name, work details, or email. If you got an email you didn't expect after browsing a store, it may have come through a service like ours. ## What you can ask for - Stop selling or sharing your information (opt out) - Delete your information - Tell you what information we have - Correct it - Limit use of sensitive information ## How 1. Go to the [privacy request page](https://wholayer.com/privacy-request). 2. Choose what you want and enter your email address. Add your phone number to cover it too. Send one request per email address you use. 3. You'll get an email with a reference number. Opt-outs and deletions take effect on our suppression list **immediately**, and opt-outs need no verification. To delete, see, or correct your information, open the one-time link in that email to confirm it's your address. We complete every request within 45 days. An authorized agent can also make a request for you. You can also email privacy@wholayer.com. To stop emails from a specific company, use the unsubscribe link in their email as well; they're required to honor it. ## Related - [How opt-outs and suppression work](https://wholayer.com/help/how-suppression-works.md) --- # I don't see any visitors > Work through these checks in order; most issues are the tag, the site key, or the domain. Category: Troubleshooting 1. **Is the tag on the page?** Open your site, view the page source, and search for `cdn.wholayer.com/t.js`. If it isn't there, the install didn't publish (or a cache needs clearing). 2. **Is the site key right?** The `data-site` value must match the key under **Sites** exactly. 3. **Is the domain right?** Live sites only accept visits from the domain you entered and its subdomains. If your store runs on `shop.example.com` but you entered `example-store.com`, visits are ignored. 4. **Is Global Privacy Control on in your browser?** Brave and some privacy extensions send it, and the tag deliberately sends nothing. Test in a normal Chrome or Safari window. 5. **Are you outside the US?** Without consent, nothing is recorded for non-US visitors. See [consent banners](https://wholayer.com/help/consent-banners). 6. **Is the page excluded?** Check **Excluded paths** under **Sites**. 7. **Is it a sandbox site?** Sandbox shows fictional test people. Turn sandbox off for real matches. 8. **Out of credits on the free plan?** Person matches pause until the 1st; company matches continue. Still stuck? [Contact support](https://wholayer.com/contact?topic=support) with your site domain. ## Related - [Install the tag on any website (HTML)](https://wholayer.com/help/install-html.md) - [Sandbox mode vs live mode](https://wholayer.com/help/sandbox-vs-live.md) - [Why is my match rate low?](https://wholayer.com/help/low-match-rate.md) - [Consent banners and non-US visitors](https://wholayer.com/help/consent-banners.md) --- # Why is my match rate low? > Match rates depend on traffic mix; here's what moves the number and what doesn't. Category: Troubleshooting ## What lowers match rates - **Non-US traffic.** Person-level matching is US-only. - **Mobile and in-app browsers,** which share fewer signals. - **Privacy tools** such as Global Privacy Control, VPNs, and strict tracking protection. We respect these on purpose. - **Consumer traffic on B2B sites,** for example students or job seekers. Exclude `/careers`. - **Bot traffic,** which is never matched but still counts in your analytics. ## What helps - Make sure the tag loads on every page, not just the homepage. - If people log in, call [identify](https://wholayer.com/help/identify-known-users) with their email. - Judge results over a couple of weeks, not a single day. ## A realistic expectation Independent tests across this industry have measured person-level identification at roughly 2% to 20% of traffic. Company-level rates are higher. Your own free-plan results are the most reliable number. ## Related - [How Visitor ID identifies people and companies](https://wholayer.com/help/visitor-id-how-it-works.md) - [Tell WhoLayer about logged-in users](https://wholayer.com/help/identify-known-users.md) --- # Emails are bouncing > Check the risk grade, send to flows not blasts, and warm up slowly. Category: Troubleshooting - **Shopper ID with Klaviyo refunds bounces automatically.** If a shopper we sent bounces or marks your email as spam within 30 days, we refund the credit, never send them again, and lower your daily cap when your complaint or bounce rate runs high. See [Shopper ID and Klaviyo](https://wholayer.com/help/shopper-id-klaviyo-guarantees). - **Check the risk grade.** Emails come back with a risk grade. Grade A is safest. Consider skipping C and D addresses in your sends. - **Verify before big sends.** `POST /v1/emails/verify` costs 0.25 credit per address. - **Use flows, not blasts.** Send one relevant message tied to what the person did, not your whole campaign calendar. - **Warm up.** Start with a small daily volume and grow it over a few weeks. - **Honor unsubscribes immediately,** and suppress people who complain. If a specific address we returned bounced, [tell support](https://wholayer.com/contact?topic=support) and include it so we can review the source. ## Related - [How Shopper ID works](https://wholayer.com/help/shopper-id-how-it-works.md) - [Shopper ID and Klaviyo: what you're charged for, refunds, the daily cap, and the holdout](https://wholayer.com/help/shopper-id-klaviyo-guarantees.md) - [Send shoppers to Klaviyo](https://wholayer.com/help/destination-klaviyo.md) --- # My destination isn't receiving anything > Send a test, check filters, and check what your endpoint returns. Category: Troubleshooting 1. **Click Send test** on the destination. If it fails, the error is shown on screen. 2. **Is it enabled?** Disabled destinations receive nothing. 3. **Do your filters exclude everyone?** Remove filters temporarily and test again. 4. **Is anyone being identified?** Check **People**. If it's empty, see [I don't see any visitors](https://wholayer.com/help/no-visitors). 5. **Webhooks:** your endpoint must answer with a 2xx status within 10 seconds. Redirects and self-signed certificates fail. 6. **Slack or Teams:** Slack webhook URLs stop working if the Slack app is removed, and Teams workflow URLs stop if the workflow is turned off or deleted. Create a new one. 7. **HubSpot, Pipedrive, Attio, or Klaviyo:** check the token or key still exists and has write access. CRMs only receive people with an email address. 8. **Salesforce:** if the log says access was revoked, edit the destination, tick **Reconnect**, and save. Failed deliveries are retried for up to 24 hours, so a short outage on your side won't lose data. ## Related - [Webhooks: receive matches in your own system](https://wholayer.com/help/destination-webhook.md) - [Send only your best visitors (filters)](https://wholayer.com/help/filters-and-hot-leads.md) - [I don't see any visitors](https://wholayer.com/help/no-visitors.md) --- # I can't log in: confirm your email > New accounts must confirm their email address before signing in. Category: Account and security After you register, we email you a confirmation link. Click it to finish setting up and sign in. The link works for 24 hours. ## Didn't get it? - Check spam and promotions folders for an email from **WhoLayer**. - Try signing in again: an unconfirmed sign-in sends a fresh link. - Make sure you typed your email correctly. If not, register again with the right address. ## Related - [Reset your password](https://wholayer.com/help/password-reset.md) - [Quickstart: your first identified visitor in 10 minutes](https://wholayer.com/help/quickstart.md) --- # Reset your password > Use Forgot password on the login page. Category: Account and security 1. Go to [Forgot password](https://wholayer.com/forgot-password). 2. Enter your email. We'll send a reset link. 3. Choose a new password with at least 10 characters. If the email doesn't arrive within a few minutes, check spam for a message from WhoLayer. ## Related - [I can't log in: confirm your email](https://wholayer.com/help/verify-email.md) - [Keep your API keys safe](https://wholayer.com/help/api-key-security.md) --- # Invite your team > Invite teammates from Settings; they join your workspace when they register. Category: Account and security Team members are included on the **Scale** plan and above. 1. Open **Settings**, then **Team**. 2. Enter your teammate's email and send the invite. 3. They register with that same email address and confirm it, then join your workspace. There's no charge per seat. Owners and admins can manage billing, keys, and destinations; members are read-only: they can view people, companies, and usage. If you already have a WhoLayer account with the invited email, just sign in: the workspace appears in the workspace menu at the top of the sidebar. ## Related - [Keep your API keys safe](https://wholayer.com/help/api-key-security.md) --- # Use more than one workspace > Create extra workspaces and switch between them from the menu at the top of the dashboard sidebar. Category: Account and security Each workspace has its own sites, people, API keys, destinations, plan, and billing. Use one per business, brand, or team. 1. Open the workspace menu at the top of the dashboard sidebar and choose **All workspaces · New**. 2. Name the workspace and create it. You're switched to it and taken to setup. 3. Switch back any time from the same menu. Workspaces you were invited to appear there too. New workspaces start on Free with 0 credits. Free credits (the welcome credits and the monthly Free allowance) go to one workspace per person, the first you create, so pick a paid plan for any extra workspace that needs credits. You can own up to 20 workspaces. ## Related - [Agency mode: client workspaces with budgets](https://wholayer.com/help/agency-client-workspaces.md) - [Invite your team](https://wholayer.com/help/team-members.md) - [Plans, upgrading, and annual billing](https://wholayer.com/help/plans-and-upgrades.md) --- # Agency mode: client workspaces with budgets > On Scale and above, create a workspace per client that spends from your credits, with a monthly budget per client. Category: Account and security Agency client workspaces are included on **Scale** and above. ## Set up a client 1. In your agency workspace, open **Agency**. 2. Enter the client's name and a monthly credit budget, then create it. Only the workspace owner can create clients. 3. Click **Open** to work in the client workspace: add the client's sites, keys, and destinations as usual. 4. Under **Settings**, invite the client's staff as **Read-only (client staff)**. They can see people, companies, and usage, but can't change settings, create API keys, or spend credits from the dashboard. ## How billing works - A client workspace has no plan or card of its own. It uses your plan and spends from your agency wallet. You pay; nothing is billed to the client. - Each client can spend up to its monthly budget (resetting on the 1st, UTC). It also can't go past your wallet's balance or your overage limit. When the budget runs out, the client's person-level identification and API calls pause until you raise it or the month resets; company-level ID keeps working. - Refunds for reported results go back to your wallet and free up that client's budget. ## Keep track **Agency** lists every client with spend against its budget. Your **Usage** page shows all clients' spend this month, and each client charge appears in your ledger as Client usage. Owners and admins can change budgets at any time; a budget of 0 pauses the client. If you downgrade below Scale, existing clients keep working; only creating new ones needs the plan. ## Related - [Use more than one workspace](https://wholayer.com/help/multiple-workspaces.md) - [Invite your team](https://wholayer.com/help/team-members.md) - [Running out of credits, overage, and limits](https://wholayer.com/help/overage-and-spend-caps.md) --- # Keep your API keys safe > Never put live keys in browser code; revoke a leaked key immediately. Category: Account and security - API keys belong on servers, never in browser JavaScript or mobile apps. - Create a separate key for each app or agent so you can revoke one without breaking the others. - Give agents a [daily cap](https://wholayer.com/help/agent-spend-caps), or a read-only key when they don't need contact details. - If a key leaks, open **API keys** and **revoke** it. It stops working immediately. Then create a new one. The site key in your tag (`site_...`) is different: it's meant to be public, and live sites only accept visits from your own domain. ## Related - [Keep an AI agent from overspending](https://wholayer.com/help/agent-spend-caps.md) - [Test keys and live keys](https://wholayer.com/help/test-api-keys.md) --- # Delete your workspace > Owners can permanently delete a workspace and its data from Settings. Category: Account and security 1. Cancel any paid plan first under **Billing**. 2. Open **Settings** and scroll to **Delete workspace**. Only the owner can do this. 3. Confirm. Sites, identified people, keys, and destinations are deleted. This can't be undone. Export anything you want to keep first: **People** has a CSV export. ## Related - [Cancel or downgrade](https://wholayer.com/help/cancel-or-downgrade.md)