Skip to content

How to find B2B decision-maker phone numbers with Claude Code or Codex.

Find direct B2B phone numbers with Leadbase MCP in Claude Code or Codex, from a few qualified contacts to a complete people list.

Leading companies trust Leadbase

Otto GroupFreudenbergERGOIFVLiebl und FrankDeutsche Vermögensberatung

Find a direct number in four steps

Connect Leadbase MCP to Claude Code or Codex, identify the person you want to research, submit a phone question with enrichment_start, then retrieve the result with enrichment_get. For a list already in Leadbase, enrich the selected rows with sheets_enrich instead. Your AI client coordinates the research; it does not place calls.

You need a Leadbase workspace with research access and sufficient credits. A name, company and professional profile help identify the right person. A direct business number may be a mobile number or a work line; a phone result does not guarantee a mobile number for every contact.

For the HTTP version of this workflow, use the complete email and phone API example. It includes submission, retrieval and the difference between a missing number and a failed job.

1. Connect Claude Code or Codex to Leadbase MCP

Follow the MCP setup instructions for your client and authorize the intended workspace. Check the connected tool list and verify access with a read call such as billing_get before starting paid research.

Use the public tools exposed by that connection:

TaskMCP tool
Research a phone number without creating a Sheetenrichment_start
Retrieve progress and results for that batchenrichment_get
Fill a phone column in existing Sheet rowssheets_enrich
Read Sheet research progress and saved valuessheets_get_enrichment_status, then sheets_query

HTTP integrations use dotted operation names such as enrichment.start. Your MCP client uses the underscore tool names above. It does not need to discover an underlying provider operation such as prospects.find_phone.

2. Give the agent a person and a precise phone question

Start with one contact or a small list you intend to research. Include the professional profile URL when known, plus the person's name and current company. If you only have a common name, first identify the person and company rather than accepting a number for a different person.

This fictional example shows the arguments for enrichment_start. Replace the profile placeholders and company details with your own contacts before running it. Choose one stable idempotency key for this exact batch; execution can consume credits.

json
{  "idempotencyKey": "phone-pilot-001",  "items": [    {      "id": "contact-1-phone",      "input": {        "name": "Alex Example",        "company": "Example Systems",        "profileUrl": "https://www.linkedin.com/in/CONTACT_ONE"      },      "question": "Find this person's direct business phone number. Do not substitute a company switchboard or guess a missing number.",      "output": { "type": "phone" }    },    {      "id": "contact-2-phone",      "input": {        "name": "Blair Example",        "company": "Example Works",        "profileUrl": "https://www.linkedin.com/in/CONTACT_TWO"      },      "question": "Find this person's direct business phone number. Do not substitute a company switchboard or guess a missing number.",      "output": { "type": "phone" }    }  ]}

Each item has its own ID so the agent can join results back to the original person. One phone question per person fits up to 100 people in a batch. If you also need work emails, submit a separate email item per person; a 100-item batch then fits up to 50 people with both fields. See bulk enrichment.

You can give Claude Code or Codex this instruction instead of assembling the JSON yourself:

text
Use Leadbase to find direct business phone numbers for the people in my selectedlist. Preserve each record ID and its known name, company and professional profile.Ask for output type phone; never invent a number or substitute a switchboard.Use enrichment_start for batches of at most 100 independent phone questions.Keep one stable idempotency key for each exact batch. Save batchId and job IDs.Read the existing batch with enrichment_get instead of submitting it again.Report returned numbers, completed searches without a number, failed jobs,unresolved jobs and actual credits separately. Stay within my agreed scope and budget.

3. Retrieve the same batch and interpret the answer

The start response contains batchId and jobs. It confirms acceptance, not completion. Pass the returned UUID to enrichment_get:

json
{  "batchId": "BATCH_ID_FROM_START"}

While a job is queued or running, read the same batch at a reasonable interval with backoff. Save its IDs if you close the client and resume retrieval later. A lost start response is recovered with the original payload and idempotency key; a fresh key could create new paid work.

Observed job resultMeaningWhat to do
completed and a non-empty result.value phone arrayOne or more phone values were returnedRead result.summary and result.sources, then check the intended person
completed and an empty phone arrayNo usable phone was returnedPreserve the empty result and explanation
queued or runningResearch is still in progressRead the existing batch again later
failed or cancelledResearch did not finish successfullyKeep the status and errorCode; investigate before retrying
billingStatus is pending or reconciliation_pendingCost is not finalReport observed cost and unresolved settlement separately

For example, if the first item completes with a phone value and the second completes with [], you have one contact with a returned number and one without. That is not two successful phone finds. If the second job is still running, its outcome remains unknown. The contact-data documentation shows a fictional response excerpt and the complete HTTP retrieval request.

credits: null means unknown usage, not zero. Read settled costs in the result or Activity. A missing phone can still have research costs even when no contact-result charge applies; check the current credit policy before increasing volume.

4. Enrich a phone column in an existing Sheet

If your people are already in a Sheet, keep research beside their company and profile context. Use sheets_enrich with the configured phone column and the selected row UUIDs:

json
{  "idempotencyKey": "phone-sheet-pilot-001",  "sheetId": "SHEET_UUID",  "column": { "columnId": "PHONE_COLUMN_UUID" },  "rowIds": ["FIRST_ROW_UUID", "SECOND_ROW_UUID"]}

To create the column, replace column with {"name":"Direct business phone","question":"Find this person's direct business phone number.","type":"phone"}. Existing values and active cells are skipped. Keep rowIds for a selected subset: omitting it covers all existing rows, up to 10,000. Leadbase manages execution admission and dispatch.

Read sheets_get_enrichment_status, then sheets_query for saved values and evidence. Phone and email enrichment use separate columns and requests. See Sheet enrichment for the full workflow.

Mobile numbers, direct lines and DACH coverage

For leads in Germany, Austria and Switzerland, preserve the person's current company and country in your input and evaluate the actual returned results by market. This guide does not establish a coverage rate or promise a mobile number for every DACH contact.

Ask for the number type your task needs. A returned phone string alone does not establish whether it is a mobile number, a direct extension or a switchboard. Only retain type or verification labels when the result actually provides evidence for them. Leave unknown attributes unknown rather than inferring them from a prefix.

Check the identity, current company and evidence before using a result. Retrieving a number does not establish permission to call it. Apply your organization's country, purpose and suppression checks before outreach; those decisions are separate from this research workflow.

Plan and evaluate a larger list

Once your first results are useful, expand with the same record IDs and explicit batch boundaries. A direct workload of 5,000 people with one phone question each requires at least 50 batches. A Sheet lets you manage that list without dispatching a separate client tool call for every cell. Neither batch size nor row count guarantees simultaneous execution or a completion time.

Use the planner to compare the workload with and without first qualifying your target people. Its rates and credit inputs are assumptions, not measured Leadbase performance. Add observed AI, web and identity research costs separately.

Spend phone credits on the right prospects

See how qualifying companies and roles first can focus phone lookups on the prospects your team wants to call.

Workload assumptions
Enter your list size and expected fit and phone-availability rates. Compare looking up everyone with enriching only your qualified prospects. You can enrich selected rows together in a Leadbase Sheet.

Use your own results for the most useful estimate. The default values are examples; phone availability can differ between segments.

3,000 avoidable lookup submissions

Under these assumptions, 2,000 people reach phone lookup and approximately 1,200 results are found. The scenario avoids 9,000 credits compared with submitting every candidate.

MetricLookup every candidateQualify before lookup
Expected phone lookups submitted5,0002,000
Estimated found results3,0001,200
Estimated credits15,0006,000
Compare lookup-first with qualification-first

Both scenarios use the same assumed found rate and credits per found result. Only the number of people submitted changes.

Illustrative phone lookup submissions and credits before and after qualification
How the planner works

The planner multiplies your candidate count by the account-and-role fit rate, then applies the same assumed phone-availability rate and contact-action credit price to both scenarios. It retains one decimal throughout and excludes AI, web research, and other usage. The five-credit default models one found phone action. Public enrichment_start accepts 1–100 independent items: up to 100 people for one phone item each, or 50 when email and phone are separate items. A 5,000-person phone list requires at least 50 batches; retrieve results with the returned batch IDs. Sheet enrichment handles the selected rows for you. These estimates are not measured coverage, accuracy, savings, or permission to call.

Illustrative estimate based on your inputs. Actual lookup results and total costs vary; research usage is calculated separately.

Preserve the denominator: every submitted person, including missing results, failures and unfinished jobs. Review returned numbers as confirmed correct, confirmed incorrect, inconclusive or not reviewed. Returned coverage and confirmed accuracy answer different questions; do not count an unreviewed result as correct.

Score a direct-phone lookup pilot

Enter observed pilot counts to separate returned coverage, right-person accuracy, unresolved results, call eligibility, connection outcomes, and lookup-and-review cost.

Observed pilot counts
Use one frozen segment, test window, lookup configuration, review rule, and call-eligibility policy. Enter raw counts rather than percentages.

The accounting value per credit is your input. Included-plan credits, marginal overage credits, reviewer time, and downstream calling cost are different economic categories.

15 call-eligible records from 40 lookups

Returned coverage is 62.5%; confirmed right-person accuracy is 85.7%. 15 records passed the separate call-eligibility review, and 7 attempts reached the right person.

MetricResultDefinition
Returned coverage62.5%Found results ÷ submitted lookups
Confirmed right-person accuracy85.7%Confirmed correct ÷ (confirmed correct + confirmed incorrect)
Inconclusive found share16%Inconclusive found results ÷ found results
Call-ready yield37.5%Call-eligible ÷ submitted lookups
Right-person connection rate58.3%Right-person connections ÷ call attempts
Lookup-and-review pilot cost€98.75Credits × credit value + review minutes ÷ 60 × hourly cost
Lookup-and-review cost per call-eligible record€6.58Lookup-and-review pilot cost ÷ call-eligible records
Lookup-and-review cost per right-person connection€14.11Lookup-and-review pilot cost ÷ right-person connections
Keep lookup and review outcomes separate

Every submitted lookup remains visible as found and reviewed, found but not reviewed, not found, pending, or failed. A found result is not treated as correct until the identity review decides it.

Composition of submitted phone lookups by confirmed correct, confirmed incorrect, inconclusive, not reviewed, not found, pending, and failed
How the scorecard separates denominators

Coverage uses submitted lookups. Confirmed accuracy excludes inconclusive and not-reviewed results but keeps both visible separately. Call-ready yield uses every submitted lookup. Connection rate uses actual call attempts. Lookup-and-review pilot cost equals credits multiplied by the entered credit value plus reviewer minutes multiplied by the hourly cost divided by 60; it excludes calling operations and other downstream costs.

The scorecard does not establish statistical significance, data freshness, legal permission, consent, presumed consent, or vendor superiority. Retain row-level evidence and report the segment, dates, definitions, and unresolved cases beside these metrics.

Download the fictional phone-lookup ledger to retain IDs, review decisions and costs. For a deeper evaluation, use the European B2B data-provider test and sales-ready account cost guide.

Start with your first contacts

Connect your client using the MCP setup, run a small phone batch and retrieve the actual results. Use the email and phone API documentation when integrating your own application, or create your workspace to keep the list in Leadbase.

Examples are fictional and explain the workflow; they are not measured coverage, accuracy or cost results. The operation contract was checked against the product source on 20 October 2026.