{"id":"d3bce40f-8b46-4f56-a7de-dfe80b7203a1","entityType":"agent","slug":"clawhub-cargo-ai-cargo-gtm","name":"cargo-gtm","canonicalUrl":"https://www.xpersona.co/agent/clawhub-cargo-ai-cargo-gtm","canonicalPath":"/agent/clawhub-cargo-ai-cargo-gtm","generatedAt":"2026-10-09T22:32:41.779Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":null},"description":"Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (`references/acceptable-use.md`); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: \"build me a list of\", \"find 50 <title> at <segment>\", \"who works at\", \"find work emails for these accounts\", \"enrich this CSV\", \"verify these emails\", \"build a TAM\", \"who fits our ICP\", \"who actually buys from us\", \"what data points should we collect on accounts\", \"our outbound is reaching the wrong people\", \"score these leads\", \"write a first-touch email\", \"push these to my CRM\", \"who changed jobs\", \"who just raised funding\", \"companies using <tech>\", \"who is hiring <role>\", \"find the buying committee\", \"portfolio companies of <investor>\", \"upload this audience to Google/Meta/LinkedIn ads\". Providers: aiArk, anthropic, apolloio, bouncer, brightData, builtwith, cleon1, companyEnrich, contactOut, datagma, dropcontact, enrichCrm, enrichley, enrowio, exa, findyMail, firecrawl, forager, FullEnrich, g2, gemini, hunter, icypeas, kitt, leadMagic, linkedin, linkup, mixrank, neverBounce, oceanio, openAi, parallel, peopleDataLabs, perplexity, piloterr, prospeo, proxycurl, reverseContact, rocketreach, salesNavigator, serper, sillage, snitcher, societeInfo, theirStack, theSwarm, waterfall, x, zeroBounce. Reads phase guides, recipes, and per-provider playbooks before any paid call. Skip when: a run already happened and misbehaved — use cargo-diagnostics.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.7K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s178dcd9wkfn0a2fqrygmt3jzn87j9e1:cargo-gtm","sourceUrl":"https://clawhub.ai/cargo-ai/cargo-gtm","homepage":"https://clawhub.ai/cargo-ai/skills/cargo-gtm","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/cargo-ai/cargo-gtm","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/cargo-ai/skills/cargo-gtm","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":68,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"cargo-gtm technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":null},"stars":null,"forks":null,"downloads":2652,"packageName":null,"latestVersion":"2.2.0","tractionLabel":"2.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T12:29:39.374Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T12:29:39.384Z","lastCrawledAt":"2026-10-09T12:29:39.374Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T12:29:39.374Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.0","createdAt":"2026-10-02T20:45:19.665Z","changelog":"cargo-gtm 2.2.0 - Expanded and updated phase guides, recipes, and provider playbooks for richer documentation and more supported workflows. - Updated key guides: company/contact finding, enrichment, and provider usage docs feature improved routing and clearer examples. - skill-card.md removed; main SKILL.md and supporting docs are now the canonical references. - Reference docs and cost tables updated to reflect new providers and latest capabilities. - Documentation hierarchy clarified; now specifies levels from decision models to actionable provider playbooks.","fileCount":101,"zipByteSize":342477},{"version":"2.1.2","createdAt":"2026-10-02T18:34:05.943Z","changelog":"cargo-gtm 2.1.2 - Updated guides, recipes, and provider playbooks for improved documentation and clarity. - Removed the deprecated skill-card.md file. - Refined phase guides and reference documents for prospecting, enrichment, and outreach workflows. - Documentation improvements to several provider integrations. - Minor version bump and metadata updates for @cargo-ai/cli compatibility.","fileCount":101,"zipByteSize":340018},{"version":"2.1.1","createdAt":"2026-09-14T06:27:00.795Z","changelog":"cargo-gtm v2.1.1 - Removed the skill-card.md file. - Updated documentation in SKILL.md and several recipe files. - Made minor metadata adjustments in skill-metadata.json. - No changes to core functionality or provider integration.","fileCount":101,"zipByteSize":340028},{"version":"2.1.0","createdAt":"2026-09-02T23:41:51.994Z","changelog":"cargo-gtm 2.1.0 - Major documentation expansion and reorganization across guides, provider playbooks, and recipes - Added or revised phase-specific guides for finding companies, enriching contacts, and building lists - Updated provider playbooks for individual data sources and enrichment routines - Improved decision model and routing guidance in SKILL.md - Removed deprecated files (provider-playbooks/cargo.md, skill-card.md) to streamline documentation","fileCount":101,"zipByteSize":340101},{"version":"1.19.0","createdAt":"2026-09-01T23:30:09.147Z","changelog":"- Added support for new data providers: brightData and proxycurl. - Expanded provider documentation with two new playbooks. - Removed obsolete skill-card.md file. - Updated provider lists and documentation references throughout the skill. - Version bump to 1.19.0.","fileCount":102,"zipByteSize":338949},{"version":"1.17.0","createdAt":"2026-08-27T23:44:19.780Z","changelog":"- Major documentation overhaul: revised and expanded phase guides, provider playbooks, and process documentation for improved clarity and workflow guidance. - Numerous file changes across agents, guides, and provider-playbooks to update procedures, best practices, and safety guardrails. - Outdated skill-card.md removed for streamlined doc organization. - Skill version incremented to 1.17.0.","fileCount":100,"zipByteSize":323318},{"version":"1.16.0","createdAt":"2026-08-24T04:49:42.214Z","changelog":"cargo-gtm 1.16.0 - Updated skill documentation and metadata for the new version. - Removed the deprecated skill-card.md file. - Updated acceptable use policy and improved cross-references. - Refined guidance in phase guides and documentation structure. - Minor improvements to outreach activation recipe.","fileCount":100,"zipByteSize":322024},{"version":"1.15.0","createdAt":"2026-08-15T07:00:25.747Z","changelog":"cargo-gtm 1.15.0 - Added five new provider playbooks: builtwith, exa, parallel, sillage, and x. - Provider list expanded to include builtwith, exa, parallel, sillage, and x. - Updated documentation and references to reflect new and updated providers. - Removed deprecated skill-card.md file. - Improved references and provider mapping in supporting docs.","fileCount":100,"zipByteSize":321253}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178dcd9wkfn0a2fqrygmt3jzn87j9e1:cargo-gtm","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s178dcd9wkfn0a2fqrygmt3jzn87j9e1:cargo-gtm` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/cargo-ai/cargo-gtm before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:32:41.776Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cargo-ai-cargo-gtm/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":null},"readme":"Skill: cargo-gtm\n\nOwner: cargo-ai\n\nSummary: Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (`references/acceptable-use.md`); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: \"build me a list of\", \"find 50 <title> at <segment>\", \"who works at\", \"find work emails for these accounts\", \"enrich this CSV\", \"verify these emails\", \"build a TAM\", \"who fits our ICP\", \"who actually buys from us\", \"what data points should we collect on accounts\", \"our outbound is reaching the wrong people\", \"score these leads\", \"write a first-touch email\", \"push these to my CRM\", \"who changed jobs\", \"who just raised funding\", \"companies using <tech>\", \"who is hiring <role>\", \"find the buying committee\", \"portfolio companies of <investor>\", \"upload this audience to Google/Meta/LinkedIn ads\". Providers: aiArk, anthropic, apolloio, bouncer, brightData, builtwith, cleon1, companyEnrich, contactOut, datagma, dropcontact, enrichCrm, enrichley, enrowio, exa, findyMail, firecrawl, forager, FullEnrich, g2, gemini, hunter, icypeas, kitt, leadMagic, linkedin, linkup, mixrank, neverBounce, oceanio, openAi, parallel, peopleDataLabs, perplexity, piloterr, prospeo, proxycurl, reverseContact, rocketreach, salesNavigator, serper, sillage, snitcher, societeInfo, theirStack, theSwarm, waterfall, x, zeroBounce. Reads phase guides, recipes, and per-provider playbooks before any paid call. Skip when: a run already happened and misbehaved — use cargo-diagnostics.\n\nTags: latest:2.2.0\n\nVersion history:\n\nv2.2.0 | 2026-10-02T20:45:19.665Z | auto\n\ncargo-gtm 2.2.0\n\n- Expanded and updated phase guides, recipes, and provider playbooks for richer documentation and more supported workflows.\n- Updated key guides: company/contact finding, enrichment, and provider usage docs feature improved routing and clearer examples.\n- skill-card.md removed; main SKILL.md and supporting docs are now the canonical references.\n- Reference docs and cost tables updated to reflect new providers and latest capabilities.\n- Documentation hierarchy clarified; now specifies levels from decision models to actionable provider playbooks.\n\nv2.1.2 | 2026-10-02T18:34:05.943Z | auto\n\ncargo-gtm 2.1.2\n\n- Updated guides, recipes, and provider playbooks for improved documentation and clarity.\n- Removed the deprecated skill-card.md file.\n- Refined phase guides and reference documents for prospecting, enrichment, and outreach workflows.\n- Documentation improvements to several provider integrations.\n- Minor version bump and metadata updates for @cargo-ai/cli compatibility.\n\nv2.1.1 | 2026-09-14T06:27:00.795Z | auto\n\ncargo-gtm v2.1.1\n\n- Removed the skill-card.md file.\n- Updated documentation in SKILL.md and several recipe files.\n- Made minor metadata adjustments in skill-metadata.json.\n- No changes to core functionality or provider integration.\n\nv2.1.0 | 2026-09-02T23:41:51.994Z | auto\n\ncargo-gtm 2.1.0\n\n- Major documentation expansion and reorganization across guides, provider playbooks, and recipes\n- Added or revised phase-specific guides for finding companies, enriching contacts, and building lists\n- Updated provider playbooks for individual data sources and enrichment routines\n- Improved decision model and routing guidance in SKILL.md\n- Removed deprecated files (provider-playbooks/cargo.md, skill-card.md) to streamline documentation\n\nv1.19.0 | 2026-09-01T23:30:09.147Z | auto\n\n- Added support for new data providers: brightData and proxycurl.\n- Expanded provider documentation with two new playbooks.\n- Removed obsolete skill-card.md file.\n- Updated provider lists and documentation references throughout the skill.\n- Version bump to 1.19.0.\n\nv1.17.0 | 2026-08-27T23:44:19.780Z | auto\n\n- Major documentation overhaul: revised and expanded phase guides, provider playbooks, and process documentation for improved clarity and workflow guidance.\n- Numerous file changes across agents, guides, and provider-playbooks to update procedures, best practices, and safety guardrails.\n- Outdated skill-card.md removed for streamlined doc organization.\n- Skill version incremented to 1.17.0.\n\nv1.16.0 | 2026-08-24T04:49:42.214Z | auto\n\ncargo-gtm 1.16.0\n\n- Updated skill documentation and metadata for the new version.\n- Removed the deprecated skill-card.md file.\n- Updated acceptable use policy and improved cross-references.\n- Refined guidance in phase guides and documentation structure.\n- Minor improvements to outreach activation recipe.\n\nv1.15.0 | 2026-08-15T07:00:25.747Z | auto\n\ncargo-gtm 1.15.0\n\n- Added five new provider playbooks: builtwith, exa, parallel, sillage, and x.\n- Provider list expanded to include builtwith, exa, parallel, sillage, and x.\n- Updated documentation and references to reflect new and updated providers.\n- Removed deprecated skill-card.md file.\n- Improved references and provider mapping in supporting docs.\n\nv1.14.1 | 2026-08-15T02:02:12.477Z | auto\n\ncargo-gtm 1.14.1\n\n- Updated documentation in SKILL.md with latest changes and version info.\n- Updated internal scripts and metadata for improved compatibility.\n- Removed deprecated skill-card.md file.\n\nv1.14.0 | 2026-08-15T01:04:49.772Z | auto\n\ncargo-gtm v1.14.0\n\n- Added new \"recipes/clay-to-cargo.md\" and \"recipes/custom-datapoints.md\" for expanded how-to coverage.\n- Removed deprecated \"skill-card.md\".\n- Updated documentation: improved guidance in SKILL.md, expanded data extraction prompts and references.\n- Added trigger: \"what data points should we collect on accounts\".\n- Refreshed phase guides, recipe structure, and prompt library references for clarity and completeness.\n\nv1.13.0 | 2026-08-13T01:44:59.336Z | auto\n\ncargo-gtm 1.13.0\n\n- Added clear mandatory acceptable use policy with new `references/acceptable-use.md`; highlights B2B-only scope, consent checks, opt-out, and explicit refusal for non-compliant use cases.\n- Updated all documentation, commands, and guidance to enforce three-stage compliance checks before any outreach (basis, suppression, relevance).\n- Skill explicitly refuses bulk unsolicited messaging, scraping, consumer targeting, and non-compliant outreach; now offers compliant alternatives with clear explanations.\n- Outreach features now stop at generating send-ready variables, handing off actual sending to the user's sequencer and enforcing required sender info.\n- Removed outdated/incomplete documentation (`skill-card.md`) and updated links and instructions across guides, recipes, and references for greater clarity and compliance.\n\nv1.12.0 | 2026-08-12T17:19:38.645Z | auto\n\ncargo-gtm v1.12.0\n\n- Expanded the set of supported use cases and clarified trigger phrases and provider coverage in the SKILL.md description.\n- Added new recipes: ads audience activation, review and iteration process, and source planning for credit-efficient execution.\n- Updated and reorganized phase guides and playbooks for various data providers.\n- Improved documentation hierarchy and routing instructions to prioritize the correct guides and recipes before execution.\n- Removed obsolete documentation (skill-card.md) and refined onboarding/usage instructions.\n\nv1.10.0 | 2026-08-12T07:59:29.600Z | auto\n\ncargo-gtm 1.10.0\n\n- Expanded skill description to explicitly list all data providers that trigger this skill.\n- No changes to functionality or routing rules; documentation updated for clearer provider matching.\n- Removed skill-card.md file.\n\nv1.9.1 | 2026-08-11T21:43:08.961Z | auto\n\ncargo-gtm 1.9.1\n\n- Updated CLI sign-in instructions: `cargo-ai login --email` now supports a code-based flow without requiring a browser.\n- SKILL.md: clarified compatibility and updated authentication requirements.\n- Expanded recurring workflow documentation to require reading the provider playbook for each paid node.\n- Removed legacy skill-card.md.\n- Updated multiple provider playbooks for consistency and routing.\n\nv1.9.0 | 2026-07-25T19:17:52.999Z | auto\n\ncargo-gtm v1.9.0\n\n- Added new provider playbook: aiArk\n- Removed deprecated playbook: proxycurl\n- Removed legacy documentation file: skill-card.md\n- Updated several reference docs and recipes for improved clarity and current workflows\n- SKILL.md updated for new documentation structure and recipe list\n- Minor metadata and references adjustments\n\nv1.7.0 | 2026-07-10T07:53:18.665Z | auto\n\ncargo-gtm 1.7.0 introduces extensive new provider documentation and broader reference support.\n\n- Added 23 provider playbooks for specific enrichment and data sources (e.g., Anthropic, Bouncer, Dropcontact, Rocketreach, OpenAI, and more)\n- Expanded and updated reference and prompt-library documents for improved task guidance and coverage\n- Enhanced guides and recipes for outreach, activation, and enrichment workflows\n- Updated documentation hierarchy and instructions to integrate new provider- and phase-specific behaviors\n- Improved routing and reading rules to strengthen execution safety and cost discipline\n\nv1.6.0 | 2026-07-10T07:46:21.620Z | auto\n\ncargo-gtm 1.6.0\n\n- Added new recipe: `recipes/import-gtm-data.md` for importing existing GTM data (e.g. CSV/CRM exports) into models, QA auditing, and rebuilding recurring logic as plays.\n- Updated documentation in SKILL.md to reference the new import recipe in the main recipes table with usage guidance.\n- Incremented skill version to 1.6.0.\n\nv1.5.0 | 2026-07-10T07:42:11.073Z | auto\n\ncargo-gtm 1.5.0\n\n- Added documentation for the new list-builder agent (`agents/list-builder.md`) to support large-scale, sliced sourcing tasks.\n- Updated main docs to clarify when and how to use the new `list-builder` agent for wide sourcing and maintaining row data outside the main context.\n- Clarified delegation flow between execution-plan-creator and list-builder agents, particularly for industry/geo fan-out scenarios.\n- No changes to core functionality; improvements are in documentation and workflow guidance only.\n\nv1.4.0 | 2026-07-10T07:27:02.546Z | auto\n\ncargo-gtm 1.4.0\n\n- Added reference prompt-library documents for company research, data extraction, lead scoring, personalization, qualification, and signal analysis.\n- Introduced a new master index for the prompt-library references.\n- Added skill-metadata.json for metadata management.\n- Updated existing docs and recipes to reflect new prompt-library structure.\n\nv1.3.0 | 2026-07-10T07:17:01.751Z | auto\n\ncargo-gtm v1.3.0\n\n- Added 13 new provider playbooks for detailed, per-provider enrichment and lookup guidance.\n- Introduced documentation on contact data accuracy and associated validation/audit scripts.\n- Significantly expanded script coverage: contact accuracy audit, email/name validation, and current role selection.\n- Updated core recipes (e.g., outreach activation, prospecting, LinkedIn URL lookup) for improved clarity and integration with new resources.\n- Improved documentation structure and depth, with new references and expanded pattern coverage for data quality and provider selection.\n\nv1.1.1 | 2026-07-10T00:54:38.052Z | auto\n\n- Updated SKILL.md to version 1.1.1 with minor maintenance or documentation changes.\n- Removed the skill-card.md file.\n\nv1.1.0 | 2026-07-09T04:38:41.138Z | auto\n\n**Expanded with new recipes and improved cost controls.**\n\n- Added new recipes for outreach activation, re-engagement, lost deal revival, account expansion, and saving runs as plays.\n- Introduced a dedicated cost discipline section with mandatory pilot/approval flows, spend reporting, and coverage guidance.\n- Updated and extended existing guides, playbooks, and reference materials to reflect latest best practices.\n- Updated compatibility to require the latest @cargo-ai/cli version.\n- Removed the legacy skill-card.md file for clarity.\n\nv1.0.0 | 2026-05-28T18:26:02.319Z | auto\n\nInitial release of the cargo-gtm skill for orchestrating GTM tasks via Cargo:\n\n- Provides a meta front door for prospecting, enrichment, lead scoring, sequence activation, and CRM workflows using Cargo.\n- Introduces a mandatory, documentation-first routing model—users must consult phase guides, recipes, and provider-specific playbooks before action execution.\n- Outlines hierarchical documentation for decision logic, phase-specific guides, step-by-step recipes, and per-provider best practices.\n- Documents provider selection and default “recipe spine” covering end-to-end GTM flows.\n- Lists and explains the priority provider stack for credits-efficient sourcing, enrichment, verification, and signal monitoring.\n- Enforces company-first, then people, discovery process for best results and resource savings.\n\nArchive index:\n\nArchive v2.2.0: 101 files, 342477 bytes\n\nFiles: agents/execution-plan-creator.md (6113b), agents/list-builder.md (2637b), guides/enriching-and-researching.md (7654b), guides/finding-companies-and-contacts.md (8017b), guides/writing-outreach.md (7352b), provider-playbooks/aiArk.md (12201b), provider-playbooks/anthropic.md (7008b), provider-playbooks/apolloio.md (7282b), provider-playbooks/bouncer.md (4732b), provider-playbooks/brightData.md (8391b), provider-playbooks/builtwith.md (5279b), provider-playbooks/cleon1.md (5091b), provider-playbooks/companyEnrich.md (5246b), provider-playbooks/contactOut.md (6556b), provider-playbooks/datagma.md (5523b), provider-playbooks/dropcontact.md (5190b), provider-playbooks/enrichCrm.md (5535b), provider-playbooks/enrichley.md (5306b), provider-playbooks/enrowio.md (5351b), provider-playbooks/exa.md (6141b), provider-playbooks/findyMail.md (5177b), provider-playbooks/firecrawl.md (6093b), provider-playbooks/forager.md (5170b), provider-playbooks/FullEnrich.md (9862b), provider-playbooks/g2.md (5189b), provider-playbooks/gemini.md (6594b), provider-playbooks/hunter.md (5615b), provider-playbooks/icypeas.md (6456b), provider-playbooks/kitt.md (4313b), provider-playbooks/leadMagic.md (5309b), provider-playbooks/linkedin.md (10429b), provider-playbooks/linkup.md (5341b), provider-playbooks/mixrank.md (4819b), provider-playbooks/neverBounce.md (4931b), provider-playbooks/oceanio.md (7114b), provider-playbooks/openAi.md (6780b), provider-playbooks/parallel.md (9087b), provider-playbooks/peopleDataLabs.md (9100b), provider-playbooks/perplexity.md (7056b), provider-playbooks/piloterr.md (5790b), provider-playbooks/prospeo.md (5498b), provider-playbooks/proxycurl.md (9832b), provider-playbooks/reverseContact.md (5833b), provider-playbooks/rocketreach.md (5235b), provider-playbooks/salesNavigator.md (6346b), provider-playbooks/serper.md (5587b), provider-playbooks/sillage.md (4532b), provider-playbooks/snitcher.md (5700b), provider-playbooks/societeInfo.md (5688b), provider-playbooks/theirStack.md (6587b), provider-playbooks/theSwarm.md (5203b), provider-playbooks/waterfall.md (6816b), provider-playbooks/x.md (6990b), provider-playbooks/zeroBounce.md (5461b), recipes/account-expansion.md (7164b), recipes/ads-audience-activation.md (11839b), recipes/build-tam.md (11994b), recipes/clay-to-cargo.md (14059b), recipes/custom-datapoints.md (29557b), recipes/funding-watch.md (6760b), recipes/icp-discovery.md (8293b), recipes/import-gtm-data.md (7208b), recipes/job-change-monitoring.md (5150b), recipes/linkedin-url-lookup.md (4412b), recipes/lost-deal-revival.md (8055b), recipes/outreach-activation.md (11003b), recipes/portfolio-prospecting.md (6525b), recipes/prospecting.md (17044b), recipes/re-engagement.md (8052b), recipes/review-and-iterate.md (6959b), recipes/save-as-play.md (6863b), recipes/source-planning.md (7840b), recipes/tech-intent.md (5963b), references/acceptable-use.md (7544b), references/alternatives.md (7133b), references/contact-accuracy.md (5822b), references/cost-discipline.md (9579b), references/credits-cost-table.md (32057b), references/output-retrieval.md (4970b), references/prompt-library/company-research.md (6704b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: cargo-gtm\ndescription: \"Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (`references/acceptable-use.md`); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: \\\"build me a list of\\\", \\\"find 50 <title> at <segment>\\\", \\\"who works at\\\", \\\"find work emails for these accounts\\\", \\\"enrich this CSV\\\", \\\"verify these emails\\\", \\\"build a TAM\\\", \\\"who fits our ICP\\\", \\\"who actually buys from us\\\", \\\"what data points should we collect on accounts\\\", \\\"our outbound is reaching the wrong people\\\", \\\"score these leads\\\", \\\"write a first-touch email\\\", \\\"push these to my CRM\\\", \\\"who changed jobs\\\", \\\"who just raised funding\\\", \\\"companies using <tech>\\\", \\\"who is hiring <role>\\\", \\\"find the buying committee\\\", \\\"portfolio companies of <investor>\\\", \\\"upload this audience to Google/Meta/LinkedIn ads\\\". Providers: aiArk, anthropic, apolloio, bouncer, brightData, builtwith, cleon1, companyEnrich, contactOut, datagma, dropcontact, enrichCrm, enrichley, enrowio, exa, findyMail, firecrawl, forager, FullEnrich, g2, gemini, hunter, icypeas, kitt, leadMagic, linkedin, linkup, mixrank, neverBounce, oceanio, openAi, parallel, peopleDataLabs, perplexity, piloterr, prospeo, proxycurl, reverseContact, rocketreach, salesNavigator, serper, sillage, snitcher, societeInfo, theirStack, theSwarm, waterfall, x, zeroBounce. Reads phase guides, recipes, and per-provider playbooks before any paid call. Skip when: a run already happened and misbehaved — use cargo-diagnostics.\"\nversion: \"2.2.0\"\ncompatibility: Requires @cargo-ai/cli (npm). Sign in or create an account with `cargo-ai login --email` (emailed code, no browser), `--oauth`, or an API token\nhomepage: https://github.com/getcargohq/cargo-skills\nmetadata:\n  author: getcargo\n  openclaw:\n    requires:\n      bins:\n        - cargo-ai\n    install:\n      - kind: node\n        package: \"@cargo-ai/cli@latest\"\n        bins:\n          - cargo-ai\n    homepage: https://github.com/getcargohq/cargo-skills\n---\n\n# Cargo GTM — Meta Skill\n\nUse this skill for prospecting, account research, contact enrichment, verification, lead scoring, personalization, signal monitoring, and campaign activation.\n\n## Acceptable use — MANDATORY, before anything that touches a person\n\nFull spec: [`references/acceptable-use.md`](references/acceptable-use.md). The short version, binding on every recipe here:\n\n- **B2B professional identities only**, from the licensed providers in [`provider-playbooks/`](provider-playbooks/) — never consumer targeting, purchased lists, or data taken from a platform in breach of its terms.\n- **Three checks before any outreach step** — *basis* (customers, opted-in contacts, event attendees, or a documented legitimate-interest case), *suppression* (filter on unsubscribe / DNC / hard-bounce **before** enriching or sending), *relevance* (name, per recipient, why this message is for them). Any check that fails is a stop-and-ask, not a warning.\n- **Refuse and say why**: undifferentiated fan-out (\"email everyone in `<industry>`\"), contacting a suppressed record, filter evasion or disguised sender identity, auto-dialing and SMS blasts, batch-blasting LinkedIn engagement actions. Offer the compliant version once — state it, don't lecture.\n- **This skill never sends.** Outreach recipes stop at send-ready variables and hand off to the user's own sequencer, under that sequencer's limits, domains, and identities. Copy it drafts must carry an honest sender and subject, a working opt-out, and a postal address where the jurisdiction requires one.\n\n## Bootstrap\n\nAlready signed in (`cargo-ai whoami` returns a workspace)? Skip to the next section.\n\n```bash\nnpm install -g @cargo-ai/cli            # no global install? prefix every command with `npx @cargo-ai/cli`\ncargo-ai login --email you@company.com  # emailed code, no browser; creates the account on first use\n                                        # alternatives: --oauth (browser) · --token <api-token> (CI)\ncargo-ai whoami                         # confirm the active workspace before any write\n```\n\nEvery command prints JSON to stdout; failures exit non-zero with `{\"errorMessage\": \"...\"}`. Anything that creates a run or a batch is async — pass `--wait-until-finished` or poll the matching `get`. When the full skill bundle is installed, [`../cargo/references/prerequisites.md`](../cargo/references/prerequisites.md) adds the CLI version pin, token scopes, and the admin-only surface.\n\n## 1) What this skill governs\n\n- Route GTM decisions, safety gates, and provider/quality defaults **before** execution.\n- Keep long command chains and tooling nuance in sub-docs; provider-specific implementation detail in `provider-playbooks/*.md`.\n- Anchor recipes in **credits-based actions** (the high-value action calls). Free CRUD (createLead, getLead, deleteRecords) doesn't need this skill — agents can compose those ad hoc.\n\n### Process / goal\n\nThe user is generally trying to go from \"I have an ICP\" to \"Here's a list of prospects with verified emails and personalized signals.\" They may be anywhere in this process — guide them along.\n\n**Discovery order: companies first, then people.** When the task requires finding contacts at companies matching criteria (portfolio, ICP, hiring signal), discover the company set first, then find people at each company. Don't start with broad people-search queries.\n\n### Documentation hierarchy\n\n- **Level 1** — `SKILL.md` (this file): decision model, guardrails, routing table, links to sub-docs.\n- **Level 2** — Phase docs: [`guides/finding-companies-and-contacts.md`](guides/finding-companies-and-contacts.md), [`guides/enriching-and-researching.md`](guides/enriching-and-researching.md), [`guides/writing-outreach.md`](guides/writing-outreach.md).\n- **Level 2.5** — Recipes: [`recipes/*.md`](recipes/) — step-by-step playbooks for specific scenarios.\n- **Level 3** — Provider playbooks: [`provider-playbooks/<slug>.md`](provider-playbooks/) — provider-specific quirks, costs, and fallback behavior.\n\n## 2) Read behavior — MANDATORY before any execution\n\n**STOP. Do not call any provider, run any `cargo-ai orchestration action execute` command, or write any search query until you have opened the correct sub-doc for your task.**\n\nThese docs encode what works, what fails, and why. They contain validated parameter schemas, cheapest-provider mappings, parallel execution patterns, sample payloads, and known pitfalls. Reading the right doc for 10 seconds saves 10 failed action calls, wasted credits, and garbage output.\n\n### Routing rules — match your task to a doc and READ IT\n\n| When the task involves… | You MUST read this doc first | What it gives you |\n|---|---|---|\n| **Finding companies, finding people, building lead lists, prospecting, portfolio/VC sourcing, contact finding at known companies** | [`guides/finding-companies-and-contacts.md`](guides/finding-companies-and-contacts.md) | Provider filter schemas, cheapest-source decision tree, parallel patterns, role-based search rules, portfolio/VC shortcuts, contact-finding patterns. |\n| **Enriching companies or contacts, finding emails/phones/LinkedIn, waterfall enrichment, signal lookup (job change, funding, tech stack), coalescing data** | [`guides/enriching-and-researching.md`](guides/enriching-and-researching.md) | Waterfall patterns with fallback chains, when to use aiArk vs waterfall vs FullEnrich vs peopleDataLabs, email/phone/LinkedIn fallback orders, signal segments, output retrieval via `run download-outputs`. |\n| **Writing first-touch outreach, personalizing messages, lead scoring, qualification, sequence design, campaign copy** | [`guides/writing-outreach.md`](guides/writing-outreach.md) + [`references/acceptable-use.md`](references/acceptable-use.md) (§3 checks, blocking) | LLM provider routing (openAi/anthropic/perplexity/gemini), prompt templates, scoring rubrics, email length/tone rules, personalization patterns — gated on basis, suppression, and per-recipient relevance. |\n| **Actually sending the drafted copy from a mailbox Cargo owns** (rather than handing off to the user's own sequencer) | [`../cargo-mailbox-management/SKILL.md`](../cargo-mailbox-management/SKILL.md) + [`references/acceptable-use.md`](references/acceptable-use.md) (§3 checks, blocking) | Provisioning and warm-up, the 5→40/day send ramp that caps volume, the `sendEmail` action (0.1 credits/send), the workspace suppression list, and replies/opens/clicks as events. |\n| **Building or modifying a recurring workflow** (cron / webhook / scheduled tool / play), designing step sequences, triggers, deploy/verify cycles | [`../cargo-orchestration/SKILL.md`](../cargo-orchestration/SKILL.md) (capability) + apply-patterns from this skill's recipes + the [provider playbook](provider-playbooks/) of **every paid node** (§11, esp. its **Recurring use** section) | Schema for tool/play workflows, node graph syntax, polling strategies, output retrieval; per-provider cadence defaults and re-billing gates. |\n\n### Recipes: step-by-step playbooks (check before executing)\n\nScan this list and read the recipe matching your task. **When a recipe matches: follow it step-by-step as your execution plan.**\n\n| Recipe | Use when… |\n|---|---|\n| [`recipes/source-planning.md`](recipes/source-planning.md) | **Read first when the source isn't obvious.** Turn the question into a field, probe 2–3 candidate sources on 5–10 rows, present cost-per-*hit* — before any fan-out |\n| [`recipes/prospecting.md`](recipes/prospecting.md) | End-to-end find → enrich → verify → sync (P1/P2/P3 variants) |\n| [`recipes/build-tam.md`](recipes/build-tam.md) | Building a Total Addressable Market list at scale (100–10,000 companies) |\n| [`recipes/linkedin-url-lookup.md`](recipes/linkedin-url-lookup.md) | Resolving a person's LinkedIn profile URL from name + company with strict identity validation |\n| [`recipes/portfolio-prospecting.md`](recipes/portfolio-prospecting.md) | Investor / accelerator → portfolio companies → contacts |\n| [`recipes/job-change-monitoring.md`](recipes/job-change-monitoring.md) | `waterfall.detectJobChange` (cargo-unique) on a contact segment |\n| [`recipes/funding-watch.md`](recipes/funding-watch.md) | Tracking companies that recently raised funding |\n| [`recipes/tech-intent.md`](recipes/tech-intent.md) | Finding companies by tech-stack or hiring-intent signals |\n| [`recipes/icp-discovery.md`](recipes/icp-discovery.md) | Diffing Closed-Won vs Closed-Lost segments to surface ICP signals |\n| [`recipes/custom-datapoints.md`](recipes/custom-datapoints.md) | Designing *which* custom attributes and live signals to collect for a seller's ICP — feasibility-gated against the catalog, then wired into columns, scoring, segments, and a refresh cadence |\n| [`recipes/outreach-activation.md`](recipes/outreach-activation.md) | Turning a signal segment into send-ready outreach (enrich → verify → personalize → sequencer handoff) |\n| [`recipes/ads-audience-activation.md`](recipes/ads-audience-activation.md) | Pushing a segment to paid media — Google Ads Customer Match or LinkedIn Matched Audiences — and reading the match rate |\n| [`recipes/review-and-iterate.md`](recipes/review-and-iterate.md) | Judgment output a human must review — sheet handoff, grouped corrections, permanent fixes, kept as an eval set |\n| [`recipes/re-engagement.md`](recipes/re-engagement.md) | Waking up stale contacts only when a fresh signal fires (job change, funding, tech intent) |\n| [`recipes/lost-deal-revival.md`](recipes/lost-deal-revival.md) | Reviving Closed-Lost CRM deals by branching on `lost_reason` (champion left, budget, timing) |\n| [`recipes/account-expansion.md`](recipes/account-expansion.md) | Multi-threading existing customer accounts — net-new buyers, deduped against the workspace's Contacts model |\n| [`recipes/save-as-play.md`](recipes/save-as-play.md) | Converting a successful ad-hoc run into a durable scheduled play or cron tool — offer after any repeatable pull |\n| [`recipes/import-gtm-data.md`](recipes/import-gtm-data.md) | Importing existing GTM data (CSV/CRM exports from any tool) into models, QA-auditing it, and selectively rebuilding recurring logic as plays with a parity check |\n| [`recipes/clay-to-cargo.md`](recipes/clay-to-cargo.md) | **Clay specifically**: getting the column *configuration* out (not the CSV), the column-family → action map, the four Clay concepts that do not map one to one (waterfalls, run conditions, auto-update, partial runs), and the parity check against Clay's own output |\n\nIf none match, scan the phase docs above for the closest pattern and adapt — or invoke [`agents/execution-plan-creator.md`](agents/execution-plan-creator.md) to compose a custom chain with provider/action slugs and cost estimates. For wide sourcing sweeps that fan out (per-industry, per-geo), delegate approved slices to [`agents/list-builder.md`](agents/list-builder.md) — it executes exactly one pre-approved action per slice and returns rows to a file, keeping row data out of the main context. (On Claude Code with the plugin, both are installed as native subagents: `cargo-execution-planner` and `cargo-list-builder`.)\n\n## 3) Cost discipline — MANDATORY gates\n\nFull spec: [`references/cost-discipline.md`](references/cost-discipline.md). The short version every task must honor:\n\n1. **Sample → approval → full run, in that order.** Run a slice of the exact input first — 1–3 rows to prove one action's config, **10–20 records before any batch** (one row can't show a hit-rate). Then present the 4-section approval message (Assumptions · Sample result verbatim · Credits/Scope/Cap — always stating **how many records** the full run enrolls and **what they cost**, reconciled against the actual balance · 3 shaped choices); stay in AWAIT_APPROVAL until the user picks. Never fan out on an unapproved or cost-unknown action, and never read approval of the sample as approval of the full enrollment.\n2. **Receipt after every paid action**: credits spent + balance remaining + hit-rate (\"found 34 emails of 40\") + estimate-vs-actual with the why when they diverge. Prefer `billing usage get-metrics` over your own arithmetic.\n3. **Over-provision 1.4×N, then filter** — coverage is a property of the company; drop incomplete rows instead of chasing them with more providers.\n4. **Count first, pay second** — search is billed on returned rows; keep `limit` strict and size the pool with a 1-row probe before any full pull.\n5. **Phone is the guarded lever** — explicit user request only, qualified leads only. Still true at the cheap end: `aiArk.findMobilePhone` (0.5, mobile-only) is the first rung and bills 0 on a miss, but the escalation behind it is 3–7 credits (~10× email), so a full-list phone sweep needs the same approval as any other paid fan-out.\n\n## 4) After every run — receipt, then grounded next steps\n\nEnd every completed run with the receipt (above), then propose **2–3 next steps maximum, computed from the data just produced — never a generic menu**. Required shape:\n\n1. **Continuity** — builds on this session's artifacts (\"67 of these 70 companies have RevOps teams — find the leads?\"), not a fresh generic idea.\n2. **Budget-aware** — framed against the remaining balance (\"with your ~9 credits left, ~5 verified emails fits\").\n3. **Cost-per-unit stated** — \"email waterfalls run ~1.4 credits each.\"\n4. **A default picking heuristic** so answering takes one word (\"I'd default to: has funding data + RevOps ≥ 2 + posting is recent\").\n5. **An escape hatch** — always end with \"or something else entirely.\"\n\nWhen a run produced a durable, repeatable result, one of the suggestions should be **making it systematic** — see [`recipes/save-as-play.md`](recipes/save-as-play.md).\n\nWhen a run or batch **misbehaved** — errors, missing downstream values, cost surprises — hand off to the `cargo-diagnostics` skill (`../cargo-diagnostics/SKILL.md`): sweep the batch for root causes before re-running anything paid. Interaction defaults for plan gates, shaped choices, and presenting results live in `../cargo/references/interaction.md`.\n\n## 5) Priority provider stack (recipes lead with these 7)\n\nThese seven credits-based providers cover the full prospecting → enrichment → verification → signal pipeline at the lowest credit cost in the catalog. Every recipe in this skill's `recipes/` leads with this stack:\n\n| Provider | Role | Key actions (cost in credits) |\n|---|---|---|\n| **salesNavigator** | Sourcing | `searchLeads` (0.2), `searchAccounts` (0.2), `findCompanyInsights/Metrics/EmployeesCount/Distribution` (0.25 each) |\n| **aiArk** | LinkedIn-anchored enrichment + cheapest search | `enrichCompany` (0.01 — cheapest firmographics in the catalog), `searchCompanies` (0.01/record, lookalike seeds), `searchPeople` / `reverseLookup` / `analyzePersonality` (0.05), `enrichPerson` (0.1 — profile **+ verified email**), `findMobilePhone` (0.5) |\n| **waterfall** | Multi-source enrichment + signal | `enrichContact` (2), `enrichCompany` (1), `verifyEmail` (0.1), `detectJobChange` (3), `searchProspects` (3), `findPhone` (7) |\n| **FullEnrich** | Premium contact lookup + free sourcing | `searchPeople` / `searchCompanies` / `lookupPerson` / `lookupCompany` (**0**), `fetchPeople` / `fetchCompanies` extractors (**0**), `findEmail` (1), `findPhone` (6), `findPhoneAndEmail` (7), `reverseEmailLookup` (1) |\n| **apolloio** | Niche-coverage enrichment | `enrichPerson` (1, **3** with `revealPhoneNumber`), `enrichOrganization` (1) — the **only two** credits-based actions; its other nine need your own Apollo API key |\n| **theirStack** | Tech-stack + hiring intent | `searchTechnologies` (0.5), `searchJobs` (0.5), `searchCompanies` (0.5) |\n| **peopleDataLabs** | Heavyweight backfill | `enrichPerson` (3), `enrichCompany` (3), `searchPeople` (3), `searchCompanies` (3), `queryPeople/Companies` (3) |\n\n`aiArk` and `apolloio` sit at opposite ends of the enrich tier and are picked by **what you hold**, not by preference: `aiArk` wins whenever a **LinkedIn URL** is in hand (profile + verified email at 0.1, mobile at 0.5, both billing 0 on a miss), `apolloio` is the **1-credit niche-coverage rung** you promote per-batch when a pilot shows Apollo hits where `aiArk` (0.1) and `waterfall` (2) miss — investor-backed and portfolio niches especially. Neither displaces `salesNavigator` for plain at-scale sourcing (0.2/lead).\n\nThree signal families sit outside the stack and are picked per task from [`references/stage-action-map.md`](references/stage-action-map.md): **firmographic depth** beyond `aiArk.enrichCompany` → `companyEnrich.enrichByDomain` (0.25); **funding / acquisitions** → `enrichCrm.getFunding` (1, the only credits-based funding action in the catalog); **tech stack on a known domain** → `builtwith.getDomainSummary` (free) before `builtwith.enrichDomain` (1).\n\nSee [`provider-playbooks/`](provider-playbooks/) for per-provider deep dives — including each provider's **Recurring use** section for when the task is a monitor, play, or scheduled pull rather than a one-off. See [`references/stage-action-map.md`](references/stage-action-map.md) for the complete cheapest-action-per-stage table across the full 136-integration catalog.\n\n> **Already holding identifiers (not sourcing)?** The stack above leads the *sourcing-first* spine. When you already have **LinkedIn URLs**, the cheapest enrich is [`aiArk.enrichPerson`](provider-playbooks/aiArk.md) (0.1 — full profile **plus** a verified email, bills 0 when no email is found); drop to [`linkedin.enrichProfile` / `enrichCompany`](provider-playbooks/linkedin.md) (0.25) when you don't need the email, and skip `waterfall.enrichContact` entirely (it keys on email or name+company, not a URL). Need a **phone**? `aiArk.findMobilePhone` (0.5) is the first rung, not the 3–7 tier. Have a **LinkedIn event URL**? `linkedin.extractEventAttendees` sources the attendee list directly. Have **emails**? `aiArk.reverseLookup` (0.05), then `leadMagic` / `contactOut`. See `references/stage-action-map.md` for the full input-type → cheapest-action map.\n\n## 6) Recipe spine (default chain)\n\n```\n1. SOURCE   → salesNavigator.searchLeads / searchAccounts            (0.2/record)\n              lookalike seeds, or filters SN can't express (skills,\n              education, tenure)? aiArk.searchCompanies / searchPeople (0.01–0.05/record)\n              free first pass on plain title/industry/size/geo filters?\n              FullEnrich.searchPeople / searchCompanies                (0/record)\n2. DEDUPE   → match against the workspace's own Companies / Contacts models\n              on domain / linkedin_url (storage SQL or a segment filter)  (free)\n3. ENRICH   → LinkedIn URL in hand? aiArk.enrichPerson (0.1) FIRST — profile + verified\n              email in one call; linkedin.enrichProfile/enrichCompany (0.25) if no email needed\n              aiArk.enrichCompany (0.01) for firmographics; companyEnrich.enrichByDomain\n              (0.25) on the rows that come back thin\n              + waterfall.enrichContact / enrichCompany              (1–2/record)\n              + apolloio.enrichPerson / enrichOrganization on the niche residue (1/record)\n4. SIGNAL   → enrichCrm.getFunding                                   (1/record)\n              + theirStack.searchJobs / builtwith.getDomainSummary   (0–0.5/record)\n              + waterfall.detectJobChange                            (3/record)\n5. CONTACT  → FullEnrich.findEmail — only on rows step 3 left without\n              an email (fallback peopleDataLabs)                     (1–3/record)\n6. VERIFY   → waterfall.verifyEmail                                  (0.1/record)\n7. BACKFILL → peopleDataLabs.enrichPerson (only if step 5 missed)    (3/record)\n8. QA       → scripts/contact-accuracy-audit.ts                      (free, local)\n```\n\nTwo spine notes from the 8-provider stack: step 3's `aiArk.enrichPerson` **already returns a verified email**, so step 5 runs on the residue only — don't pay `FullEnrich.findEmail` (1) behind a row that already has one. And when the goal reaches a **phone**, `aiArk.findMobilePhone` (0.5, mobile-only, bills 0 on a miss) is the first rung before `prospeo` (3) / `FullEnrich` (6) / `waterfall` (7) — the guarded-lever rule in §3 still applies to all four.\n\nAdapt by phase: drop steps that aren't relevant to the user's goal. For pure sourcing, run step 1 only. For \"enrich a list I already have,\" run steps 2–7.\n\n## 7) Output retrieval — use `run download-outputs`, not `run download`\n\nWhen the agent needs the actual data produced by an action (enriched fields, found emails, search results), use:\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid <uuid> \\\n  --output-node-slug <slug> \\\n  --format json\n```\n\n(Don't pass `--is-finished` — the CLI help still lists it but the API currently rejects it with `unrecognized_keys`; reported.)\n\nReturns `{\"url\": \"...\"}` — a signed URL to a CSV/JSON containing only the output node's data. Faster and cheaper than `run download` (which pulls full run records). See [`references/output-retrieval.md`](references/output-retrieval.md) and [`../cargo-analytics/SKILL.md`](../cargo-analytics/SKILL.md).\n\n## 8) Contact accuracy — run the QA scripts, don't eyeball\n\nFour deterministic TypeScript scripts in [`scripts/`](scripts/) (Node ≥ 22.18, zero deps, fixture-tested in CI) replace in-context row checking. **Run the script — never re-derive its logic by reasoning over rows.** Full doctrine, pipeline order, and the SEND/VERIFY/REVIEW/REMOVE verdict semantics: [`references/contact-accuracy.md`](references/contact-accuracy.md).\n\n- `scripts/validate-emails.ts` — free syntax/risk/duplicate cull **before** paid `verifyEmail`.\n- `scripts/select-current-role.ts` — pick the real current role from an experiences array (catches job changers).\n- `scripts/validate-linkedin-names.ts` — name↔profile match (catches same-name decoys); pairs with [`recipes/linkedin-url-lookup.md`](recipes/linkedin-url-lookup.md).\n- `scripts/contact-accuracy-audit.ts` — final per-row `audit_action` stamp on the merged output; cite its summary counts in the receipt. Reads files or a finished run directly (`--workflow-uuid`, via `@cargo-ai/api`).\n\n## 9) Action shape rules (every recipe)\n\nEvery action JSON in this skill follows the rules in [`../cargo-orchestration/references/examples/actions.md`](../cargo-orchestration/references/examples/actions.md):\n\n- `kind: \"connector\"` action shape: `{\"kind\":\"connector\",\"integrationSlug\":\"<slug>\",\"actionSlug\":\"<slug>\"}`. **`connectorUuid` is NOT in `config`** — the platform resolves the workspace's authenticated connector from `integrationSlug` automatically.\n- **A top-level action has no `config` — omit it.** Inputs go in `--data` / `--records`, and every recipe here writes the action without the key. That holds for `action execute`, `execute-batch`, and `get-output-schema` alike — the object `action list` returns pastes into all three. Inputs misplaced into `config` are not rejected, they are **dropped**, and the action runs with no input, so check this first when a call returns empty for no visible reason.\n- **Don't hand-write a slug you're unsure of, and don't page the catalog looking for one.** `cargo-ai orchestration action list <keywords> [--integration-slug <slug>]` is free, searches every integration plus native actions, tools, and agents, and returns the action object ready to paste **with the action's credit costs** — a cheap sanity check on both the slug and the price before a paid call. When the question is *which paid actions exist for this?*, `cargo-ai connection action search <keywords> --credits-only` is the one that filters on it. Neither replaces the provider playbook below: the playbook is where the input quirks, hit-rates, and recurring-use traps live.\n- For multi-step node graphs: `connectorUuid` lives at the top level of the node, not in `config`. Cross-node interpolation uses `{{nodes.<slug>.<field>}}`. Agent node outputs wrap under `.answer` (read as `{{nodes.<slug>.answer.<field>}}`).\n\n## 10) When stuck — file a workspace report\n\nIf a recipe fails repeatedly and the cause isn't obvious, escalate via `cargo-ai workspaceManagement report create`. See [`../cargo-workspace-management/SKILL.md`](../cargo-workspace-management/SKILL.md) (Reports section).\n\n## 11) Provider playbooks — read before you call (one-off or recurring)\n\n**STOP — do not execute any paid action against a provider below, and do not wire a provider into a recurring play/tool node graph, until you have opened its playbook.** Each playbook carries the exact action slugs, config shapes, input quirks, and cost traps; reading it for five seconds is cheaper than one failed paid call, and a failed batch is 100 failed paid calls. The stakes are higher, not lower, when the provider goes into a **recurring** workflow: a bad config repeats on every scheduled run, and a wrong cadence re-bills the same rows forever — each playbook ends with a **Recurring use** section (schedule fit, cadence default, re-billing gates, extractors) for exactly this. **Every credits-based provider with callable actions now has a playbook, with one stated exception**: `openRouter`, which exposes a model lister rather than credits-based actions, so there is nothing to document. `brightData` and `proxycurl` gained playbooks rather than staying unlisted — an undocumented provider still shows up in the cost table, and leaving the acceptable-use framing implicit was the weaker option: [`provider-playbooks/brightData.md`](provider-playbooks/brightData.md) states the consumer-targeting refusal up front. Own-key integrations fall back to [`references/alternatives.md`](references/alternatives.md) and [`references/stage-action-map.md`](references/stage-action-map.md).\n\n**Priority stack (recipes lead with these):**\n- [`provider-playbooks/salesNavigator.md`](provider-playbooks/salesNavigator.md) — LinkedIn-native lead and account sourcing (0.2/record).\n- [`provider-playbooks/aiArk.md`](provider-playbooks/aiArk.md) — LinkedIn-anchored people/company data: `enrichPerson` returns profile **+ verified email** at 0.1, `findMobilePhone` (0.5) is the cheapest phone rung, `searchCompanies` (0.01/record) does lookalikes, and `analyzePersonality` (0.05) is catalog-unique. All actions run on the managed connection.\n- [`provider-playbooks/waterfall.md`](provider-playbooks/waterfall.md) — swiss-army-knife: enrichment, verification, and the cargo-unique `detectJobChange` signal.\n- [`provider-playbooks/FullEnrich.md`](provider-playbooks/FullEnrich.md) — premium contact lookup; `reverseEmailLookup` is unique; `searchPeople` / `searchCompanies` and the `fetch*` extractors are free.\n- [`provider-playbooks/apolloio.md`](provider-playbooks/apolloio.md) — the 1-credit niche-coverage enrich rung (person + organization); **read it before assuming Apollo is available** — only two of its eleven actions are credits-based, the rest need your own Apollo API key.\n- [`provider-playbooks/theirStack.md`](provider-playbooks/theirStack.md) — tech-stack + hiring-intent signals.\n- [`provider-playbooks/peopleDataLabs.md`](provider-playbooks/peopleDataLabs.md) — heavyweight backfill at flat 3-credit tier.\n\n**Sourcing & company-data specialists:**\n- [`provider-playbooks/linkedin.md`](provider-playbooks/linkedin.md) — the native LinkedIn integration's action set (profiles, companies, posts, jobs).\n- [`provider-playbooks/oceanio.md`](provider-playbooks/oceanio.md) — lookalike-company discovery from seed domains, with technographic / web-traffic filters `aiArk.searchCompanies` (0.01) can't express.\n- [`provider-playbooks/datagma.md`](provider-playbooks/datagma.md) — lightweight person/company enrichment alternative.\n- [`provider-playbooks/companyEnrich.md`](provider-playbooks/companyEnrich.md) — cheapest company-by-domain (0.25) + per-item-billed lookalikes.\n- [`provider-playbooks/enrichCrm.md`](provider-playbooks/enrichCrm.md) — CRM-record enrichment; `getFunding` is the funding-signal fallback.\n- [`provider-playbooks/societeInfo.md`](provider-playbooks/societeInfo.md) — French-registry company/contact data (SIREN/SIRET).\n- [`provider-playbooks/snitcher.md`](provider-playbooks/snitcher.md) — website-visitor identification; the recurring extractor is the cost trap.\n- [`provider-playbooks/piloterr.md`](provider-playbooks/piloterr.md) — ultra-cheap bulk company extractor + G2 product info.\n- [`provider-playbooks/g2.md`](provider-playbooks/g2.md) — software-review & category signal data.\n- [`provider-playbooks/theSwarm.md`](provider-playbooks/theSwarm.md) — warm-intro network mapping to target companies/people.\n- [`provider-playbooks/mixrank.md`](provider-playbooks/mixrank.md) — premium person/company backfill (4/lookup, phone-only reverse lookup).\n\n**Email & contact specialists** (all feed the VERIFY step — see [`references/waterfall-strategy.md`](references/waterfall-strategy.md)):\n- [`provider-playbooks/hunter.md`](provider-playbooks/hunter.md) — domain-search email finding + verification.\n- [`provider-playbooks/prospeo.md`](provider-playbooks/prospeo.md) — email/phone lookup, LinkedIn-URL input path.\n- [`provider-playbooks/icypeas.md`](provider-playbooks/icypeas.md) — budget email find/verify.\n- [`provider-playbooks/findyMail.md`](provider-playbooks/findyMail.md) — email finding alternative.\n- [`provider-playbooks/leadMagic.md`](provider-playbooks/leadMagic.md) — email + mobile lookup alternative.\n- [`provider-playbooks/contactOut.md`](provider-playbooks/contactOut.md) — contact info from LinkedIn profiles.\n- [`provider-playbooks/zeroBounce.md`](provider-playbooks/zeroBounce.md) — email-verification second opinion to `waterfall.verifyEmail`.\n- [`provider-playbooks/bouncer.md`](provider-playbooks/bouncer.md) / [`neverBounce.md`](provider-playbooks/neverBounce.md) / [`kitt.md`](provider-playbooks/kitt.md) / [`enrichley.md`](provider-playbooks/enrichley.md) — verification long tail (0.3 / 0.2 / 0.05 / 0.1; enrichley's slug is `verify`, not `verifyEmail`).\n- [`provider-playbooks/dropcontact.md`](provider-playbooks/dropcontact.md) — email finding with French/EU registry depth; `email` output is an array.\n- [`provider-playbooks/enrowio.md`](provider-playbooks/enrowio.md) — email find (1) + verify (0.1); takes `fullName` only.\n- [`provider-playbooks/reverseContact.md`](provider-playbooks/reverseContact.md) — company-from-LinkedIn (credits); profile lookups are own-key.\n- [`provider-playbooks/rocketreach.md`](provider-playbooks/rocketreach.md) — person lookup (1); healthcare/NPI niche; beware the `currrentEmployer` schema key.\n- [`provider-playbooks/forager.md`](provider-playbooks/forager.md) — personal-email + phone from a LinkedIn URL.\n- [`provider-playbooks/cleon1.md`](provider-playbooks/cleon1.md) — terminal phone rung (15/lookup) — explicit user request only.\n\n**Research & scraping:**\n- [`provider-playbooks/firecrawl.md`](provider-playbooks/firecrawl.md) — web scraping for research/personalization stages.\n- [`provider-playbooks/serper.md`](provider-playbooks/serper.md) — Google SERP queries for research and URL discovery.\n- [`provider-playbooks/linkup.md`](provider-playbooks/linkup.md) — web search (0.5 standard / 2 deep) + sourced/structured answers.\n- [`provider-playbooks/parallel.md`](provider-playbooks/parallel.md) — cheapest page read in the catalog (`extract`, 0.025/URL) plus `createTask`, the only action that fills a caller-supplied output schema.\n- [`provider-playbooks/exa.md`](provider-playbooks/exa.md) — semantic search with a document-type `category` filter and publication-date bounds.\n- [`provider-playbooks/builtwith.md`](provider-playbooks/builtwith.md) — a domain's technology stack; `getDomainSummary` is **free** and runs in front of the paid rung.\n- [`provider-playbooks/x.md`](provider-playbooks/x.md) — public X posts and profiles at 0.02 an action; a signal rung, gated by acceptable use.\n- [`provider-playbooks/sillage.md`](provider-playbooks/sillage.md) — inbound signal detections read back from a model, **free**, so it runs first on any signal question.\n- [`provider-playbooks/brightData.md`](provider-playbooks/brightData.md) — Instagram / TikTok / Facebook / YouTube profiles by URL, 0.1 an action; the catalog's only non-LinkedIn, non-X social coverage, and the playbook opens with the consumer-targeting refusal that gates it.\n- [`provider-playbooks/proxycurl.md`](provider-playbooks/proxycurl.md) — LinkedIn profile / company lookups on your own key.\n\n**LLM providers** (all: one `instruct` action, cost per 1,000-token package, per-model tiers — prompts come from [`references/prompt-library/index.md`](references/prompt-library/index.md)):\n- [`provider-playbooks/anthropic.md`](provider-playbooks/anthropic.md) — judgment-tier default (Haiku/Sonnet 0.2, Opus 2); temperature nests under `advancedSettings` with required `maxTokens`.\n- [`provider-playbooks/openAi.md`](provider-playbooks/openAi.md) — cheapest bulk tier (`gpt-5-nano` 0.006) + native JSON-schema output.\n- [`provider-playbooks/gemini.md`](provider-playbooks/gemini.md) — cheap high-throughput (Flash 0.01, 15,000/min) + search grounding.\n- [`provider-playbooks/perplexity.md`](provider-playbooks/perplexity.md) — web-grounded research answers; default model is the expensive `sonar-deep-research` — always set `model` explicitly.\n\n## 12) References\n\n- [`references/cost-discipline.md`](references/cost-discipline.md) — the mandatory spend rules: pilot → approval gate, per-run receipts, 1.4×N over-provision, count-first sizing, provider-billing rules.\n- [`references/contact-accuracy.md`](references/contact-accuracy.md) — the deterministic QA scripts (email cull, current-role, name match, final audit) and the SEND/VERIFY/REVIEW/REMOVE verdicts.\n- [`references/prompt-library/index.md`](references/prompt-library/index.md) — ~40 named, parameterized LLM prompts (personalization, scoring, research, qualification, signal analysis, extraction). **Before authoring any enrichment/scoring prompt from scratch, grep this index** — reuse beats reinvention, and each entry carries a tested output contract. Load only the shard you need, never all of them.\n- [`references/stage-action-map.md`](references/stage-action-map.md) — cheapest credits-based action per stage across the full 136-integration catalog.\n- [`references/credits-cost-table.md`](references/credits-cost-table.md) — auto-generated cost table for all 176 credits-based actions.\n- [`references/waterfall-strategy.md`](references/waterfall-strategy.md) — canonical waterfall chains by enrichment goal (every recipe's \"fallback\" follows these).\n- [`references/alternatives.md`](references/alternatives.md) — provider swap-ins from the long tail when the priority stack can't serve.\n- [`references/output-retrieval.md`](references/output-retrieval.md) — `run download-outputs` patterns for fetching action data.\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7by8t6yt9yghbxtxz6hv0bts87k6bq\",\n  \"slug\": \"cargo-gtm\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1790973919665\n}\n\nFile v2.2.0:references/acceptable-use.md\n\n# Acceptable use — basis, suppression, and volume gates\n\nCanonical people-data rules for this skill. Recipes and playbooks link here instead of restating them. These are **mandatory behaviors**, the same tier as [`cost-discipline.md`](cost-discipline.md): an agent that skips the basis check or writes around a suppression list is misusing the skill.\n\nScope: every step that touches a person — sourcing, enrichment, verification, personalization, sequencer handoff, ads activation. Not legal advice; the user's counsel owns the final call on their jurisdiction and lawful basis.\n\n## 1) What this skill is for\n\nBusiness-to-business revenue work, on business identities, using data the workspace is licensed to receive through the providers in [`../provider-playbooks/`](../provider-playbooks/). The unit of work is a **qualified account and the person whose professional role makes them a plausible buyer** — a list that has been filtered, scored, and costed before anyone is contacted.\n\nIt is not a bulk-messaging tool. Nothing in *this* skill sends mail: the outreach recipes stop at send-ready variables and hand off to a sequencer, under that sequencer's sending limits and identities. Where that sequencer is Cargo's own — a mailbox the workspace provisioned through [`../../cargo-mailbox-management/SKILL.md`](../../cargo-mailbox-management/SKILL.md) — nothing on this page relaxes: the three checks in §3 run before the first send, the mailbox's warm-up ramp is the ceiling, and an unsubscribe writes a workspace-wide suppression that no later send may work around. Cargo owning the inbox changes who presses send, not whether the message should be sent.\n\n## 2) Hard refusals\n\nDo not execute these. Say which rule applies in one sentence, offer the compliant version, and move on — state it once, don't lecture.\n\n| Request | Why it's refused |\n|---|---|\n| \"Email everyone at every company in `<industry>`\" — undifferentiated fan-out with no qualification step | Volume in place of relevance is the definition of spam; propose the scored, filtered slice instead |\n| Consumer or private-individual targeting — personal life, home contact details, audiences with no business role | This skill covers B2B professional identities only |\n| A list whose origin the user can't state — purchased lists, lists exported from a former employer, data taken from a platform in breach of its terms | No lawful basis, and every downstream provider ToS forbids it |\n| Contacting anyone on the workspace's unsubscribe / do-not-contact / hard-bounce list | Suppression is absolute; re-contact is a violation, not an optimization |\n| Evasion: rotating sending domains or identities to dodge filters, disguising the sender, misleading subject lines, fake `Re:` threads on a first touch, forged headers | Deception is prohibited independently of volume |\n| Auto-dialing, SMS blasts, or a full-list phone sweep | Phone is explicit-request-only on qualified leads — see [`cost-discipline.md`](cost-discipline.md) §5 |\n| Batch-blasting LinkedIn engagement actions (`connectProfile`, `commentPost`) across a raw list | They act as a real member identity — see [`../provider-playbooks/linkedin.md`](../provider-playbooks/linkedin.md) |\n| Scraping a site in breach of its terms or `robots.txt` when a licensed provider action covers the same field | Use the provider action; if none exists, say so rather than routing around the block |\n\n## 3) Before any outreach step — three checks\n\nRun these before the personalize stage of [`../recipes/outreach-activation.md`](../recipes/outreach-activation.md), before an ads upload, and before any sequencer handoff. All three are free.\n\n| Check | What to ask / verify | If it fails |\n|---|---|---|\n| **Basis** | Which basis covers this audience — existing customers, opted-in contacts, event attendees, or a documented legitimate-interest case for a B2B role? | Stop and ask. Don't assume legitimate interest because the record has a work email |\n| **Suppression** | Filter the segment on the workspace's unsubscribe / DNC / hard-bounce columns *before* enriching or sending | If no such column exists, flag it as a real gap and offer to add one — don't proceed silently |\n| **Relevance** | Can you name, per recipient, why this message is for them? The signal in the segment is usually the answer | If the honest answer is \"they matched an industry filter\", the list isn't ready — tighten it |\n\n## 4) What every message must carry\n\nThe skill drafts copy; these are the properties that copy must have before the user's sequencer sends it.\n\n- **Accurate identity** — real sender, real company, headers and subject line that describe the message honestly.\n- **A working opt-out**, honored promptly and permanently. Under CAN-SPAM that's a mechanism valid ≥30 days and processed within 10 business days; under GDPR/ePrivacy an objection is immediate.\n- **A physical postal address** where the sender's jurisdiction requires one (CAN-SPAM does).\n- **Per-recipient relevance** — the personalization prompts in [`prompt-library/personalization.md`](prompt-library/personalization.md) exist for this. A prompt that produces the same sentence for every row is a signal the list is wrong, not that the prompt needs rewriting.\n\n## 5) Data hygiene\n\n- **Verify before you send.** `waterfall.verifyEmail` / `icypeas` aren't only a deliverability lever — mailing unverified addresses is how a list starts hitting spam traps.\n- **Record provenance.** Keep which provider supplied each contact field and when. An access or erasure request can't be honored on a column with no origin.\n- **Propagate erasure and opt-out.** On request, delete — and dedupe the *next* sourcing run against the suppression list, not just against the Contacts model, so a suppressed person doesn't re-enter as a \"new\" lead.\n- **Don't hoard.** Enriched personal data the workspace isn't actively working is cost and liability at once; drop the rows that didn't qualify.\n\n## 6) Volume and cadence\n\n- Respect the sequencer's and mailbox's own limits — this skill never proposes raising them, and a request to work around them is an evasion refusal under §2. On a Cargo-owned mailbox that limit is the warm-up ramp (5/day rising to 40/day over 45 days, read with `mailbox get-send-allowance`): it is a ceiling, not a target, and spreading one campaign across extra mailboxes to clear the same volume is the same refusal wearing a fleet — see [`../../cargo-mailbox-management/references/warmup-and-allowance.md`](../../cargo-mailbox-management/references/warmup-and-allowance.md).\n- One campaign per contact at a time; cap the touch count; **stop on reply, opt-out, or bounce**.\n- Cadence on recurring plays is a spend gate *and* a contact-frequency gate — a play that re-enrolls the same segment weekly is re-contacting the same people weekly. Check the provider playbook's **Recurring use** section before scheduling.\n\n## 7) Cross-references\n\n- Spend gates and the approval message: [`cost-discipline.md`](cost-discipline.md)\n- Ads consent and the removal path: [`../recipes/ads-audience-activation.md`](../recipes/ads-audience-activation.md)\n- Sending from a Cargo-owned mailbox — warm-up ramp, suppression list, delivery events: [`../../cargo-mailbox-management/SKILL.md`](../../cargo-mailbox-management/SKILL.md)\n- Personal-mailbox routing: [`../provider-playbooks/forager.md`](../provider-playbooks/forager.md)\n- LinkedIn identity limits: [`../provider-playbooks/linkedin.md`](../provider-playbooks/linkedin.md)\n\nFile v2.2.0:references/alternatives.md\n\n# Alternative provider chains\n\nWhen the priority stack (salesNavigator / cargo / aiArk / waterfall / FullEnrich / apolloio / theirStack / peopleDataLabs) can't serve the user's criteria, swap in providers from the long tail.\n\nFor every alternative, see [`stage-action-map.md`](stage-action-map.md) for the cheapest credits-based action per stage across the full 136-integration catalog.\n\n## When to swap providers\n\nOnly swap when:\n\n1. **Filter mismatch**: priority provider doesn't expose the filter you need (e.g., salesNavigator can't filter by funding round → escalate to peopleDataLabs.queryCompanies).\n2. **Coverage gap**: priority provider doesn't have data for the niche (e.g., local SMBs aren't well-covered by salesNavigator → escalate to serper.searchPlaces).\n3. **Premium quality required**: cheap email/phone finders missed → FullEnrich was already the priority answer; further escalation goes to multi-source like waterfall.findPhone (7 credits).\n\nDefault rule: **don't swap to chase 2× cheaper if hit-rate drops 30%**. The total credit spend across a chain is dominated by misses (re-running across stages), not by the per-call cost.\n\n## Sourcing alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| At-scale lead search | FullEnrich.searchPeople (**0**) **or** salesNavigator.searchLeads (0.2) | icypeas.findPeople (0.02) | When LinkedIn coverage is thin (e.g., privacy-focused industries). |\n| At-scale account search | FullEnrich.searchCompanies (**0**), salesNavigator.searchAccounts (0.2) **or** aiArk.searchCompanies (0.01) | oceanio.searchCompanies (1) | aiArk is 20× cheaper and takes lookalike seeds (≤5 domains), oceanio when the filter is technographic / web-traffic shaped. |\n|   |   | peopleDataLabs.searchCompanies (3) for cargo-filter shape, or queryCompanies (3) for SQL | When salesNavigator's filters miss (funding, investor, complex bool). |\n| Tech-intent sourcing | theirStack.searchJobs / searchCompanies (0.5) | (no priority alternative — theirStack IS priority) | n/a |\n| SMB / local | (none in priority — priority skips SMB) | serper.searchPlaces (0.05), firecrawl.scrape (0.05) | Always for local/storefront. |\n| Visitor de-anonymization | (none — niche) | snitcher.searchSessions (0) | Always for visitor ID — free credits-tier. |\n| Warm-intro sourcing | (none — niche) | theSwarm.searchWarmIntrosToCompany (2) | When the goal is intros, not pure prospecting. |\n\n## Person enrichment alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Person enrichment (LinkedIn URL in hand) | aiArk.enrichPerson (0.1) | linkedin.enrichProfile (0.25) | When you only need LinkedIn-anchored details and no email. |\n|   |   | prospeo.enrichLinkedin (0.5) | Second opinion on a URL-anchored miss. |\n| Person enrichment (name + company) | waterfall.enrichContact (2) | apolloio.enrichPerson (1, **3** with phone reveal, priority) | The niche-coverage rung — promote per-batch when a pilot shows Apollo hits where aiArk/waterfall miss (investor-backed, portfolio niches). |\n|   |   | hunter.enrichPerson (1) | Cheap mid-tier alternative. |\n| Reverse email → person | (none in priority) | FullEnrich.reverseEmailLookup (1) | Always for email → LinkedIn. |\n| Person backfill (heavyweight) | peopleDataLabs.enrichPerson (3) | (none cheaper for heavyweight) | n/a |\n\n## Company enrichment alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Company firmographics | aiArk.enrichCompany (0.01) | companyEnrich.enrichByDomain (0.25) | Fuller field set. Promote whenever 0.01 comes back thin. |\n|   |   | linkedin.enrichCompany (0.25) | When LinkedIn-anchored details are sufficient. |\n|   |   | apolloio.enrichOrganization (1, priority) | The niche-coverage rung — when the cheaper rungs miss and LinkedIn doesn't have it. |\n| Company technographics | builtwith.getDomainSummary (**0**) | theirStack.searchTechnologies (0.5) | When you want catalog-style \"show me the tech list\" rather than per-domain detection. |\n|   |   | builtwith.enrichDomain (1) | Full stack detail on the rows the free summary left ambiguous. |\n\n## Find email alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Find email (LinkedIn URL in hand) | aiArk.enrichPerson (0.1) | — | Returns a verified email with the profile and bills 0 when it finds none; run the finders below only on the residue. |\n| Find email (default) | FullEnrich.findEmail (1) | hunter.findEmail (0.5) | When budget critical AND okay with lower hit rate. |\n|   |   | icypeas.findEmail (0.1) | Cheap last-resort for very large lists. |\n|   |   | findyMail.findEmail (0.5) | Mid-tier alternative; sometimes finds what hunter misses. |\n|   |   | leadMagic.findEmail (0.5) | Mid-tier alternative. |\n|   |   | dropcontact.findEmail (1) | Better for French/EU data. |\n|   |   | datagma.findEmail (1) | Alt mid-tier. |\n\n## Verify email alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Verify email | waterfall.verifyEmail (0.1) | icypeas.verifyEmail (0.01) | When verifying very large lists (10× cheaper). |\n|   |   | zeroBounce.verifyEmail (0.1) | Equivalent cost; different underlying provider. |\n|   |   | kitt.verifyEmail (0.05) | Cheaper alternative. |\n\n## Find phone alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Find phone (mobile, URL in hand) | aiArk.findMobilePhone (0.5) | prospeo.findPhone (3) | Landline/DID fallback; escalate from aiArk on a mobile miss. |\n| Find phone (no URL / mobile missed) | FullEnrich.findPhone (6) | prospeo.findPhone (3) | Cheaper first attempt; escalate to FullEnrich on a miss. |\n|   |   | forager.findPhone (5) | Mid-tier. |\n|   |   | findyMail.findPhone (5) | Mid-tier. |\n|   |   | cleon1.findPhoneFromLinkedin (15) | Premium; only for high-value leads where standard sources fail. |\n\n## LinkedIn URL alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Resolve LinkedIn from name+company | linkedin.findProfileUrl (0.25) | (no cheaper credible alternative) | n/a |\n| Resolve LinkedIn from email | FullEnrich.reverseEmailLookup (1) | (no cheaper credible alternative) | n/a |\n\n## When the priority stack genuinely can't serve the goal\n\nExamples:\n- \"Find every TikTok creator with > 10k followers\" — no priority provider has this; need apify.* or specialized scrapers.\n- \"Get GitHub stars over time for a list of repos\" — github connector + custom enrichment.\n- \"Find every company that uses Stripe Atlas\" — niche; might require custom scraping via firecrawl.\n\nFor these: defer to [`../SKILL.md`](../SKILL.md) and its [`../agents/execution-plan-creator.md`](../agents/execution-plan-creator.md), which builds a custom chain citing the right long-tail providers.\n\n## Always escalate to a workspace report\n\nIf the priority stack misses AND no documented alternative covers the gap, file a `cargo-ai workspaceManagement report create` describing the missing capability. See [`../../cargo-workspace-management/SKILL.md`](../../cargo-workspace-management/SKILL.md) (Reports section).\n\nFile v2.2.0:references/contact-accuracy.md\n\n# Contact accuracy — deterministic QA scripts\n\nEvery list that reaches a sequencer or CRM carries three failure modes that\nprose diligence misses: the **wrong person** (same-name decoy behind a LinkedIn\nURL), the **stale role** (contact left the company; the #1 source of bounces\nand bad first lines), and the **unsafe email** (catch-all domains that accept\nanything, single-source guesses, role accounts). This reference wires four\nrunnable TypeScript scripts into the pipeline so those checks are code, not\njudgment.\n\n**The rule: run the script — do not re-derive its logic in-context.** The\nscripts are deterministic, fixture-tested in CI, and cheaper than reasoning\nthrough 500 rows. If a script's verdict looks wrong, that's a bug report\n(`workspaceManagement report create`), not a reason to hand-check rows.\n\n## Runtime\n\nScripts live in [`../scripts/`](../scripts/) (this skill's directory — resolve\nrelative to wherever the skill loaded from). They run directly with Node ≥\n22.18 (`node <script>.ts`, native type-stripping; `npx tsx <script>.ts` on\nolder Nodes). Zero dependencies for file mode. Every script supports:\n\n- `--input <file.csv|file.json>` — rows from a file: a CSV from\n  `run download-outputs`, a JSON array, or raw `action execute-batch` output\n  (`{\"results\": [...]}` is unwrapped automatically), **or**\n- `--workflow-uuid <uuid>` (+ optional `--batch-uuid`, `--output-node-slug`,\n  `--workspace-uuid`) — **API mode**: fetches the output rows directly via the\n  `@cargo-ai/api` package (`npm install -g @cargo-ai/api` if missing), reusing\n  the CLI's stored login (`~/.config/cargo-ai/credentials.json`) or\n  `CARGO_API_TOKEN`. Equivalent to `run download-outputs`, no temp file.\n- `--output <file>` — write augmented rows (default: stdout). On\n  `validate-emails.ts` and `contact-accuracy-audit.ts`, `--json` switches the\n  row output from CSV to a JSON array — use it when the next step is a `jq`\n  filter (build the paid-verify batch from `recommendation != \"skip\"` rows;\n  hand off only `audit_action == \"SEND\"` rows).\n- `--fixtures` — self-test against the bundled fixture file; exits non-zero on\n  failure (CI runs this on every push).\n\n## The four scripts, in pipeline order\n\n| Stage | Script | Adds columns | Run it… |\n|---|---|---|---|\n| Before paid verification | `validate-emails.ts` | `email_syntax_valid`, `email_risk` (ok/free/role/disposable/invalid), `recommendation`, `is_duplicate` | on every enriched list, **before** `waterfall.verifyEmail` — culling invalid/disposable/duplicate rows first is free and shrinks the paid verify batch |\n| After enrichment | `select-current-role.ts` | `current_title`, `current_company`, `role_confidence` (high/medium/low), `role_reason` | whenever a provider returned an experiences array — never trust the top experience blindly |\n| After enrichment | `validate-linkedin-names.ts` | `name_match` (true/false), `name_match_reason` | whenever a LinkedIn URL was looked up from a name (see [`../recipes/linkedin-url-lookup.md`](../recipes/linkedin-url-lookup.md)) — catches same-name decoys |\n| Last, before handoff | `contact-accuracy-audit.ts` | `audit_action` (**SEND / VERIFY / REVIEW / REMOVE**), `audit_flags`, `audit_flag_reason` | on the final merged output, after verification — the audit consumes the columns the other three produced (it degrades gracefully if some are missing) |\n\n**The audit must see every row.** Merge verification statuses back onto the\nfull row set before auditing — never pre-filter to `status == \"valid\"` first,\nor the catch-all/unknown/invalid rows silently vanish along with their\nVERIFY/REVIEW/REMOVE verdicts and the receipt counts. Filtering happens once,\nafter the audit: only `audit_action == \"SEND\"` rows proceed.\n\nChaining example (each script reads the previous one's output):\n\n```bash\nS=<path-to-this-skill>/scripts\nnode $S/validate-emails.ts        --input outputs.csv        --output step1.csv\n# … run waterfall.verifyEmail on the survivors, merge results into step2.csv …\nnode $S/select-current-role.ts    --input step2.csv          --output step3.csv\nnode $S/validate-linkedin-names.ts --input step3.csv         --output step4.csv\nnode $S/contact-accuracy-audit.ts  --input step4.csv         --output final.csv\n```\n\nOr audit a finished run in one step, no download:\n\n```bash\nnode $S/contact-accuracy-audit.ts --workflow-uuid <uuid> --batch-uuid <uuid> --summary-json\n```\n\n## What each verdict means\n\n- **SEND** — verified email (or catch-all corroborated by ≥ 2 providers), no\n  name mismatch, current role confirmed. Safe for the sequencer.\n- **VERIFY** — email unproven (catch-all with a single source, or never\n  verified). Route these rows back through `waterfall.verifyEmail` — that\n  re-run is paid, so it goes through the pilot gate in\n  [`cost-discipline.md`](cost-discipline.md).\n- **REVIEW** — human-judgment rows: likely job changer (`role_confidence:\n  low`), or a role account (info@/sales@). Present them to the user; don't\n  silently send or drop.\n- **REMOVE** — wrong person, invalid/disposable email, failed verification, or\n  a duplicate row (the first occurrence carries the send).\n  Drop from the batch and report the count in the receipt.\n\nReport the audit summary with every deliverable — the stderr table (or\n`--summary-json`) gives the counts to cite in the cost receipt, e.g. \"412 SEND\n/ 41 VERIFY / 22 REVIEW / 25 REMOVE\".\n\n## Fixtures & CI\n\nEach script ships a `fixtures_*.json` next to it — synthetic cases only, no\nreal contact data. `--fixtures` recomputes every case;\n`validate-linkedin-names.ts` additionally enforces precision ≥ 0.95 / recall ≥\n0.85 on the match class. CI (`skills-lint` workflow) runs all four on every\npush, so a green build means the verdicts you rely on are the verdicts that\nwere tested.\n\nFile v2.2.0:references/cost-discipline.md\n\n# Cost discipline — pilot gate, receipts, and spend rules\n\nCanonical spend rules for every credits-based action in this skill. Recipes and playbooks link here instead of restating them. These are **mandatory behaviors**, not advice: an agent that skips the pilot gate or the receipt is misusing the skill.\n\n## 1) The pilot → approval → full-run gate (blocking)\n\nRequired order for **every** paid batch (anything beyond a handful of records, or any action whose cost is unknown):\n\n```\n1. SAMPLE    Run a small slice of the EXACT input data through the EXACT config.\n             1–3 rows to prove one action's config shape.\n             10–20 records before any BATCH — one row can't show a hit-rate,\n             and a batch's cost is (per-row cost × hit-rate) × N.\n2. APPROVAL  Present the approval message (format below). Wait for the user.\n             It must state the RECORD COUNT to be enrolled and the CREDIT\n             ESTIMATE for them.\n3. FULL RUN  Only after explicit approval, fan out across the remaining records.\n```\n\nSize the pool before you can quote either number — `segment get <uuid>` → `recordsCount`, a `storage query execute` count, or `wc -l` on the input file. All free. Approval of the sample is **not** approval of the full run; ask again, explicitly. Batch-sampling mechanics per data kind (`filter` + `limit`, `recordIds`, sliced `records`, truncated CSV) live in [`../../cargo-orchestration/SKILL.md`](../../cargo-orchestration/SKILL.md) → \"Create a batch\".\n\nThe approval message has four required sections. **If any section is missing, stay in AWAIT_APPROVAL — do not run paid or cost-unknown actions.**\n\n```\nASSUMPTIONS\n  Define every judgment call operationally, not vaguely.\n  Bad:  \"best contact per company\"\n  Good: \"best contact = highest-ranked current employee matching RevOps/GTM-ops\n         titles, weighted Chief > VP > Head > Director > Lead > Manager\"\n  Declare data decisions already made (rows dropped and why, domains fixed)\n  and the cost trade-off chosen (cheap chain vs premium play, and why).\n\nSAMPLE RESULT (verbatim)\n  Rows run, credits spent, per-row cost, hit-rate — observed numbers,\n  not catalog numbers. Paste a preview of the actual output rows.\n\nCREDITS · SCOPE · CAP\n  Both numbers, always, in one line the user can decide on:\n    - HOW MANY records the full run would enroll (the counted pool minus\n      the sample), and\n    - WHAT IT COSTS = observed per-row cost × remaining rows.\n  Reconcile against the ACTUAL balance (see §2) — if the estimate exceeds\n  the balance, say so BEFORE the user hits it mid-run.\n\nAPPROVE?\n  Offer 3 shaped choices, never bare yes/no:\n    1. Run until the budget cap is hit (state how many rows that covers).\n    2. Top up first, then run everything clean.\n    3. Trim scope to fit the budget (propose the trimming heuristic —\n       e.g. \"keep the ~45 companies with funding data + RevOps team ≥ 2\").\n  Option 3 is usually the operator move: reshape scope instead of asking\n  for more budget.\n```\n\nCheck the balance before quoting an estimate:\n\n```bash\ncargo-ai billing subscription get\n# remaining = subscriptionAvailableCreditsCount - subscriptionCreditsUsedCount\n```\n\n### The estimate has two terms, not one\n\n```\ncredits = (provider cost per record × records)      # what the cost table prices\n        + (node executions per record × records / 100)  # the execution charge\n```\n\n**Every node execution bills 0.01 credits — 1 per 100 — whatever the node is.** `branch`, `filter`, `switch`, `variables` and the other structural natives carry no provider price and are still not free, and errored executions bill too. The credits cost table prices *actions*; it has no row for a step, so an estimate built from it alone omits the second term entirely.\n\nIt is a rounding error on an action-heavy chain (a 2-credit `enrichContact` dwarfs the 8 steps around it) and the *whole* bill on a step-heavy, action-light one — a 12-node routing sweep over 20,000 records is 2,400 credits with no provider call in it. Two consequences for the gate above:\n\n- **Measure it on the pilot**, where it is free to observe: the sample's execution count is `length(run.executions)` per record, or `cargo-ai billing usage get-metrics --unit orchestration.executions` over the sample window (`success` + `error` are execution counts, not credits). Never estimate it from the graph you *think* ran — loops, retries, tool internals and agent steps all multiply it.\n- **Quote it in `CREDITS · SCOPE · CAP`** whenever it is more than ~10% of the total. A user approving \"1,225 records ≈ 502 credits\" who is then billed 640 was not given the number they approved.\n\nThe charge is attributed to no node — `executions[].creditsUsedCount` is provider cost only and reads `0` on a native that billed — so it is invisible in per-node diagnostics. Full accounting: [`../../cargo-billing/SKILL.md`](../../cargo-billing/SKILL.md) → \"The execution charge\".\n\n## 2) Per-run receipt (after every paid action)\n\nAfter **every** paid action or batch — pilot included — report:\n\n1. **Credits spent + balance remaining** — \"12.4 credits spent, ~31 left.\" Use the billing figure, not your own sum of action prices: it includes the execution charge, which your arithmetic will not.\n2. **Hit-rate** — \"found 34 emails of 40 contacts (85%)\", per field when the action returns several (\"RevOps count 67/70 · funding 31/70\"). Flag rows to distrust, don't silently include them.\n3. **Estimate vs actual, with the why** — only when they diverge: \"cost 7.5 credits vs 3–5 estimated: theirStack billed per returned job posting, and 12 companies had >5 postings each.\"\n\nPrefer the billing source of truth over your own arithmetic:\n\n```bash\ncargo-ai billing usage get-metrics --workflow-uuid <uuid>\n```\n\nA receipt is not optional bookkeeping — it is what makes the next-step suggestion and the next approval trustworthy.\n\n**On a new account, frame the balance against the free tier.** A new workspace starts with **100 free credits, no card** — so \"12.4 spent, 87.6 of your 100 free credits left\" is the receipt a first-time user can actually act on, where \"87.6 remaining\" is a number with no scale. Two consequences for how you spend them:\n\n- **Lead with the cheap rungs harder than usual.** 100 credits is ~5,000 sourced leads or ~50 fully enriched contacts — the same budget, two orders of magnitude apart depending on the chain. A first session that burns the tier on `findPhone` (6–7/lookup) leaves the user with nothing to try next.\n- **Say what's left in the tier when proposing the next step.** \"With ~88 free credits left, verifying all 400 of these runs ~40\" is a decision the user can make in one word; \"that'll cost about 40 credits\" is not.\n\n## 3) Over-provision 1.4×N, then filter — never chase misses\n\nProvider coverage is a property of the target company, not something more retries can overcome. Contact search typically misses 15–20% of companies; email waterfalls miss another 5–10% of contacts.\n\n- To deliver N complete rows, **source ~1.4×N** and let the misses fall out.\n- **Drop incomplete rows instead of re-running them** through more providers — the marginal credits go to the same rows that already missed.\n- Stop at ~80% of target and filter, rather than restarting the chain for the tail.\n\n## 4) Count first, pay second\n\nSize the pool before paying for it:\n\n- Use free lookups (`orchestration action list <keywords>` — or `connection action search <keywords> --credits-only` to see only the paid ones — plus model SQL counts and existing segments) and the cheapest search page before any paid pull. `action list` returns each action's `credits` cost table, so the price is knowable before the call rather than after.\n- **Keep `limit`/page sizes strict** — search actions are billed on *returned* rows, not on matched totals. Where a provider returns a `total_count` alongside results, a 1-row request sizes the whole TAM for the price of one row.\n- Never pull a full result set \"to see what's there.\" Decide the filter from a small page, then pull exactly the scope approved in §1.\n\n## 5) Provider-billing rules\n\n- **Prefer pay-on-success actions** when coverage is uncertain. If a provider bills per attempt, prove quality on the pilot before scaling.\n- **Phone is the guarded lever** — the escalation tier runs 3–7 credits/record, ~10× email. `aiArk.findMobilePhone` (0.5, mobile-only, LinkedIn-URL or domain+name anchored) is the cheap first rung and bills 0 on a miss, but the rule is unchanged: never include phone lookup in a default chain; it enters a plan only on explicit user request, on qualified leads only.\n- Cheap-but-low-hit-rate providers are not savings: total spend is dominated by misses, not per-call price (see [`alternatives.md`](alternatives.md)).\n\n## 6) Context discipline\n\nNever read a large CSV/JSON export into the conversation context — it's the most common way to blow a session. Inspect exports with `head`, `jq`, or a storage SQL query, and pass files by path. Receipts and previews (a few rows) belong in context; datasets don't.\n\n## Where this gate is applied\n\n- The plan agent ([`../agents/execution-plan-creator.md`](../agents/execution-plan-creator.md)) emits plans in the §1 approval format.\n- Every recipe's batch step assumes the gate ran; per-recipe credit-budget tables give the *catalog* estimate, the pilot gives the *observed* one — trust the pilot.\n- Waterfall chains add their own stop-early rules on top: see [`waterfall-strategy.md`](waterfall-strategy.md).\n\nFile v2.2.0:references/credits-cost-table.md\n\n# Credits cost table\n\nEvery credits-based action Cargo can run — 180 of the 517 actions exposed by 123 of the catalog's 136 integrations, plus Cargo's own native actions — sorted by cost. The other 337 carry no *provider* price; they are not free, because every node execution bills 0.01 credits (1 per 100) regardless. See [`../../cargo-billing/SKILL.md`](../../cargo-billing/SKILL.md) → \"The execution charge\".\n\nRows whose provider is `native` are Cargo's own platform actions, run as `{\"kind\":\"native\",\"actionSlug\":\"<action>\"}` with no integration; every other row runs as `{\"kind\":\"connector\",\"integrationSlug\":\"<provider>\",\"actionSlug\":\"<action>\"}`.\n\n**Generated. Do not edit by hand** — this is a snapshot of the live catalog, which is where pricing actually lives. Regenerate from `action list`, which returns a `credits` array on every billed action:\n\n```sh\ncargo-ai orchestration action list --kind connector\ncargo-ai orchestration action list --kind native\n```\n\nOmit `--limit` so both return the full set, then render one row per action. Each `credits` entry is one of three shapes: `fixed` bills `cost` per call; `unit` bills `cost` per `unit` consumed; `package` bills `cost` per block of `unitsCount` `unit`. For `unit` and `package`, `fixedCost` is a base charge that **adds to** the metered rate rather than replacing it — a search billed `0.175` `fixedCost` + `0.025` per item costs `0.2` for one item. Several entries mean the price depends on config, and each entry's `config.jsonSchema` const/enum is what selects it; those go in the per-config section at the end rather than the main table.\n\nGenerated: 2026-08-28\n\n| Cost | Provider | Category | Action | Description |\n|---|---|---|---|---|\n| 0 | `aiArk` | enrichment | `countCompanies` | Count how many companies match company filters or lookalike domains, without retrieving them |\n| 0 | `aiArk` | enrichment | `countPeople` | Count how many people match person and company filters, without retrieving them |\n| 0 | `builtwith` | enrichment | `getDomainSummary` | Get summary technology-group counts for a domain (Free API) |\n| 0 / item | `sillage` | sales | `searchLeads` | Search the leads Sillage collected on the monitored accounts of a listen signals model |\n| 0 / item | `snitcher` | enrichment | `searchSessions` | Search and retrieve website visitor sessions with filtering options for date ranges, URLs, and referrers |\n| 0–1 / person | `apolloio` | enrichment | `searchPeople` | Search Apollo's people database by person, company, technology, and hiring filters |\n| 0–3 | `contactOut` | enrichment | `enrich` | Find data from an email. It returns data person / company information as the response |\n| 0.006–0.5 / 1k token + base | `openAi` | freeform | `instruct` | Instruct prompt |\n| 0 | `FullEnrich` | enrichment | `lookupCompany` | Look up one company by domain or LinkedIn URL or ID |\n| 0 | `FullEnrich` | enrichment | `lookupPerson` | Look up one person by LinkedIn URL or ID, or by full name with a company domain or LinkedIn URL |\n| 0 | `FullEnrich` | enrichment | `searchCompanies` | Search for companies matching company filters |\n| 0 | `FullEnrich` | enrichment | `searchPeople` | Search for people matching person and company filters |\n| 0.01 | `aiArk` | enrichment | `enrichCompany` | Retrieve firmographics for a single company from its domain or LinkedIn URL |\n| 0.01 / item | `aiArk` | enrichment | `searchCompanies` | Search for companies matching company filters or lookalike domains |\n| 0.01 / organization | `apolloio` | enrichment | `searchOrganizations` | Search Apollo's company database by firmographic, funding, technology, and hiring filters |\n| 0.01 | `icypeas` | enrichment | `verifyEmail` | Verify a person's email status |\n| 0.01 | `piloterr` | enrichment | `getG2ProductInfo` | Retrieve detailed information about a product from G2 including reviews, ratings, pricing plans, and product specificati… |\n| 0.01–0.25 / 1k token + base | `gemini` | freeform | `instruct` | Instruct prompt |\n| 0.02 / 100 item | `icypeas` | enrichment | `findCompanies` | Search the Icypeas lead database for companies matching the given criteria. Returns a paginated list of matching compani… |\n| 0.02 / 100 item | `icypeas` | enrichment | `findPeople` | Search the Icypeas lead database for people matching the given criteria. Returns a paginated list of matching profiles. |\n| 0.02 / 1k token | `native` | platform | `fileSearch` | Search files |\n| 0.02 | `x` | enrichment | `getFollowers` | Get the followers of an X account |\n| 0.02 | `x` | enrichment | `getFollowing` | Get the accounts an X account is following |\n| 0.02 | `x` | enrichment | `getPostComments` | Get the replies (comments) on an X post |\n| 0.02 | `x` | enrichment | `getPostDetails` | Get a single X post (tweet) with its engagement metrics |\n| 0.02 | `x` | enrichment | `getPostLikers` | Get the X accounts that liked a post |\n| 0.02 | `x` | enrichment | `getQuoteTweets` | Get the posts that quote-tweeted an X post |\n| 0.02 | `x` | enrichment | `getRetweeters` | Get the X accounts that reposted (retweeted) a post |\n| 0.02 | `x` | enrichment | `getUserLikes` | Get the posts recently liked by an X account |\n| 0.02 | `x` | enrichment | `getUserMedia` | Get the recent media posts (photos/videos) of an X account |\n| 0.02 | `x` | enrichment | `getUserPosts` | Get the recent posts (tweets) published by an X account |\n| 0.02 | `x` | enrichment | `getUserProfile` | Get the profile of an X account (bio, followers, links, …) |\n| 0.02 | `x` | enrichment | `getUserReplies` | Get the recent replies posted by an X account |\n| 0.02 | `x` | enrichment | `searchPeople` | Search X accounts (people) by keyword |\n| 0.02 | `x` | enrichment | `searchPosts` | Search X posts (tweets) by keyword or advanced query |\n| 0.025 / url | `parallel` | enrichment | `extract` | Extract relevant content from specific web URLs using Parallel AI |\n| 0.05 | `aiArk` | enrichment | `analyzePersonality` | Analyze a LinkedIn profile to get personality insights (OCEAN, DISC) and tailored selling and hiring guidance |\n| 0.05 | `aiArk` | enrichment | `reverseLookup` | Find a person's full profile from an email address or a phone number |\n| 0.05 / item | `aiArk` | enrichment | `searchPeople` | Search for people matching person and company filters |\n| 0.05 / item | `firecrawl` | enrichment | `crawl` | Recursively search through a urls subdomains, and gather the content |\n| 0.05 / item | `firecrawl` | enrichment | `scrape` | Turn any url into clean data |\n| 0.05 / item | `firecrawl` | enrichment | `search` | Search the web using Firecrawl |\n| 0.05 | `kitt` | sales | `verifyEmail` | Verify an email address |\n| 0.05 / item | `linkedin` | enrichment | `extractCompanyViewers` | Extract the list of people who viewed a LinkedIn company page you administrate over the past year. |\n| 0.05 / item | `linkedin` | enrichment | `extractEventAttendees` | Extract the attendees of a LinkedIn event. |\n| 0.05 / item | `linkedin` | enrichment | `extractFollowers` | Extract the list of people who follow the connected LinkedIn profile. |\n| 0.05 / item | `linkedin` | enrichment | `extractPageFollowers` | Extract the list of people who follow a LinkedIn company page you administrate, with the date each one followed. |\n| 0.05 / item | `linkedin` | enrichment | `extractProfileCommentActivity` | Extract the comment activity history of a LinkedIn profile, showing posts they have commented on |\n| 0.05 / item | `linkedin` | enrichment | `extractProfilePostActivity` | Extract the post activity history of a LinkedIn profile, showing content they have published |\n| 0.05 / item | `linkedin` | enrichment | `extractProfileReactionActivity` | Extract the reaction activity history of a LinkedIn profile, showing posts they have liked or reacted to |\n| 0.05 / item | `linkedin` | enrichment | `extractProfileViewers` | Extract the list of people who have viewed your LinkedIn profile recently. |\n| 0.05 / item | `linkedin` | enrichment | `searchPostComments` | Search for post comments |\n| 0.05 / item | `linkedin` | enrichment | `searchPostReactions` | Search for post reactions |\n| 0.05 | `serper` | enrichment | `search` | Retrieve Google searches |\n| 0.05 | `serper` | enrichment | `searchPlaces` | Retrieve Google places |\n| 0.05–4 / 1k token + base | `anthropic` | freeform | `instruct` | Instruct prompt |\n| 0.1 | `aiArk` | enrichment | `enrichPerson` | Enrich a person's full profile and find their verified email from a LinkedIn URL or an AI-Ark person ID |\n| 0.1 | `brightData` | enrichment | `scrapeFacebookPagePosts` | Scrape Facebook page posts by URL including content, engagement metrics, and attachments |\n| 0.1 | `brightData` | enrichment | `scrapeFacebookProfile` | Scrape Facebook page or profile data by URL including name, followers, contact info, and business details |\n| 0.1 | `brightData` | enrichment | `scrapeInstagramProfile` | Scrape Instagram profile data by URL including follower count, posts, bio, and engagement metrics |\n| 0.1 | `brightData` | enrichment | `scrapeTikTokProfile` | Scrape TikTok profile data by URL including follower count, likes, videos, and engagement metrics |\n| 0.1 | `brightData` | enrichment | `scrapeTwitterProfile` | Scrape X (Twitter) profile data by URL including follower count, posts, bio, and engagement metrics |\n| 0.1 | `brightData` | enrichment | `scrapeYouTubeChannel` | Scrape YouTube channel data by URL including subscriber count, videos, views, and top videos |\n| 0.1 | `enrichley` | enrichment | `verify` | Verify email |\n| 0.1 | `enrowio` | enrichment | `verifyEmail` | Verify a person's email |\n| 0.1 | `icypeas` | enrichment | `findEmail` | Find an email address from a firstname, a lastname and a company domain name. |\n| 0.1 | `icypeas` | enrichment | `scanDomain` | A special route in order to completely scan a domain. Scanning a domain allows you to discover all role-based email addr… |\n| 0.1 | `native` | platform | `sendEmail` | Send an email from one of your mailboxes |\n| 0.1 | `waterfall` | enrichment | `verifyEmail` | Verify a person's email |\n| 0.1 | `zeroBounce` | enrichment | `verifyEmail` | Verify a person's email status. |\n| 0.125–60 | `parallel` | enrichment | `createTask` | Execute a web research task using Parallel AI. Supports complex queries that require deep research, analysis, and struct… |\n| 0.125 + 0.025 / item | `parallel` | enrichment | `search` | Search the web with Parallel AI and return ranked results with relevant excerpts |\n| 0.025 / item + base | `exa` | enrichment | `search` | Search the web with Exa and return ranked results |\n| 0.2 | `neverBounce` | enrichment | `verifyEmail` | Verify an email address |\n| 0.2 / item | `salesNavigator` | enrichment | `extractAccountSearch` | Retrieve accounts from Sales Navigator |\n| 0.2 / item | `salesNavigator` | enrichment | `extractLeadSearch` | Retrieve leads from Sales Navigator |\n| 0.2 / item | `salesNavigator` | enrichment | `searchAccounts` | Search and retrieve company accounts from Sales Navigator based on various filters including headcount, location, indust… |\n| 0.2 / item | `salesNavigator` | enrichment | `searchLeads` | Search and retrieve contact profiles from Sales Navigator based on various filters including company, role, location, an… |\n| 0.25 | `companyEnrich` | enrichment | `enrichByDomain` | Retrieve company information by domain name |\n| 0.25 | `companyEnrich` | enrichment | `getWorkforce` | Returns workforce insights including historical headcount by department. Useful for tracking department-level growth and… |\n| 0.25 | `companyEnrich` | enrichment | `lookupPerson` | Looks up a person by email address. Resolves the company from the email domain first, then matches the person by email l… |\n| 0.25 | `findyMail` | enrichment | `verifyEmail` | Verify email for potential bounce |\n| 0.25 | `linkedin` | enrichment | `commentPost` | Comment LinkedIn posts |\n| 0.25 | `linkedin` | enrichment | `commentPostComment` | Comment LinkedIn post comments |\n| 0.25 | `linkedin` | enrichment | `connectProfile` | Connect to LinkedIn profiles |\n| 0.25 | `linkedin` | enrichment | `enrichCompany` | Retrieve information about a company |\n| 0.25 | `linkedin` | enrichment | `enrichJob` | Retrieve information about a job |\n| 0.25 | `linkedin` | enrichment | `enrichPost` | Retrieve information about a LinkedIn post including content, author, engagement metrics, and media |\n| 0.25 | `linkedin` | enrichment | `enrichProfile` | Retrieve information about a profile |\n| 0.25 | `linkedin` | enrichment | `extractCompanyEmployeesInsights` | Extract employee insights and analytics from a LinkedIn company page, including headcount by function, location, and sen… |\n| 0.25 | `linkedin` | enrichment | `extractSimilarCompanies` | Extract a list of companies similar to a given LinkedIn company page, based on LinkedIn's recommendations |\n| 0.25 | `linkedin` | enrichment | `findProfileUrl` | Find a LinkedIn profile URL from a name |\n| 0.25 | `linkedin` | enrichment | `followProfile` | Follow LinkedIn profiles |\n| 0.25 | `linkedin` | enrichment | `likePost` | Like LinkedIn posts |\n| 0.25 | `linkedin` | enrichment | `messageProfile` | Send a direct message to a LinkedIn connection |\n| 0.25 | `linkedin` | enrichment | `searchPosts` | Search for posts |\n| 0.25 | `linkedin` | enrichment | `visitProfile` | Visit LinkedIn profiles |\n| 0.25 | `salesNavigator` | enrichment | `findCompanyInsights` | Retrieve insights about a company from Sales Navigator |\n| 0.25 | `salesNavigator` | enrichment | `findCompanyMetrics` | Retrieve metrics about a company from Sales Navigator |\n| 0.25 | `salesNavigator` | enrichment | `findEmployeesCount` | Retrieve employees count from Sales Navigator |\n| 0.25 | `salesNavigator` | enrichment | `findEmployeesDistribution` | Retrieve employees distribution from Sales Navigator |\n| 0.25 | `salesNavigator` | enrichment | `searchCompanyMetrics` | Get total result count metrics for a Sales Navigator company search URL |\n| 0.25 | `salesNavigator` | enrichment | `searchPersonMetrics` | Get metrics and statistics for a Sales Navigator person search, including total results count |\n| 0.3 | `bouncer` | enrichment | `verifyEmail` | Verify an email address |\n| 0.3–1 / 1k token | `perplexity` | freeform | `instruct` | Instruct prompt |\n| 0.5 | `aiArk` | enrichment | `findMobilePhone` | Find a person's mobile phone number from a LinkedIn URL, or from a company domain and a full name |\n| 0.5 | `findyMail` | enrichment | `findEmail` | Retrieve email given a name and domain |\n| 0.5 | `hunter` | enrichment | `findEmail` | Find a person's email |\n| 0.5 | `leadMagic` | enrichment | `findEmail` | Find email given a name and domain |\n| 0.5 | `linkedin` | enrichment | `enrichCompanyFromDomain` | Retrieve information about a company from domain |\n| 0.5 | `linkedin` | enrichment | `enrichProfileFromName` | Retrieve information about a profile from name |\n| 0.5 | `linkedin` | enrichment | `findCustomHeadcount` | Find the number of people in a company |\n| 0.5 | `linkedin` | enrichment | `searchJobs` | Search for jobs |\n| 0.5 | `native` | platform | `modelAsk` | Query your model with a question |\n| 0.5 | `prospeo` | enrichment | `enrichCompany` | Enrich a company with B2B firmographics data |\n| 0.5 | `prospeo` | enrichment | `enrichLinkedin` | Retrieve information about a person's Linkedin profile |\n| 0.5 | `prospeo` | enrichment | `findEmail` | Find a person's email address using their name and company domain |\n| 0.5 / item | `theirStack` | enrichment | `searchCompanies` | Search for companies |\n| 0.5 / item | `theirStack` | enrichment | `searchJobs` | Search for jobs |\n| 0.5 | `theirStack` | enrichment | `searchTechnologies` | Search for technologies |\n| 0.5–2 | `linkup` | enrichment | `search` | Search for results using Linkup |\n| 1 | `apolloio` | enrichment | `enrichOrganization` | Enrich an organization |\n| 1 | `builtwith` | enrichment | `enrichDomain` | Look up the full technology stack and metadata for a domain |\n| 1 / item | `companyEnrich` | enrichment | `findSimilarCompanies` | Find similar companies |\n| 1 | `datagma` | enrichment | `findEmail` | Retrieve a person's email |\n| 1 | `dropcontact` | enrichment | `findEmail` | Find a person's email using their first and last name |\n| 1 | `enrichCrm` | enrichment | `enrichCompany` | Enrich company given domain |\n| 1 | `enrichCrm` | enrichment | `enrichPerson` | Enrich person given email or full name + domain or first name + last name + domain |\n| 1 | `enrichCrm` | enrichment | `findEmail` | Find email using first name, last name, full name, company, LinkedIn, country |\n| 1 | `enrichCrm` | enrichment | `getFunding` | Get company financial and funding data given a domain |\n| 1 | `enrowio` | enrichment | `findEmail` | Find a person's email |\n| 1 | `FullEnrich` | enrichment | `findEmail` | Find a person's email address using their first name, last name, company name, domain name, or LinkedIn URL |\n| 1 | `FullEnrich` | enrichment | `reverseEmailLookup` | Find a person's LinkedIn profile and company information from their email address |\n| 1 | `g2` | enrichment | `enrichProduct` | Retrieve detailed information about a product from G2 including reviews, ratings, and product specifications |\n| 1 | `hunter` | enrichment | `enrichPerson` | Enrich a person's information |\n| 1 | `hunter` | enrichment | `searchDomain` | Search for people in a domain |\n| 1 | `hunter` | enrichment | `verifyEmail` | Verify a person's email status |\n| 1 | `linkup` | enrichment | `instruct` | Get structured or sourced answers using Linkup |\n| 1 | `oceanio` | enrichment | `enrichCompany` | Retrieve company data |\n| 1 | `oceanio` | enrichment | `enrichPerson` | Retrieve person data |\n| 1 / item | `oceanio` | enrichment | `searchCompanies` | Search for companies |\n| 1 | `oceanio` | enrichment | `searchPeople` | Search for people |\n| 1 | `proxycurl` | enrichment | `enrich` | Retrieve information about a person/organization |\n| 1 / item | `proxycurl` | enrichment | `search` | Retrieve object records |\n| 1 | `reverseContact` | enrichment | `enrichCompanyFromLinkedin` | Retrieve information about a company from Linkedin |\n| 1 | `rocketreach` | enrichment | `lookupPerson` | Lookup person and company |\n| 1 | `waterfall` | enrichment | `enrichCompany` | Retrieve company data |\n| 1–3 / item | `contactOut` | enrichment | `search` | Search person / company data from linkedin URL |\n| 1–9 | `apolloio` | enrichment | `enrichPerson` | Enrich a person |\n| 2 | `datagma` | enrichment | `enrichPersonFromPersonalEmail` | Retrieve a person's profile from a personal email address (outside of the EU) |\n| 2 | `forager` | enrichment | `findPersonalEmail` | Find a person's personal email |\n| 2 | `forager` | enrichment | `findWorkEmail` | Find a person's work email |\n| 2 | `theSwarm` | enrichment | `searchWarmIntrosToCompany` | Search for warm intros to a company, filtering for target company employees with the desired job function and seniority. |\n| 2 | `theSwarm` | enrichment | `searchWarmIntrosToPerson` | Search for warm introductions to a specific person using their LinkedIn profile. |\n| 2 | `waterfall` | enrichment | `enrichContact` | Retrieve a contact |\n| 3 | `leadMagic` | enrichment | `enrichProfile` | Enrich profile data |\n| 3 | `peopleDataLabs` | enrichment | `enrichCompany` | Retrieve information about a company |\n| 3 | `peopleDataLabs` | enrichment | `enrichPerson` | Retrieve information about a person |\n| 3 / item | `peopleDataLabs` | enrichment | `queryCompanies` | Query companies |\n| 3 / item | `peopleDataLabs` | enrichment | `queryPeople` | Query people |\n| 3 / item | `peopleDataLabs` | enrichment | `searchCompanies` | Search for companies |\n| 3 / item | `peopleDataLabs` | enrichment | `searchPeople` | Search for people |\n| 3 | `prospeo` | enrichment | `findPhone` | Find a person's phone number using linkedin url |\n| 3 | `waterfall` | enrichment | `detectJobChange` | Detect if a contact has changed jobs. Returns the job change status (MOVED, LEFT, NO_CHANGE, UNKNOWN) and updated person… |\n| 3 / item | `waterfall` | enrichment | `searchProspects` | Search contacts and their companies |\n| 4 | `mixrank` | enrichment | `findCompany` | Retrieve a person or company information |\n| 4 | `mixrank` | enrichment | `findPerson` | Find a person using various identifiers like email, phone, name, or company details |\n| 4 | `societeInfo` | enrichment | `enrich` | Retrieve information about a contact/company |\n| 4 / item | `societeInfo` | enrichment | `search` | Search for a company or contact |\n| 5 | `findyMail` | enrichment | `findPhone` | Retrieve phone number given a linkedin URL |\n| 5 | `forager` | enrichment | `findPhone` | Find a person's phone number |\n| 6 | `FullEnrich` | enrichment | `findPhone` | Find a person's phone number using their first name, last name, company name, domain name, or LinkedIn URL |\n| 6 | `salesNavigator` | enrichment | `searchLeadsLegacy` | Retrieve leads from Sales Navigator |\n| 7 | `FullEnrich` | enrichment | `findPhoneAndEmail` | Find a person's email and phone number using their first name, last name, company name, domain name, or LinkedIn URL |\n| 7 | `waterfall` | enrichment | `findPhone` | Retrieve a person's phone number |\n| 8 | `datagma` | enrichment | `enrichPerson` | Enrich a person from their LinkedIn profile URL or professional email |\n| 8 | `datagma` | enrichment | `findPhone` | Retrieve a person's phone number |\n| 8 | `datagma` | enrichment | `findPhoneAndEmail` | Retrieve both phone number and email address for a person |\n| 15 | `cleon1` | enrichment | `findPhone` | Find a person's phone number using their first and last name, optionally refined with company information |\n| 15 | `cleon1` | enrichment | `findPhoneFromLinkedin` | Find a person's phone number using their Linkedin URL |\n\n## Actions whose price depends on config\n\nThese bill differently depending on how the node is configured, so the range above is not a quote. Pick the row that matches the config you are about to run.\n\n### `apolloio.searchPeople` — varies by `shouldEnrich`\n\n| Config | Cost |\n|---|---|\n| shouldEnrich=true | 1 / person |\n| shouldEnrich=false | 0 / person |\n\n### `contactOut.enrich` — varies by `objectType`, `includePhone`, `emailType`\n\n| Config | Cost |\n|---|---|\n| objectType=company | 0 |\n| objectType=contact, includePhone=false, emailType empty | 1 |\n| objectType=contact, includePhone=false, emailType set | 2 |\n| objectType=contact, includePhone=true | 3 |\n\n### `openAi.instruct` — varies by `model`, `advancedSettings.withWebSearch`\n\n| Config | Cost |\n|---|---|\n| model=gpt-5.6-sol, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.6-terra, advancedSettings.withWebSearch=true | 0.4 + 0.03 / 1k token |\n| model=gpt-5.6-luna, advancedSettings.withWebSearch=true | 0.4 + 0.006 / 1k token |\n| model=gpt-5-nano, advancedSettings.withWebSearch=true | 0.4 + 0.006 / 1k token |\n| model=gpt-5-mini, advancedSettings.withWebSearch=true | 0.4 + 0.03 / 1k token |\n| model=gpt-5, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.5, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.4, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.4-mini, advancedSettings.withWebSearch=true | 0.4 + 0.03 / 1k token |\n| model=gpt-5.4-nano, advancedSettings.withWebSearch=true | 0.4 + 0.006 / 1k token |\n| model=gpt-5.3, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.3-mini, advancedSettings.withWebSearch=true | 0.4 + 0.03 / 1k token |\n| model=gpt-5.3-nano, advancedSettings.withWebSearch=true | 0.4 + 0.006 / 1k token |\n| model=gpt-5.2, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-5.1, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gpt-4.1-nano, advancedSettings.withWebSearch=true | 0.4 + 0.01 / 1k token |\n| model=gpt-4.1-mini, advancedSettings.withWebSearch=true | 0.4 + 0.05 / 1k token |\n| model=gpt-4.1, advancedSettings.withWebSearch=true | 0.4 + 0.3 / 1k token |\n| model=gpt-4o-mini, advancedSettings.withWebSearch=true | 0.4 + 0.02 / 1k token |\n| model=gpt-4o, advancedSettings.withWebSearch=true | 0.4 + 0.5 / 1k token |\n| model=gpt-3.5-turbo, advancedSettings.withWebSearch=true | 0.4 + 0.5 / 1k token |\n| model=gpt-5.6-sol, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.6-terra, advancedSettings.withWebSearch=false | 0.03 / 1k token |\n| model=gpt-5.6-luna, advancedSettings.withWebSearch=false | 0.006 / 1k token |\n| model=gpt-5-nano, advancedSettings.withWebSearch=false | 0.006 / 1k token |\n| model=gpt-5-mini, advancedSettings.withWebSearch=false | 0.03 / 1k token |\n| model=gpt-5, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.5, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.4, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.4-mini, advancedSettings.withWebSearch=false | 0.03 / 1k token |\n| model=gpt-5.4-nano, advancedSettings.withWebSearch=false | 0.006 / 1k token |\n| model=gpt-5.3, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.3-mini, advancedSettings.withWebSearch=false | 0.03 / 1k token |\n| model=gpt-5.3-nano, advancedSettings.withWebSearch=false | 0.006 / 1k token |\n| model=gpt-5.2, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-5.1, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gpt-4.1-nano, advancedSettings.withWebSearch=false | 0.01 / 1k token |\n| model=gpt-4.1-mini, advancedSettings.withWebSearch=false | 0.05 / 1k token |\n| model=gpt-4.1, advancedSettings.withWebSearch=false | 0.3 / 1k token |\n| model=gpt-4o-mini, advancedSettings.withWebSearch=false | 0.02 / 1k token |\n| model=gpt-4o, advancedSettings.withWebSearch=false | 0.5 / 1k token |\n| model=gpt-3.5-turbo, advancedSettings.withWebSearch=false | 0.5 / 1k token |\n\n### `gemini.instruct` — varies by `model`, `advancedSettings.withWebSearch`\n\n| Config | Cost |\n|---|---|\n| model=gemini-3.6-flash, advancedSettings.withWebSearch=true | 0.4 + 0.25 / 1k token |\n| model=gemini-3.5-flash-lite, advancedSettings.withWebSearch=true | 0.4 + 0.08 / 1k token |\n| model=gemini-3.1-pro-preview, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gemini-3-pro-preview, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=gemini-3-flash-preview, advancedSettings.withWebSearch=true | 0.4 + 0.05 / 1k token |\n| model=gemini-2.5-pro, advancedSettings.withWebSearch=true | 0.4 + 0.15 / 1k token |\n| model=gemini-2.5-flash, advancedSettings.withWebSearch=true | 0.4 + 0.03 / 1k token |\n| model=gemini-1.5-pro, advancedSettings.withWebSearch=true | 0.4 + 0.1 / 1k token |\n| model=gemini-1.5-flash, advancedSettings.withWebSearch=true | 0.4 + 0.01 / 1k token |\n| model=gemini-2.0-flash, advancedSettings.withWebSearch=true | 0.4 + 0.01 / 1k token |\n| model=gemini-3.6-flash, advancedSettings.withWebSearch=false | 0.25 / 1k token |\n| model=gemini-3.5-flash-lite, advancedSettings.withWebSearch=false | 0.08 / 1k token |\n| model=gemini-3.1-pro-preview, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gemini-3-pro-preview, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=gemini-3-flash-preview, advancedSettings.withWebSearch=false | 0.05 / 1k token |\n| model=gemini-2.5-pro, advancedSettings.withWebSearch=false | 0.15 / 1k token |\n| model=gemini-2.5-flash, advancedSettings.withWebSearch=false | 0.03 / 1k token |\n| model=gemini-1.5-pro, advancedSettings.withWebSearch=false | 0.1 / 1k token |\n| model=gemini-1.5-flash, advancedSettings.withWebSearch=false | 0.01 / 1k token |\n| model=gemini-2.0-flash, advancedSettings.withWebSearch=false | 0.01 / 1k token |\n\n### `anthropic.instruct` — varies by `model`, `advancedSettings.withWebSearch`\n\n| Config | Cost |\n|---|---|\n| model=claude-sonnet-5, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-fable-5, advancedSettings.withWebSearch=true | 0.4 + 4 / 1k token |\n| model=claude-opus-4-8, advancedSettings.withWebSearch=true | 0.4 + 2 / 1k token |\n| model=claude-opus-4-7, advancedSettings.withWebSearch=true | 0.4 + 2 / 1k token |\n| model=claude-opus-4-6, advancedSettings.withWebSearch=true | 0.4 + 2 / 1k token |\n| model=claude-opus-4-1-20250805, advancedSettings.withWebSearch=true | 0.4 + 2 / 1k token |\n| model=claude-opus-4-20250514, advancedSettings.withWebSearch=true | 0.4 + 2 / 1k token |\n| model=claude-sonnet-4-20250514, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-sonnet-4-6, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-sonnet-4-5-20250929, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-3-7-sonnet-latest, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-3-5-sonnet-latest, advancedSettings.withWebSearch=true | 0.4 + 0.2 / 1k token |\n| model=claude-3-5-haiku-latest, advancedSettings.withWebSearch=true | 0.4 + 0.05 / 1k token |\n| model=claude-sonnet-5, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-fable-5, advancedSettings.withWebSearch=false | 4 / 1k token |\n| model=claude-opus-4-8, advancedSettings.withWebSearch=false | 2 / 1k token |\n| model=claude-opus-4-7, advancedSettings.withWebSearch=false | 2 / 1k token |\n| model=claude-opus-4-6, advancedSettings.withWebSearch=false | 2 / 1k token |\n| model=claude-opus-4-1-20250805, advancedSettings.withWebSearch=false | 2 / 1k token |\n| model=claude-opus-4-20250514, advancedSettings.withWebSearch=false | 2 / 1k token |\n| model=claude-sonnet-4-20250514, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-sonnet-4-6, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-sonnet-4-5-20250929, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-3-7-sonnet-latest, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-3-5-sonnet-latest, advancedSettings.withWebSearch=false | 0.2 / 1k token |\n| model=claude-3-5-haiku-latest, advancedSettings.withWebSearch=false | 0.05 / 1k token |\n\n### `parallel.createTask` — varies by `processor`\n\n| Config | Cost |\n|---|---|\n| processor=lite | 0.125 |\n| processor=base | 0.25 |\n| processor=core | 0.625 |\n| processor=core2x | 1.25 |\n| processor=pro | 2.5 |\n| processor=ultra | 7.5 |\n| processor=ultra2x | 15 |\n| processor=ultra4x | 30 |\n| processor=ultra8x | 60 |\n| any config | 0.625 |\n\n### `exa.search` — varies by `searchType`\n\n| Config | Cost |\n|---|---|\n| searchType=deep | 0.3 + 0.025 / item |\n| any config | 0.175 + 0.025 / item |\n\n### `perplexity.instruct` — varies by `model`, `searchContextSize`\n\n| Config | Cost |\n|---|---|\n| model=sonar-deep-research | 0.5 / 1k token |\n| model=sonar, searchContextSize=high | 0.5 / 1k token |\n| model=sonar, searchContextSize=medium | 0.4 / 1k token |\n| model=sonar, searchContextSize=low | 0.3 / 1k token |\n| model=sonar-pro, searchContextSize=high | 1 / 1k token |\n| model=sonar-pro, searchContextSize=medium | 0.8 / 1k token |\n| model=sonar-pro, searchContextSize=low | 0.6 / 1k token |\n| model=sonar-reasoning, searchContextSize=high | 0.6 / 1k token |\n| model=sonar-reasoning, searchContextSize=medium | 0.5 / 1k token |\n| model=sonar-reasoning, searchContextSize=low | 0.4 / 1k token |\n| model=sonar-reasoning-pro, searchContextSize=high | 0.9 / 1k token |\n| model=sonar-reasoning-pro, searchContextSize=medium | 0.7 / 1k token |\n| model=sonar-reasoning-pro, searchContextSize=low | 0.5 / 1k token |\n\n### `linkup.search` — varies by `depth`\n\n| Config | Cost |\n|---|---|\n| depth=standard | 0.5 |\n| depth=deep | 2 |\n\n### `contactOut.search` — varies by `objectType`, `revealInfo`\n\n| Config | Cost |\n|---|---|\n| objectType=people, revealInfo=false | 1 / item |\n| objectType=people, revealInfo=true | 3 / item |\n\n### `apolloio.enrichPerson` — varies by `revealPhoneNumber`\n\n| Config | Cost |\n|---|---|\n| revealPhoneNumber=false | 1 |\n| revealPhoneNumber=true | 9 |\n\nFile v2.2.0:references/output-retrieval.md\n\n# Output retrieval — `run download-outputs` vs `run download`\n\nHow to extract action results from the platform after a run or batch finishes. **Always prefer `run download-outputs`** for the actual data; reserve `run download` for debugging.\n\n## The two commands\n\n| CLI command | Maps to API | Returns | Use for |\n|---|---|---|---|\n| `cargo-ai orchestration run download` | `POST /v1/orchestration/runs/download-runs` | Newline-delimited JSON of full run records (status, executions, `runContext.<nodeSlug>` per-node outputs, timing) | Debugging — what did each node output? Why did this run fail? |\n| `cargo-ai orchestration run download-outputs` | `POST /v1/orchestration/runs/download-outputs` | `{\"url\": \"...\"}` — signed URL to a CSV (default) or JSON file with input + output node data per record | **Canonical way to get action results.** Faster, cheaper, output-focused. |\n\n## When to use each\n\n### Use `run download-outputs` when\n\n- You ran an action / tool / play and want the resulting enriched records.\n- You're feeding outputs into the next step of a pipeline.\n- You're handing the dataset to the user as a CSV.\n- You only care about one specific node's output (the terminal `output` / `end` node).\n\nThis is the default in every recipe in this skill.\n\n### Use `run download` when\n\n- A run failed and you need to inspect every node's `runContext` to find the breakage.\n- You want timing / credit attribution per node.\n- You need the full execution trace (e.g., which conditional branches fired).\n\n## `run download-outputs` reference\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid <uuid> \\\n  --output-node-slug <slug> \\\n  [--format json|csv] \\\n  [--batch-uuid <uuid>] \\\n  [--release-uuid <uuid>] \\\n  [--statuses pending,running,finished,failed,cancelled] \\\n  [--parent-batch-uuid <uuid>] \\\n  [--parent-uuid <uuid>] \\\n  [--parent-node-uuid <uuid>] \\\n  [--is-group-parent] \\\n  [--record-id <id>] \\\n  [--record-title <title>] \\\n  [--record-title-or-id <value>] \\\n  \\\n  [--executions-filter <json>] \\\n  [--created-after <iso8601>] \\\n  [--created-before <iso8601>]\n```\n\n**Required**: `--workflow-uuid` and `--output-node-slug`.\n\nThe response is a JSON object: `{\"url\": \"<signed-url>\"}`. The signed URL is short-lived — fetch immediately:\n\n```bash\nURL=$(cargo-ai orchestration run download-outputs --workflow-uuid <uuid> --output-node-slug <slug> --format json | jq -r .url)\ncurl -fsSL \"$URL\" > /tmp/outputs.json\n```\n\n## Finding the `output-node-slug`\n\nTwo paths:\n\n```bash\n# From the deployed release of a saved workflow / tool / play:\ncargo-ai orchestration release get <release-uuid> | jq '.nodes[] | {slug, name, kind}'\n# → Look for the terminal node, typically slug \"output\" or \"end\"\n```\n\nFor ad-hoc `action execute` calls, the slug is the action's `actionSlug` itself (the action becomes a single-node workflow internally).\n\nFor multi-step `run create --nodes` calls, the slug is whatever you assigned to the terminal node in your node graph.\n\n## Examples\n\n### Pull all enriched records from a finished batch\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid abc-123-… \\\n  --output-node-slug output \\\n  --batch-uuid def-456-… \\\n  --format json \\\n```\n\n### Pull only successful records\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid abc-123-… \\\n  --output-node-slug output \\\n  --statuses finished \\\n  --format csv\n```\n\n### Pull records by external recordId\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid abc-123-… \\\n  --output-node-slug output \\\n  --record-id \"lead-456\"\n```\n\n### Filter by node-execution status (e.g., only rows where the enrich step succeeded)\n\n```bash\ncargo-ai orchestration run download-outputs \\\n  --workflow-uuid abc-123-… \\\n  --output-node-slug output \\\n  --executions-filter '{\"enrich\":{\"status\":\"finished\"}}'\n```\n\n## Why this matters for recipes\n\nCargo's orchestration layer is async by default. After firing an `action execute-batch` or `batch create`, you have two options:\n\n1. **Wait inline**: pass `--wait-until-finished` and read the response. Works for small runs (< 50 records).\n2. **Poll, then download**: fire async, poll status, then `run download-outputs` once finished. Required for large runs.\n\nEvery recipe in this skill that fans out across >50 records uses path 2 with `download-outputs`. Path 1 inline reads only work because `--wait-until-finished` returns the run object directly — but it doesn't scale.\n\n## See also\n\n- [`../../cargo-analytics/SKILL.md`](../../cargo-analytics/SKILL.md#downloading-run-results) — full reference for `run download` and `run download-outputs`.\n- [`../../cargo-orchestration/references/polling.md`](../../cargo-orchestration/references/polling.md) — polling strategies for async runs and batches.\n- [`../../cargo-orchestration/references/response-shapes.md`](../../cargo-orchestration/references/response-shapes.md) — full JSON shape of run / batch responses.\n\nFile v2.2.0:references/prompt-library/company-research.md\n\n# Prompt library — company research\n\nPrompts that turn raw research inputs (scraped website text, news lists, headcount data) into compact, structured company understanding. Run through `anthropic.instruct` with `temperature: 0`–`0.2` (bulk tier only — some judgment-tier models reject non-default sampling parameters with a 400; see [`../../provider-playbooks/anthropic.md`](../../provider-playbooks/anthropic.md) and omit the override when in doubt). Inputs are usually large — truncate scraped text to the first ~3,000 words before substitution; the signal is almost always in the top of the page.\n\n### company-two-liner\n\n**Purpose:** Say what a company does in exactly 2 plain sentences from its website text. **Variables:** {{website_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** exactly 2 sentences, plain text — or `NULL` for empty/error pages.\n\n```\nFrom this website text, state what the company does in exactly 2 sentences: sentence 1 = what they sell and to whom; sentence 2 = how they differ or what they replace. Plain declarative language — strip marketing adjectives (\"leading\", \"revolutionary\", \"seamless\"). Use only claims present in the text; if the text never says who the customer is, write \"customer unclear from site\" for that part rather than guessing. If the text is empty, an error page, or a domain-parking page, output exactly: NULL. Website text: {{website_text}}\n```\n\n### business-model-classification\n\n**Purpose:** Classify the dominant business model with a confidence level and cited evidence. **Variables:** {{website_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{model, confidence, evidence}`.\n\n```\nClassify this company's business model from its website text. Categories: B2B SaaS, B2C SaaS, B2B services, B2C services, marketplace, e-commerce, hardware, fintech-regulated, nonprofit, other. Pick the ONE dominant model — the one driving revenue today, not an aspirational pivot. Base the choice only on evidence in the text: pricing pages, customer language (\"for teams\" vs \"for you\"), checkout vs book-a-demo CTAs, regulatory notices. If the text supports no category, use \"other\" with confidence \"low\" — do not classify from the company name alone. Output ONLY the JSON object: {\"model\": \"<category>\", \"confidence\": \"high|medium|low\", \"evidence\": \"<one short phrase quoted from the text>\"}. Website text: {{website_text}}\n```\n\n### competitive-positioning-summary\n\n**Purpose:** Summarize how a company positions itself from its own scraped pages — category, who it attacks, differentiators. **Variables:** {{scraped_pages}}. **Model guidance:** claude-sonnet-4-6 — reading positioning between the lines is judgment-heavy. **Output:** exactly 3 bullets (`- ` lines) — or `NULL`.\n\n```\nFrom these scraped pages (homepage / product / comparison pages), summarize how the company positions itself: {{scraped_pages}}\n\nOutput exactly 3 bullets: (1) the category they claim for themselves; (2) who they position against — named competitors only if the text names them, otherwise the status quo or workflow they attack; (3) the 1-2 differentiators they repeat most often. Quote or closely paraphrase the text — do not add positioning they never state, and never name a competitor the text does not name. If the pages contain no positioning language at all, output exactly: NULL. Format: three lines, each starting with \"- \".\n```\n\n### news-significance-filter\n\n**Purpose:** Filter a company's news items down to the ones that matter for outreach, with a suggested acting window. **Variables:** {{news_items}}, {{relevance_criteria}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON array (possibly empty) of `{item, category, why_significant, outreach_window_days}`.\n\n```\nFilter these news items about one company down to the ones significant for sales outreach: {{news_items}}\n\nSignificant = matches these criteria: {{relevance_criteria}} (typically funding, leadership change, expansion, layoffs, product launch, regulatory event). Not significant: awards, listicles, minor partnerships, stock-price commentary, sponsored content. Judge each item only by its given headline and summary — do not enrich from outside knowledge, and do not upgrade an item's importance beyond what its own text states. Output ONLY a JSON array, possibly empty: [{\"item\": \"<headline>\", \"category\": \"<event type>\", \"why_significant\": \"<one clause>\", \"outreach_window_days\": <7|30|90>}]\n```\n\n### org-maturity-estimate\n\n**Purpose:** Estimate go-to-market maturity from headcount distribution by function — absence of roles is itself the signal. **Variables:** {{headcount_distribution}}, {{total_employees}}. **Model guidance:** claude-3-5-haiku-latest; claude-sonnet-4-6 for unusual org shapes. **Output:** JSON `{stage, signals, sales_headcount_pct}`.\n\n```\nEstimate go-to-market maturity from this headcount distribution by function: {{headcount_distribution}} (total employees: {{total_employees}}).\n\nStages: \"founder-led\" = no dedicated sales or marketing headcount; \"first-team\" = sales and marketing exist but are <10% of headcount, no ops roles; \"scaling\" = dedicated ops/enablement roles appear, sales is 10-25% of headcount; \"mature\" = full GTM org with visible management layers. Reason only from the functions and counts provided — never infer functions absent from the distribution; their absence is itself the signal. If the distribution is empty or totals do not parse, output stage \"unknown\". Output ONLY the JSON object: {\"stage\": \"founder-led|first-team|scaling|mature|unknown\", \"signals\": [\"<observation>\", ...], \"sales_headcount_pct\": <number|null>}\n```\n\n### target-customer-inference\n\n**Purpose:** Infer who a company sells to from case studies, logos, pricing tiers, and industry pages on its site. **Variables:** {{website_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{segments, named_customers, buyer_role_guess, evidence}`.\n\n```\nInfer who this company sells to from its website text (case studies, customer logos, pricing tiers, industry pages): {{website_text}}\n\nOutput ONLY the JSON object: {\"segments\": [\"<segment, e.g. mid-market fintech ops teams>\", ...], \"named_customers\": [\"<company named in the text>\", ...], \"buyer_role_guess\": \"<job title or null>\", \"evidence\": \"<one short phrase quoted from the text>\"}\n\nRules: named_customers must appear verbatim in the text — never add customers you know from memory. If the text names no customers, use []. If nothing indicates a target segment, use \"segments\": [] rather than guessing from the industry. buyer_role_guess only if the text addresses a role directly (\"built for RevOps\"); otherwise null.\n```\n\nFile v2.2.0:references/prompt-library/data-extraction.md\n\n# Prompt library — data extraction\n\nPrompts that turn messy input (scraped pages, raw name/address strings, job postings) into strict, parse-ready JSON. Every prompt carries its schema inline and instructs the model to emit ONLY the JSON object — pipe the response straight into `jq`. Run through `anthropic.instruct` with `temperature: 0` (bulk tier only — some judgment-tier models reject non-default sampling parameters with a 400; see [`../../provider-playbooks/anthropic.md`](../../provider-playbooks/anthropic.md) and omit the override when in doubt); extraction wants zero creativity.\n\n### scraped-page-to-company-json\n\n**Purpose:** Extract company facts from a scraped page into a fixed schema — nulls, never guesses. **Variables:** {{page_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON object matching the inline schema.\n\n```\nExtract company facts from this scraped page text into the exact schema below. Output ONLY the JSON object — no prose, no markdown fences.\n\nSchema: {\"company_name\": string|null, \"description\": string|null (≤25 words), \"industry\": string|null, \"headquarters_city\": string|null, \"headquarters_country\": string|null, \"employee_count_stated\": number|null, \"founded_year\": number|null, \"contact_email\": string|null, \"social_links\": string[]}\n\nRules: every value must be supported by explicit text on the page — if the page does not state a field, output null (empty array for social_links); never fill gaps from outside knowledge. employee_count_stated only when the page states a single explicit figure; ranges and vague counts (\"hundreds of employees\") → null. founded_year must be a 4-digit year stated on the page. Page text: {{page_text}}\n```\n\n### person-name-normalization\n\n**Purpose:** Split any raw name string into structured parts, handling \"Last, First\", particles, suffixes, and non-person strings. **Variables:** {{raw_name}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{first_name, last_name, middle, suffix, honorific, is_person}`.\n\n```\nNormalize this raw person-name string into structured parts. Output ONLY the JSON object.\n\nSchema: {\"first_name\": string|null, \"last_name\": string|null, \"middle\": string|null, \"suffix\": string|null, \"honorific\": string|null, \"is_person\": boolean}\n\nRules: handle \"Last, First\" ordering; multi-word and particle surnames (\"van der Berg\", \"De La Cruz\") stay intact in last_name; suffixes (Jr, III, PhD, MBA, CPA) go to suffix and honorifics (Dr, Prof) to honorific — never leave either inside a name field; strip emojis, parenthesized pronouns, and credentials from name parts. Single-token names: token in first_name, last_name null. If the string is a company, team, or placeholder (\"Sales Team\", \"info desk\", \"N/A\"), set is_person false and every part null. Never invent a part that is not in the string. Raw name: {{raw_name}}\n```\n\n### address-geo-parsing\n\n**Purpose:** Parse a raw address or location string into structured geography with an explicit precision level. **Variables:** {{raw_address}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{street, city, region, postal_code, country, country_code, precision}`.\n\n```\nParse this raw address/location string into structured geography. Output ONLY the JSON object.\n\nSchema: {\"street\": string|null, \"city\": string|null, \"region\": string|null, \"postal_code\": string|null, \"country\": string|null, \"country_code\": string|null (ISO 3166-1 alpha-2), \"precision\": \"street|city|region|country|none\"}\n\nRules: expand common abbreviations (NYC → New York; UK → United Kingdom); region = state/province/prefecture; keep street names in their original spelling — do not translate. Set precision to the finest level actually present in the string. Emit only parts stated or unambiguously implied (\"Paris, TX\" → US; a bare city name resolves its country only when there is no plausible ambiguity). Ambiguous, fictional, or empty input: all fields null, precision \"none\" — never pick between candidate interpretations. Raw address: {{raw_address}}\n```\n\n### employee-count-banding\n\n**Purpose:** Convert any raw headcount expression (\"~500\", \"5k\", \"200-500 employees\") into a canonical band. **Variables:** {{employee_count_raw}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{band, count_parsed, source_kind}`.\n\n```\nConvert this raw employee-count value into a canonical band. Output ONLY the JSON object.\n\nBands: \"1-10\", \"11-50\", \"51-200\", \"201-500\", \"501-1000\", \"1001-5000\", \"5001-10000\", \"10000+\".\n\nSchema: {\"band\": string|null, \"count_parsed\": number|null, \"source_kind\": \"exact|range|approximate|none\"}\n\nRules: parse formats like \"1,234\", \"~500\", \"500+\", \"200-500 employees\", \"5k\", \"1.2k\". Ranges: band by the midpoint. Open-ended values (\"500+\"): band by the stated floor. count_parsed = the single number you banded on. Text with no numeric employee information (\"many\", \"growing team\", empty) → band null, count_parsed null, source_kind \"none\". Never infer a count from company fame, revenue, or industry. Raw value: {{employee_count_raw}}\n```\n\n### industry-taxonomy-slotting\n\n**Purpose:** Classify a company into exactly one slot of a caller-supplied fixed taxonomy — labels verbatim, no free text. **Variables:** {{company_description}}, {{taxonomy_list}}. **Model guidance:** claude-3-5-haiku-latest; claude-sonnet-4-6 for fine-grained taxonomies (>40 slots). **Output:** JSON `{industry, confidence, runner_up}`.\n\n```\nClassify this company into exactly one slot of a fixed taxonomy. Output ONLY the JSON object.\n\nTaxonomy — choose from these values verbatim; never output a label that is not in this list: {{taxonomy_list}}\n\nCompany description: {{company_description}}\n\nSchema: {\"industry\": \"<taxonomy value or null>\", \"confidence\": \"high|medium|low\", \"runner_up\": \"<taxonomy value or null>\"}\n\nRules: classify by the primary revenue activity described, not the technology used — a logistics company using AI is logistics, not AI. If the description fits two slots, pick the more specific one and put the other in runner_up. If the description is empty or fits nothing, use the taxonomy's own fallback slot (\"Other\" or similar) with confidence \"low\"; if the list has no fallback, output industry null. Do not classify from the company name alone.\n```\n\n### contact-details-extraction\n\n**Purpose:** Pull emails, phones, and social URLs out of messy footer/contact-page/signature text — verbatim values only. **Variables:** {{page_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{emails, phones, linkedin_urls, other_socials, physical_address}`.\n\n```\nExtract contact details from this messy text (page footer, contact page, or email signature). Output ONLY the JSON object.\n\nSchema: {\"emails\": string[], \"phones\": string[], \"linkedin_urls\": string[], \"other_socials\": string[], \"physical_address\": string|null}\n\nRules: emails must be syntactically valid and appear in the text — de-obfuscate only trivial patterns (\"name [at] domain [dot] com\"); drop placeholders and example.com addresses. Phones: keep original formatting, deduplicate. linkedin_urls: profile or company URLs only, normalized to https. physical_address: the full address string exactly as written, or null. Every value must exist in the text — output empty arrays or null for anything absent; never construct an email from a name + domain pattern. Text: {{page_text}}\n```\n\n### job-posting-fields-extraction\n\n**Purpose:** Extract structured fields (title, seniority, location, remote policy, salary, technologies) from a job posting. **Variables:** {{job_posting_text}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON object matching the inline schema.\n\n```\nExtract structured fields from this job posting. Output ONLY the JSON object.\n\nSchema: {\"job_title\": string|null, \"seniority\": \"C-Level|VP|Director|Manager|IC\"|null, \"department\": string|null, \"location\": string|null, \"remote_policy\": \"remote|hybrid|onsite\"|null, \"salary_range\": string|null, \"technologies\": string[], \"posted_date\": string|null (ISO 8601)}\n\nRules: technologies = named tools, languages, and platforms from the requirements, verbatim and deduplicated — not soft skills. salary_range only if the posting states figures; keep currency symbols as written. remote_policy only from explicit statements (\"fully remote\", \"3 days in office\") — never inferred from location alone. Any field the posting does not state = null (empty array for technologies); do not infer from the company or from title conventions. Posting text: {{job_posting_text}}\n```\n\n### custom-attribute-extraction\n\n**Purpose:** Fill one *defined* custom attribute for one account from fetched page text — with a confidence band, a verbatim evidence quote, and `Unknown` as a first-class answer. The extract half of the `firecrawl.scrape` → `instruct` pattern in [`../../recipes/custom-datapoints.md`](../../recipes/custom-datapoints.md). **Variables:** {{attribute_name}}, {{attribute_definition}}, {{allowed_values}}, {{page_text}}. **Model guidance:** claude-3-5-haiku-latest; claude-sonnet-4-6 when the attribute needs synthesis across several pages. **Output:** JSON `{value, confidence, evidence, source_hint}`.\n\n```\nDetermine ONE attribute for this company from the page text below. Do not use any knowledge of the company beyond this text.\n\nAttribute: {{attribute_name}} — {{attribute_definition}}\nAllowed values: {{allowed_values}}\nPage text: {{page_text}}\n\nConfidence bands: \"confirmed\" = the text states it explicitly and currently; \"inferred\" = several consistent indirect statements and nothing contradicting them; \"estimated\" = calculated or approximated from partial figures actually present in the text (use only for numeric or range-valued attributes); \"unknown\" = insufficient, contradictory, or only historical evidence. Those first three are all reportable — return the value with the band that describes how you got it. Return value null with confidence \"unknown\" whenever the evidence does not reach any of them: an unsupported value is worse than a missing one, because it will be scored as if it were real. \"estimated\" requires arithmetic on figures in the text, never a guess at a plausible number. Never widen the allowed value set; if the true answer is outside it, return null.\n\nOutput ONLY the JSON object: {\"value\": <one of the allowed values, or null>, \"confidence\": \"confirmed|inferred|estimated|unknown\", \"evidence\": \"<verbatim phrase from the text supporting the value, or null>\", \"source_hint\": \"<which section or page the phrase came from, or null>\"}\n```\n\n### technology-adoption-state\n\n**Purpose:** Classify *how widely* a company uses a technology from mixed evidence — the guard against one job posting becoming \"company-wide adoption\". **Variables:** {{technology}}, {{evidence_items}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{state, strongest_evidence, evidence_count, caveat}`.\n\n```\nClassify how widely this company uses a technology, based only on the evidence listed. Technology: {{technology}}. Evidence items (each with source type and date): {{evidence_items}}\n\nStates, strongest first: \"company_standard\" (official docs, engineering handbook, or public standardization statement) · \"approved_tool\" (listed as sanctioned/available, not mandated) · \"team_usage\" (multiple current people on one team, or a team-scoped statement) · \"individual_usage\" (one person's profile, post, or repo) · \"pilot_or_evaluation\" (explicitly trialing or evaluating) · \"historical\" (all evidence predates 18 months, or describes past use) · \"none_found\" (evidence exists about the company but none about this technology) · \"unknown\" (no usable evidence).\n\nRules: a single job posting is at most \"individual_usage\" — never higher, no matter how strongly worded. A technology listed as a desired or nice-to-have skill is \"none_found\", not usage. A vendor's own customer page counts only if the customer is quoted. Downgrade one band when all evidence is older than 12 months. Never aggregate weak evidence into a strong state — three individual profiles are still \"individual_usage\" unless they name a team or a standard.\n\nOutput ONLY the JSON object: {\"state\": \"<one state>\", \"strongest_evidence\": \"<verbatim quote or item reference>\", \"evidence_count\": <number of items that mention the technology>, \"caveat\": \"<the main reason this could be wrong, or null>\"}\n```\n\nFile v2.2.0:references/prompt-library/index.md\n\n# Prompt library — index\n\nCurated, parameterized prompts for the LLM steps in GTM pipelines (`anthropic.instruct` calls and agent nodes). Reuse these instead of authoring from scratch — each has a tested output contract and a hallucination guard.\n\n**Usage:**\n1. Grep this index for the task; note the prompt name and shard file.\n2. Open ONLY that shard file — never load all six.\n3. Substitute every `{{variable}}` (mustache, snake_case) before sending; unfilled variables silently corrupt output.\n\nAction shape: `{\"kind\":\"connector\",\"integrationSlug\":\"anthropic\",\"actionSlug\":\"instruct\"}` — with `model` (required), `prompt` (required), and `advancedSettings` (e.g. `{\"temperature\":0.3,\"maxTokens\":1024}`) in each record of `--records` / in `--data`, never in the action's `config`. The substituted prompt goes in each record's `prompt` field (see [`../../recipes/outreach-activation.md`](../../recipes/outreach-activation.md) step 5). Models: `claude-3-5-haiku-latest` for cheap/bulk, `claude-sonnet-4-6` for judgment-heavy — each entry says which. **Sampling overrides apply to the bulk tier only** (extraction and classification want `temperature: 0`); some judgment-tier models reject non-default sampling parameters with a 400 — before setting `advancedSettings` on a non-bulk model, check [`../../provider-playbooks/anthropic.md`](../../provider-playbooks/anthropic.md) and omit the override when in doubt (the prompt's own output contract carries the determinism).\n\nShards: [company-research.md](company-research.md) · [lead-scoring.md](lead-scoring.md) · [personalization.md](personalization.md) · [qualification.md](qualification.md) · [signal-analysis.md](signal-analysis.md) · [data-extraction.md](data-extraction.md)\n\n| Prompt | Shard | Purpose | Variables |\n|---|---|---|---|\n| company-two-liner | company-research.md | What the company does, in exactly 2 plain sentences | website_text |\n| business-model-classification | company-research.md | B2B/B2C/marketplace/etc + confidence, from site text | website_text |\n| competitive-positioning-summary | company-research.md | Category claimed, who they attack, differentiators — 3 bullets | scraped_pages |\n| news-significance-filter | company-research.md | Keep only outreach-worthy news items, with acting window | news_items, relevance_criteria |\n| org-maturity-estimate | company-research.md | GTM maturity stage from headcount distribution by function | headcount_distribution, total_employees |\n| target-customer-inference | company-research.md | Who they sell to, from case studies/logos/pricing pages | website_text |\n| icp-fit-score | lead-scoring.md | 1-10 ICP fit with explicit rubric + missing-data flags | icp_description, company_name, company_summary, industry, employee_count, country |\n| tech-stack-fit-score | lead-scoring.md | Fit from detected stack; incumbents cap the score | detected_technologies, complementary_technologies, competing_technologies |\n| hiring-intent-strength | lead-scoring.md | 1-10 intent from job postings, recency- and seniority-weighted | job_postings, relevant_functions |\n| composite-priority-score | lead-scoring.md | Merge sub-scores into P1/P2/P3 tier with tie-breaks | icp_fit_score, signal_strength_score, engagement_score |\n| disqualification-check | lead-scoring.md | Hard-disqualifier gate before paid enrichment: DISQUALIFY/PASS | disqualifiers, company_name, company_summary, industry, employee_count, country |\n| persona-title-fit | lead-scoring.md | 1-10 title-vs-persona match with ambiguity flag | persona_description, title |\n| cold-email-first-line | personalization.md | Signal-referencing cold-email opener (canonical, from outreach-activation) | first_name, last_name, title, company_name, signal_summary |\n| job-change-follow-up-line | personalization.md | Follow-up line anchored on a new-role first-90-days priority | first_name, new_title, new_company, previous_company, relationship_context |\n| funding-congrats-angle | personalization.md | Funding opener that bans the \"congrats\" template | company_name, round_type, round_amount, investors, stated_use_of_funds, your_value_prop |\n| linkedin-connection-note | personalization.md | Connection note, ≤300 chars, no pitch | first_name, title, company_name, reason_for_connecting |\n| subject-line-variants | personalization.md | 3 subject-line styles as a JSON array | first_line, signal_summary, company_name |\n| reengagement-opener | personalization.md | Stale-contact opener where the fresh signal is the news | first_name, last_touch_summary, months_since_contact, fresh_signal |\n| proof-point-bridge | personalization.md | One sentence tying a customer proof point to the prospect | prospect_situation, customer_name, proof_point |\n| seniority-normalization | qualification.md | Any title → C-Level/VP/Director/Manager/IC/Other | title |\n| buying-committee-role | qualification.md | Economic buyer/champion/user/blocker/influencer guess | title, department, product_category |\n| decision-maker-likelihood | qualification.md | 0-100 can-they-approve estimate for a product + price band | title, employee_count, product_category, price_band |\n| geo-territory-normalization | qualification.md | Raw location → parsed geo + one territory from a list | raw_location, territory_list |\n| job-function-classification | qualification.md | Title → one of 15 fixed functions | title |\n| title-red-flag-check | qualification.md | EXCLUDE students, job-seekers, agencies, joke titles | title, headline |\n| job-posting-pain-hypothesis | signal-analysis.md | Job posting → business-pain hypothesis + product mapping | job_posting_text, your_product_summary |\n| funding-budget-window | signal-analysis.md | Funding round → budget-timing verdict (act_now/1_3/3_9/too_late) | round_type, round_amount, announced_date, stated_use_of_funds, product_category |\n| tech-change-displacement | signal-analysis.md | Stack change → open_door/fresh_incumbent/stack_shift/none | added_technologies, removed_technologies, your_product_summary, competing_technologies |\n| job-change-angle | signal-analysis.md | Job change → classified re-engagement play + hook | contact_name, new_title, new_company, previous_company, prior_relationship, product_category |\n| filing-priorities-extraction | signal-analysis.md | 10-K/10-Q/report text → top 5 priorities with verbatim quotes | filing_text |\n| signal-triage | signal-analysis.md | All signals for one account → act_now/monitor/ignore | signals, icp_fit_score |\n| scraped-page-to-company-json | data-extraction.md | Messy page → strict company JSON, nulls never guesses | page_text |\n| person-name-normalization | data-extraction.md | Raw name string → structured parts, edge cases handled | raw_name |\n| address-geo-parsing | data-extraction.md | Raw address → structured geo + precision level | raw_address |\n| employee-count-banding | data-extraction.md | \"~500\"/\"5k\"/\"200-500\" → canonical headcount band | employee_count_raw |\n| industry-taxonomy-slotting | data-extraction.md | Company → one verbatim slot of a supplied taxonomy | company_description, taxonomy_list |\n| contact-details-extraction | data-extraction.md | Emails/phones/socials from footer or signature text, verbatim only | page_text |\n| job-posting-fields-extraction | data-extraction.md | Job posting → title/seniority/location/salary/tech JSON | job_posting_text |\n| custom-attribute-extraction | data-extraction.md | One defined attribute from page text + confidence band + evidence quote | attribute_name, attribute_definition, allowed_values, page_text |\n| technology-adoption-state | data-extraction.md | Mixed evidence → how widely a tech is used (individual → company standard) | technology, evidence_items |\n\nConventions shared by every prompt: explicit output contract (parse-ready for downstream nodes), a hallucination guard (\"if the text doesn't state X, output null — do not guess\"), and ≤200 words. When a prompt underperforms, tune the variables before the prose — and if it's genuinely broken, file a `workspaceManagement report create` so the library gets fixed for everyone.\n\nFile v2.2.0:references/prompt-library/lead-scoring.md\n\n# Prompt library — lead scoring\n\nPrompts that turn enriched records into scores, tiers, and disqualifications with explicit rubrics — so two runs on the same data agree. Run through `anthropic.instruct` with `temperature: 0` (0.2 max) (bulk tier only — some judgment-tier models reject non-default sampling parameters with a 400; see [`../../provider-playbooks/anthropic.md`](../../provider-playbooks/anthropic.md) and omit the override when in doubt); scoring wants determinism. All JSON outputs are parse-ready for downstream filter/branch nodes.\n\n### icp-fit-score\n\n**Purpose:** Score a company 1-10 against a written ICP definition with a fixed rubric. **Variables:** {{icp_description}}, {{company_name}}, {{company_summary}}, {{industry}}, {{employee_count}}, {{country}}. **Model guidance:** claude-3-5-haiku-latest for bulk sweeps; claude-sonnet-4-6 when the ICP has many soft, judgment-heavy criteria. **Output:** JSON `{score, rationale, missing_data}`.\n\n```\nScore how well this company fits the ICP, 1-10.\n\nICP definition: {{icp_description}}\n\nCompany: {{company_name}} — {{company_summary}}. Industry: {{industry}}. Employees: {{employee_count}}. Country: {{country}}.\n\nRubric: 9-10 = matches every stated ICP criterion; 7-8 = matches all hard criteria, misses one soft criterion; 5-6 = matches most hard criteria with one clear gap; 3-4 = misses multiple hard criteria; 1-2 = wrong market entirely. Score only against criteria stated in the ICP definition — do not add criteria of your own. If a field the ICP needs is empty, do not guess its value: list it in missing_data and score conservatively. Output ONLY the JSON object: {\"score\": <1-10>, \"rationale\": \"<one sentence citing the deciding criteria>\", \"missing_data\": [\"<field>\", ...]}\n```\n\n### tech-stack-fit-score\n\n**Purpose:** Score fit from detected technologies — complementary tools raise it, incumbents cap it. **Variables:** {{detected_technologies}}, {{complementary_technologies}}, {{competing_technologies}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{score, complementary_matches, competing_matches, displacement_candidate, rationale}`.\n\n```\nScore tech-stack fit 1-10 for a company whose detected stack is: {{detected_technologies}}.\n\nTechnologies that indicate fit (we integrate with or build on): {{complementary_technologies}}. Technologies that indicate an incumbent solution we would displace: {{competing_technologies}}.\n\nScoring: each complementary match raises the score; a competing match caps the score at 6 (displacement candidate — flag it, score 5-6 only if complementary matches also exist, otherwise 3-4). No matches either way = 3. Match only technologies literally present in the detected list — do not infer unlisted tools from company type or industry. Output ONLY the JSON object: {\"score\": <1-10>, \"complementary_matches\": [...], \"competing_matches\": [...], \"displacement_candidate\": <true|false>, \"rationale\": \"<one sentence>\"}\n```\n\n### hiring-intent-strength\n\n**Purpose:** Score how strongly job postings signal buying intent, weighted by recency and seniority. **Variables:** {{job_postings}}, {{relevant_functions}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{score, relevant_posting_count, evidence, rationale}`.\n\n```\nAssess hiring-intent strength 1-10 from these job postings (one per line: title, posted date, location): {{job_postings}}. Functions relevant to our product: {{relevant_functions}}.\n\nRubric: count postings in relevant functions, weighted by recency (≤30 days old = full weight, 31-90 days = half, older = ignore) and seniority (a leadership hire in a relevant function means they are building a team: +2). 0 relevant postings = 1. 1-2 recent = 4-5. 3-5 recent = 6-7. More than 5, or any leadership hire = 8-10. Use only the postings provided — if the list is empty, output score 1 with evidence []. Output ONLY the JSON object: {\"score\": <1-10>, \"relevant_posting_count\": <n>, \"evidence\": [\"<title (age in days)>\", ...], \"rationale\": \"<one sentence>\"}\n```\n\n### composite-priority-score\n\n**Purpose:** Merge ICP, signal, and engagement sub-scores into a P1/P2/P3 outreach tier with deterministic tie-breaks. **Variables:** {{icp_fit_score}}, {{signal_strength_score}}, {{engagement_score}}. **Model guidance:** claude-3-5-haiku-latest (pure arithmetic + two rules). **Output:** JSON `{composite, tier, tie_break_applied}`.\n\n```\nCombine three sub-scores (each 1-10, already computed — do not re-derive them) into a priority tier for outreach. ICP fit: {{icp_fit_score}}. Signal strength: {{signal_strength_score}}. Engagement history: {{engagement_score}}.\n\nWeights: composite = 0.5 × ICP + 0.35 × signal + 0.15 × engagement. Tiers: ≥8.0 = P1, 6.0-7.9 = P2, 4.0-5.9 = P3, <4.0 = park. Tie-breaks, applied only when the composite sits within 0.2 of a tier boundary: promote one tier if signal ≥ 8 (fresh signals decay — act on them); demote one tier if ICP ≤ 4 (signal never outranks fit). If any sub-score is missing or outside 1-10, output tier \"park\" with composite null — do not substitute a default. Output ONLY the JSON object: {\"composite\": <number|null>, \"tier\": \"P1|P2|P3|park\", \"tie_break_applied\": \"<rule applied, or none>\"}\n```\n\n### disqualification-check\n\n**Purpose:** Hard-disqualifier gate to run before spending enrichment credits on a record. **Variables:** {{disqualifiers}}, {{company_name}}, {{company_summary}}, {{industry}}, {{employee_count}}, {{country}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** one line — `DISQUALIFY: <rule> — <evidence>`, `PASS`, or `PASS (unverified: <fields>)`.\n\n```\nCheck this company against hard disqualifiers before any paid enrichment. Disqualifiers: {{disqualifiers}}\n\nCompany: {{company_name}} — {{company_summary}}. Industry: {{industry}}. Employees: {{employee_count}}. Country: {{country}}.\n\nApply ONLY the listed disqualifiers — do not invent additional ones. A disqualifier fires only on explicit evidence in the fields above; ambiguity or a missing field is never grounds to disqualify — flag it instead. Output exactly one line, nothing else: \"DISQUALIFY: <which rule> — <the evidence>\" or \"PASS\" or \"PASS (unverified: <comma-separated fields that were empty>)\".\n```\n\n### persona-title-fit\n\n**Purpose:** Score how closely a job title matches a written buyer persona. **Variables:** {{persona_description}}, {{title}}. **Model guidance:** claude-3-5-haiku-latest. **Output:** JSON `{score, ambiguous, reason}`.\n\n```\nScore 1-10 how well the job title \"{{title}}\" matches this buyer persona: {{persona_description}}.\n\nRubric: 9-10 = the persona's title or a direct synonym; 7-8 = same function, one seniority level off; 5-6 = same function at the wrong level, or an adjacent function at the right level; 3-4 = adjacent function and wrong level; 1-2 = unrelated function. Judge from the title text alone — do not assume responsibilities the title does not state. If the title is an abbreviation you cannot expand with confidence, score 5 and set ambiguous true. Empty title = score 1. Output ONLY the JSON object: {\"score\": <1-10>, \"ambiguous\": <true|false>, \"reason\": \"<one sentence>\"}\n```\n\nArchive v2.1.2: 101 files, 340018 bytes\n\nFiles: agents/execution-plan-creator.md (6113b), agents/list-builder.md (2637b), guides/enriching-and-researching.md (7654b), guides/finding-companies-and-contacts.md (7543b), guides/writing-outreach.md (7352b), provider-playbooks/aiArk.md (12140b), provider-playbooks/anthropic.md (7008b), provider-playbooks/apolloio.md (7282b), provider-playbooks/bouncer.md (4732b), provider-playbooks/brightData.md (8391b), provider-playbooks/builtwith.md (5279b), provider-playbooks/cleon1.md (5091b), provider-playbooks/companyEnrich.md (5246b), provider-playbooks/contactOut.md (6556b), provider-playbooks/datagma.md (5523b), provider-playbooks/dropcontact.md (5190b), provider-playbooks/enrichCrm.md (5535b), provider-playbooks/enrichley.md (5306b), provider-playbooks/enrowio.md (5351b), provider-playbooks/exa.md (6141b), provider-playbooks/findyMail.md (5177b), provider-playbooks/firecrawl.md (6093b), provider-playbooks/forager.md (5170b), provider-playbooks/FullEnrich.md (5884b), provider-playbooks/g2.md (5189b), provider-playbooks/gemini.md (6594b), provider-playbooks/hunter.md (5615b), provider-playbooks/icypeas.md (6456b), provider-playbooks/kitt.md (4313b), provider-playbooks/leadMagic.md (5309b), provider-playbooks/linkedin.md (10429b), provider-playbooks/linkup.md (5341b), provider-playbooks/mixrank.md (4819b), provider-playbooks/neverBounce.md (4931b), provider-playbooks/oceanio.md (7114b), provider-playbooks/openAi.md (6780b), provider-playbooks/parallel.md (9087b), provider-playbooks/peopleDataLabs.md (9100b), provider-playbooks/perplexity.md (7056b), provider-playbooks/piloterr.md (5790b), provider-playbooks/prospeo.md (5498b), provider-playbooks/proxycurl.md (9832b), provider-playbooks/reverseContact.md (5833b), provider-playbooks/rocketreach.md (5235b), provider-playbooks/salesNavigator.md (6281b), provider-playbooks/serper.md (5587b), provider-playbooks/sillage.md (4532b), provider-playbooks/snitcher.md (5700b), provider-playbooks/societeInfo.md (5688b), provider-playbooks/theirStack.md (6587b), provider-playbooks/theSwarm.md (5203b), provider-playbooks/waterfall.md (6816b), provider-playbooks/x.md (6990b), provider-playbooks/zeroBounce.md (5461b), recipes/account-expansion.md (7164b), recipes/ads-audience-activation.md (11839b), recipes/build-tam.md (11537b), recipes/clay-to-cargo.md (14059b), recipes/custom-datapoints.md (29557b), recipes/funding-watch.md (6760b), recipes/icp-discovery.md (8293b), recipes/import-gtm-data.md (7208b), recipes/job-change-monitoring.md (5150b), recipes/linkedin-url-lookup.md (4412b), recipes/lost-deal-revival.md (8055b), recipes/outreach-activation.md (11003b), recipes/portfolio-prospecting.md (6525b), recipes/prospecting.md (16959b), recipes/re-engagement.md (8052b), recipes/review-and-iterate.md (6959b), recipes/save-as-play.md (6863b), recipes/source-planning.md (7840b), recipes/tech-intent.md (5963b), references/acceptable-use.md (7544b), references/alternatives.md (7058b), references/contact-accuracy.md (5822b), references/cost-discipline.md (9579b), references/credits-cost-table.md (31593b), references/output-retrieval.md (4970b), references/prompt-library/company-research.md (6704b)\n\nFile v2.1.2:SKILL.md\n\n---\nname: cargo-gtm\ndescription: \"Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (`references/acceptable-use.md`); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: \\\"build me a list of\\\", \\\"find 50 <title> at <segment>\\\", \\\"who works at\\\", \\\"find work emails for these accounts\\\", \\\"enrich this CSV\\\", \\\"verify these emails\\\", \\\"build a TAM\\\", \\\"who fits our ICP\\\", \\\"who actually buys from us\\\", \\\"what data points should we collect on accounts\\\", \\\"our outbound is reaching the wrong people\\\", \\\"score these leads\\\", \\\"write a first-touch email\\\", \\\"push these to my CRM\\\", \\\"who changed jobs\\\", \\\"who just raised funding\\\", \\\"companies using <tech>\\\", \\\"who is hiring <role>\\\", \\\"find the buying committee\\\", \\\"portfolio companies of <investor>\\\", \\\"upload this audience to Google/Meta/LinkedIn ads\\\". Providers: aiArk, anthropic, apolloio, bouncer, brightData, builtwith, cleon1, companyEnrich, contactOut, datagma, dropcontact, enrichCrm, enrichley, enrowio, exa, findyMail, firecrawl, forager, FullEnrich, g2, gemini, hunter, icypeas, kitt, leadMagic, linkedin, linkup, mixrank, neverBounce, oceanio, openAi, parallel, peopleDataLabs, perplexity, piloterr, prospeo, proxycurl, reverseContact, rocketreach, salesNavigator, serper, sillage, snitcher, societeInfo, theirStack, theSwarm, waterfall, x, zeroBounce. Reads phase guides, recipes, and per-provider playbooks before any paid ca\n\nArchive v2.1.1: 101 files, 340028 bytes\n\nFiles: agents/execution-plan-creator.md (6113b), agents/list-builder.md (2637b), guides/enriching-and-researching.md (7654b),...","readmeExcerpt":"Skill: cargo-gtm Owner: cargo-ai Summary: Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a perso","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"npm install -g @cargo-ai/cli            # no global install? prefix every command with `npx @cargo-ai/cli`\ncargo-ai login --email you@company.com  # emailed code, no browser; creates the account on first use\n                                        # alternatives: --oauth (browser) · --token <api-token> (CI)\ncargo-ai whoami                         # confirm the active workspace before any write"},{"language":"text","snippet":"1. SOURCE   → salesNavigator.searchLeads / searchAccounts            (0.2/record)\n              lookalike seeds, or filters SN can't express (skills,\n              education, tenure)? aiArk.searchCompanies / searchPeople (0.01–0.05/record)\n              free first pass on plain title/industry/size/geo filters?\n              FullEnrich.searchPeople / searchCompanies                (0/record)\n2. DEDUPE   → match against the workspace's own Companies / Contacts models\n              on domain / linkedin_url (storage SQL or a segment filter)  (free)\n3. ENRICH   → LinkedIn URL in hand? aiArk.enrichPerson (0.1) FIRST — profile + verified\n              email in one call; linkedin.enrichProfile/enrichCompany (0.25) if no email needed\n              aiArk.enrichCompany (0.01) for firmographics; companyEnrich.enrichByDomain\n              (0.25) on the rows that come back thin\n              + waterfall.enrichContact / enrichCompany              (1–2/record)\n              + apolloio.enrichPerson / enrichOrganization on the niche residue (1/record)\n4. SIGNAL   → enrichCrm.getFunding                                   (1/record)\n              + theirStack.searchJobs / builtwith.getDomainSummary   (0–0.5/record)\n              + waterfall.detectJobChange                            (3/record)\n5. CONTACT  → FullEnrich.findEmail — only on rows step 3 left without\n              an email (fallback peopleDataLabs)                     (1–3/record)\n6. VERIFY   → waterfall.verifyEmail                                  (0.1/record)\n7. BACKFILL → peopleDataLabs.enrichPerson (only if step 5 missed)    (3/record)\n8. QA       → scripts/contact-accuracy-audit.ts                      (free, local)"},{"language":"bash","snippet":"cargo-ai orchestration run download-outputs \\\n  --workflow-uuid <uuid> \\\n  --output-node-slug <slug> \\\n  --format json"},{"language":"bash","snippet":"S=<path-to-this-skill>/scripts\nnode $S/validate-emails.ts        --input outputs.csv        --output step1.csv\n# … run waterfall.verifyEmail on the survivors, merge results into step2.csv …\nnode $S/select-current-role.ts    --input step2.csv          --output step3.csv\nnode $S/validate-linkedin-names.ts --input step3.csv         --output step4.csv\nnode $S/contact-accuracy-audit.ts  --input step4.csv         --output final.csv"},{"language":"bash","snippet":"node $S/contact-accuracy-audit.ts --workflow-uuid <uuid> --batch-uuid <uuid> --summary-json"},{"language":"text","snippet":"1. SAMPLE    Run a small slice of the EXACT input data through the EXACT config.\n             1–3 rows to prove one action's config shape.\n             10–20 records before any BATCH — one row can't show a hit-rate,\n             and a batch's cost is (per-row cost × hit-rate) × N.\n2. APPROVAL  Present the approval message (format below). Wait for the user.\n             It must state the RECORD COUNT to be enrolled and the CREDIT\n             ESTIMATE for them.\n3. FULL RUN  Only after explicit approval, fan out across the remaining records."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: cargo-gtm\ndescription: \"Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (`references/acceptable-use.md`); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: \\\"build me a list of\\\", \\\"find 50 <title> at <segment>\\\", \\\"who works at\\\", \\\"find work emails for these accounts\\\", \\\"enrich this CSV\\\", \\\"verify these emails\\\", \\\"build a TAM\\\", \\\"who fits our ICP\\\", \\\"who actually buys from us\\\", \\\"what data points should we collect on accounts\\\", \\\"our outbound is reaching the wrong people\\\", \\\"score these leads\\\", \\\"write a first-touch email\\\", \\\"push these to my CRM\\\", \\\"who changed jobs\\\", \\\"who just raised funding\\\", \\\"companies using <tech>\\\", \\\"who is hiring <role>\\\", \\\"find the buying committee\\\", \\\"portfolio companies of <investor>\\\", \\\"upload this audience to Google/Meta/LinkedIn ads\\\". Providers: aiArk, anthropic, apolloio, bouncer, brightData, builtwith, cleon1, companyEnrich, contactOut, datagma, dropcontact, enrichCrm, enrichley, enrowio, exa, findyMail, firecrawl, forager, FullEnrich, g2, gemini, hunter, icypeas, kitt, leadMagic, linkedin, linkup, mixrank, neverBounce, oceanio, openAi, parallel, peopleDataLabs, perplexity, piloterr, prospeo, proxycurl, reverseContact, rocketreach, salesNavigator, serper, sillage, snitcher, societeInfo, theirStack, theSwarm, waterfall, x, zeroBounce. Reads phase guides, recipes, and per-provider playbooks before any paid call. Skip when: a run already happened and misbehaved — use cargo-diagnostics.\"\nversion: \"2.2.0\"\ncompatibility: Requires @cargo-ai/cli (npm). Sign in or create an account with `cargo-ai login --email` (emailed code, no browser), `--oauth`, or an API token\nhomepage: https://github.com/getcargohq/cargo-skills\nmetadata:\n  author: getcargo\n  openclaw:\n    requires:\n      bins:\n        - cargo-ai\n    install:\n      - kind: node\n        package: \"@cargo-ai/cli@latest\"\n        bins:\n          - cargo-ai\n    homepage: https://github.com/getcargohq/cargo-skills\n---\n\n# Cargo GTM — Meta Skill\n\nUse this skill for prospecting, account research, contact enrichment, verification, lead scoring, personalization, signal monitoring, and campaign activation.\n\n## Acceptable use — MANDATORY, before anything that touches a person\n\nFull spec: [`references/acceptable-use.md`](references/acceptable-use.md). The short version, binding on every recipe here:\n\n- **B2B professional identities only**, from the licensed providers in [`provider-playbooks/`](provider-playbooks/) — never consumer targeting, purchased lists, or data taken from a platform in breach of its terms.\n- **Three checks before any outreach step** — *basis* (customers,"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7by8t6yt9yghbxtxz6hv0bts87k6bq\",\n  \"slug\": \"cargo-gtm\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1790973919665\n}"},{"path":"references/acceptable-use.md","content":"# Acceptable use — basis, suppression, and volume gates\n\nCanonical people-data rules for this skill. Recipes and playbooks link here instead of restating them. These are **mandatory behaviors**, the same tier as [`cost-discipline.md`](cost-discipline.md): an agent that skips the basis check or writes around a suppression list is misusing the skill.\n\nScope: every step that touches a person — sourcing, enrichment, verification, personalization, sequencer handoff, ads activation. Not legal advice; the user's counsel owns the final call on their jurisdiction and lawful basis.\n\n## 1) What this skill is for\n\nBusiness-to-business revenue work, on business identities, using data the workspace is licensed to receive through the providers in [`../provider-playbooks/`](../provider-playbooks/). The unit of work is a **qualified account and the person whose professional role makes them a plausible buyer** — a list that has been filtered, scored, and costed before anyone is contacted.\n\nIt is not a bulk-messaging tool. Nothing in *this* skill sends mail: the outreach recipes stop at send-ready variables and hand off to a sequencer, under that sequencer's sending limits and identities. Where that sequencer is Cargo's own — a mailbox the workspace provisioned through [`../../cargo-mailbox-management/SKILL.md`](../../cargo-mailbox-management/SKILL.md) — nothing on this page relaxes: the three checks in §3 run before the first send, the mailbox's warm-up ramp is the ceiling, and an unsubscribe writes a workspace-wide suppression that no later send may work around. Cargo owning the inbox changes who presses send, not whether the message should be sent.\n\n## 2) Hard refusals\n\nDo not execute these. Say which rule applies in one sentence, offer the compliant version, and move on — state it once, don't lecture.\n\n| Request | Why it's refused |\n|---|---|\n| \"Email everyone at every company in `<industry>`\" — undifferentiated fan-out with no qualification step | Volume in place of relevance is the definition of spam; propose the scored, filtered slice instead |\n| Consumer or private-individual targeting — personal life, home contact details, audiences with no business role | This skill covers B2B professional identities only |\n| A list whose origin the user can't state — purchased lists, lists exported from a former employer, data taken from a platform in breach of its terms | No lawful basis, and every downstream provider ToS forbids it |\n| Contacting anyone on the workspace's unsubscribe / do-not-contact / hard-bounce list | Suppression is absolute; re-contact is a violation, not an optimization |\n| Evasion: rotating sending domains or identities to dodge filters, disguising the sender, misleading subject lines, fake `Re:` threads on a first touch, forged headers | Deception is prohibited independently of volume |\n| Auto-dialing, SMS blasts, or a full-list phone sweep | Phone is explicit-request-only on qualified leads — see [`cost-discipline.md`](cost-discipline.md) §5 |\n"},{"path":"references/alternatives.md","content":"# Alternative provider chains\n\nWhen the priority stack (salesNavigator / cargo / aiArk / waterfall / FullEnrich / apolloio / theirStack / peopleDataLabs) can't serve the user's criteria, swap in providers from the long tail.\n\nFor every alternative, see [`stage-action-map.md`](stage-action-map.md) for the cheapest credits-based action per stage across the full 136-integration catalog.\n\n## When to swap providers\n\nOnly swap when:\n\n1. **Filter mismatch**: priority provider doesn't expose the filter you need (e.g., salesNavigator can't filter by funding round → escalate to peopleDataLabs.queryCompanies).\n2. **Coverage gap**: priority provider doesn't have data for the niche (e.g., local SMBs aren't well-covered by salesNavigator → escalate to serper.searchPlaces).\n3. **Premium quality required**: cheap email/phone finders missed → FullEnrich was already the priority answer; further escalation goes to multi-source like waterfall.findPhone (7 credits).\n\nDefault rule: **don't swap to chase 2× cheaper if hit-rate drops 30%**. The total credit spend across a chain is dominated by misses (re-running across stages), not by the per-call cost.\n\n## Sourcing alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| At-scale lead search | FullEnrich.searchPeople (**0**) **or** salesNavigator.searchLeads (0.2) | icypeas.findPeople (0.02) | When LinkedIn coverage is thin (e.g., privacy-focused industries). |\n| At-scale account search | FullEnrich.searchCompanies (**0**), salesNavigator.searchAccounts (0.2) **or** aiArk.searchCompanies (0.01) | oceanio.searchCompanies (1) | aiArk is 20× cheaper and takes lookalike seeds (≤5 domains), oceanio when the filter is technographic / web-traffic shaped. |\n|   |   | peopleDataLabs.searchCompanies (3) for cargo-filter shape, or queryCompanies (3) for SQL | When salesNavigator's filters miss (funding, investor, complex bool). |\n| Tech-intent sourcing | theirStack.searchJobs / searchCompanies (0.5) | (no priority alternative — theirStack IS priority) | n/a |\n| SMB / local | (none in priority — priority skips SMB) | serper.searchPlaces (0.05), firecrawl.scrape (0.05) | Always for local/storefront. |\n| Visitor de-anonymization | (none — niche) | snitcher.searchSessions (0) | Always for visitor ID — free credits-tier. |\n| Warm-intro sourcing | (none — niche) | theSwarm.searchWarmIntrosToCompany (2) | When the goal is intros, not pure prospecting. |\n\n## Person enrichment alternatives\n\n| Goal | Priority | Alternative | When to swap |\n|---|---|---|---|\n| Person enrichment (LinkedIn URL in hand) | aiArk.enrichPerson (0.1) | linkedin.enrichProfile (0.25) | When you only need LinkedIn-anchored details and no email. |\n|   |   | prospeo.enrichLinkedin (0.5) | Second opinion on a URL-anchored miss. |\n| Person enrichment (name + company) | waterfall.enrichContact (2) | apolloio.enrichPerson (1, **3** with phone reveal, priority) | The niche-coverage rung — promote per-batch when a pilot shows Apollo hits where aiArk"},{"path":"references/contact-accuracy.md","content":"# Contact accuracy — deterministic QA scripts\n\nEvery list that reaches a sequencer or CRM carries three failure modes that\nprose diligence misses: the **wrong person** (same-name decoy behind a LinkedIn\nURL), the **stale role** (contact left the company; the #1 source of bounces\nand bad first lines), and the **unsafe email** (catch-all domains that accept\nanything, single-source guesses, role accounts). This reference wires four\nrunnable TypeScript scripts into the pipeline so those checks are code, not\njudgment.\n\n**The rule: run the script — do not re-derive its logic in-context.** The\nscripts are deterministic, fixture-tested in CI, and cheaper than reasoning\nthrough 500 rows. If a script's verdict looks wrong, that's a bug report\n(`workspaceManagement report create`), not a reason to hand-check rows.\n\n## Runtime\n\nScripts live in [`../scripts/`](../scripts/) (this skill's directory — resolve\nrelative to wherever the skill loaded from). They run directly with Node ≥\n22.18 (`node <script>.ts`, native type-stripping; `npx tsx <script>.ts` on\nolder Nodes). Zero dependencies for file mode. Every script supports:\n\n- `--input <file.csv|file.json>` — rows from a file: a CSV from\n  `run download-outputs`, a JSON array, or raw `action execute-batch` output\n  (`{\"results\": [...]}` is unwrapped automatically), **or**\n- `--workflow-uuid <uuid>` (+ optional `--batch-uuid`, `--output-node-slug`,\n  `--workspace-uuid`) — **API mode**: fetches the output rows directly via the\n  `@cargo-ai/api` package (`npm install -g @cargo-ai/api` if missing), reusing\n  the CLI's stored login (`~/.config/cargo-ai/credentials.json`) or\n  `CARGO_API_TOKEN`. Equivalent to `run download-outputs`, no temp file.\n- `--output <file>` — write augmented rows (default: stdout). On\n  `validate-emails.ts` and `contact-accuracy-audit.ts`, `--json` switches the\n  row output from CSV to a JSON array — use it when the next step is a `jq`\n  filter (build the paid-verify batch from `recommendation != \"skip\"` rows;\n  hand off only `audit_action == \"SEND\"` rows).\n- `--fixtures` — self-test against the bundled fixture file; exits non-zero on\n  failure (CI runs this on every push).\n\n## The four scripts, in pipeline order\n\n| Stage | Script | Adds columns | Run it… |\n|---|---|---|---|\n| Before paid verification | `validate-emails.ts` | `email_syntax_valid`, `email_risk` (ok/free/role/disposable/invalid), `recommendation`, `is_duplicate` | on every enriched list, **before** `waterfall.verifyEmail` — culling invalid/disposable/duplicate rows first is free and shrinks the paid verify batch |\n| After enrichment | `select-current-role.ts` | `current_title`, `current_company`, `role_confidence` (high/medium/low), `role_reason` | whenever a provider returned an experiences array — never trust the top experience blindly |\n| After enrichment | `validate-linkedin-names.ts` | `name_match` (true/false), `name_match_reason` | whenever a LinkedIn URL was looked up from a name (see [`../recipes/linkedin-url-lookup.m"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2594,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T12:29:39.384Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:32:41.779Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}