Brickbank
Blocks Ways to run Try a block

Finished jobs, paid per result.

Each block does one job: input in, result out. Run it from this page, from your own software, or from an AI agent. Every block shows its price per result before you run it.

See the blocks Ways to run them
THE STORE

Blocks you can run today.

To try a block, paste a run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS.

appsim 0.2.0

Outside sites it contacts: api.anthropic.com

View manifest

  • read_job_ad — Must-haves, nice-to-haves and deal-breakers from one job ad, each with its verbatim quote. up to $0.05 per unit Inputs: Job ad Try
  • read_resume — Titles with dates and claims from one CV or service description, each with its verbatim quote. up to $0.05 per unit Inputs: CV or service description Try
  • match_report — Each job-ad requirement checked against the CV and message's exact wording; counts met, recruiter notice, and fixes. up to $0.05 per unit Inputs: Job ad, CV or service description, Cover message Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/appsim

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/appsim/v1/run/read_job_ad -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"job_ad": "Senior Backend Engineer (Python) \u2014 Northwind Analytics, remote (EU)\n\nWe build the data platform behind retail demand forecasting.\n\nMust have:\n- 5+ years of professional Python experience\n- Production experience with PostgreSQL\n- Designing and running REST APIs at scale\n\nNice to have:\n- Kubernetes\n- Experience with event streaming (Kafka)\n\nWe cannot sponsor visas; you must be able to work in the EU."}}]}'

MCP address: https://brickbank.cc/b/appsim/mcp (tools)

Claude Code:

claude mcp add --transport http appsim https://brickbank.cc/b/appsim/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "appsim": {
      "type": "http",
      "url": "https://brickbank.cc/b/appsim/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

read_job_ad

Must-haves, nice-to-haves and deal-breakers from one job ad, each with its verbatim quote.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/appsim/v1/run/read_job_ad -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"job_ad": "Senior Backend Engineer (Python) \u2014 Northwind Analytics, remote (EU)\n\nWe build the data platform behind retail demand forecasting.\n\nMust have:\n- 5+ years of professional Python experience\n- Production experience with PostgreSQL\n- Designing and running REST APIs at scale\n\nNice to have:\n- Kubernetes\n- Experience with event streaming (Kafka)\n\nWe cannot sponsor visas; you must be able to work in the EU."}}]}'

read_resume

Titles with dates and claims from one CV or service description, each with its verbatim quote.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/appsim/v1/run/read_resume -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"resume": "Backend Engineer, Contoso Retail \u2014 2019 to present\n- 6 years building Python services (FastAPI, SQLAlchemy)\n- Designed the public REST API serving 40M requests a day\n- Ran PostgreSQL clusters in production, including zero-downtime migrations\n\nSoftware Developer, Fabrikam Logistics \u2014 2016 to 2019\n- Built shipment tracking pipelines on Kafka\n\nBased in Lisbon, Portugal; EU citizen."}}]}'

match_report

Each job-ad requirement checked against the CV and message's exact wording; counts met, recruiter notice, and fixes.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/appsim/v1/run/match_report -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"job_ad": "Senior Backend Engineer (Python) \u2014 Northwind Analytics, remote (EU)\n\nWe build the data platform behind retail demand forecasting.\n\nMust have:\n- 5+ years of professional Python experience\n- Production experience with PostgreSQL\n- Designing and running REST APIs at scale\n\nNice to have:\n- Kubernetes\n- Experience with event streaming (Kafka)\n\nWe cannot sponsor visas; you must be able to work in the EU.", "resume": "Backend Engineer, Contoso Retail \u2014 2019 to present\n- 6 years building Python services (FastAPI, SQLAlchemy)\n- Designed the public REST API serving 40M requests a day\n- Ran PostgreSQL clusters in production, including zero-downtime migrations\n\nSoftware Developer, Fabrikam Logistics \u2014 2016 to 2019\n- Built shipment tracking pipelines on Kafka\n\nBased in Lisbon, Portugal; EU citizen.", "message": "Hello Northwind team,\n\nI'd like to apply for the Senior Backend Engineer role. For the past six years I have built Python\nservices and the REST API at Contoso Retail, and I run its PostgreSQL clusters in production.\n\nBest regards"}}]}'

bossroster 0.1.0

Outside sites it contacts: api.anthropic.com, app.icypeas.com

View manifest

  • resolve — A company's domain, LinkedIn slug or signals id → its canonical LinkedIn company key, backed by two agreeing anchors, plus the team_digest state the other ops need. up to $0.03 per unit Inputs: none Try
  • aggregate — Typed talent / engineering team cells (leader, staff) for a resolved company, each present, not_seen, not_asked or error, with pointer-only evidence and the preset checked, named only, never judged. up to $0.10 per unit Inputs: Canonical company key (from resolve) Try
  • leader_seat — Whether a resolved company's CTO seat is filled, with the holder as a minimised pointer; requires a declared purpose. up to $0.02 per unit Inputs: Canonical company key (from resolve) Try
  • people.find — The manager-and-up people of a company (by LinkedIn URN, name or domain), a name each at $0.10, with their title and profile; a person served here can be asked for by name in email.find. A UK or Polish company's register officers are merged in (company_number or krs, or the exact UK company name): they annotate the people they match, and UK directors with no profile follow, unbilled, as source=registry. $0.10 per unit Inputs: Company LinkedIn URN, Company name, Company domain, UK Companies House number (read officers for it), Polish KRS number (read the register's board for it) Try
  • ask — Answers a question about a resolved company with evidence and honest abstention. count_function: how many people work in a function (talent, engineering), worldwide or in one country, from free counts only; 1 or 2 read as a range, never a person. has_head: whether the function has a head, widening country, region, world, with a reason per step; the CEO counts only under 50 staff; an absence is stated only above the calibrated floor, else unknown; never a person. dm_for_posting: the person who leads the function in a country, named only for a declared purpose and only when the ranker and the title dictionary agree, at $0.10, refused behind the privacy gates; nobody acceptable is not_found and free. org_picture: the company picture at $1, a free skyline of every function by leaders and staff, a seat verdict per function and, for up to 5 functions the caller names with a declared purpose, their head; never a reporting line. max_credits 0 quotes and spends nothing; a fresh re-ask is free. up to $0.10 per unit Inputs: Canonical company key (from resolve) Try
  • email.find — A work email for a named person at a company domain, for a person people.find showed this account. Verified: one credit; risky: returned, marked, free; none found: free. up to $0.06 per unit Inputs: First name, Last name, Company domain Try
  • key.validate — Whether your BossRoster key is valid, free of charge. $0.02 per unit Inputs: none Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/bossroster

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/bossroster/v1/run/resolve -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domain": "stripe.com"}}]}'

MCP address: https://brickbank.cc/b/bossroster/mcp (tools)

Claude Code:

claude mcp add --transport http bossroster https://brickbank.cc/b/bossroster/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "bossroster": {
      "type": "http",
      "url": "https://brickbank.cc/b/bossroster/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

resolve

A company's domain, LinkedIn slug or signals id → its canonical LinkedIn company key, backed by two agreeing anchors, plus the team_digest state the other ops need.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/bossroster/v1/run/resolve -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domain": "stripe.com"}}]}'

aggregate

Typed talent / engineering team cells (leader, staff) for a resolved company, each present, not_seen, not_asked or error, with pointer-only evidence and the preset checked, named only, never judged.

leader_seat

Whether a resolved company's CTO seat is filled, with the holder as a minimised pointer; requires a declared purpose.

people.find

The manager-and-up people of a company (by LinkedIn URN, name or domain), a name each at $0.10, with their title and profile; a person served here can be asked for by name in email.find. A UK or Polish company's register officers are merged in (company_number or krs, or the exact UK company name): they annotate the people they match, and UK directors with no profile follow, unbilled, as source=registry.

ask

Answers a question about a resolved company with evidence and honest abstention. count_function: how many people work in a function (talent, engineering), worldwide or in one country, from free counts only; 1 or 2 read as a range, never a person. has_head: whether the function has a head, widening country, region, world, with a reason per step; the CEO counts only under 50 staff; an absence is stated only above the calibrated floor, else unknown; never a person. dm_for_posting: the person who leads the function in a country, named only for a declared purpose and only when the ranker and the title dictionary agree, at $0.10, refused behind the privacy gates; nobody acceptable is not_found and free. org_picture: the company picture at $1, a free skyline of every function by leaders and staff, a seat verdict per function and, for up to 5 functions the caller names with a declared purpose, their head; never a reporting line. max_credits 0 quotes and spends nothing; a fresh re-ask is free.

email.find

A work email for a named person at a company domain, for a person people.find showed this account. Verified: one credit; risky: returned, marked, free; none found: free.

key.validate

Whether your BossRoster key is valid, free of charge.

lpcritic 0.1.0

Outside sites it contacts: api.anthropic.com

View manifest

  • line_check — Checks one headline, subhead or CTA line: its promise rung 0-4 (concrete = 3+), what it says back, whether a competitor could say it, and rule-cited findings. No rewrites. $0.02 per unit Inputs: Headline or line, Role Try
  • hero_check — Critiques a landing page's first screen (URL or md/html upload) at 1280 and 390 px: a stranger's cold read, the hero's promises and rule-cited findings, top 3 first. Never judges whether the product delivers. $0.06 per unit Inputs: Landing page URL, Uploaded draft Try
  • page_critique — Critiques a whole landing page (URL or md/html upload): its cold read and every promise with its proof and whether the page keeps it. Never judges whether the product delivers. $0.31 per unit Inputs: Landing page URL, Uploaded draft Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/lpcritic

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/lpcritic/v1/run/line_check -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"line": "Automate with confidence", "role": "headline"}}]}'

MCP address: https://brickbank.cc/b/lpcritic/mcp (tools)

Claude Code:

claude mcp add --transport http lpcritic https://brickbank.cc/b/lpcritic/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "lpcritic": {
      "type": "http",
      "url": "https://brickbank.cc/b/lpcritic/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

line_check

Checks one headline, subhead or CTA line: its promise rung 0-4 (concrete = 3+), what it says back, whether a competitor could say it, and rule-cited findings. No rewrites.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/lpcritic/v1/run/line_check -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"line": "Automate with confidence", "role": "headline"}}]}'

hero_check

Critiques a landing page's first screen (URL or md/html upload) at 1280 and 390 px: a stranger's cold read, the hero's promises and rule-cited findings, top 3 first. Never judges whether the product delivers.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/lpcritic/v1/run/hero_check -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"url": "https://example.com/"}}]}'

page_critique

Critiques a whole landing page (URL or md/html upload): its cold read and every promise with its proof and whether the page keeps it. Never judges whether the product delivers.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/lpcritic/v1/run/page_critique -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"url": "https://example.com/"}}]}'

instantly 1.0.0

Outside sites it contacts: api.instantly.ai

View manifest

  • campaign.enrol — Enrol a lead into an Instantly campaign (and optionally a list) by email $0.00 per unit Inputs: campaign_id, contact_id, email, list_id Try
  • lead.add — Add a lead to an Instantly campaign or list with its names, company fields and custom variables $0.00 per unit Inputs: email, campaign_id, list_id, first_name, last_name, website, company_name, custom_variables Try
  • lead.list — List the leads of an Instantly campaign with their delivery status, paging Instantly internally $0.00 per unit Inputs: campaign_id, limit Try
  • campaign.sending_status — Read an Instantly campaign's daily send limit, how much of it is used, and whether it is hit $0.00 per unit Inputs: campaign_id Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/instantly

campaign.enrol has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/instantly/mcp (tools)

Claude Code:

claude mcp add --transport http instantly https://brickbank.cc/b/instantly/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "instantly": {
      "type": "http",
      "url": "https://brickbank.cc/b/instantly/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

campaign.enrol

Enrol a lead into an Instantly campaign (and optionally a list) by email

lead.add

Add a lead to an Instantly campaign or list with its names, company fields and custom variables

lead.list

List the leads of an Instantly campaign with their delivery status, paging Instantly internally

campaign.sending_status

Read an Instantly campaign's daily send limit, how much of it is used, and whether it is hit

lemlist 1.0.0

Outside sites it contacts: api.lemlist.com

View manifest

  • campaign.enrol — Enrol a lead into a lemlist campaign by email $0.00 per unit Inputs: campaign_id, contact_id, email, list_id Try
  • campaigns.list — List the account's lemlist campaigns $0.00 per unit Inputs: none Try
  • campaigns.inventory — List the account's lemlist campaigns with status and the vendor's boolean flags $0.00 per unit Inputs: none Try
  • campaign.preflight — Whether a lemlist campaign can dispatch a lead right now, without adding one $0.00 per unit Inputs: campaign_id Try
  • lead.add — Add a lead (email and/or LinkedIn URL, names, custom variables) to a lemlist campaign that can dispatch it $0.00 per unit Inputs: campaign_id, email, linkedin_url, first_name, last_name, variables Try
  • activities.pull — The lemlist activity feed (sends, opens, replies, ...) since an instant, as raw rows $0.00 per unit Inputs: since Try
  • seats.count — How many distinct lemlist users (seats) the account has $0.00 per unit Inputs: none Try
  • key.validate — Whether a lemlist API key is valid, free of charge $0.00 per unit Inputs: none Try
  • employment.confirm — Whether lemlist's people database places a LinkedIn profile at the given company $0.00 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • people.stated_employment — The current employer lemlist's people database states for a LinkedIn profile $0.00 per unit Inputs: linkedin_url Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/lemlist

campaign.enrol has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/lemlist/mcp (tools)

Claude Code:

claude mcp add --transport http lemlist https://brickbank.cc/b/lemlist/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "lemlist": {
      "type": "http",
      "url": "https://brickbank.cc/b/lemlist/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

campaign.enrol

Enrol a lead into a lemlist campaign by email

campaigns.list

List the account's lemlist campaigns

campaigns.inventory

List the account's lemlist campaigns with status and the vendor's boolean flags

campaign.preflight

Whether a lemlist campaign can dispatch a lead right now, without adding one

lead.add

Add a lead (email and/or LinkedIn URL, names, custom variables) to a lemlist campaign that can dispatch it

activities.pull

The lemlist activity feed (sends, opens, replies, ...) since an instant, as raw rows

seats.count

How many distinct lemlist users (seats) the account has

key.validate

Whether a lemlist API key is valid, free of charge

employment.confirm

Whether lemlist's people database places a LinkedIn profile at the given company

people.stated_employment

The current employer lemlist's people database states for a LinkedIn profile

whatblock 0.1.0

Outside sites it contacts: api.anthropic.com

View manifest

  • company.what_it_does — What a company actually does — what it sells, to whom, where — in 1-3 plain third-person sentences, from its own LinkedIn About and website texts. No self-praise, mission or founding story; never invents facts. $0.00060 per unit Inputs: company_name, profile_text, website_text, industry Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/whatblock

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/whatblock/v1/run/company.what_it_does -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_name": "Sandline HR", "profile_text": "We are a family of passionate, result-driven people, proudly serving since 2015! Our journey began with a dream to change how businesses grow in the region.", "website_text": "Payroll outsourcing | Work visas & PRO services | Recruitment | For startups and SMEs across Dubai and Abu Dhabi | 300+ clients", "industry": "Human Resources Services"}}]}'

MCP address: https://brickbank.cc/b/whatblock/mcp (tools)

Claude Code:

claude mcp add --transport http whatblock https://brickbank.cc/b/whatblock/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "whatblock": {
      "type": "http",
      "url": "https://brickbank.cc/b/whatblock/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

company.what_it_does

What a company actually does — what it sells, to whom, where — in 1-3 plain third-person sentences, from its own LinkedIn About and website texts. No self-praise, mission or founding story; never invents facts.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/whatblock/v1/run/company.what_it_does -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_name": "Sandline HR", "profile_text": "We are a family of passionate, result-driven people, proudly serving since 2015! Our journey began with a dream to change how businesses grow in the region.", "website_text": "Payroll outsourcing | Work visas & PRO services | Recruitment | For startups and SMEs across Dubai and Abu Dhabi | 300+ clients", "industry": "Human Resources Services"}}]}'

datagate-people 0.1.0

Outside sites it contacts: api.hunter.io, api.leadmagic.io, app.bettercontact.rocks, app.icypeas.com

View manifest

  • bettercontact.email.find — A person's work email from name and company domain (BetterContact waterfall) $0.07 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • bettercontact.phone.find — A person's phone number from their LinkedIn URL (BetterContact waterfall). Dataset-sourced, not dial-verified, so `type` is `unknown`. $0.75 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • bettercontact.people.find — People matching titles, locations and seniority, optionally at one company domain (BetterContact Lead Finder). Needs at least one of titles, locations or seniority; seniority takes the vendor's values (intern, entry, mid-level, senior, manager, head, director, vp, c_suite, partner, owner, founder). A company name is never sent. up to $1.50 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • bettercontact.key.validate — Whether a BetterContact API key is valid and has credits, free (GET /account) $0.00 per unit Inputs: none Try
  • bossroster.people.find — The manager-and-up people of a company (by LinkedIn URN, name or domain) with title, seniority and profile, $0.10 a name (BossRoster). A person found here can then be asked for by name in `email.find`. $0.10 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • bossroster.email.find — A manager's verified work email, from a name people.find served (BossRoster) up to $0.06 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • bossroster.key.validate — Whether a BossRoster key is valid, free of charge $0.00 per unit Inputs: none Try
  • companies_house.companies.search — UK companies by incorporation date, SIC code, status or part of the name (Companies House advanced search): number, name, status, incorporation date, SIC codes and registered town and postcode. No headcount. $0.00 per unit Inputs: incorporated_from, incorporated_to, sic_codes, company_status, name_includes, limit Try
  • companies_house.filings.share_allotments — A company's SH01 filings, the notices that it allotted new shares (new equity raised), newest first, read from the newest 100 capital filings in Companies House's filing history. $0.00 per unit Inputs: company_number, limit Try
  • companies_house.officers.list — A UK company's officers (directors, secretaries, LLP members) from Companies House: name, role, appointment and resignation dates, country of residence and nationality. Current officers unless include_resigned is set. $0.00 per unit Inputs: company_number, include_resigned, limit Try
  • companies_house.key.validate — Whether a Companies House API key is valid, free of charge (a one-row company search) $0.00 per unit Inputs: none Try
  • getprospect.email.find — A person's work email from a name and company domain or name (GetProspect Email Finder) $0.00 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • getprospect.email.verify — Whether an email address is deliverable (GetProspect Email Verifier): `valid`, `risky` for accept-all, `unknown` when the verifier cannot tell, `not_found` for an invalid address. $0.00 per unit Inputs: email Try
  • getprospect.key.validate — Whether a GetProspect API key is valid, free of charge (GET /v2/me) $0.00 per unit Inputs: none Try
  • hunter.email.find — A person's work email from name and company (Hunter Email Finder) $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • hunter.email.find_published — A person's work email Hunter found published on the web, with the page it is on (Email Finder /email-finder/found: never an inferred address) $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • hunter.email.verify — Whether an email address is deliverable (Hunter Email Verifier): `valid`, `risky` for accept-all or webmail, `not_found` for an invalid or disposable address, otherwise `unknown`. Hunter answers 202 while it checks, so the call waits for the result. $0.01 per unit Inputs: email Try
  • hunter.people.find — People at a company, with title and seniority (Hunter Domain Search). Titles filter on the returned position; Hunter rows carry no location, so `locations` is ignored. $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • hunter.key.validate — Whether a Hunter API key is valid, free of charge (GET /account) $0.00 per unit Inputs: none Try
  • hunter.account.balance — A Hunter account's plan and the credits and searches used and available, free of charge (GET /account) $0.00 per unit Inputs: none Try
  • icypeas.people.rank — Pick the right decision-maker from people the caller already holds, for one posting: no vendor call, free. Drops a person from another function or country (a regional title that covers the posting's country passes), takes a CEO, MD or founder only when the company has no head of the posting's function, and returns the rest best first, each with a `pick_role` (posting_manager, function_head, small_company_ceo, executive or senior_contact), a `pick_reason` code and a `pick_why` sentence. A posting's `exclude_titles` drop a person whose title holds one of those words, and its `seniority` bands rank a person further from them lower (`off_seniority_band`). Nobody acceptable is a `not_found` miss that lists every rejected person's title, country and reason, or with `not_found_as` data an ok answer carrying that as fields. `strict` false lets generalists through. $0.00 per unit Inputs: What the pick is for: the job posting, or fixed client titles for a company-only pipeline, candidates Try
  • icypeas.people.taxonomy — The decision-maker vocabulary the picker speaks, free, no vendor call and no input: the function families (`functions`, a posting's `posting_function` names one), the seniority bands (`seniority_bands`, top of the company first, a posting's `seniority` names them) and the `version` of that vocabulary, which changes whenever either list does. $0.00 per unit Inputs: none Try
  • icypeas.domain.scan — Role emails Icypeas finds at a company domain or name (Icypeas Domain Scan) $0.02 per unit Inputs: Company domain or name Try
  • icypeas.email.find — A person's work email from a name (first/last or full) and a company domain or name (Icypeas Email Search). `probable` is `risky`; rows the vendor grades `not_found` are skipped. $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • icypeas.email.verify — Whether an email address is deliverable (Icypeas Email Verification): `valid` for a sure grade, `risky` for probable, `not_found` when the vendor grades it so or finds no row, otherwise `unknown`. $0.0019 per unit Inputs: email Try
  • icypeas.account.balance — An Icypeas account's plan and credits left, free of charge (POST /a/actions/subscription-information) $0.00 per unit Inputs: none Try
  • icypeas.companies.search — Companies matching industry, location, keyword, headcount, revenue or headcount-growth filters (Icypeas Company Search), 10 by default. Each row carries the vendor's `total` match count. $0.00038 per unit Inputs: none Try
  • icypeas.company.find — The Icypeas lead-database company for a domain (Icypeas Company Search, one row): its LinkedIn URN, slug and page, website, headcount, industry and address as the vendor holds them. The vendor matches the domain loosely (showcase and sub-pages), so a caller checks `website` and `url` before trusting `lid`. $0.00038 per unit Inputs: Company domain Try
  • icypeas.key.validate — Whether an Icypeas API key is valid, free of charge (POST /find-people/count) $0.00 per unit Inputs: none Try
  • icypeas.people.count — How many people at a company (domain or LinkedIn company URN) match a job-title filter, free $0.00 per unit Inputs: Company domain, LinkedIn sales-company URN Try
  • icypeas.people.find — People matching titles at one company (domain, name or LinkedIn company URN) or anywhere (Icypeas People Search), 10 by default and up to 200. Needs a company, titles or locations. Locations filter the returned page by country or city, so they can shrink it; `seniority` is ignored. Each person carries the vendor's `total` match count and `truncated` when the page holds fewer rows than that. $0.00038 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • icypeas.people.find_ranked — People at one company (domain, name or LinkedIn company URN) or anywhere, for the first of `title_any` (1-10 titles, most likely first) that finds someone: one Icypeas People Search per title, 10 people by default and up to 200, stopping at the first title with people left after the locations filter. With `tiers` (each a ranked title list) the same first-hit search runs once per tier and then once for `title_any` as the last tier, `limit` applying per tier; a person already found by an earlier tier is dropped by LinkedIn URL, and each person carries its 0-based `tier`. A title is not started once another search would not fit inside the time budget: the tiers finished by then are returned, or a `not_found` miss when none found anyone. `title_none` words and the posting's `exclude_titles` are sent to the vendor as job-title excludes, so rows with those words are never read or billed; locations stay a filter on the returned page. Every row read is billed, including those the locations filter drops. Each person carries the vendor's `total` match count for the title that matched. With a `posting` the shared decision-maker picker also reads the people: `picker` shadow (the default) logs its pick beside this answer and changes nothing; `on` returns only the people it accepts, each with a `pick_role`, `pick_reason` and `pick_why`, moves to the next title when a page holds nobody acceptable, and answers a `not_found` that is not billed when every person read was rejected. A CEO, MD or founder is taken only when the company has no head of the posting's function: a free count the gateway keeps 30 days for every consumer answers that, the posting's `function_head_exists` overrides it and its `employee_count` decides when neither is known. $0.00038 per unit Inputs: company_domain, company_name, company_urn, Job titles, most likely first, What the pick is for: the job posting, or fixed client titles for a company-only pipeline Try
  • icypeas.people.search — People matching person and company filters, no company needed (Icypeas People Search), 10 by default. Each row carries the vendor's `total` match count. $0.00038 per unit Inputs: none Try
  • icypeas.company.scrape — A LinkedIn company page's public fields (URN, slug, headcount, industry, website, specialties, employee growth), read from Icypeas's own scrape (never from LinkedIn) $0.0095 per unit Inputs: LinkedIn company URL Try
  • icypeas.company.url_find — A company's LinkedIn page URL by name or domain (Icypeas URL Search) $0.02 per unit Inputs: Company name or domain Try
  • icypeas.email.reverse — The LinkedIn profile behind an email address (Icypeas Reverse Email Lookup) $0.19 per unit Inputs: Email Try
  • icypeas.profile.scrape — A LinkedIn profile's public fields, read from Icypeas's own scrape (never from LinkedIn) $0.03 per unit Inputs: LinkedIn profile URL Try
  • icypeas.profile.url_find — A person's LinkedIn profile URL by name and company name or domain (Icypeas URL Search) $0.02 per unit Inputs: First name, Last name, Company name or domain Try
  • krs.officers.list — The board, supervisory board and proxies of a Polish company by KRS number (Polish court register): body, role and name. The register masks natural persons' names to an initial, so a row names a role, not a person. $0.00 per unit Inputs: krs, limit Try
  • krs.connection.try — Prove the source answers: one extract of a known company, read as officers are. Free, no input. $0.00 per unit Inputs: none Try
  • leadmagic.email.find — A person's work email from name and company domain (LeadMagic Email Finder) $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • leadmagic.people.find — Decision-makers at a company domain, one LeadMagic Role Finder call per title (at most 10), in waves of `limit` until `limit` people are found. Each person carries the title it was found for. Rows carry no location or seniority, so `locations` and `seniority` are ignored. A title whose lookup fails is skipped when others found people. up to $0.48 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • leadmagic.phone.find — A person's mobile number from their LinkedIn URL (LeadMagic Mobile Finder) $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • leadmagic.key.validate — Whether a LeadMagic API key is valid, free of charge (POST /credits) $0.00 per unit Inputs: none Try
  • prospeo.email.find — A person's verified work email from name and company (Prospeo Enrich Person) $0.00 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • prospeo.key.validate — Whether a Prospeo API key is valid, free of charge (GET /account-information) $0.00 per unit Inputs: none Try
  • tomba.email.find_published — A person's work email Tomba names a source page for, with that page (Tomba Email Finder) $0.02 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • tomba.key.validate — Whether a Tomba key and secret are valid, free of charge (GET /me) $0.00 per unit Inputs: none Try
  • treg.email.find — A person's work email from name and company, routed across email finders (treg) up to $0.15 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • treg.key.validate — Whether a treg token is valid, free of charge (an empty email find treg refuses) $0.00 per unit Inputs: none Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/datagate-people

bettercontact.email.find has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/datagate-people/mcp (tools)

Claude Code:

claude mcp add --transport http datagate-people https://brickbank.cc/b/datagate-people/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "datagate-people": {
      "type": "http",
      "url": "https://brickbank.cc/b/datagate-people/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

bettercontact.email.find

A person's work email from name and company domain (BetterContact waterfall)

bettercontact.phone.find

A person's phone number from their LinkedIn URL (BetterContact waterfall). Dataset-sourced, not dial-verified, so `type` is `unknown`.

bettercontact.people.find

People matching titles, locations and seniority, optionally at one company domain (BetterContact Lead Finder). Needs at least one of titles, locations or seniority; seniority takes the vendor's values (intern, entry, mid-level, senior, manager, head, director, vp, c_suite, partner, owner, founder). A company name is never sent.

bettercontact.key.validate

Whether a BetterContact API key is valid and has credits, free (GET /account)

bossroster.people.find

The manager-and-up people of a company (by LinkedIn URN, name or domain) with title, seniority and profile, $0.10 a name (BossRoster). A person found here can then be asked for by name in `email.find`.

bossroster.email.find

A manager's verified work email, from a name people.find served (BossRoster)

bossroster.key.validate

Whether a BossRoster key is valid, free of charge

companies_house.companies.search

UK companies by incorporation date, SIC code, status or part of the name (Companies House advanced search): number, name, status, incorporation date, SIC codes and registered town and postcode. No headcount.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/companies_house.companies.search -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"incorporated_from": "2026-09-01", "sic_codes": ["62012", "62020"], "limit": 50}}]}'

companies_house.filings.share_allotments

A company's SH01 filings, the notices that it allotted new shares (new equity raised), newest first, read from the newest 100 capital filings in Companies House's filing history.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/companies_house.filings.share_allotments -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_number": "09876543", "limit": 10}}]}'

companies_house.officers.list

A UK company's officers (directors, secretaries, LLP members) from Companies House: name, role, appointment and resignation dates, country of residence and nationality. Current officers unless include_resigned is set.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/companies_house.officers.list -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_number": "09876543", "limit": 10}}]}'

companies_house.key.validate

Whether a Companies House API key is valid, free of charge (a one-row company search)

getprospect.email.find

A person's work email from a name and company domain or name (GetProspect Email Finder)

getprospect.email.verify

Whether an email address is deliverable (GetProspect Email Verifier): `valid`, `risky` for accept-all, `unknown` when the verifier cannot tell, `not_found` for an invalid address.

getprospect.key.validate

Whether a GetProspect API key is valid, free of charge (GET /v2/me)

hunter.email.find

A person's work email from name and company (Hunter Email Finder)

hunter.email.find_published

A person's work email Hunter found published on the web, with the page it is on (Email Finder /email-finder/found: never an inferred address)

hunter.email.verify

Whether an email address is deliverable (Hunter Email Verifier): `valid`, `risky` for accept-all or webmail, `not_found` for an invalid or disposable address, otherwise `unknown`. Hunter answers 202 while it checks, so the call waits for the result.

hunter.people.find

People at a company, with title and seniority (Hunter Domain Search). Titles filter on the returned position; Hunter rows carry no location, so `locations` is ignored.

hunter.key.validate

Whether a Hunter API key is valid, free of charge (GET /account)

hunter.account.balance

A Hunter account's plan and the credits and searches used and available, free of charge (GET /account)

icypeas.people.rank

Pick the right decision-maker from people the caller already holds, for one posting: no vendor call, free. Drops a person from another function or country (a regional title that covers the posting's country passes), takes a CEO, MD or founder only when the company has no head of the posting's function, and returns the rest best first, each with a `pick_role` (posting_manager, function_head, small_company_ceo, executive or senior_contact), a `pick_reason` code and a `pick_why` sentence. A posting's `exclude_titles` drop a person whose title holds one of those words, and its `seniority` bands rank a person further from them lower (`off_seniority_band`). Nobody acceptable is a `not_found` miss that lists every rejected person's title, country and reason, or with `not_found_as` data an ok answer carrying that as fields. `strict` false lets generalists through.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.people.rank -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"posting": {"posting_country": "United Arab Emirates", "posting_function": "product"}, "candidates": [{"full_name": "Jane Doe", "title": "Head of Product, GCC"}]}}]}'

icypeas.people.taxonomy

The decision-maker vocabulary the picker speaks, free, no vendor call and no input: the function families (`functions`, a posting's `posting_function` names one), the seniority bands (`seniority_bands`, top of the company first, a posting's `seniority` names them) and the `version` of that vocabulary, which changes whenever either list does.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.people.taxonomy -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {}}]}'

icypeas.domain.scan

Role emails Icypeas finds at a company domain or name (Icypeas Domain Scan)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.domain.scan -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domain_or_company": "stripe.com"}}]}'

icypeas.email.find

A person's work email from a name (first/last or full) and a company domain or name (Icypeas Email Search). `probable` is `risky`; rows the vendor grades `not_found` are skipped.

icypeas.email.verify

Whether an email address is deliverable (Icypeas Email Verification): `valid` for a sure grade, `risky` for probable, `not_found` when the vendor grades it so or finds no row, otherwise `unknown`.

icypeas.account.balance

An Icypeas account's plan and credits left, free of charge (POST /a/actions/subscription-information)

icypeas.companies.search

Companies matching industry, location, keyword, headcount, revenue or headcount-growth filters (Icypeas Company Search), 10 by default. Each row carries the vendor's `total` match count.

icypeas.company.find

The Icypeas lead-database company for a domain (Icypeas Company Search, one row): its LinkedIn URN, slug and page, website, headcount, industry and address as the vendor holds them. The vendor matches the domain loosely (showcase and sub-pages), so a caller checks `website` and `url` before trusting `lid`.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.company.find -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domain": "apple.com"}}]}'

icypeas.key.validate

Whether an Icypeas API key is valid, free of charge (POST /find-people/count)

icypeas.people.count

How many people at a company (domain or LinkedIn company URN) match a job-title filter, free

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.people.count -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company": "apple.com"}}]}'

icypeas.people.find

People matching titles at one company (domain, name or LinkedIn company URN) or anywhere (Icypeas People Search), 10 by default and up to 200. Needs a company, titles or locations. Locations filter the returned page by country or city, so they can shrink it; `seniority` is ignored. Each person carries the vendor's `total` match count and `truncated` when the page holds fewer rows than that.

icypeas.people.find_ranked

People at one company (domain, name or LinkedIn company URN) or anywhere, for the first of `title_any` (1-10 titles, most likely first) that finds someone: one Icypeas People Search per title, 10 people by default and up to 200, stopping at the first title with people left after the locations filter. With `tiers` (each a ranked title list) the same first-hit search runs once per tier and then once for `title_any` as the last tier, `limit` applying per tier; a person already found by an earlier tier is dropped by LinkedIn URL, and each person carries its 0-based `tier`. A title is not started once another search would not fit inside the time budget: the tiers finished by then are returned, or a `not_found` miss when none found anyone. `title_none` words and the posting's `exclude_titles` are sent to the vendor as job-title excludes, so rows with those words are never read or billed; locations stay a filter on the returned page. Every row read is billed, including those the locations filter drops. Each person carries the vendor's `total` match count for the title that matched. With a `posting` the shared decision-maker picker also reads the people: `picker` shadow (the default) logs its pick beside this answer and changes nothing; `on` returns only the people it accepts, each with a `pick_role`, `pick_reason` and `pick_why`, moves to the next title when a page holds nobody acceptable, and answers a `not_found` that is not billed when every person read was rejected. A CEO, MD or founder is taken only when the company has no head of the posting's function: a free count the gateway keeps 30 days for every consumer answers that, the posting's `function_head_exists` overrides it and its `employee_count` decides when neither is known.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.people.find_ranked -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "acme.com", "title_any": ["CEO", "Founder"]}}]}'

icypeas.people.search

People matching person and company filters, no company needed (Icypeas People Search), 10 by default. Each row carries the vendor's `total` match count.

icypeas.company.scrape

A LinkedIn company page's public fields (URN, slug, headcount, industry, website, specialties, employee growth), read from Icypeas's own scrape (never from LinkedIn)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.company.scrape -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"linkedin_url": "https://www.linkedin.com/company/microsoft"}}]}'

icypeas.company.url_find

A company's LinkedIn page URL by name or domain (Icypeas URL Search)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.company.url_find -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_or_domain": "stripe.com"}}]}'

icypeas.email.reverse

The LinkedIn profile behind an email address (Icypeas Reverse Email Lookup)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.email.reverse -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"email": "[email protected]"}}]}'

icypeas.profile.scrape

A LinkedIn profile's public fields, read from Icypeas's own scrape (never from LinkedIn)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.profile.scrape -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"linkedin_url": "https://www.linkedin.com/in/satyanadella"}}]}'

icypeas.profile.url_find

A person's LinkedIn profile URL by name and company name or domain (Icypeas URL Search)

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/icypeas.profile.url_find -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"firstname": "Satya", "lastname": "Nadella", "company_or_domain": "microsoft.com"}}]}'

krs.officers.list

The board, supervisory board and proxies of a Polish company by KRS number (Polish court register): body, role and name. The register masks natural persons' names to an initial, so a row names a role, not a person.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-people/v1/run/krs.officers.list -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"krs": "0000019193"}}]}'

krs.connection.try

Prove the source answers: one extract of a known company, read as officers are. Free, no input.

leadmagic.email.find

A person's work email from name and company domain (LeadMagic Email Finder)

leadmagic.people.find

Decision-makers at a company domain, one LeadMagic Role Finder call per title (at most 10), in waves of `limit` until `limit` people are found. Each person carries the title it was found for. Rows carry no location or seniority, so `locations` and `seniority` are ignored. A title whose lookup fails is skipped when others found people.

leadmagic.phone.find

A person's mobile number from their LinkedIn URL (LeadMagic Mobile Finder)

leadmagic.key.validate

Whether a LeadMagic API key is valid, free of charge (POST /credits)

prospeo.email.find

A person's verified work email from name and company (Prospeo Enrich Person)

prospeo.key.validate

Whether a Prospeo API key is valid, free of charge (GET /account-information)

tomba.email.find_published

A person's work email Tomba names a source page for, with that page (Tomba Email Finder)

tomba.key.validate

Whether a Tomba key and secret are valid, free of charge (GET /me)

treg.email.find

A person's work email from name and company, routed across email finders (treg)

treg.key.validate

Whether a treg token is valid, free of charge (an empty email find treg refuses)

datagate-scrape 0.1.0

Outside sites it contacts: api.apify.com, api.ashbyhq.com, api.brightdata.com, api.eu.lever.co, api.harvestapi.io, api.lever.co, boards-api.greenhouse.io, www.reddit.com

View manifest

  • apify.actor_run — Run an Apify Actor and return its dataset rows, billed at the run's measured usage $1.00 per unit Inputs: actor_id, run_input Try
  • apify.store.search — Search the public Apify store for Actors by keyword: ids, run statistics and pricing, no key needed $0.00 per unit Inputs: query Try
  • apify.actor.describe — What a public Actor declares about itself that its publisher cannot write: input fields, dataset fields, run statistics, pricing events and the latest build number, no key needed $0.00 per unit Inputs: actor_id Try
  • apify.company_team_profiles — Headlines of up to `limit` (1..200) people currently at ONE LinkedIn company, via the harvestapi profile search Actor (build 0.0.274); each row echoes the `company` you sent. A company with no profiles is a not_found miss. Billed at the run's measured usage. $1.00 per unit Inputs: company, limit Try
  • apify.key.validate — Whether an Apify API token is valid, free of charge (GET /users/me) $0.00 per unit Inputs: none Try
  • apify.fantasticjobs_career_site_jobs — Jobs posted on employer career sites and ATS boards (fantastic.jobs career-site job listing API, build 0.0.69) whose title matches, posted in the last 1h, 24h or 7d: one run for up to `limit` (10..100) jobs, billed at the run's measured usage on datagate's Apify Organization account $1.25 per unit Inputs: titles, time_range, limit Try
  • apify.harvestapi_linkedin_post_comments — Read the comments of up to 5 LinkedIn posts (harvestapi post comments, build 0.0.36): up to 200 comments per post, each with its commenter's name, profile URL and headline, the comment text and its own time, billed at the run's measured usage on datagate's Apify Organization account $2.00 per unit Inputs: post_urls, max_comments Try
  • apify.harvestapi_linkedin_post_search — Search LinkedIn posts by phrase or by author (harvestapi post search, build 0.0.114): one run for up to 10 phrases or author profile URLs, newest first, billed at the run's measured usage on datagate's Apify Organization account $0.20 per unit Inputs: search_queries, author_urls, posted_since, max_posts, sort_by Try
  • apify.harvestapi_linkedin_profile_scraper — Find the work email of known LinkedIn profiles (harvestapi profile scraper, build 0.0.138): one run for up to 20 profile URLs, billed at the run's measured usage on datagate's Apify Organization account $1.00 per unit Inputs: profile_urls, mode Try
  • apify.harvestapi_linkedin_profile_search — Find named people at LinkedIn companies by seniority or title (harvestapi profile search, build 0.0.87): one run for up to 25 company slugs, billed at the run's measured usage on datagate's Apify Organization account $5.00 per unit Inputs: company_slugs, seniority, titles, limit_per_company Try
  • apify.lead_scraper_apollo_zoominfo_lusha — People at ONE company domain from a prebuilt Apollo/ZoomInfo/Lusha lead database (build 1.4.68): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $1.01 per unit Inputs: domains, titles, seniorities, require_email, role_match_mode, limit Try
  • apify.leads_finder — People at ONE company domain, verified emails only, from the microworlds leads finder (build 0.0.227): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $2.01 per unit Inputs: domains, job_titles, include_mobile, limit Try
  • apify.leads_finder_linkedin_apollo_leads_generator — People at ONE company domain from the braveleads LinkedIn/Apollo leads generator (build 0.0.95): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $1.05 per unit Inputs: domains, limit Try
  • apify.leads_finder_with_emails_apollo_lusha_zoominfo — People with emails at ONE company domain from a prebuilt Apollo/ZoomInfo/Lusha lead database (build 0.0.20): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $1.01 per unit Inputs: domains, job_titles, seniorities, limit Try
  • apify.linkedin_company — Company details for ONE LinkedIn company page (harvestapi) (build 0.0.44): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $0.05 per unit Inputs: companies Try
  • apify.linkedin_company_employees — Profiles of people currently at ONE LinkedIn company (harvestapi, Full profile mode, no emails) (build 0.0.163): one run for the item, billed at the run's measured usage on datagate's Apify Organization account $2.05 per unit Inputs: companies, limit Try
  • apify.linkedin_post_comments — Read the comments of ONE LinkedIn post (harvestapi post comments, build 0.0.36): up to 200 comments, each with its commenter, reaction counts and the replies the actor nests under it, billed at the run's measured usage on datagate's Apify Organization account $0.40 per unit Inputs: post_urls, max_comments Try
  • apify.linkedin_profile_comments — Read the comments ONE LinkedIn profile has written (harvestapi profile comments, build 0.0.18): up to 100 comments, newest first as the actor returns them, billed at the run's measured usage on datagate's Apify Organization account $0.20 per unit Inputs: profile_urls, max_comments Try
  • apify.linkedin_profile_details — Read known LinkedIn profiles by public identifier (harvestapi profile scraper, build 0.0.138): one run for up to 20 profiles, name, headline, location, connections, member id, open-to-work and the current position (title, company, start, end text; "Present" means no end date), with the work email in profile_with_email mode, billed at the run's measured usage on datagate's Apify Organization account $0.20 per unit Inputs: public_identifiers, mode Try
  • apify.linkedin_profile_posts — Read the newest posts of ONE LinkedIn profile with their like and comment counts (harvestapi profile posts, build 0.0.85): up to 100 posts, billed at the run's measured usage on datagate's Apify Organization account $0.21 per unit Inputs: author_urls, max_posts Try
  • apify.x_post_search — Search X posts by query or by author (xquik X Tweet Scraper, build 1.12.394): one run for up to 10 X search queries and 10 handles (sort_by top or latest orders the queries only; a handle's timeline comes newest first), with reply, repost, quote, like, bookmark and view counts, billed at the run's measured usage on datagate's Apify Organization account $0.03 per unit Inputs: search_queries, author_handles, posted_since, max_posts, sort_by Try
  • apify.harvestapi_linkedin_post_comments.reread — Read the rows of a finished harvestapi_linkedin_post_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.harvestapi_linkedin_post_search.reread — Read the rows of a finished harvestapi_linkedin_post_search run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.linkedin_post_comments.reread — Read the rows of a finished linkedin_post_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.linkedin_profile_comments.reread — Read the rows of a finished linkedin_profile_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.linkedin_profile_details.reread — Read the rows of a finished linkedin_profile_details run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.linkedin_profile_posts.reread — Read the rows of a finished linkedin_profile_posts run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • apify.x_post_search.reread — Read the rows of a finished x_post_search run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge $0.00 per unit Inputs: run_id Try
  • brightdata.linkedin_profiles — Collect LinkedIn profiles by URL as a Bright Data snapshot, billed at the records it delivers $1.00 per unit Inputs: urls Try
  • brightdata.linkedin_companies — Collect LinkedIn company pages by URL as a Bright Data snapshot, billed at the records it delivers $1.00 per unit Inputs: urls Try
  • brightdata.linkedin_jobs — Collect LinkedIn job postings by URL as a Bright Data snapshot, billed at the records it delivers $1.00 per unit Inputs: urls Try
  • brightdata.linkedin_post_search — Search LinkedIn posts by phrase (Google via Bright Data SERP, then its posts dataset): up to 10 phrases, newest first, billed at the searches run plus the records the snapshot delivers on datagate's Bright Data account. The second supplier behind apify.harvestapi_linkedin_post_search: same input, same row, plus a `source` $0.20 per unit Inputs: search_queries, author_urls, posted_since, max_posts, sort_by Try
  • brightdata.datasets.list — The datasets the Bright Data account can run, with their ids $0.00 per unit Inputs: none Try
  • brightdata.key.validate — Whether a Bright Data API key is valid, free of charge (GET /datasets/list) $0.00 per unit Inputs: none Try
  • company_website.homepage.fetch — A company's homepage read directly from its own site (https://{domain}/) and returned as text, with its title and description. For the sites Jina Reader cannot read. No JavaScript is run. Free. $0.00 per unit Inputs: domain Try
  • company_website.connection.try — Prove the direct fetch works: read IANA's example page (https://example.com/) the way homepage.fetch reads a homepage. Free, no input. $0.00 per unit Inputs: none Try
  • contractsfinder.notices — UK public-sector tenders and contract awards from Contracts Finder, found by keyword: title, description, buyer, type, status, dates and value. Dated evidence of a pilot or a contract. $0.00 per unit Inputs: keyword, limit Try
  • contractsfinder.connection.try — Prove the source answers: one keyword search of Contracts Finder, read as notices are. Free, no input. $0.00 per unit Inputs: none Try
  • customapi.key.validate — Whether the API root and bearer key are good: GET the base URL with the key, free of charge $0.00 per unit Inputs: none Try
  • customapi.api.get — GET one JSON document from a path under the customer's own API, with their bearer key $0.00 per unit Inputs: path, query Try
  • feeds.reddit.posts — The newest posts of a subreddit, read from its public Atom feed: title, body text, link, author and time. reddit allows one anonymous read a minute per address, so a second read inside it holds rate_limited. $0.00 per unit Inputs: subreddit, limit Try
  • feeds.discourse.topics — The newest topics of one category of a Discourse forum, read from its public listing: title, link and time, and an excerpt when the forum sends one. Pinned topics are left out. $0.00 per unit Inputs: forum, category, limit Try
  • feeds.connection.try — Prove feeds can be read: the newest topics of the Discourse forum meta.discourse.org, read as discourse.topics reads a forum. Free, no input. $0.00 per unit Inputs: none Try
  • harvestapi.people.find — People at one LinkedIn company, by title and location (HarvestAPI lead search, direct). Needs `company_urn` (a public company id, URL or urn:li:organization); name and domain are not searchable. One page per call, `limit` trims it; `seniority` is ignored. $0.01 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • harvestapi.key.validate — Whether a HarvestAPI key is valid, free of charge (GET /users/my-api-user) $0.00 per unit Inputs: none Try
  • innovate_uk.funded_projects — The Innovate UK funded projects of one company, found by its Companies House number or else its exact name in UKRI's monthly funded-projects file (2016-17 to now): project, competition, award and spend, newest start first. The first call after a restart builds the index and takes seconds. The file's licence is unverified. $0.00 per unit Inputs: company_number, company_name, limit Try
  • innovate_uk.connection.try — Prove the source answers: read UKRI's publication page and find the funded-projects file link on it, without downloading the 24 MB file. Free, no input. $0.00 per unit Inputs: none Try
  • jina.page.read — A public web page read through Jina Reader and returned as clean text, with its title and description. Keyless, held to 20 requests a minute. $0.00 per unit Inputs: url Try
  • jina.connection.try — Prove the reader answers: one read of example.com, judged as page.read judges it. Free, no input. $0.00 per unit Inputs: none Try
  • jobboards.company.job_posts — A company's open job posts, each with its full text, read from the job board (Greenhouse, Lever or Ashby) its own website links to. Never guesses a board from the name: no link on the site, no posts. $0.00 per unit Inputs: company_domain, limit Try
  • jobboards.connection.try — Prove job boards can be read: list the open posts of Greenhouse's own board, with no text. Free, no input. $0.00 per unit Inputs: none Try
  • nhscep.posts — The newest posts of the NHS Clinical Entrepreneur Programme's website (nhscep.com): title, excerpt, link and time. News and cohort announcements, newest first. $0.00 per unit Inputs: limit Try
  • nhscep.connection.try — Prove the source answers: read the site's newest post as posts are. Free, no input. $0.00 per unit Inputs: none Try
  • signalsapi.company.resolve — A company's SignalsAPI id from its website or its name (Reqbeat `GET /v1/companies/resolve`). Send exactly one of `company_domain` (the companies registered at it) or `company_name` (up to five candidates, each with a `match_confidence`). Free. $0.00 per unit Inputs: company_domain, company_name Try
  • signalsapi.key.validate — Whether a SignalsAPI key is valid, free of charge (GET /v1/whoami) $0.00 per unit Inputs: none Try
  • signalsapi.reqs.qualified — The live reqs matching a full ICP (Reqbeat `POST /v1/reqs/qualified`): `criteria` groups `company`, `req` and `event`, AND across fields and OR within one. Takes the vendor's body as is and answers its page (`reqs`, `next_cursor`, and `companies` when `include_pulse`). Billed per row returned. $0.20 per unit Inputs: criteria, cursor, exclude_agencies, include_pulse, limit, live_only, salary_max_usd, salary_min_usd, since Try
  • signalsapi.company.open_reqs — One company's own open reqs, deduped across boards (Reqbeat `GET /v1/companies/{id}/open-reqs`). Takes the `signalsapi_id` `company.resolve` gives; `function` and `country` narrow it. Billed per call. $0.0020 per unit Inputs: signalsapi_id, function, country, limit Try
  • signalsapi.company.hiring_brief — One company's whole pre-action hiring brief in a call: the hiring pulse (velocity, direction, momentum) and its history atoms (Reqbeat `GET /v1/companies/{id}/pre-action-brief`). Takes the `signalsapi_id` `company.resolve` gives; `max_age` (seconds) is the oldest data accepted. A company not crawled yet is a `crawling` miss: ask again later. Billed per call. $0.0020 per unit Inputs: signalsapi_id, max_age Try
  • signalsapi.jobs.role — One stored posting, to learn whether it is still live (Reqbeat `GET /v1/jobs/role`). Takes the `company_id` and `req_key` a job search row carries. A live posting answers its role row; one that is closed, unknown or not fresh enough is a `not_found` miss, which is the answer "closed", not a failure. Billed per found role, never for the miss. $0.0020 per unit Inputs: company_id, req_key Try
  • signalsapi.company.events — UK company events from the register, oldest first: a sponsor licence added, an officer appointed or resigned (Reqbeat `GET /v1/company-events`). Cursor-paged: send `since` (0 to start) and read the next one from `next_cursor`; `company_id` and `event_type` narrow it. An event's `date` is the register's own and may precede its `observed_at`; `role` is the officer role, or the sponsor route for `sponsor_added`. An empty page is a `not_found` miss: keep the cursor you sent. Not metered. $0.00 per unit Inputs: since, company_id, event_type, limit Try
  • ukri.projects — UK research projects funded by UKRI (the research councils and Innovate UK), found by words in the title or abstract: title, abstract, funder, grant category and status. The source lags the funding by about three months. $0.00 per unit Inputs: query, limit Try
  • ukri.connection.try — Prove the source answers: one search of UKRI's Gateway to Research, read as projects are. Free, no input. $0.00 per unit Inputs: none Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/datagate-scrape

apify.actor_run has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/datagate-scrape/mcp (tools)

Claude Code:

claude mcp add --transport http datagate-scrape https://brickbank.cc/b/datagate-scrape/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "datagate-scrape": {
      "type": "http",
      "url": "https://brickbank.cc/b/datagate-scrape/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

apify.actor_run

Run an Apify Actor and return its dataset rows, billed at the run's measured usage

apify.store.search

Search the public Apify store for Actors by keyword: ids, run statistics and pricing, no key needed

apify.actor.describe

What a public Actor declares about itself that its publisher cannot write: input fields, dataset fields, run statistics, pricing events and the latest build number, no key needed

apify.company_team_profiles

Headlines of up to `limit` (1..200) people currently at ONE LinkedIn company, via the harvestapi profile search Actor (build 0.0.274); each row echoes the `company` you sent. A company with no profiles is a not_found miss. Billed at the run's measured usage.

apify.key.validate

Whether an Apify API token is valid, free of charge (GET /users/me)

apify.fantasticjobs_career_site_jobs

Jobs posted on employer career sites and ATS boards (fantastic.jobs career-site job listing API, build 0.0.69) whose title matches, posted in the last 1h, 24h or 7d: one run for up to `limit` (10..100) jobs, billed at the run's measured usage on datagate's Apify Organization account

apify.harvestapi_linkedin_post_comments

Read the comments of up to 5 LinkedIn posts (harvestapi post comments, build 0.0.36): up to 200 comments per post, each with its commenter's name, profile URL and headline, the comment text and its own time, billed at the run's measured usage on datagate's Apify Organization account

apify.harvestapi_linkedin_post_search

Search LinkedIn posts by phrase or by author (harvestapi post search, build 0.0.114): one run for up to 10 phrases or author profile URLs, newest first, billed at the run's measured usage on datagate's Apify Organization account

apify.harvestapi_linkedin_profile_scraper

Find the work email of known LinkedIn profiles (harvestapi profile scraper, build 0.0.138): one run for up to 20 profile URLs, billed at the run's measured usage on datagate's Apify Organization account

apify.harvestapi_linkedin_profile_search

Find named people at LinkedIn companies by seniority or title (harvestapi profile search, build 0.0.87): one run for up to 25 company slugs, billed at the run's measured usage on datagate's Apify Organization account

apify.lead_scraper_apollo_zoominfo_lusha

People at ONE company domain from a prebuilt Apollo/ZoomInfo/Lusha lead database (build 1.4.68): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.leads_finder

People at ONE company domain, verified emails only, from the microworlds leads finder (build 0.0.227): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.leads_finder_linkedin_apollo_leads_generator

People at ONE company domain from the braveleads LinkedIn/Apollo leads generator (build 0.0.95): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.leads_finder_with_emails_apollo_lusha_zoominfo

People with emails at ONE company domain from a prebuilt Apollo/ZoomInfo/Lusha lead database (build 0.0.20): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_company

Company details for ONE LinkedIn company page (harvestapi) (build 0.0.44): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_company_employees

Profiles of people currently at ONE LinkedIn company (harvestapi, Full profile mode, no emails) (build 0.0.163): one run for the item, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_post_comments

Read the comments of ONE LinkedIn post (harvestapi post comments, build 0.0.36): up to 200 comments, each with its commenter, reaction counts and the replies the actor nests under it, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_profile_comments

Read the comments ONE LinkedIn profile has written (harvestapi profile comments, build 0.0.18): up to 100 comments, newest first as the actor returns them, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_profile_details

Read known LinkedIn profiles by public identifier (harvestapi profile scraper, build 0.0.138): one run for up to 20 profiles, name, headline, location, connections, member id, open-to-work and the current position (title, company, start, end text; "Present" means no end date), with the work email in profile_with_email mode, billed at the run's measured usage on datagate's Apify Organization account

apify.linkedin_profile_posts

Read the newest posts of ONE LinkedIn profile with their like and comment counts (harvestapi profile posts, build 0.0.85): up to 100 posts, billed at the run's measured usage on datagate's Apify Organization account

apify.x_post_search

Search X posts by query or by author (xquik X Tweet Scraper, build 1.12.394): one run for up to 10 X search queries and 10 handles (sort_by top or latest orders the queries only; a handle's timeline comes newest first), with reply, repost, quote, like, bookmark and view counts, billed at the run's measured usage on datagate's Apify Organization account

apify.harvestapi_linkedin_post_comments.reread

Read the rows of a finished harvestapi_linkedin_post_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.harvestapi_linkedin_post_search.reread

Read the rows of a finished harvestapi_linkedin_post_search run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.linkedin_post_comments.reread

Read the rows of a finished linkedin_post_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.linkedin_profile_comments.reread

Read the rows of a finished linkedin_profile_comments run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.linkedin_profile_details.reread

Read the rows of a finished linkedin_profile_details run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.linkedin_profile_posts.reread

Read the rows of a finished linkedin_profile_posts run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

apify.x_post_search.reread

Read the rows of a finished x_post_search run again from its dataset (the run id is the `provider_ref` of its settled outcome); no new run, free of charge

brightdata.linkedin_profiles

Collect LinkedIn profiles by URL as a Bright Data snapshot, billed at the records it delivers

brightdata.linkedin_companies

Collect LinkedIn company pages by URL as a Bright Data snapshot, billed at the records it delivers

brightdata.linkedin_jobs

Collect LinkedIn job postings by URL as a Bright Data snapshot, billed at the records it delivers

brightdata.linkedin_post_search

Search LinkedIn posts by phrase (Google via Bright Data SERP, then its posts dataset): up to 10 phrases, newest first, billed at the searches run plus the records the snapshot delivers on datagate's Bright Data account. The second supplier behind apify.harvestapi_linkedin_post_search: same input, same row, plus a `source`

brightdata.datasets.list

The datasets the Bright Data account can run, with their ids

brightdata.key.validate

Whether a Bright Data API key is valid, free of charge (GET /datasets/list)

company_website.homepage.fetch

A company's homepage read directly from its own site (https://{domain}/) and returned as text, with its title and description. For the sites Jina Reader cannot read. No JavaScript is run. Free.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/company_website.homepage.fetch -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domain": "example.com"}}]}'

company_website.connection.try

Prove the direct fetch works: read IANA's example page (https://example.com/) the way homepage.fetch reads a homepage. Free, no input.

contractsfinder.notices

UK public-sector tenders and contract awards from Contracts Finder, found by keyword: title, description, buyer, type, status, dates and value. Dated evidence of a pilot or a contract.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/contractsfinder.notices -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"keyword": "digital health pilot", "limit": 10}}]}'

contractsfinder.connection.try

Prove the source answers: one keyword search of Contracts Finder, read as notices are. Free, no input.

customapi.key.validate

Whether the API root and bearer key are good: GET the base URL with the key, free of charge

customapi.api.get

GET one JSON document from a path under the customer's own API, with their bearer key

feeds.reddit.posts

The newest posts of a subreddit, read from its public Atom feed: title, body text, link, author and time. reddit allows one anonymous read a minute per address, so a second read inside it holds rate_limited.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/feeds.reddit.posts -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"subreddit": "nocode", "limit": 25}}]}'

feeds.discourse.topics

The newest topics of one category of a Discourse forum, read from its public listing: title, link and time, and an excerpt when the forum sends one. Pinned topics are left out.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/feeds.discourse.topics -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"forum": "meta.discourse.org", "category": "support", "limit": 30}}]}'

feeds.connection.try

Prove feeds can be read: the newest topics of the Discourse forum meta.discourse.org, read as discourse.topics reads a forum. Free, no input.

harvestapi.people.find

People at one LinkedIn company, by title and location (HarvestAPI lead search, direct). Needs `company_urn` (a public company id, URL or urn:li:organization); name and domain are not searchable. One page per call, `limit` trims it; `seniority` is ignored.

harvestapi.key.validate

Whether a HarvestAPI key is valid, free of charge (GET /users/my-api-user)

innovate_uk.funded_projects

The Innovate UK funded projects of one company, found by its Companies House number or else its exact name in UKRI's monthly funded-projects file (2016-17 to now): project, competition, award and spend, newest start first. The first call after a restart builds the index and takes seconds. The file's licence is unverified.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/innovate_uk.funded_projects -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_number": "05002194"}}]}'

innovate_uk.connection.try

Prove the source answers: read UKRI's publication page and find the funded-projects file link on it, without downloading the 24 MB file. Free, no input.

jina.page.read

A public web page read through Jina Reader and returned as clean text, with its title and description. Keyless, held to 20 requests a minute.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/jina.page.read -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"url": "https://example.com"}}]}'

jina.connection.try

Prove the reader answers: one read of example.com, judged as page.read judges it. Free, no input.

jobboards.company.job_posts

A company's open job posts, each with its full text, read from the job board (Greenhouse, Lever or Ashby) its own website links to. Never guesses a board from the name: no link on the site, no posts.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/jobboards.company.job_posts -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "jackandjill.ai", "limit": 10}}]}'

jobboards.connection.try

Prove job boards can be read: list the open posts of Greenhouse's own board, with no text. Free, no input.

nhscep.posts

The newest posts of the NHS Clinical Entrepreneur Programme's website (nhscep.com): title, excerpt, link and time. News and cohort announcements, newest first.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/nhscep.posts -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"limit": 10}}]}'

nhscep.connection.try

Prove the source answers: read the site's newest post as posts are. Free, no input.

signalsapi.company.resolve

A company's SignalsAPI id from its website or its name (Reqbeat `GET /v1/companies/resolve`). Send exactly one of `company_domain` (the companies registered at it) or `company_name` (up to five candidates, each with a `match_confidence`). Free.

signalsapi.key.validate

Whether a SignalsAPI key is valid, free of charge (GET /v1/whoami)

signalsapi.reqs.qualified

The live reqs matching a full ICP (Reqbeat `POST /v1/reqs/qualified`): `criteria` groups `company`, `req` and `event`, AND across fields and OR within one. Takes the vendor's body as is and answers its page (`reqs`, `next_cursor`, and `companies` when `include_pulse`). Billed per row returned.

signalsapi.company.open_reqs

One company's own open reqs, deduped across boards (Reqbeat `GET /v1/companies/{id}/open-reqs`). Takes the `signalsapi_id` `company.resolve` gives; `function` and `country` narrow it. Billed per call.

signalsapi.company.hiring_brief

One company's whole pre-action hiring brief in a call: the hiring pulse (velocity, direction, momentum) and its history atoms (Reqbeat `GET /v1/companies/{id}/pre-action-brief`). Takes the `signalsapi_id` `company.resolve` gives; `max_age` (seconds) is the oldest data accepted. A company not crawled yet is a `crawling` miss: ask again later. Billed per call.

signalsapi.jobs.role

One stored posting, to learn whether it is still live (Reqbeat `GET /v1/jobs/role`). Takes the `company_id` and `req_key` a job search row carries. A live posting answers its role row; one that is closed, unknown or not fresh enough is a `not_found` miss, which is the answer "closed", not a failure. Billed per found role, never for the miss.

signalsapi.company.events

UK company events from the register, oldest first: a sponsor licence added, an officer appointed or resigned (Reqbeat `GET /v1/company-events`). Cursor-paged: send `since` (0 to start) and read the next one from `next_cursor`; `company_id` and `event_type` narrow it. An event's `date` is the register's own and may precede its `observed_at`; `role` is the officer role, or the sponsor route for `sponsor_added`. An empty page is a `not_found` miss: keep the cursor you sent. Not metered.

ukri.projects

UK research projects funded by UKRI (the research councils and Innovate UK), found by words in the title or abstract: title, abstract, funder, grant category and status. The source lags the funding by about three months.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/datagate-scrape/v1/run/ukri.projects -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"query": "quantum sensing", "limit": 10}}]}'

ukri.connection.try

Prove the source answers: one search of UKRI's Gateway to Research, read as projects are. Free, no input.

datagate-crm 0.1.0

Outside sites it contacts: api.clay.com, api.hubapi.com, api.instantly.ai

View manifest

  • bullhorn.key.validate — Whether the access token and REST URL are good: the REST login alone, free and writing nothing $0.00 per unit Inputs: none Try
  • bullhorn.lead.upsert — Create a Bullhorn lead, or update the one with the same email. `fields` maps Bullhorn Lead field names (a dotted address.city is nested) to values; each is cleaned to ASCII and cut to Bullhorn's field size, and an empty value is sent as given. The REST login is made first, from the access token and REST URL. $0.00 per unit Inputs: email, fields Try
  • bullhorn.token.refresh — Exchange a customer's Bullhorn refresh token for a new access token at the token endpoint beside their authorization URL (spine AD-15): the caller stores the result. A refused refresh token (invalid_grant) is a bad_input miss: reconnect. $0.00 per unit Inputs: refresh_token Try
  • clay.webhook.deliver — Add one row to a Clay table through its webhook URL (https://api.clay.com/...). The payload is the row. Clay appends; a repeat is dropped only if the table dedupes on payload.email. $0.00 per unit Inputs: url, payload, headers Try
  • clay.connection.try — Prove the Clay webhook takes a row: POST one probe row ([email protected]) to the table's webhook URL (https://api.clay.com/...). Clay has no read call, so read is reported unsupported. Clay appends a row on every try unless the table dedupes on email. $0.00 per unit Inputs: url, headers Try
  • hubspot.contact.upsert — Create a HubSpot contact by email, or return the existing one; link its company and add it to a list. first_name/last_name are sent as given; full_name is split only when both are missing. A refused company or list (unknown id, a dynamic list) is a miss whose provider_ref is the contact id. $0.00 per unit Inputs: email, full_name, first_name, last_name, company_name, phone, job_title, company_id, list_id Try
  • hubspot.company.upsert — Create a HubSpot company by domain, or return the existing one. HubSpot's search index lags new records by seconds and a domain is not unique there, so the same domain sent twice within that window can create two companies. $0.00 per unit Inputs: name, domain Try
  • hubspot.lists.list — The account's HubSpot lists (first 100) $0.00 per unit Inputs: none Try
  • hubspot.connection.try — Prove the HubSpot connection reads and writes: search contacts for datagate's one probe contact ([email protected]), then create it, or rewrite its last name when it is already there. Idempotent: the portal never holds more than the one probe contact. $0.00 per unit Inputs: none Try
  • hubspot.token.refresh — Exchange a customer's HubSpot refresh token for a new access token through datagate's OAuth app (spine AD-15): the caller stores the result. A refused refresh token is a bad_input miss: reconnect. $0.00 per unit Inputs: refresh_token Try
  • instantly.campaign.enrol — Enrol a lead into an Instantly campaign (and optionally a list) by email $0.00 per unit Inputs: campaign_id, contact_id, email, list_id Try
  • instantly.lead.add — Add a lead to an Instantly campaign or list with its names, company fields and custom variables $0.00 per unit Inputs: email, campaign_id, list_id, first_name, last_name, website, company_name, custom_variables Try
  • instantly.connection.try — Prove the Instantly connection reads and writes: list one campaign, then add datagate's probe lead ([email protected]) to the workspace with no campaign or list. Idempotent: a repeat adds nothing. $0.00 per unit Inputs: none Try
  • instantly.lead.list — The leads of one Instantly campaign with their sending state (replied, bounced, other) and last update $0.00 per unit Inputs: campaign_id, since Try
  • instantly.campaign.sending_status — One Instantly campaign's state and its daily sending limit (null when Instantly reports none) $0.00 per unit Inputs: campaign_id Try
  • lemlist.key.validate — Whether a lemlist API key is valid, free of charge $0.00 per unit Inputs: none Try
  • lemlist.campaigns.list — List the account's lemlist campaigns $0.00 per unit Inputs: none Try
  • lemlist.campaigns.inventory — List the account's lemlist campaigns with status and the vendor's boolean flags $0.00 per unit Inputs: none Try
  • lemlist.campaign.preflight — Whether a lemlist campaign can dispatch a lead right now, without adding one $0.00 per unit Inputs: campaign_id Try
  • lemlist.campaign.enrol — Enrol a lead into a lemlist campaign by email $0.00 per unit Inputs: campaign_id, contact_id, email, list_id Try
  • lemlist.lead.add — Add a lead (email and/or LinkedIn URL, names, variables) to a lemlist campaign that can dispatch it $0.00 per unit Inputs: campaign_id, email, linkedin_url, first_name, last_name, variables Try
  • lemlist.activities.pull — The lemlist activity feed (sends, opens, replies, ...) since an instant, as raw rows $0.00 per unit Inputs: since Try
  • lemlist.seats.count — How many distinct lemlist users (seats) the account has $0.00 per unit Inputs: none Try
  • lemlist.employment.confirm — Whether lemlist's people database places a LinkedIn profile at the given company $0.00 per unit Inputs: full_name, first_name, last_name, company_domain, company_name, company_urn, linkedin_url Try
  • lemlist.people.stated_employment — The current employer lemlist's people database states for a LinkedIn profile $0.00 per unit Inputs: linkedin_url Try
  • manatal.candidate.upsert — Create a Manatal candidate by email, or return the existing one (searched by email first; an existing candidate is not changed). Sent as a sourced candidate with its position, company and description. $0.00 per unit Inputs: email, full_name, current_position, current_company, description Try
  • manatal.connection.try — Prove the Manatal connection reads and writes: list one candidate, then create datagate's probe candidate ([email protected]) unless it is already there. Idempotent: the account never holds more than the one probe candidate. $0.00 per unit Inputs: none Try
  • recruitcrm.contact.upsert — Create a RecruitCRM contact by email, or return the existing one (it is left as it is). A new contact is linked to company_id (a company slug), else to the company named company_name, which is created when RecruitCRM has none. first_name/last_name are sent as given; full_name is split only when both are missing. list_id is not used: RecruitCRM contacts have no list. $0.00 per unit Inputs: email, full_name, first_name, last_name, company_name, phone, job_title, company_id, list_id Try
  • recruitcrm.company.upsert — Create a RecruitCRM company by name, or return the existing one. The name is searched as given and defaults to the domain, which is stored as the company's website on create. RecruitCRM's search is not unique, so the same name sent twice within its indexing delay can create two companies. $0.00 per unit Inputs: name, domain Try
  • recruitcrm.connection.try — Prove the RecruitCRM connection reads and writes: search contacts for datagate's one probe contact ([email protected]) and create it when it is absent. Idempotent: the account never holds more than the one probe contact; a repeat only reads. $0.00 per unit Inputs: none Try
  • sourcewhale.campaigns.list — The team's live SourceWhale campaigns (paused and draft ones are not listed) $0.00 per unit Inputs: none Try
  • sourcewhale.key.validate — Whether a SourceWhale team API key works, free of charge (GET campaigns/list) $0.00 per unit Inputs: none Try
  • sourcewhale.candidate.upsert — Add a person to a SourceWhale campaign, or report that SourceWhale already holds them (found by email, then by LinkedIn URL; the existing candidate is left as it is). Needs an email or a linkedin_url. owner_email, when given, is the SourceWhale user the candidate is added for. The campaign's start is SourceWhale's own default: sendImmediately is never sent. $0.00 per unit Inputs: campaign_id, owner_email, email, linkedin_url, phone, first_name, last_name, job_title, headline, company_name, company_domain, company_linkedin_url, company_location, custom_variables, comments, source Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/datagate-crm

bullhorn.key.validate has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/datagate-crm/mcp (tools)

Claude Code:

claude mcp add --transport http datagate-crm https://brickbank.cc/b/datagate-crm/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "datagate-crm": {
      "type": "http",
      "url": "https://brickbank.cc/b/datagate-crm/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

bullhorn.key.validate

Whether the access token and REST URL are good: the REST login alone, free and writing nothing

bullhorn.lead.upsert

Create a Bullhorn lead, or update the one with the same email. `fields` maps Bullhorn Lead field names (a dotted address.city is nested) to values; each is cleaned to ASCII and cut to Bullhorn's field size, and an empty value is sent as given. The REST login is made first, from the access token and REST URL.

bullhorn.token.refresh

Exchange a customer's Bullhorn refresh token for a new access token at the token endpoint beside their authorization URL (spine AD-15): the caller stores the result. A refused refresh token (invalid_grant) is a bad_input miss: reconnect.

clay.webhook.deliver

Add one row to a Clay table through its webhook URL (https://api.clay.com/...). The payload is the row. Clay appends; a repeat is dropped only if the table dedupes on payload.email.

clay.connection.try

Prove the Clay webhook takes a row: POST one probe row ([email protected]) to the table's webhook URL (https://api.clay.com/...). Clay has no read call, so read is reported unsupported. Clay appends a row on every try unless the table dedupes on email.

hubspot.contact.upsert

Create a HubSpot contact by email, or return the existing one; link its company and add it to a list. first_name/last_name are sent as given; full_name is split only when both are missing. A refused company or list (unknown id, a dynamic list) is a miss whose provider_ref is the contact id.

hubspot.company.upsert

Create a HubSpot company by domain, or return the existing one. HubSpot's search index lags new records by seconds and a domain is not unique there, so the same domain sent twice within that window can create two companies.

hubspot.lists.list

The account's HubSpot lists (first 100)

hubspot.connection.try

Prove the HubSpot connection reads and writes: search contacts for datagate's one probe contact ([email protected]), then create it, or rewrite its last name when it is already there. Idempotent: the portal never holds more than the one probe contact.

hubspot.token.refresh

Exchange a customer's HubSpot refresh token for a new access token through datagate's OAuth app (spine AD-15): the caller stores the result. A refused refresh token is a bad_input miss: reconnect.

instantly.campaign.enrol

Enrol a lead into an Instantly campaign (and optionally a list) by email

instantly.lead.add

Add a lead to an Instantly campaign or list with its names, company fields and custom variables

instantly.connection.try

Prove the Instantly connection reads and writes: list one campaign, then add datagate's probe lead ([email protected]) to the workspace with no campaign or list. Idempotent: a repeat adds nothing.

instantly.lead.list

The leads of one Instantly campaign with their sending state (replied, bounced, other) and last update

instantly.campaign.sending_status

One Instantly campaign's state and its daily sending limit (null when Instantly reports none)

lemlist.key.validate

Whether a lemlist API key is valid, free of charge

lemlist.campaigns.list

List the account's lemlist campaigns

lemlist.campaigns.inventory

List the account's lemlist campaigns with status and the vendor's boolean flags

lemlist.campaign.preflight

Whether a lemlist campaign can dispatch a lead right now, without adding one

lemlist.campaign.enrol

Enrol a lead into a lemlist campaign by email

lemlist.lead.add

Add a lead (email and/or LinkedIn URL, names, variables) to a lemlist campaign that can dispatch it

lemlist.activities.pull

The lemlist activity feed (sends, opens, replies, ...) since an instant, as raw rows

lemlist.seats.count

How many distinct lemlist users (seats) the account has

lemlist.employment.confirm

Whether lemlist's people database places a LinkedIn profile at the given company

lemlist.people.stated_employment

The current employer lemlist's people database states for a LinkedIn profile

manatal.candidate.upsert

Create a Manatal candidate by email, or return the existing one (searched by email first; an existing candidate is not changed). Sent as a sourced candidate with its position, company and description.

manatal.connection.try

Prove the Manatal connection reads and writes: list one candidate, then create datagate's probe candidate ([email protected]) unless it is already there. Idempotent: the account never holds more than the one probe candidate.

recruitcrm.contact.upsert

Create a RecruitCRM contact by email, or return the existing one (it is left as it is). A new contact is linked to company_id (a company slug), else to the company named company_name, which is created when RecruitCRM has none. first_name/last_name are sent as given; full_name is split only when both are missing. list_id is not used: RecruitCRM contacts have no list.

recruitcrm.company.upsert

Create a RecruitCRM company by name, or return the existing one. The name is searched as given and defaults to the domain, which is stored as the company's website on create. RecruitCRM's search is not unique, so the same name sent twice within its indexing delay can create two companies.

recruitcrm.connection.try

Prove the RecruitCRM connection reads and writes: search contacts for datagate's one probe contact ([email protected]) and create it when it is absent. Idempotent: the account never holds more than the one probe contact; a repeat only reads.

sourcewhale.campaigns.list

The team's live SourceWhale campaigns (paused and draft ones are not listed)

sourcewhale.key.validate

Whether a SourceWhale team API key works, free of charge (GET campaigns/list)

sourcewhale.candidate.upsert

Add a person to a SourceWhale campaign, or report that SourceWhale already holds them (found by email, then by LinkedIn URL; the existing candidate is left as it is). Needs an email or a linkedin_url. owner_email, when given, is the SourceWhale user the candidate is added for. The campaign's start is SourceWhale's own default: sendImmediately is never sent.

datagate-notify 0.1.0

Outside sites it contacts: api.mailgun.net, api.telegram.org, hooks.slack.com

View manifest

  • mailgun.notify.send — Deliver a message as a plain-text email via the Mailgun send API, from notify@<domain> $0.00 per unit Inputs: channel, to, subject, body Try
  • mailgun.email.send — Send an email via Mailgun from a caller-chosen From (display name allowed) on the domain $0.00 per unit Inputs: from, domain, to, subject, text, html, reply_to, message_id, in_reply_to, references, unsubscribe_url, tracking, attachments Try
  • mailgun.bounce.get — Read one address's entry in the sending domain's Mailgun bounce list; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.bounce.delete — Remove one address from the sending domain's Mailgun bounce list. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.unsubscribe.add — Add one address to the sending domain's Mailgun unsubscribe table for every tag, so no mail is sent to it from that domain. An address already listed is an ok too (the same end state). $0.00 per unit Inputs: address, domain Try
  • mailgun.unsubscribe.get — Read one address's entry in the sending domain's Mailgun unsubscribe table; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.unsubscribe.delete — Remove one address from the sending domain's Mailgun unsubscribe table. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.complaint.get — Read one address's entry in the sending domain's Mailgun complaint table; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.complaint.delete — Remove one address from the sending domain's Mailgun complaint table. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart. $0.00 per unit Inputs: address, domain Try
  • mailgun.domain.create — Create a sending domain on the Mailgun account and answer its state and the DNS records to publish. The domain must be the credential's own or on the calling key's allow-list; one that already exists is a bad_input miss. $0.00 per unit Inputs: domain Try
  • mailgun.domain.get — Read a sending domain's state and DNS records from the Mailgun account; a domain the account does not hold is a not_found miss. The domain must be the credential's own or on the calling key's allow-list. $0.00 per unit Inputs: domain Try
  • mailgun.domain.verify — Ask Mailgun to check a sending domain's DNS records now and answer its state and records; a domain the account does not hold is a not_found miss. The domain must be the credential's own or on the calling key's allow-list. $0.00 per unit Inputs: domain Try
  • mailgun.route.put — Ensure the one Mailgun receiving route for a sending domain: every message to any address on it is forwarded to the https url (and to forward_to when given), stored, and stops there. Made once, then updated in place (found by its description); a route datagate did not make is never changed, and one that already receives the domain is a refused miss. The domain must be the credential's own or on the calling key's allow-list. $0.00 per unit Inputs: domain, url, forward_to Try
  • mailgun.route.get — Read the Mailgun receiving route that route.put made for a sending domain (its expression and actions) and whether it matches what route.put would write for the same url and forward_to; none is a not_found miss. Same input checks as route.put; the domain must be the credential's own or on the calling key's allow-list. $0.00 per unit Inputs: domain, url, forward_to Try
  • mailgun.key.validate — Whether a Mailgun API key is valid and owns the sending domain, free of charge (GET /domains/<domain>) $0.00 per unit Inputs: none Try
  • mailgun.events.get — Read one page of the sending domain's Mailgun event log (accepted, delivered, failed and the rest), newest first, filtered by time window, event type and recipient; pass next_page back as page for the next page $0.00 per unit Inputs: begin, end, event, recipient, domain, limit, page Try
  • mailgun.inbound.get — Read the mail Mailgun stored for one recipient address on the sending domain, oldest first, only mail received after `since`, with attachments. The recipient must be on the calling key's allow-list: any other address is refused, not answered empty. No mail yet is an ok with an empty list, so a caller can poll. $0.00 per unit Inputs: recipient, since, domain, limit Try
  • slack.notify.send — Deliver a message to a Slack channel via an incoming webhook. `to` starting with `#` is passed as Slack's legacy per-message channel override; `subject` is not used. $0.00 per unit Inputs: channel, to, subject, body Try
  • slack.key.validate — Whether a Slack webhook URL is live, free and posting nothing: a message with no text, which Slack refuses `no_text` for a live webhook and `no_service` for a revoked one. $0.00 per unit Inputs: none Try
  • telegram.notify.send — Deliver a message via the Telegram Bot API (`to` is the chat id or @channelusername) $0.00 per unit Inputs: channel, to, subject, body Try
  • telegram.message.send — Send a Telegram message with formatting: `parse_mode` (HTML or MarkdownV2) and `disable_web_page_preview` go to sendMessage as given $0.00 per unit Inputs: chat_id, text Try
  • telegram.key.validate — Whether a Telegram bot token is valid, free of charge (GET /getMe) $0.00 per unit Inputs: none Try
  • webhook.webhook.deliver — POST a JSON payload to a caller-supplied webhook URL, once, with the caller's own headers $0.00 per unit Inputs: url, payload, headers Try
  • webhook.connection.try — Check a destination URL without sending anything to it: an absolute http(s) URL whose host resolves, and only to public addresses. Free. It proves the address is one datagate can deliver to, not that the receiver is listening. $0.00 per unit Inputs: url Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/datagate-notify

mailgun.notify.send has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/datagate-notify/mcp (tools)

Claude Code:

claude mcp add --transport http datagate-notify https://brickbank.cc/b/datagate-notify/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "datagate-notify": {
      "type": "http",
      "url": "https://brickbank.cc/b/datagate-notify/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

mailgun.notify.send

Deliver a message as a plain-text email via the Mailgun send API, from notify@<domain>

mailgun.email.send

Send an email via Mailgun from a caller-chosen From (display name allowed) on the domain

mailgun.bounce.get

Read one address's entry in the sending domain's Mailgun bounce list; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.bounce.delete

Remove one address from the sending domain's Mailgun bounce list. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.unsubscribe.add

Add one address to the sending domain's Mailgun unsubscribe table for every tag, so no mail is sent to it from that domain. An address already listed is an ok too (the same end state).

mailgun.unsubscribe.get

Read one address's entry in the sending domain's Mailgun unsubscribe table; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.unsubscribe.delete

Remove one address from the sending domain's Mailgun unsubscribe table. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.complaint.get

Read one address's entry in the sending domain's Mailgun complaint table; an address not in it is a not_found miss. Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.complaint.delete

Remove one address from the sending domain's Mailgun complaint table. An address not in it is an ok with deleted false (the same end state); Mailgun answers 404 for an unknown domain too, and the two cannot be told apart.

mailgun.domain.create

Create a sending domain on the Mailgun account and answer its state and the DNS records to publish. The domain must be the credential's own or on the calling key's allow-list; one that already exists is a bad_input miss.

mailgun.domain.get

Read a sending domain's state and DNS records from the Mailgun account; a domain the account does not hold is a not_found miss. The domain must be the credential's own or on the calling key's allow-list.

mailgun.domain.verify

Ask Mailgun to check a sending domain's DNS records now and answer its state and records; a domain the account does not hold is a not_found miss. The domain must be the credential's own or on the calling key's allow-list.

mailgun.route.put

Ensure the one Mailgun receiving route for a sending domain: every message to any address on it is forwarded to the https url (and to forward_to when given), stored, and stops there. Made once, then updated in place (found by its description); a route datagate did not make is never changed, and one that already receives the domain is a refused miss. The domain must be the credential's own or on the calling key's allow-list.

mailgun.route.get

Read the Mailgun receiving route that route.put made for a sending domain (its expression and actions) and whether it matches what route.put would write for the same url and forward_to; none is a not_found miss. Same input checks as route.put; the domain must be the credential's own or on the calling key's allow-list.

mailgun.key.validate

Whether a Mailgun API key is valid and owns the sending domain, free of charge (GET /domains/<domain>)

mailgun.events.get

Read one page of the sending domain's Mailgun event log (accepted, delivered, failed and the rest), newest first, filtered by time window, event type and recipient; pass next_page back as page for the next page

mailgun.inbound.get

Read the mail Mailgun stored for one recipient address on the sending domain, oldest first, only mail received after `since`, with attachments. The recipient must be on the calling key's allow-list: any other address is refused, not answered empty. No mail yet is an ok with an empty list, so a caller can poll.

slack.notify.send

Deliver a message to a Slack channel via an incoming webhook. `to` starting with `#` is passed as Slack's legacy per-message channel override; `subject` is not used.

slack.key.validate

Whether a Slack webhook URL is live, free and posting nothing: a message with no text, which Slack refuses `no_text` for a live webhook and `no_service` for a revoked one.

telegram.notify.send

Deliver a message via the Telegram Bot API (`to` is the chat id or @channelusername)

telegram.message.send

Send a Telegram message with formatting: `parse_mode` (HTML or MarkdownV2) and `disable_web_page_preview` go to sendMessage as given

telegram.key.validate

Whether a Telegram bot token is valid, free of charge (GET /getMe)

webhook.webhook.deliver

POST a JSON payload to a caller-supplied webhook URL, once, with the caller's own headers

webhook.connection.try

Check a destination URL without sending anything to it: an absolute http(s) URL whose host resolves, and only to public addresses. Free. It proves the address is one datagate can deliver to, not that the receiver is listening.

datagate-search 0.1.0

Outside sites it contacts: api.anthropic.com, api.company-information.service.gov.uk, api.exa.ai

View manifest

  • anthropic.llm.field — A prompt in, the model's text out (Anthropic Messages API). `system` sets the model's role. `model` defaults to claude-haiku-5-5 and `max_tokens` to 1024 (at most 4096). Billed in tokens. up to $0.02 per unit Inputs: prompt, system Try
  • anthropic.web.search — Open-web search by Claude's web search tool (Anthropic Messages API): each result's URL, title and page age. `domains` limits the search to those sites. Billed per search plus the model's tokens. up to $0.03 per unit Inputs: query Try
  • anthropic.text.judge — A model reads one text and answers the caller's closed questions and copies out its quote fields; each quote is `verified` only when it appears word for word in the item's `text`. `pass_rule` (optional) removes an item by its answers; every answer is returned either way, with the `rubric_sha` of the rendered prompt. `model` defaults to claude-sonnet-5, `max_tokens` to 2048 (at most 4096). Billed in tokens, reported in `units`. up to $0.08 per unit Inputs: text, url, headline Try
  • anthropic.judge.rubric — The `rubric_sha` of a judge: SHA-256 of the prompt `text.judge` would send for these params, so a caller can tell whether two checks asked the same thing. Free, calls no model, needs no key. $0.00 per unit Inputs: none Try
  • anthropic.key.validate — Whether an Anthropic key is valid, free of charge (GET /v1/models) $0.00 per unit Inputs: none Try
  • exa.web.search — Open-web search that returns each result's evidence URL and publish date (Exa Search API). `start_published_date` and `domains` narrow it; `limit` caps the results (default 10). up to $0.02 per unit Inputs: query Try
  • exa.connection.try — Prove the key works: one Exa search for one result, read as web.search reads it. Not free: Exa has no free call, so this bills one minimal search (about $0.007). No input. $0.0070 per unit Inputs: none Try
  • exa.agent.run — Run an Exa agent on a research query at a fixed effort (`medium` or `high`, never auto), returning its answer with the sources it cites, billed at the cost Exa measured up to $0.50 per unit Inputs: query, system_prompt, output_schema Try
  • linkup.research.run — Run a Linkup research task on a question at a fixed depth (`S` or `M`), returning a sourced answer with the pages it cites up to $0.50 per unit Inputs: query Try
  • linkup.key.validate — Whether a Linkup API key is valid, free of charge (GET /credits/balance) $0.00 per unit Inputs: none Try
  • serpapi.jobs.search — Google Jobs postings for a query (SerpApi), UK by default (`gl=uk`). Each posting names the employer, location, source board and how long ago it was posted. `page_token` reads the next page of 10. $0.01 per unit Inputs: query Try
  • serpapi.web.search — Google's organic web results for a query (SerpApi, engine google): each result's URL, title, snippet and rank, the top `limit` (default and most 10). `gl`/`hl` name the country and language. One search; no results is a free miss. $0.01 per unit Inputs: query Try
  • serpapi.limits.read — What the key has left: per SerpApi limit (searches_per_month, searches_per_hour) its allowance, the searches left and when it resets, from SerpApi's free Account API. Spends no search. No input. $0.00 per unit Inputs: none Try
  • serpapi.connection.try — Prove the key works: one Google Jobs search, read as jobs.search reads it. Not free: SerpApi's free account call answers with the key itself, so this spends one search (a repeat within the hour is served from SerpApi's cache, free). No input. $0.01 per unit Inputs: none Try
  • tavily.web.search — Open-web search that returns each result's evidence URL, snippet and publish date (Tavily Search API). `topic` news returns dates; `start_date`/`end_date` (YYYY-MM-DD) and `domains` narrow it; `limit` caps the results (default 10); `depth` advanced costs two credits. up to $0.02 per unit Inputs: query Try
  • tavily.key.validate — Whether a Tavily API key is valid, free of charge (GET /usage) $0.00 per unit Inputs: none Try
  • tavily.limits.read — What the account has left: its monthly credits (credits_per_month: the plan's and any pay-as-you-go allowance), the credits left and when they reset, from Tavily's free GET /usage. Spends no credit. No input. $0.00 per unit Inputs: none Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/datagate-search

anthropic.llm.field has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/datagate-search/mcp (tools)

Claude Code:

claude mcp add --transport http datagate-search https://brickbank.cc/b/datagate-search/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "datagate-search": {
      "type": "http",
      "url": "https://brickbank.cc/b/datagate-search/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

anthropic.llm.field

A prompt in, the model's text out (Anthropic Messages API). `system` sets the model's role. `model` defaults to claude-haiku-5-5 and `max_tokens` to 1024 (at most 4096). Billed in tokens.

anthropic.web.search

Open-web search by Claude's web search tool (Anthropic Messages API): each result's URL, title and page age. `domains` limits the search to those sites. Billed per search plus the model's tokens.

anthropic.text.judge

A model reads one text and answers the caller's closed questions and copies out its quote fields; each quote is `verified` only when it appears word for word in the item's `text`. `pass_rule` (optional) removes an item by its answers; every answer is returned either way, with the `rubric_sha` of the rendered prompt. `model` defaults to claude-sonnet-5, `max_tokens` to 2048 (at most 4096). Billed in tokens, reported in `units`.

anthropic.judge.rubric

The `rubric_sha` of a judge: SHA-256 of the prompt `text.judge` would send for these params, so a caller can tell whether two checks asked the same thing. Free, calls no model, needs no key.

anthropic.key.validate

Whether an Anthropic key is valid, free of charge (GET /v1/models)

exa.web.search

Open-web search that returns each result's evidence URL and publish date (Exa Search API). `start_published_date` and `domains` narrow it; `limit` caps the results (default 10).

exa.connection.try

Prove the key works: one Exa search for one result, read as web.search reads it. Not free: Exa has no free call, so this bills one minimal search (about $0.007). No input.

exa.agent.run

Run an Exa agent on a research query at a fixed effort (`medium` or `high`, never auto), returning its answer with the sources it cites, billed at the cost Exa measured

linkup.research.run

Run a Linkup research task on a question at a fixed depth (`S` or `M`), returning a sourced answer with the pages it cites

linkup.key.validate

Whether a Linkup API key is valid, free of charge (GET /credits/balance)

serpapi.jobs.search

Google Jobs postings for a query (SerpApi), UK by default (`gl=uk`). Each posting names the employer, location, source board and how long ago it was posted. `page_token` reads the next page of 10.

serpapi.web.search

Google's organic web results for a query (SerpApi, engine google): each result's URL, title, snippet and rank, the top `limit` (default and most 10). `gl`/`hl` name the country and language. One search; no results is a free miss.

serpapi.limits.read

What the key has left: per SerpApi limit (searches_per_month, searches_per_hour) its allowance, the searches left and when it resets, from SerpApi's free Account API. Spends no search. No input.

serpapi.connection.try

Prove the key works: one Google Jobs search, read as jobs.search reads it. Not free: SerpApi's free account call answers with the key itself, so this spends one search (a repeat within the hour is served from SerpApi's cache, free). No input.

tavily.web.search

Open-web search that returns each result's evidence URL, snippet and publish date (Tavily Search API). `topic` news returns dates; `start_date`/`end_date` (YYYY-MM-DD) and `domains` narrow it; `limit` caps the results (default 10); `depth` advanced costs two credits.

tavily.key.validate

Whether a Tavily API key is valid, free of charge (GET /usage)

tavily.limits.read

What the account has left: its monthly credits (credits_per_month: the plan's and any pay-as-you-go allowance), the credits left and when they reset, from Tavily's free GET /usage. Spends no credit. No input.

dibs 0.1.0

Outside sites it contacts: api.anthropic.com, api.name.com, api.porkbun.com, cloudflare-dns.com, crates.io, data.iana.org, dns.google, domainfinder.nic.at, github.com, pubapi.registry.google, pypi.org, rdap.identitydigital.services, rdap.nic.so, rdap.norid.no, rdap.registry.co, rdap.verisign.com, registry.npmjs.org, tld-rdap.verisign.com, whois.nic.at, whois.nic.io, whois.nic.sh, whois.nic.so

View manifest

  • names.suggest — Product-name candidates for a bonsai vision: name, why (citing V-ids), length, pronounceable, notes. $0.06 per unit Inputs: Vision, Current Name, Count, Style Try
  • naming.steer — The next round for a product card, a client-held envelope and this product's marks (`[{name, label, $1.47 per unit Inputs: Product, State, Marks Try
  • naming.critic — For each name the founder liked, in the order given: the strongest objection, its severity and a $0.25 per unit Inputs: Product, Names Try
  • naming.fit — For each name, in the order given: its fit to the card's vision, the passage it speaks to, why, a gloss. $0.36 per unit Inputs: Product, Names Try
  • naming.internal — Names for an internal tool, best first, each with how it was made and, when generated, the blind guess $0.08 per unit Inputs: Does, Siblings, Taken, Wraps, Family, Count Try
  • domains.check — Which `<name>.<tld>` domains are free: every name on `ALWAYS_TLDS` (.com, .no, .cc, .co, .at) first, $0.00 per unit Inputs: Names, Tlds Try
  • domains.ladder — Each name's best domain-ladder rung (free .com, free domain hack, free other TLD), with the $0.40 per unit Inputs: Names, Product, Tlds Try
  • naming.clear — Clearance for up to 8 finalists of a product card: handles (GitHub, npm, PyPI, crates; X and Instagram by $0.05 per unit Inputs: Product, Names Try
  • naming.dossier — The decision page for the names the founder starred or liked: the Pareto front of mark × domain path, a $0.00 per unit Inputs: Finalists, Ladder, Clearance, Classes, Prices, Critique, Funnel Try
  • domains.watch — Each domain's RDAP statuses, expiry, days left and drop phase now, asked of its registry alone. $0.00 per unit Inputs: Domains Try
  • domains.price — A registrar's price, premium flag and renewal for finalist domains (the caller's Porkbun keys), beside the registry verdict. $0.00 per unit Inputs: Domains Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/dibs

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/names.suggest -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"vision": "- **V-1** `cap` \u2014 Founders get a landing page critique in one minute.", "count": 5}}]}'

MCP address: https://brickbank.cc/b/dibs/mcp (tools)

Claude Code:

claude mcp add --transport http dibs https://brickbank.cc/b/dibs/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "dibs": {
      "type": "http",
      "url": "https://brickbank.cc/b/dibs/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

names.suggest

Product-name candidates for a bonsai vision: name, why (citing V-ids), length, pronounceable, notes.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/names.suggest -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"vision": "- **V-1** `cap` \u2014 Founders get a landing page critique in one minute.", "count": 5}}]}'

naming.steer

The next round for a product card, a client-held envelope and this product's marks (`[{name, label,

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.steer -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"product": {"vision": "## Purpose\n\n- **V-1** `cap` \u2014 Founders get product names that fit their vision, with free domains.", "rivals": ["Namelix", "Looka"], "tlds": ["com", "cc", "app", "co"], "angles": []}, "state": {"round": 0, "shown": []}}}]}'

naming.critic

For each name the founder liked, in the order given: the strongest objection, its severity and a

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.critic -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"product": {"vision": "## Purpose\n\n- **V-1** `cap` \u2014 Founders get product names that fit their vision, with free domains.", "rivals": ["Namelix", "Looka"], "tlds": ["com", "cc", "app", "co"], "angles": []}, "names": ["Kern"]}}]}'

naming.fit

For each name, in the order given: its fit to the card's vision, the passage it speaks to, why, a gloss.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.fit -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"product": {"vision": "## Purpose\n\n- **V-1** `cap` \u2014 Founders get product names that fit their vision, with free domains.", "rivals": ["Namelix", "Looka"], "tlds": ["com", "cc", "app", "co"], "angles": []}, "names": ["Kern"]}}]}'

naming.internal

Names for an internal tool, best first, each with how it was made and, when generated, the blind guess

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.internal -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"does": "One read-only view of every brainstorm, spec and story across the repos, and which work went quiet.", "siblings": [{"name": "fleet", "does": "runs many coding-agent workers across every repo under one master"}, {"name": "tower", "does": "the control MCP over the worker scheduler"}], "taken": ["lane", "gate", "board"]}}]}'

domains.check

Which `<name>.<tld>` domains are free: every name on `ALWAYS_TLDS` (.com, .no, .cc, .co, .at) first,

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/domains.check -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"names": ["dibs"], "tlds": ["com", "dev"]}}]}'

domains.ladder

Each name's best domain-ladder rung (free .com, free domain hack, free other TLD), with the

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/domains.ladder -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"names": ["dibs", "kern"], "product": "A name you love whose domain you can claim today, for founders naming a new product.", "tlds": ["com", "app", "cc"]}}]}'

naming.clear

Clearance for up to 8 finalists of a product card: handles (GitHub, npm, PyPI, crates; X and Instagram by

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.clear -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"product": {"vision": "## Purpose\n\n- **V-1** `cap` \u2014 Founders get product names that fit their vision, with free domains.", "rivals": ["Namelix", "Looka"], "tlds": ["com", "cc", "app", "co"], "angles": []}, "names": ["Kern", "Stoop"]}}]}'

naming.dossier

The decision page for the names the founder starred or liked: the Pareto front of mark × domain path, a

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/naming.dossier -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"finalists": [{"name": "Kern", "label": "star"}], "ladder": [{"name": "kern", "rung": 3, "rung_label": "exact name free on another TLD asked", "domain": "kern.dev", "verdict": "ok", "complete": true, "beyond": [], "checks": []}]}}]}'

domains.watch

Each domain's RDAP statuses, expiry, days left and drop phase now, asked of its registry alone.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/domains.watch -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domains": ["dibs.com", "dibs.dev"]}}]}'

domains.price

A registrar's price, premium flag and renewal for finalist domains (the caller's Porkbun keys), beside the registry verdict.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/dibs/v1/run/domains.price -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"domains": ["dibs.dev", "kern.io"]}}]}'

smspool 1.0.0

Outside sites it contacts: api.smspool.net

View manifest

  • sms.code — Rent a phone number for a site and read the code it texts $0.01 per unit Inputs: Site the code is for, Country of the number (ISO-3166 alpha-2), SMSPool pool id; blank lets SMSPool pick the cheapest Try
  • balance.read — The SMSPool credit left on your key, in USD $0.00 per unit Inputs: none Try
  • key.validate — Whether an SMSPool API key is valid, free of charge $0.00 per unit Inputs: none Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/smspool

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/smspool/v1/run/sms.code -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"service": "linkedin", "country": "US"}}]}'

MCP address: https://brickbank.cc/b/smspool/mcp (tools)

Claude Code:

claude mcp add --transport http smspool https://brickbank.cc/b/smspool/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "smspool": {
      "type": "http",
      "url": "https://brickbank.cc/b/smspool/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

sms.code

Rent a phone number for a site and read the code it texts

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/smspool/v1/run/sms.code -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"service": "linkedin", "country": "US"}}]}'

balance.read

The SMSPool credit left on your key, in USD

key.validate

Whether an SMSPool API key is valid, free of charge

capture 0.1.0

Outside sites it contacts: none declared

View manifest

  • capture.bundle — Renders a URL or an offline HTML mockup in headless Chromium at the given widths and declared states and returns one hashed evidence bundle: full-page and CSS-stripped wireframe PNGs, DOM, accessibility tree, computed styles with one selector per visible element, axe-core results, a bounded click graph and scripted traces. Same input, same bundle_sha. $0.01 per unit Inputs: url, html, assets, widths, states, hide, clip, color_scheme, tasks Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/capture

capture.bundle has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/capture/mcp (tools)

Claude Code:

claude mcp add --transport http capture https://brickbank.cc/b/capture/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "capture": {
      "type": "http",
      "url": "https://brickbank.cc/b/capture/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

capture.bundle

Renders a URL or an offline HTML mockup in headless Chromium at the given widths and declared states and returns one hashed evidence bundle: full-page and CSS-stripped wireframe PNGs, DOM, accessibility tree, computed styles with one selector per visible element, axe-core results, a bounded click graph and scripted traces. Same input, same bundle_sha.

ui-critic 0.1.0

Outside sites it contacts: api.anthropic.com

Recall not measured · False alarms not measured · Gate-grade no (last 30 days)

View manifest

  • ui.critique — Judges how a captured screen looks, from its pixels, computed styles and, when you give them, your design tokens only: nine deterministic floor rules (contrast, unstyled controls, tap targets, 390 px overflow, token and grid drift, type sizes, axe, dead clicks) plus a three-sample model quorum over real and wireframe tiles. Returns a critic-verdict/1 report: exit code, admissible findings with locators and crops, JUnit, SARIF and a builder view. Never sees the screen's goal or page source. $0.80 per unit Inputs: stage, kind, bundle, states, rubric, tokens, references, baseline, changed_regions, sanctioned, shadow, builder_session, builder_model, color_scheme Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/ui-critic

ui.critique has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/ui-critic/mcp (tools)

Claude Code:

claude mcp add --transport http ui-critic https://brickbank.cc/b/ui-critic/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "ui-critic": {
      "type": "http",
      "url": "https://brickbank.cc/b/ui-critic/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

ui.critique

Judges how a captured screen looks, from its pixels, computed styles and, when you give them, your design tokens only: nine deterministic floor rules (contrast, unstyled controls, tap targets, 390 px overflow, token and grid drift, type sizes, axe, dead clicks) plus a three-sample model quorum over real and wireframe tiles. Returns a critic-verdict/1 report: exit code, admissible findings with locators and crops, JUnit, SARIF and a builder view. Never sees the screen's goal or page source.

ux-critic 0.1.0

Outside sites it contacts: api.anthropic.com

Recall not measured · False alarms not measured · Gate-grade no (last 30 days)

View manifest

  • ux.critique — Judges whether a persona can finish their tasks on a screen, from a capture bundle's accessibility trees and click graph (never its pixels), from a written UX spec, or from an API/library example script and its output. Deterministic graph rules plus a 3-sample LLM walk quorum; returns a critic-verdict/1 report (exit code, findings, JUnit, SARIF, builder view) and the walked traces. $0.85 per unit Inputs: stage, kind, bundle, ux_spec, dx, persona, tasks, states, rubric, baseline, changed_regions, sanctioned, shadow, builder_session, builder_model Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/ux-critic

ux.critique has no example input yet, so there is no ready-made call: try it to see its inputs.

MCP address: https://brickbank.cc/b/ux-critic/mcp (tools)

Claude Code:

claude mcp add --transport http ux-critic https://brickbank.cc/b/ux-critic/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "ux-critic": {
      "type": "http",
      "url": "https://brickbank.cc/b/ux-critic/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

ux.critique

Judges whether a persona can finish their tasks on a screen, from a capture bundle's accessibility trees and click graph (never its pixels), from a written UX spec, or from an API/library example script and its output. Deterministic graph rules plus a 3-sample LLM walk quorum; returns a critic-verdict/1 report (exit code, findings, JUnit, SARIF, builder view) and the walked traces.

belief-extractor 0.1.0

Outside sites it contacts: none declared

View manifest

  • company.beliefs — The beliefs a company states, found in its marketing pages, its job posts and the industry content around it. One result per belief, with the quotes that state it and the challenge it implies. $0.00 per unit Inputs: Company website Try
  • company.internal_voice — What a company says about how it hires, its hiring bar and its culture, in its own words: its careers page and its open job posts, quoted word for word under one header per source. A source that failed is named with its reason, never left out. $0.00 per unit Inputs: Company website Try
  • company.founder_profiles — Who a company's founders and chief executives are on LinkedIn: up to 3 profile URLs, found from the LinkedIn page the company's website links and kept only when their current title says founder, CEO, CTO or another chief. A company with none is a miss naming why. $0.04 per unit Inputs: Company website Try
  • company.founder_posts — What people say in public, in their own words: the LinkedIn posts (not reposts) of up to 3 profiles from the last six months, at most 3 each, quoted word for word under one header per post. Give it company.founder_profiles' answer to read a company's founders. A source that failed is named with its reason, never left out. $0.04 per unit Inputs: Founders' LinkedIn profiles Try
  • company.founder_background — Where people have worked and studied, in their own words: the experience and education of up to 3 LinkedIn profiles, quoted word for word under one header per person. It answers whether a founder is a domain expert (a clinician, a lawyer, a teacher) and not only a software engineer. Give it company.founder_profiles' answer to read a company's founders. A source that failed is named with its reason, never left out. $0.01 per unit Inputs: Founders' LinkedIn profiles Try
From your software

Replace <YOUR_RUN_KEY> with your run key. The operator's run key is in crew /root/dev/blocks/.env, BLOCKS_RUN_KEYS; make more on the run keys page.

Address: https://brickbank.cc/b/belief-extractor

Call it:

# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.beliefs -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "jackandjill.ai"}}]}'

MCP address: https://brickbank.cc/b/belief-extractor/mcp (tools)

Claude Code:

claude mcp add --transport http belief-extractor https://brickbank.cc/b/belief-extractor/mcp --header "Authorization: Bearer <YOUR_RUN_KEY>"

.mcp.json (other MCP clients):

{
  "mcpServers": {
    "belief-extractor": {
      "type": "http",
      "url": "https://brickbank.cc/b/belief-extractor/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_RUN_KEY>"
      }
    }
  }
}
Run keys page (needs a run key)

company.beliefs

The beliefs a company states, found in its marketing pages, its job posts and the industry content around it. One result per belief, with the quotes that state it and the challenge it implies.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.beliefs -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "jackandjill.ai"}}]}'

company.internal_voice

What a company says about how it hires, its hiring bar and its culture, in its own words: its careers page and its open job posts, quoted word for word under one header per source. A source that failed is named with its reason, never left out.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.internal_voice -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "jackandjill.ai"}}]}'

company.founder_profiles

Who a company's founders and chief executives are on LinkedIn: up to 3 profile URLs, found from the LinkedIn page the company's website links and kept only when their current title says founder, CEO, CTO or another chief. A company with none is a miss naming why.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.founder_profiles -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"company_domain": "jackandjill.ai"}}]}'

company.founder_posts

What people say in public, in their own words: the LinkedIn posts (not reposts) of up to 3 profiles from the last six months, at most 3 each, quoted word for word under one header per post. Give it company.founder_profiles' answer to read a company's founders. A source that failed is named with its reason, never left out.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.founder_posts -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"founder_profile_urls": ["https://www.linkedin.com/in/williamhgates"]}}]}'

company.founder_background

Where people have worked and studied, in their own words: the experience and education of up to 3 LinkedIn profiles, quoted word for word under one header per person. It answers whether a founder is a domain expert (a clinician, a lawyer, a teacher) and not only a software engineer. Give it company.founder_profiles' answer to read a company's founders. A source that failed is named with its reason, never left out.

Example call
# Use a new code for each new run. Send the same code again when you retry, and you get the first run back, never charged twice.
curl -X POST https://brickbank.cc/b/belief-extractor/v1/run/company.founder_background -H "Authorization: Bearer <YOUR_RUN_KEY>" -H "Idempotency-Key: <NEW_CODE_PER_RUN>" -d '{"items": [{"id": "example", "input": {"founder_profile_urls": ["https://www.linkedin.com/in/williamhgates"]}}]}'

One block. Three ways to run it.

Same block, same price, wherever you run it.
This page Fill the form, check the price per result, press Run.
Software One API call. Quick jobs answer at once, long ones send a receipt.
AI agents Claude and other assistants use it as a tool, inside your budget.
Brickbank· Finished jobs, paid per result.
© 2026 Brickbank