# Influencer Talent Agency Lookup (`mambalabs/talent-agency-lookup`) Actor

Matches a creator to the talent agency that represents them, or an agency to its public roster. One flat row with agency name, domain, public contact, niches, and match method. Coverage is partial and each row says how it matched. Reads and contributes to a shared agency pool, on by default.

- **URL**: https://apify.com/mambalabs/talent-agency-lookup.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 agency lookups

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🏢 What can Influencer Talent Agency Lookup do?

Both directions. Creator to agency: handles in; the public profile is read for a manager or business email, the bio link page is crawled for manager wording, the email domain is matched against the agency list, the handle is matched against public rosters, and the bio is read for an agency name. Agency to roster: agency domains or names in; one row per creator on the agency's public roster page, with the agency columns filled.

Every row says how it matched: `email_domain_exact`, `email_domain_parent`, `public_roster`, `bio_wording`, `no_public_roster`, or `no_match` with the domains tried in `error_reason`.

| 📦 What you get | ⚙️ Features and integrations |
|---|---|
| 🏢 **Agency name and domain** for a creator, with the match method<br>📋 **Public roster** for an agency, one row per creator<br>📧 **Manager or business email** read from the profile and the bio link page<br>🧭 **Six match methods**, so a `no_match` says what was tried<br>🧾 **57 flat fields**, `snake_case`, the suite's shared row | 🗂️ **143 agencies, 557 roster creators**, seeded from 13 public directories<br>🔁 **The list grows on your account**, new manager domains are appended<br>🌐 **Seven platforms**, TikTok, Instagram, YouTube, Pinterest, Twitch, Threads, podcasts<br>🧪 **Clay ready**, one handle or domain per row lands on the same path<br>⬇️ **Export** to JSON, CSV, Excel, HTML or XML |

Bought by talent agencies mapping the competition's roster, brand partnership teams that need the manager rather than the creator, and creator tool companies selling through management.

> 🚫 **This is not a complete registry of creator representation.** Coverage is what 13 public directories and 22 public roster pages expose. A creator represented by an agency outside the list returns `no_match`, never a guess, and the domains tried are in `error_reason`.

### 💡 Why use Influencer Talent Agency Lookup?

| If you sell | Read these fields |
|---|---|
| Talent representation | `agency_name`, `agency_match_method`, `manager_email` |
| Brand partnerships | `manager_email`, `manager_source_url`, `agency_domain` |
| Creator tools sold through management | `agency_name`, `agency_domain`, then the roster direction |
| Anything, as a disqualifier | `agency_match_method`, `row_status`, `error_reason` |

#### 🧭 The list, and why coverage is partial by construction

Seeded on 2026-09-22 from 13 public directories (Influencer Marketing Hub, Attri, three Influencer Hero lists, NetInfluencer, Munro, ForCreators, Everything PR, LYFE Marketing, The Social Shepherd, Web Tonic) and each agency's own site: 143 reachable agencies, 93 with a public contact email, 22 with a public roster holding 557 creators (instagram 287, tiktok 132, youtube 104, twitch 34). Directory listings are paid placements, and 99 of the 143 agencies appear in exactly one directory, so `sources` on every agency record shows where it came from. Coverage is partial by construction; a creator represented by an agency outside the list returns `no_match`, never a guess.

The list is read at run time from a named key value store on your account (`creator-agency-list`), seeded from the bundled copy on the first run. Every run appends newly seen manager email domains as unconfirmed agencies, which is how the list grows.

### 📋 What data can Influencer Talent Agency Lookup extract?

**57 fields** per row, the same 57 in the same order on every actor in this suite. The ones this actor fills:

| Field | What it holds |
|---|---|
| `agency_name`, `agency_domain` | The agency matched, or the agency whose roster this row came from |
| `agency_match_method` | `email_domain_exact`, `email_domain_parent`, `public_roster`, `bio_wording`, `no_public_roster`, or `no_match` |
| `manager_name`, `manager_email`, `manager_source_url` | The manager contact and where it was found |
| `business_email`, `business_email_source` | A public email in the bio or on the link page |
| `platform`, `handle`, `profile_url`, `display_name`, `bio`, `bio_link` | The creator, in either direction |
| `source_url`, `read_at`, `row_status`, `error_reason`, `billable_events_json` | Where the row came from, when, whether it is usable, what was tried, and what it cost |

> ⚠️ **`false` and `null` are not the same thing, and an empty cell is not a failed read.** A column this actor does not own is `null`, never missing. On a boolean, `false` means the page was read and the signal was not there; `null` means nothing read it. On an Influencer Profile Scraper row, `verified: false` is a profile without the mark and `verified: null` is a profile that could not be read. Read `row_status` before any other column; the paragraph below says how.

Every actor in this suite writes the same 57 flat columns, in the same order, and fills the ones it owns. A column an actor does not own is null, never missing. Nested data lives only in columns ending `_json`, as a JSON string, so a Clay column reads one cell.

| Group | Columns | Filled by |
| --- | --- | --- |
| Identity | `creator_id`, `creator_id_method`, `creator_id_confidence`, `platform`, `handle`, `profile_url`, `display_name` | Influencer Finder, Influencer Profile Scraper |
| Discovery | `search_keyword`, `niche`, `similar_creators`, `similar_creators_method` | Influencer Finder |
| Profile | `followers`, `following`, `post_count`, `engagement_rate`, `engagement_method`, `verified`, `bio`, `bio_link`, `location_text`, `country_guess`, `country_guess_method` | Influencer Profile Scraper |
| Contact | `business_email`, `business_email_source`, `website_email`, `website_email_source_url`, `manager_name`, `manager_email`, `manager_source_url`, `agency_name`, `agency_domain`, `agency_match_method` | Influencer Profile Scraper, Link in Bio Scraper and Newsletter Detector, Influencer Talent Agency Lookup |
| Links | `link_in_bio_platform`, `outbound_links_json`, `other_social_profiles_json`, `own_website` | Link in Bio Scraper and Newsletter Detector; `other_social_profiles_json` also by the Influencer Profile Scraper |
| Newsletter | `newsletter_status`, `newsletter_platform`, `newsletter_url`, `newsletter_evidence_url`, `newsletter_check_method` | Link in Bio Scraper and Newsletter Detector |
| Sells | `sells_course`, `sells_coaching`, `sells_digital_product`, `sells_merch`, `sells_membership`, `brand_deals_visible`, `discount_codes_visible` | Link in Bio Scraper and Newsletter Detector |
| Change | `change_type`, `change_from`, `change_to`, `previous_run_at` | Influencer Change Monitor |
| Run | `source_url`, `read_at`, `row_status`, `error_reason`, `billable_events_json` | All six |

The Influencer Lead List Builder runs the Influencer Finder, the Influencer Profile Scraper, and the Link in Bio Scraper and Newsletter Detector in one run and fills what they fill. The Influencer Change Monitor and the Influencer Talent Agency Lookup read the profile (and the Influencer Change Monitor reads the link page too when `check_links` is on), so their rows carry the identity, profile, contact, and link columns as well.

**Read `row_status` first.** `ok` is a normal row. `error` carries the reason in `error_reason` (`not_found: user banned`, `private`, `blocked: bot detection page`) and charges nothing. `partial` means the page was read but a step after it failed, and the reason says which.

**The creator ID.** `creator_id` is `cr_` plus 16 hex characters of the SHA-1 of `platform:handle` of the creator's primary profile, so the same creator gets the same ID in every actor and every run. When one run sees the same creator on two platforms, the rows share the ID and each row says how it was linked: `bio_link_match` (0.9, one profile links to the other), `website_match` (0.8, same own website), `handle_match` (0.5, same handle on two platforms, which collides on common words). A lone row is `seed_handle` at 1.

**Country scope.** This actor applies no country filter. A creator to agency row carries `country_guess` and `country_guess_method` from the profile read (the platform's region field, the location text, the bio, or a flag emoji); a roster row is read from the agency's page, not the profile, so both are null.

### 🛠️ How to find the talent agency behind a creator

1. Open the **Input** tab. Creator to agency: put handles or profile URLs in `handles`, with `platforms` for any bare `@handle`. Agency to roster: put agency domains in `agency_domains` or names in `agency_names`.
2. Click **Start**. Creator to agency returns one row per creator; agency to roster returns one row per creator on the agency's public roster page.
3. Read `agency_match_method` first. `email_domain_exact` and `public_roster` are the strong matches; `bio_wording` is a name read from the bio; `no_match` lists the domains tried in `error_reason`.
4. Export from the **Output** tab, or pull the rows through the API.

#### 🧪 Using it in Clay

Add an **Enrichment > Apify** column, pick this actor, and map your handle column to `handles`, or your agency domain column to `agency_domains` in a separate roster table. Every input is accepted as a string, which is what Clay sends. Filter on `agency_match_method` before acting on `agency_name`.

#### 📚 Batch or single

One handle or one agency domain is one run; a list is a batch. Both shapes reach the same code path, and so does the shape the platform produces when Clay sends a top level array against an object schema. Input is deduplicated before any fetch. Rows are pushed as each wave finishes, so a run that hits its timeout keeps every row it already resolved. A row that throws becomes an error row with the reason and the run continues.

Concurrency (`batch_size`) is profiles in flight per platform in the creator to agency direction, default 4 on Instagram and 3 elsewhere, the values measured for the Influencer Profile Scraper. Above the measured point rows started dropping; that is why the default is not higher.

### 💵 How much does it cost to look up a creator agency?

Pay per event. You are charged for output, never for input.

| Event | Fires when | Price |
|---|---|---|
| `actor-start` | Once per run, on start. | $0.001 |
| `agency-lookup` | Once per row returned, in either direction. | $0.008 |
| `browser-render` | Once per agency roster page rendered in the headless browser because the plain fetch returned an empty shell, and only when the rendered page came back readable. Only when `render_unreadable_pages` is on. A page that answers with a bot challenge is recorded as blocked and is never rendered, so it is never charged. | $0.004 |
| `instagram-bio-fetch` | Once per Instagram profile row when the bio, bio link, and following were not on the embed widget or the datacenter API and the profile page was read over the residential proxy and came back readable. Only when `escalate_on_block` is on; uncheck it to avoid the charge and accept empty bio fields on about half of Instagram rows. Never on the embed or datacenter reads, never on another platform, never on a blocked page, never on an error row. | $0.010 |

Free Apify plan users get 160 results per calendar month, reset monthly. Upgrade to any paid Apify plan for unlimited use: https://apify.com/pricing?fpr=mamba

> 💳 **What you are billed for.** `agency-lookup` fires once per row returned, in either direction, a `no_match` row included, because the profile read, the link page crawl, and the roster match are the work. The creator to agency direction reads the creator's profile for a manager email; an Instagram handle whose bio needs the residential page is charged `instagram-bio-fetch` on top of the lookup.

Apify bills its own platform usage on top of the event prices.

### ⌨️ Input

Everything is on the **Input** tab. The options worth explaining:

| Field | What it does |
| --- | --- |
| `handles`, `platforms` | Creator to agency. Handles or profile URLs, same shapes as the Influencer Profile Scraper. |
| `agency_domains` | Agency to roster: one domain per line (for example viralnation.com). Returns one row per creator on the agency's public roster. |
| `agency_names` | Agency to roster by name when you do not have the domain. Exact or partial name match against the list. |
| `render_unreadable_pages` | Off by default. An agency roster page that builds its talent grid in the browser returns an empty shell to a plain fetch, so the roster reads as empty. Turn this on to render those pages and read the roster from the rendered page. Charges `browser-render` ($0.004) per page that comes back readable. A bot challenge page is recorded as blocked and is never rendered. |
| `escalate_on_block` | On by default. A profile fetch that returns a bot detection page is retried once over the residential proxy, and on Instagram the bio page is fetched over residential when the datacenter API does not answer; a readable page charges `instagram-bio-fetch` ($0.010) on top of the lookup. Off: no `instagram-bio-fetch` is ever charged, and the Instagram bio, bio link, and therefore any manager email written in the bio stay empty on about half of the rows. Creator to agency direction only. |
| `batch_size` | Rows in flight per platform. Leave empty for the measured default. |

### 📤 Output

Exports to **JSON, CSV, Excel, HTML or XML**. One flat, snake\_case row per creator per platform, 57 columns, with `null` rather than a missing key. No nested objects, so it drops straight into Clay, a spreadsheet or a warehouse table without a flattening step. Nested data lives only in columns ending `_json`, as a JSON string, so a Clay column reads one cell.

A creator to agency row with no match: the public email was found, its domain is not an agency on the list, and the handle is on no public roster, so `agency_match_method` is `no_match` and `error_reason` says what was tried. The row below is trimmed to the columns this actor fills.

```json
{
  "creator_id": "cr_f37780b33cab221f",
  "creator_id_method": "seed_handle",
  "creator_id_confidence": 1,
  "platform": "tiktok",
  "handle": "thatisperfect",
  "profile_url": "https://www.tiktok.com/@thatisperfect",
  "display_name": "Tech & Gadget Finds 🚀",
  "bio": "Trendy Tech Gadgets + more 🚀\n\n📩Thatisperfect@hotmail.com \n\n🔻Links🔻",
  "bio_link": "https://linktr.ee/thatisperfect",
  "business_email": "thatisperfect@hotmail.com",
  "business_email_source": "bio",
  "manager_email": null,
  "agency_name": null,
  "agency_domain": null,
  "agency_match_method": "no_match",
  "source_url": "https://www.tiktok.com/@thatisperfect",
  "read_at": "2026-09-22T08:19:08.818Z",
  "row_status": "ok",
  "error_reason": "no manager or business email domain to match, and no roster hit",
  "billable_events_json": "[{\"event\":\"agency-lookup\",\"count\":1}]"
}
```

### 💡 Tips

- Read `agency_match_method` before `agency_name`. `email_domain_parent` and `bio_wording` are weaker than `email_domain_exact` and `public_roster`.
- Run the roster direction on your competitors' domains. One row per creator, with the creator columns filled, is a prospect list.
- The list grows on your account. Every run appends newly seen manager email domains as unconfirmed agencies to `creator-agency-list`, so a second run over the same niche matches more.
- A creator with a Gmail business email and no roster hit is a creator without public representation, which is its own signal.

### ⚠️ Known limits

**Coverage is partial by construction.** 143 reachable agencies, 93 with a public contact email, 22 with a public roster holding 557 creators. Directory listings are paid placements, and 99 of the 143 agencies appear in exactly one directory. A creator represented by an agency outside the list returns `no_match`, never a guess.

**A roster is what the agency publishes.** Agencies without a public roster page return `no_public_roster` in the roster direction.

**A manager email is read only where one is written.** In the bio, on the link page, or on the creator's website, labeled management, mgmt, managed by, manager, or booking. A creator who publishes none returns `no_match` unless a roster names them.

**Not X, not Facebook pages, not LinkedIn.** Seven platforms are read, listed above.

**What is never done.** No login. No CAPTCHA solving. No LinkedIn fetch. No message to anyone. No key of ours is used on your run; this actor has no AI option and takes no API key.

### What this actor shares

This run contributes the records it finds to a shared creator and agency pool that all users of this actor read from. What one run finds, the next run can read.

This actor reads the pool before it reads anything else. When the pool is unreachable it falls back to the agency list bundled in the build, so a run never fails on the pool.

The toggle is `contribute_to_shared_pool`. It is a boolean input and it is on by default. Turn it off and the run still reads the pool and writes nothing to it.

**What this actor contributes.** The agency rows and the roster rows read during the run: agency name, domain, public contact, country, classification, roster URL, and one roster row per creator with the platform and the handle.

**Only public data that is already in your own output.** Every field written to the pool is a field this run returned to you, read from a page the platform or the creator publishes to anyone without a login. Nothing from your Apify account, your input list, your API keys, or your own notes is sent. A contribution never deletes anything from the pool.

**What a contribution is labeled with.** The actor ID, the run ID, the pool key issued to the actor build, and a hash of the calling IP address, used for the rate limit and nothing else. Your Apify account and your user ID are not recorded.

**Contributing is free.** No event is charged for a write to the pool. If the pool is unreachable the run finishes as normal, the rows are dropped, and the run log says so.

### ❓ FAQ

**Why does a creator I know is represented come back `no_match`?**
The agency is not on the list, or the creator's public pages carry no manager email and the agency has no public roster. `error_reason` lists the domains tried.

**Where does the list come from?**
Seeded on 2026-09-22 from 13 public directories and each agency's own site. `sources` on every agency record shows where it came from.

**Does it read LinkedIn?**
No. No LinkedIn fetch, ever.

**Is a `no_match` row charged?**
Yes. The profile read, the link page crawl, and the roster match are the work, and the row says what was tried.

**Can I run an agency name instead of a domain?**
Yes. `agency_names` matches exact or partial names against the list.

### 🧩 Want other GTM data?

Mamba Labs builds a fleet of GTM enrichment actors that share one flat,
Clay-ready output convention, so their rows join on `company_domain` or
`creator_id` with no cleaning step:

| | |
|---|---|
| 🕵️ [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) | 🤖 [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) |
| 📡 [B2B Buying Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) | 🚀 [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) |
| 📝 [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) | 🦋 [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) |
| ⏩ [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | 🔄 [Company Change-Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) |
| 📇 [Company Contact Details Extractor](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | 🧭 [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) |
| 🏢 [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | 🪪 [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) |
| 🌐 [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | 🏷️ [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) |
| 📈 [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | 🔎 [Influencer Finder](https://apify.com/mambalabs/creator-finder?fpr=mamba) |
| 🧾 [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | 👤 [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) |
| 📬 [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | 🔗 [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) |
| 🛒 [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | ✉️ [Work Email Waterfall Finder](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) |
| 🎪 [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | 💵 [Funding Record and Filings](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) |
| 💰 [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) | 🐙 [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) |
| 🧑‍💼 [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) | 📋 [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) |
| 🧱 [Tech Stack Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) | 🎯 [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) |
| 🔑 [Job Board Keyword Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) | ⚖️ [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) |
| 🔗 [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | 💼 [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) |
| 💬 [LinkedIn Post Tracker and Comment Capture](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | 📢 [Meta Ad Library Monitor](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) |
| 📸 [Instagram and Facebook Brand Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | 📮 [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) |
| 📄 [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) | 👤 [People Finder and Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) |
| 📌 [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) | 🏛️ [Government Contract Award Monitor](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) |
| 📅 [Public Company Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) | 👽 [Reddit Brand and Mention Monitor](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) |
| ⭐ [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) | 👥 [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) |
| 🎵 [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | 📈 [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) |
| 🏅 [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | ✖️ [X Twitter Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) |
| ▶️ [YouTube Channel Stats Extractor](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) |  |

> Every actor in the suite takes a domain, a company, or a creator and returns one flat row,
> so they stack in the same Clay table without reshaping anything.

> 🛠️ **Need something custom built for you or your team?** Tell us what you are
> trying to find and we will build it. [Talk to Mamba Labs](https://mambabuilt.com/contact).

### 🆘 Support

Issues, field requests and bug reports: open an issue on the actor's Issues tab.
Mamba Labs reads every one.

> ℹ️ **Sourcing and legal.** Every field comes from pages the platforms and the creators publish to anyone without a login, read directly or through a proxy, with no login, no CAPTCHA solving, and no LinkedIn fetch. The row records what was public at `read_at`. Nothing is assessed or scored; a class, a flag, or a match method says what was read and where. You are responsible for how you use the output, including under applicable data protection and platform terms.

Built by [Mamba Labs](https://apify.com/mambalabs?fpr=mamba).

# Actor input Schema

## `handles` (type: `array`):

One per line. A profile URL on any supported platform (https://www.tiktok.com/@name, https://www.instagram.com/name/, https://www.youtube.com/@name, a Pinterest, Twitch, or Threads profile, an Apple Podcasts show page, or a Spotify show), or platform:@handle (tiktok:@name). A bare @handle needs `platforms` and is looked up on each listed platform. One entry is a single run; a list is a batch. Duplicates are removed before any fetch.

## `platforms` (type: `array`):

Which platforms a bare @handle is looked up on. A full profile URL carries its own platform and ignores this. This actor does not search; pass the creators you want read. Supported: TikTok, Instagram, YouTube, Pinterest, Twitch, Threads, and podcasts. Not X, not Facebook pages, not LinkedIn.

## `agency_domains` (type: `array`):

Agency to roster: one domain per line (for example viralnation.com). Returns one row per creator on the agency's public roster.

## `agency_names` (type: `array`):

Agency to roster by name when you do not have the domain. Exact or partial name match against the list.

## `render_unreadable_pages` (type: `boolean`):

Off by default. Some agency roster pages build their talent grid in the browser and return an empty shell to a plain fetch, so the roster reads as empty. Turn this on to render those pages in a headless browser and read the roster from the rendered page. Charged per page rendered (event browser-render) to cover the browser compute, and only when the rendered page comes back readable. A page that answers with a bot challenge is recorded as blocked and is never rendered.

## `escalate_on_block` (type: `boolean`):

On by default. A profile fetch that comes back as a bot detection page is retried once over the residential proxy. On Instagram the bio, bio link, and following are read from the profile page over residential when the embed and the datacenter API did not carry them, and a page that comes back readable charges instagram-bio-fetch ($0.010). Uncheck it to never pay that event: a blocked profile then returns a labeled error row, and Instagram rows keep an empty bio and bio link on about half of the reads.

## `batch_size` (type: `integer`):

Rows fetched at once. Leave empty for the measured per platform default; the measurement is in the README. Higher is faster and, above the measured point, loses rows.

## `contribute_to_shared_pool` (type: `boolean`):

On by default. The run contributes the public records it finds to a shared creator and agency pool that all users of this actor read from, so a later run reads what this one found. Only public data that is already in your own output rows is sent: nothing from your Apify account, your input list, your API keys, or your own notes. Nothing is charged for a contribution. Turn this off and the run still reads the pool and writes nothing to it. Default: true.

## `source_tag` (type: `string`):

Attribution for published example tasks. Leave empty.

## Actor input object example

```json
{
  "handles": [],
  "platforms": [
    "tiktok",
    "instagram"
  ],
  "agency_domains": [],
  "agency_names": [],
  "render_unreadable_pages": false,
  "escalate_on_block": true,
  "contribute_to_shared_pool": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of one flat row per creator per platform, with row\_status on every row so an error never reads as a blank. Every actor in the Mamba Labs creator suite writes the same column set; a column this actor does not fill is null on every row. The Overview view lists the columns this actor fills.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "handles": [],
    "platforms": [
        "tiktok",
        "instagram"
    ],
    "agency_domains": [],
    "agency_names": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/talent-agency-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "handles": [],
    "platforms": [
        "tiktok",
        "instagram",
    ],
    "agency_domains": [],
    "agency_names": [],
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/talent-agency-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "handles": [],
  "platforms": [
    "tiktok",
    "instagram"
  ],
  "agency_domains": [],
  "agency_names": []
}' |
apify call mambalabs/talent-agency-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/talent-agency-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zCuX4Mgyg6JvXgGzd/builds/jKuoJbVCOvDRjcf8L/openapi.json
