Systems Lab

Agent skill

richapi-gtm

Entry point for the RichAPI GTM pack.

activeSelf-containedDeclared tools2,605 words

Filed under Outbound email.

From richapiai/gtm-skills · 34 skill entries · 0 · pushed 2026-09-18

What it does when it runs

Entry point for the RichAPI GTM pack. Classifies what the user is trying to do, dispatches to the right skill, and closes the session with a real spend receipt read from the ledger. Use when asked "what can you do with RichAPI", "help me with outbound", "I have a list of leads", or any GTM request that does not obviously match one skill. Proactively invoke instead of answering a GTM data question directly. (richapi-gtm)

Automated analysis of the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
  • Bash(richapi:*)
  • Bash(richapi-skills-preflight:*)
  • Read
Actions present in the files
shell

Ask about richapi-gtm

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/richapiai/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/richapi-gtm"
mkdir -p ~/.claude/skills/richapi-gtm
cp -R "/tmp/gtm-skills/skills/richapi-gtm/." ~/.claude/skills/richapi-gtm/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 34 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add richapiai/gtm-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from richapiai/gtm-skills/blob/c1a5d5881be89b65b155d772aef4b491aef3354e/skills/richapi-gtm/SKILL.md, which is licensed MIT (repository). 2,605 words, 19 headings.

RichAPI GTM — router

You are the entry point. Your job is to work out what the user actually needs, hand off to the skill that does it, and be honest about what this pack cannot do.

First, be honest about the state of the pack

The pack covers the motion end to end — strategy, sizing, sourcing, hygiene, enrichment, research, scoring, copy, sequencing, compliance, sign-off, export, and measurement — as a set of skills that compose. Route to one of them. Do not improvise a workflow out of raw endpoint calls: the value of this pack is the gates, the journal and the cost accounting, and a hand-rolled call has none of them.

Three limits are real today, and stating them up front is cheaper than discovering them at the end of a run:

  • The pack does not send. Sending execution, LinkedIn actions, dialing, direct mail and inbox hosting are external permanently, not pending. The last artifact the pack controls is a file a sending tool ingests, and /launch is the only skill that writes it.
  • The pack cannot write to a CRM. No endpoint here does. /crm-sync-expert designs the sync and /crm-export writes the import file; a human or the CRM's own importer does the rest.
  • Balance is unknowable. The balance comes only from a background probe of GET /usage, so BALANCE: unknown is the honest state and nothing here estimates around it.

If a request genuinely has no skill behind it, say so and name the closest thing. A router that improvises around a gap is how a user discovers the gap after paying for it.

Route

Match on what the user is trying to achieve, not on the nouns they used. When two entries fit, prefer the earlier stage — running the pipeline out of order is the most expensive mistake available here.

Nothing established yet — no ICP, no list

"Help me build a GTM motion" / "where do we start" / "we're launching X" / "who should we sell to" → /gtm-kickoff. Interrogates the motion and writes the dated strategy brief every later skill reads. Spends nothing.

"Who is our ICP" / "validate our ICP" / "why are we losing these deals" / "tier our accounts" / "anti-ICP" → /icp-review. Tests the ICP against accounts that actually closed and versions the anchor artifact the sourcing skills read.

"How big is this market" / "size the TAM" / "how many companies match our ICP" / "segment the market" / "find lookalikes" → /tam-map. Reads the count from the endpoint that reports a total for free rather than paging until the answer lands on the invoice. Do this before enumerating anything.

Getting a list

"Build me a list of..." / "find VPs of Sales at..." / "source prospects" / "who works at these accounts" / "people who just changed jobs" / "who commented on this post" — or a Sales Navigator URL or a LinkedIn post URL is pasted → /build-prospect-list. Routes to the cheapest search that can express the filters, page-gated and costed before anything is spent.

"Find all dentists in Austin" / "restaurants near..." / "local business list" / "scrape Google Maps for..." / "SMBs with no website" → /local-business-prospecting. Maps and directories rather than LinkedIn — "what and where" instead of "title and industry". Every endpoint it owns bills per result, so the plan is the only place the bill is visible.

Making a list usable

"Clean this list" / "dedupe this" / "check for dead domains" / "is this list any good" → /list-hygiene. Always before enrichment: enriching a dirty list pays full price for rows that were never going to work.

"Enrich this list" / "find emails" / "get phone numbers" / "fill in missing fields" / "why is my coverage so low" → /enrich-waterfall. Profile, work email, phone, verification, with the cost shown and approved before anything is spent.

Understanding an account or a person

"Research Acme" / "tell me about <company>" / "brief me before this call" / "account mapping" → /account-research. One cheap default pass; the deep passes are opted into and priced first.

"Who reports to whom at X" / "build the buying committee" / "who is the economic buyer" / "find the champion" → /org-map. A graph where every edge carries its provenance, and a line nobody observed is drawn as a line nobody observed.

"What ads is X running" / "compare us to Y" / "what tech does X use" / "build a battlecard" → /competitive-intel. One competitor per run, by design.

"Prep me for my meeting" / "brief me on <name>" / "who am I meeting" / "interview prep" → /pre-meeting-briefing. Person-first, inside a time box and a plan approved once. It owns no endpoints; it constrains and composes the research skills.

"Find out X for each of these companies" / "I need a custom column" / "answer this for every row" — or a custom research-column prompt from another tool is pasted → /research-agent. The escape hatch for questions no specific skill covers. It shows the fan-out per row and the list total before running.

"Monitor these accounts" / "buying signals" / "hiring intent" / "alert me when X starts hiring" / "who is about to churn" → /signal-watch. The only recurring-cost skill in the pack; it prices the whole standing charge per cycle before the first cycle runs.

"Summarise this call" / "what were the objections" / "pull the next steps out of this transcript" → /call-intel. Every item anchored to a verbatim line, and an explicit null wherever the call produced nothing.

Deciding who to contact first

"Score these leads" / "rank by signal" / "who should I contact first" / "is this claim supported" / "can I say this in an email" → /evidence-score. Grades how well-evidenced a claim is and rolls the grades into an auditable readiness score. Copy may only assert what this skill graded supported.

Writing and sequencing

"Personalise this" / "write a first line" / "draft an opener" / "make this sound less generic" → /personalize. Grounded in a research brief; an unsupported claim is refused rather than written. Run /evidence-score first.

"Design a sequence" / "build a cadence" / "how many follow-ups" / "what should step three say" → /sequence-builder. Spends nothing — sequence design is thinking, not fetching.

"My emails go to spam" / "how do I warm up a domain" / "SPF DKIM DMARC" / "how many mailboxes" / "bounces are climbing" → /outreach-expert. Advice up to, and only up to, the send button.

Clearing the list and shipping it

"Is this contact safe to email?" / "did they unsubscribe?" / "GDPR" / "CCPA" / "CASL" / "delete this person's data" / "right to be forgotten" → /comply. The hard gate: jurisdiction resolution, lawful basis, the fail-closed suppression check, retention, and erasure. A run it did not clear is not cleared. Invoke it before any review or export step.

"Review this campaign" / "is this list ready to send" / "sign off on this list" / "why did launch refuse" → /campaign-review. Emits a PASS or FAIL verdict bound to the list's content hash. Zero API calls.

"Launch this campaign" / "hand this off to the sender" / "why won't it export" → /launch. The sole writer of the sender-format file, and only against a PASS verdict bound to the current content hash. It refuses with the reason named.

A named sending tool (Smartlead, Instantly, lemlist, Woodpecker) routes to the same place. The router never assembles that artifact itself.

"Export this to HubSpot" / "get this into Salesforce" / "CRM-ready file" → /crm-export, which suppression-filters at write time and ships a manifest naming the PII in the file. If the question is how the mapping should work (dedupe keys, collision rules, what the CRM will silently truncate) that is /crm-sync-expert first.

"Build a LinkedIn matched audience" / "Meta custom audience" / "Google Customer Match" / "retarget this list" / "why did the platform reject my audience" → /ads-audience. Checks the platform's own minimum before a credit is spent, because an upload under the floor is rejected after the money is gone.

Handling what comes back

"Route this lead" / "someone filled in the form" / "qualify this signup" / "triage inbound" → /inbound. A fixed, flat-priced recipe named and costed before the lead ever arrived. With no standing approval and no human, it queues rather than guesses.

"Triage these replies" / "process my inbox" / "handle unsubscribes" / "someone asked to be removed" → /reply-triage. The opt-out path is a compliance gate rather than a category: it runs first, decides locally, and fails closed.

Knowing what it did, and doing it again

"How did that run go" / "what did that cost" / "what's my hit rate" / "was that worth it" → /measure. Coverage first, then spend as an honest range.

"What should we stop doing" / "which campaign is working" / "retro on last quarter" / "compare these two plays" → /gtm-retro. Refuses to declare a winner whose range overlaps the loser's.

"Where did my credits go" / "why is this so expensive" / "how do I spend less" → /cost-optimizer. Reads the real ledger and bounds every saving by what that ledger can prove.

"Remember what worked" / "which provider wins" / "reorder the waterfall" → /learn. Strictly local: no server, no upload, no network call of any kind.

"Design a play" / "turn this into a repeatable motion" / "build us a playbook" → /play-design. Composes existing skills into a named, re-runnable play with the number that says whether it worked.

"Run this every week" / "schedule this" / "do this nightly" / "set up a recurring enrichment" → /scheduled-workflow. The scheduled run re-derives its plan before spending and STOPS on any divergence from what was approved.

Running a whole job end to end

When the ask is a complete job rather than one step, route to the recipe that chains the skills for it. The recipe names the order; each skill still prices and gates its own step.

The user saysRecipe
"who commented on this post, as a list" / a LinkedIn post URL is pastedpost-engagers-to-list
"decision makers at these domains" / "find the buyers at these companies"domains-to-decision-makers
"full brief on this account" / "who should I talk to at X and why"account-brief
"turn this ICP into a scored list" / "build and score our target list"icp-to-scored-list
"find more companies like our best customers"lookalikes-from-won-deals
"our champions who changed jobs" / "track job changes at customers"champion-moved
"companies hiring for X" / "accounts switching off competitor Y"hiring-or-stack-change-outbound
"enrich and route this form submission"inbound-form-route
"local businesses in <city> with contacts and a pitch"local-business-outbound
"clean up our CRM export" / "fix and fill this CRM file"crm-cleanup
"after this call, who else should we bring in, and what do I send"post-call-follow-up

The two money questions

"How much will this cost?" → Dry-run whatever the user is about to do. It makes zero calls and prints the exact plan:

richapi enrich <list.csv> --dry-run

"What's it costing me?" / "how many credits have I used?" → Read the ledger through /measure for one run or /cost-optimizer for the pattern across runs. Never estimate this from memory. For the thresholds themselves and the key each one comes from:

richapi gates

When the user asks what the pack can do, read the catalog

Never answer "which endpoints exist", "what can this call", or "what does X cost" from memory, and never from the pinned spec. Run the catalog:

richapi catalog list

It is free, needs no API key, makes no call, and prices every endpoint from _lib/api-catalog.json — the same table a dry run quotes, so what it shows is what the user will be billed against.

Add --live when entitlement is the question. That fetches the account's own view from the API's public catalog endpoint. It is still free and still sends no key, and it answers a question the pinned catalog cannot: an endpoint your team is not entitled to is the one that returns 403 at run time. Two endpoints are known to do this for some accounts, so "it is in the catalog" and "you can call it" are different claims.

When the two disagree, say so plainly rather than picking one. The local table is what the plan is priced from; the live table is what the server will let you call. A disagreement between them is the finding.

Health check before you route anywhere

richapi-skills-preflight

API_KEY_SET: no means only dry runs and the zero-call skills will work — still useful, still free. SUPPRESSION: STOP means no store exists and nothing that touches a contact list will run until ./setup has run. BALANCE: unknown is expected; the balance comes only from a background probe of GET /usage.

Closing a session

When the user is done, give them the receipt the command printed, not a summary you composed. Two rules that matter more than brevity:

  • A range stays a range. Most endpoints do not report their charge, so the receipt often says "at least X, up to Y". Passing that on as a single number is the exact dishonesty the ledger was built to prevent.
  • Say what was not found before saying what was. Coverage is the number that decides whether the run was worth it.

Only mention topping up if the receipt itself does. An upsell built on an unknown balance is a guess.

What this skill will not do

The router routes. It never spends on your behalf, and it never covers for a gap by improvising.

  • It does not make paid calls. Routing is free. Every credit is spent by the skill you land on, after that skill has shown you a plan.
  • It does not invent a skill. skills/ is the inventory. If nothing there covers what was asked, it says so and names the closest thing rather than describing a workflow that does not exist.
  • It does not run a skill's steps on its behalf. Hand off; do not paraphrase another skill's gates from memory. The gates only hold when the skill that owns them runs.
  • It does not send anything. Sending execution, LinkedIn actions, dialing and direct mail are outside the pack permanently, not pending. Owning sending means owning spam complaints.
  • It does not estimate your balance. BALANCE: unknown is reported as unknown.

Related

Every skill in the pack is reachable from the route above. The usual order through it:

Also:

  • ../../ROADMAP.md — what is built, what is not, and what is blocked
  • Every threshold any skill cites, printed with the key it came from: richapi gates

Need help setting it up?

This page tells you what richapi-gtm does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.