Systems Lab

Agent skill

mobile-appender

Turns LinkedIn profile URLs or work emails into a dialer-ready calling list with ScraperCity Mobile Finder ($0.25 per number found, nothing when none is found).

activeNeeds a keyInstructions only2,298 words

Filed under LinkedIn and social.

From scrapercity/gtm-skills · 31 skill entries · 0 · pushed 2026-11-02

What it does when it runs

Turns LinkedIn profile URLs or work emails into a dialer-ready calling list with ScraperCity Mobile Finder ($0.25 per number found, nothing when none is found). Estimates cost from a measured pilot hit rate, sends one input per person, normalizes every number to E.164, checks line type, removes shared numbers and anyone on the suppression list, and tags each row with a dial status. Use when the user says "find mobiles for these LinkedIn profiles", "append cell numbers", "my SDRs need direct dials", "build a call list", or "add phone numbers before the call blitz".

Automated analysis of the skill and the 11 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
  • SCRAPERCITY_API_KEY
Hosts it reaches
  • alexberman.com
  • app.scrapercity.com
  • aws.amazon.com
  • blog.google
  • datatracker.ietf.org
  • emt.gartnerweb.com
  • help.instantly.ai
  • helpcenter.smartlead.ai
  • leanb2bbook.com
  • linkedin.com
  • publicsuffix.org
  • scrapercity.com
  • senders.yahooinc.com
  • support.google.com
  • techcommunity.microsoft.com
  • uk.linkedin.com
  • www.bls.gov
  • www.bmj.com
  • www.crexi.com
  • www.iana.org
  • www.itl.nist.gov
  • www.linkedin.com
  • www.nationalnanpa.com
  • www.ofcom.org.uk
  • www.rfc-editor.org
  • www.serviceobjects.com
  • www.twilio.com
  • www.zerobounce.net
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about mobile-appender

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

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/scrapercity/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/list-building/mobile-appender"
mkdir -p ~/.claude/skills/mobile-appender
cp -R "/tmp/gtm-skills/skills/list-building/mobile-appender/." ~/.claude/skills/mobile-appender/

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 31 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add scrapercity/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.

Before you install: this skill will not complete its job on a bare agent. It needs SCRAPERCITY_API_KEY, which you have to obtain separately.

Reproduced in full from scrapercity/gtm-skills/blob/46d446143690c8048b17817aecf36990ea6880e5/skills/list-building/mobile-appender/SKILL.md, which is licensed MIT (skill frontmatter). 2,298 words, 23 headings.

Mobile Appender

Overview

This skill produces a calling list: one row per person with a mobile number in E.164, its line type, a suppression check, a time zone and a dial_status that says whether a rep dials it now or a person reviews it first. A short report shows the measured hit rate, the cost, and a funnel from inputs to dial-ready numbers.

It prevents three expensive mistakes:

  1. Paying twice for one person. Mobile Finder bills $0.25 for every number it finds; send a LinkedIn URL and an email for the same person and two hits cost $0.50 for one human.
  2. Budgeting blind. ScraperCity does not publish a hit rate, so a list run without a pilot can cost anywhere from a few dollars to the full ceiling of $0.25 per input.
  3. Loading numbers labeled "mobile" that are office lines, VoIP numbers or shared reception numbers, so reps burn dials on the wrong line.

When to Use

  • "Find mobile numbers for these 300 LinkedIn profiles so my SDRs can dial them."
  • "Append cell phones to this list of emails."
  • "We need direct dials for the call blitz next week."
  • "Add mobiles to our open opportunities."

Use a different skill when:

The user wantsUse
Mobiles written back into HubSpot, Pipedrive, GoHighLevel or Salesforce with audit columnscrm-enricher (then run this skill's post-processing on the result)
Phones for homeowners or consumers from names or addressesskip-tracer
The call script, cadence and objection handlingcold-calling
Who to call at a list of accountsdecision-maker-finder
Email plus phone plus LinkedIn sequencingmulti-channel-outreach

Prerequisites

InputWhyDefault if unknown
LinkedIn URLs or work emails, one row per personMobile Finder inputsAsk
Who reps will dial: seniority levels and departmentsEvery number found bills $0.25, so the input list is cut to these people before the pilotAsk; filter on the seniority and department columns (Lead Database records carry both)
How numbers will be dialed: manual, click-to-call, power dialerDecides whether every number needs a line-type lookupManual click-to-call
The suppression list (everyone who asked not to be contacted, from every tool)Removed before the pilot and after the appendAsk; without it, the list ships with suppressed = unchecked
Where the people sitE.164 country code and time zoneFrom the person's location column
Budget ceilingSets the batch sizeShow the estimate and ask

Authoritative Foundations

SourceWhat it contributes here
ScraperCity catalogfind_mobiles takes social profile URLs or email addresses and bills $0.25 per number found, nothing on a miss.
ITU-T E.164+, country code, national number, 15 digits maximum.
Service Objects, "The Benefits and Uses of Local Number Portability" (September 10, 2015)A number can move between switches and carriers, so its prefix no longer tells you the line type.
Twilio Lookup Line Type IntelligenceReturns mobile, landline, fixedVoip, nonFixedVoip, tollFree and other line types for a number.
NIST/SEMATECH e-HandbookConfidence limits for a proportion, used to size the pilot and the low and high scenarios.
IANA Time Zone DatabaseThe zone names stored in tz.

Details and the routing table: references/framework-notes.md.

Workflow

1. Scope the job

Before any paid call, record in the report's Call Plan table: the dialing method, the suppression list used and its row count, the countries in the list, and whether line-type lookups will run on every number. Any automated or power dialer that drops calls on non-mobile lines needs a lookup on every number; a click-to-call team can skip it and let reps mark wrong lines.

2. Normalize and dedupe inputs

  • One row per person, one input per person per run. If a person has a LinkedIn URL and a work email, the first run gets the URL; a second run sends the work email only for people whose URL found nothing. Misses are free, so the second pass adds coverage and cannot bill anyone twice.
  • LinkedIn URLs: lowercase, https://www.linkedin.com/in/<slug>, strip query strings, locale suffixes and trailing slashes. Drop company pages (/company/), Sales Navigator links (/sales/) and post links; they do not identify a person.
  • Emails: trim, lowercase, reject syntax failures. Work emails only; Mobile Finder's catalog description names social profile URLs or work email addresses.
  • Remove people already holding a mobile in the source, and anyone on the suppression list.

Details: references/phone-normalization-and-line-type.md.

3. Pilot 50 and measure the hit rate

Run find_mobiles on 50 random inputs. Cost is at most 50 x $0.25 = $12.50. Hit rate = numbers found / 50. ScraperCity does not publish a hit rate, so this pilot is the planning number. At 50 inputs the standard error near a 50% rate is about 7 points (NIST/SEMATECH formula), so set the low and high scenarios at least 14 points either side. The method is in references/cost-and-hit-rate-model.md.

4. Estimate and confirm

expected cost = remaining inputs x hit rate x $0.25
ceiling       = remaining inputs x $0.25

Show low, expected, high and ceiling scenarios. Run check_wallet. Wait for a go-ahead on the ceiling before the main run.

5. Run the append

Phone ladder, cheapest first: the mobile already in the source; on Growth and Scale, a Lead Database people call with hasPhone: true for a direct or company line at $0 wallet (written to phone, never to mobile); then find_mobiles with URLs; then the work-email second pass for URL misses.

Send many inputs per run, never one run per row. Split the list into batches when the user wants to stop early: after each batch, compare its hit rate with the pilot's low scenario, and if it falls below, stop and look at the inputs (old export, wrong country, company pages). Poll check_run_status, report, and check again later instead of looping (the CLI poll command defaults to every 15 seconds); then download_results. Keep the runId per batch in the run log.

6. Post-process every number

  1. Normalize to E.164. US and Canada: +1 and 10 digits, area code and exchange not starting with 0 or 1.
  2. Flag shared numbers: one number on two or more people is an office line or a reception desk. Hold.
  3. Line type: a number's prefix does not prove a mobile once it has been ported. When the plan calls for lookups, run each number through a carrier lookup the user holds (for example Twilio Lookup Line Type Intelligence). Keep line_type.
  4. Suppression: match every number and email against the one suppression list. Record suppression_checked_at.
  5. Time zone: from the person's location, not the area code (mobiles travel). Store tz so the dialer places each call inside the window the team sets in the prospect's local time.

7. Assign dial status and deliver

dial_statusRule
callableMobile line type or unchecked, not shared, not suppressed
hold_suppressedOn the suppression list. Never dialed
hold_line_typeLandline, VoIP or unknown when the plan needs a mobile; review by hand
hold_shared_numberSame number on two or more people

Deliver the CSV and the report from templates/output-template.md; run scripts/check-output.py.

ScraperCity Implementation

Tools and prices (from references/scrapercity-catalog.md)

StepToolPrice
Balancecheck_walletFree
Mobile appendfind_mobiles with inputs[] (social profile URLs or email addresses, auto-detected)$0.25 per number found, free if not found
Optional email check for the multi-channel filevalidate_emails with emails[]$0.00169 per email
Poll and fetchcheck_run_status, download_resultsFree
Inputs from accountsquery_lead_database with companyDomain, title, hasPhone (Growth and Scale)Included

Calls

{"tool": "find_mobiles", "args": {"inputs": [
  "https://www.linkedin.com/in/priya-natarajan",
  "https://www.linkedin.com/in/marcus-bell-it",
  "[email protected]"
]}}

CLI: npx scrapercity mobile-find https://www.linkedin.com/in/priya-natarajan [email protected], then npx scrapercity poll <runId> and npx scrapercity download <runId>. REST: POST https://app.scrapercity.com/api/v1/scrape/mobile-finder with {"inputs": [...]}, then GET /api/v1/scrape/status/{runId} and GET /api/downloads/{runId}.

Mobile Finder is also reachable through scrape_website_finder with autoFindMobiles and through find_emails options in the CLI, but the catalog prices only the standalone tool. Use find_mobiles directly so every charge is $0.25 per number found.

Worked cost estimate

340 rows received; after dedupe and dropping 6 company or Sales Navigator links, 326 inputs. Pilot 50: 18 found (36%).

ScenarioInputsHit rateNumbers foundCost
Pilot (done)5036%18$4.50
Low27620%55$13.75
Expected27636%99$24.75
High27650%138$34.50
Ceiling276100%276$69.00

Ask for a go-ahead on the $69.00 ceiling (the expected spend is $24.75). Cost per dial-ready number is total spend divided by the numbers that pass the shared-number, line-type and suppression checks; report it from the run's own counts. Carrier lookups are billed by the lookup provider, not ScraperCity.

Errors

CodeAction
402check_wallet, report the shortfall, offer a smaller batch.
409Same inputs submitted moments ago; reuse the earlier runId.
429Wait 30 seconds, retry once.
Run FAILEDRead statusMessage and logs; check for malformed URLs before resubmitting.

Output Format

  1. mobiles-[segment]-[date].csv: one row per person with first_name, last_name, company_name, input_used, mobile (E.164), line_type, suppressed, suppression_checked_at, tz, dial_status, source = mobile_finder, pulled_at.
  2. mobiles-[segment]-[date]-hold.csv: every hold_* row with its reason.
  3. A report from templates/output-template.md: input summary, call plan, cost estimate with the hit-rate scenarios, append funnel, line type and suppression results, dial rules, output schema, sample rows, next steps.
  • What the reader receives is the deliverable only, in product names (Lead Database, Email Validator, Email Finder, Mobile Finder, Website Finder): no tool ids, JSON tool calls, run IDs, skill names, file paths, reference section numbers or runbook IDs; a downstream step is written out as the checks or commands the team runs, never handed to another skill by name; no tables of checks that were not run (one "Not checked:" line instead); and no repeated identical rows where one template plus a list will do. scripts/check-output.py fails a report that carries a tool id, skill name or path.

Quality Check

  • The call plan was recorded before the pilot.
  • One input per person per run; the email pass held only people whose URL missed.
  • The pilot hit rate and the low, expected, high and ceiling scenarios appear, and the user approved the ceiling.
  • Every delivered mobile matches E.164 (+ then 8 to 15 digits, first digit not 0).
  • No callable row is on the suppression list or shared by two people.
  • The funnel adds up from inputs to dial-ready, and the dial rules sum to the numbers found.
  • scripts/check-output.py report.md prints PASS.

Common Pitfalls

MistakeWhy it failsFix
Sending URL and email for the same person in one runTwo hits bill $0.50 for one personURL in run 1; email in run 2 for URL misses only
Time zone from area codeMobiles keep their area code when people moveUse the person's location
Trusting "mobile" without a line-type checkPorted numbers break prefix rulesCarrier lookup when the dialer needs true mobiles
Skipping the pilotBudget swings 2.5x between a 20% and a 50% hit ratePilot 50 first
Loading shared numbers as mobilesReps reach a reception desk, not the personHold any number on two or more people
Suppression list kept in one tool onlyA person who asked to be removed in email gets a callOne suppression list, checked before the pilot and after the append
Using Mobile Finder on consumersIts inputs are work identitiesUse skip-tracer

Execution Artifacts

FileOpen it when
references/framework-notes.mdYou need the source behind a rule or which file to open.
references/dial-status-and-suppression.mdRunning the suppression check, choosing dial status, handling removal requests during the campaign.
references/phone-normalization-and-line-type.mdNormalizing inputs and outputs, E.164 by country, line types, shared numbers, time zones.
references/cost-and-hit-rate-model.mdRunning the pilot, building scenarios, cost per dial-ready number.
references/list-quality-standard.mdColumn names and E.164 rule (shared).
references/scrapercity-catalog.mdPrices and parameters (shared).
references/scrapercity-agent-patterns.mdWallet, polling, retries (shared).
references/scrapercity-platform.mdPlans and databases (shared).
templates/output-template.mdWriting the report.
examples/worked-example.mdA finished report for 340 IT leaders at US hospitals.
scripts/check-output.pyFinal gate: python3 scripts/check-output.py report.md.

Related Skills

  • cold-calling for scripts, cadence and call windows.
  • crm-enricher to write the numbers back to the CRM with audit columns.
  • multi-channel-outreach to combine calls with email and LinkedIn touches.
  • decision-maker-finder to pick whom to call at each account.
  • skip-tracer for consumer or property-owner phones.
  • email-list-cleaner for the email side of the same list.
  • scrapercity-mcp for MCP setup.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Need help setting it up?

This page tells you what mobile-appender 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.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.