# Local Business Leads & Email Finder for Agencies (`ryanbot_research/ryanbot-company-research`) Actor

Type a city and a sector. Get local businesses with emails, phones, owners, tech stack and SEO gaps, each with a source link, plus a free list of businesses that have no website. Built for web, SEO and marketing agencies. Pay only for complete reports.

- **URL**: https://apify.com/ryanbot_research/ryanbot-company-research.md
- **Developed by:** [Woven Comet Technologies](https://apify.com/ryanbot_research) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 qualified company reports

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Company Finder & B2B Lead Enrichment | RyanBot

![RyanBot: local business leads, with proof](https://islem-api-production.up.railway.app/marketplace-media/ryanbot-cover.jpg)

**Get a list of local businesses with their emails, phones, website technology and hiring pages — with a source link for every finding.**

Type a city and a sector (for example *Hamburg + dentists*), or paste the websites you already have. RyanBot finds the companies, reads their websites and returns a ready-to-use lead report as **CSV, JSON or an interactive HTML report**. No API key, no proxy setup, no AI subscription needed.

**From $2.50 per 1,000 company reports.** You only pay for reports that contain real evidence; blocked or empty websites are not billed.

▶ **Try it now:** [Find dental practices in Hamburg](https://apify.com/ryanbot_research/ryanbot-company-research/examples/find-hamburg-dental-practices-for-agency-research) — runs in about a minute with a $0.05 cap.

![RyanBot discovery and company intelligence at a glance](https://api.apify.com/v2/key-value-stores/Lr9w7KjoIz44Ms0M1/records/scope-overview.png)

### What you get for each company

| | |
| --- | --- |
| 📇 **Contacts** | Published business emails and phone numbers, contact and quote forms |
| 👤 **People** | Owners, founders and managers named on the company's own website |
| 🛠 **Technology** | CMS, shop, CRM, analytics, booking and support tools (57 detected) |
| 🔎 **Website & SEO** | Titles, meta descriptions, headings, indexing and social markup |
| 💼 **Hiring** | Careers pages and job ads (Greenhouse, Lever, Personio, Ashby and on-site) |
| 🧭 **Sales angle** | Ten ready-made views: web agency, SEO, CRM, automation, e-commerce, recruiting and more |
| 🔗 **Proof** | Source URL and observation date for every finding |
| 🆓 **No-website bonus** | Businesses whose map listing shows no website (name, address, phone, listing link) in a separate free list: the warmest leads for web agencies |

### Who uses it

- **Agencies** (web, SEO, automation, booking): find local businesses and see what they are missing before you call.
- **Sales & lead generation teams**: build a prospect list for one city and sector in minutes.
- **Recruiters**: find employers that are actively hiring.
- **CRM & data teams**: enrich a website list with contacts and technology.

### One-click examples

| Your first question | Open a bounded example |
|---|---|
| Find local prospects without a list | [Hamburg dental practices](https://apify.com/ryanbot_research/ryanbot-company-research/examples/find-hamburg-dental-practices-for-agency-research) |
| Find hotels and inspect booking routes | [City and hotel discovery](https://apify.com/ryanbot_research/ryanbot-company-research/examples/find-hotel-companies-by-city-for-booking-and-agency-research) |
| Inspect a website across all ten perspectives | [General company research](https://apify.com/ryanbot_research/ryanbot-company-research/examples/research-a-company-website-for-agencies-crm-and-b2b-teams) |
| Prepare contact and company evidence for CRM review | [CRM and customer research](https://apify.com/ryanbot_research/ryanbot-company-research/examples/enrich-company-websites-for-crm-and-customer-research) |
| Inspect commerce technology and customer routes | [Commerce website research](https://apify.com/ryanbot_research/ryanbot-company-research/examples/review-commerce-technology-and-customer-routes-on-a-website) |
| Inspect careers routes and available published jobs | [Employer and hiring research](https://apify.com/ryanbot_research/ryanbot-company-research/examples/research-employer-careers-pages-and-published-job-evidence) |

Each example has a USD 0.05 run cap and uses no paid search or AI. Replace the inputs with your own city, sector or websites.

### How to use it

**1. No list? Discover companies.** Set `cities`, `country_code`, `sector` (52 sectors, from dentists to logistics) and `radius_km`. RyanBot searches OpenStreetMap and other open sources, then reads each company website.

**2. Have a list? Enrich it.** Paste website URLs into `websites`, or use `companies_csv` or an Apify `dataset_id` (up to 200 rows).

**3. Open the results.** Download the dataset as CSV/Excel/JSON, or open **Opportunity Report (HTML)** in the run's storage to filter companies and switch between the ten sales views.

```json
{
  "cities": ["Hamburg"],
  "country_code": "DE",
  "sector": "dentistry",
  "radius_km": 3,
  "max_results": 4,
  "include_jobs": true
}
```

### Real example

**Hamburg dental practices, 31 October 2026** — no company list supplied. One run found 20 practices and returned three completed reports with published emails and phone numbers, each with its source page, in about 90 seconds. Results depend on what each company publishes.

![Actual city-discovered company evidence](https://api.apify.com/v2/key-value-stores/Lr9w7KjoIz44Ms0M1/records/scope-real-evidence.png)

### Pricing

| Your Apify plan | Per 1,000 company reports |
| --- | ---: |
| Free | $2.50 |
| Starter | $2.40 |
| Scale | $2.30 |
| Business | $2.20 |

Plus a $0.00005 start fee and normal Apify platform usage (about $0.30–$0.45 per 1,000 results). **One report covers all ten sales views** — selecting more views does not cost more. Reports without real first-party evidence (blocked, unreadable or empty websites) are not billed.

![Ten customer types supported by one company report](https://api.apify.com/v2/key-value-stores/Lr9w7KjoIz44Ms0M1/records/scope-customers.png)

### Good to know

- **Coverage:** public sources can be incomplete, slow or out of date. If the main OpenStreetMap server is busy, RyanBot automatically switches to a backup source. An empty result does not mean no businesses exist.
- **Contacts:** emails and phones are what the company publishes. They are not verified mailboxes or permission to contact; follow your local outreach rules.
- **No actions:** RyanBot only reads public pages. It never sends messages, submits forms or changes your CRM.
- **Optional extras:** Google-backed discovery, Chrome UX Report web-vitals (`include_web_experience` + your own `crux_api_key`), machine-readable PDF evidence and change monitoring (`monitor_id`) are available as opt-in settings.
- **Languages:** reports in English, German and Turkish.
- **Integration:** prefer a REST API with monthly plans? See [RyanBot on RapidAPI](https://rapidapi.com/MuhammednedimIpek/api/ryanbot-company-research-api/tutorials).

OpenStreetMap-derived records: © OpenStreetMap contributors — ODbL, [license](https://www.openstreetmap.org/copyright). For help, open an Issue with your input (never include API keys).

### Have operational records to process after company research?

[ISLEM on Apify](https://apify.com/ryanbot_research/islem-b2b-automation?utm_source=ryanbot_store\&utm_medium=owned\&utm_campaign=related_product) and [ISLEM on RapidAPI](https://rapidapi.com/MuhammednedimIpek/api/islem-b2b-operations-automation?utm_source=ryanbot_store\&utm_medium=owned\&utm_campaign=related_product) turn supplied invoices, order lines, stock records and supplier offers into reviewable reports. Its 32 operations also cover cash-flow scenarios, contact cleaning, table checks, dispatch and SLA review.

**See one result before integrating:** [invoice matching](https://islem-api-production.up.railway.app/marketplace-media/start.html#reconciliation), [stock within a budget](https://islem-api-production.up.railway.app/marketplace-media/start.html#inventory), or [supplier comparison](https://islem-api-production.up.railway.app/marketplace-media/start.html#procurement). The free input builder prepares JSON without running the engine. Examples are synthetic; platform processing has separate prices and limits.

RyanBot researches public company evidence. ISLEM processes the operational records you provide. They have separate subscriptions and quotas, with no automatic transfer, private financial-data discovery or external actions implied.

# Actor input Schema

## `websites` (type: `array`):

Enrich up to 200 company website addresses instead of discovering companies by city. Choose only one import source. Existing request/time/result limits still apply. Use company-owned websites, not social or map links.

## `companies_csv` (type: `string`):

Paste CSV text with a website, url, domain or company_website header, plus optional name, city and address columns. Comma, semicolon and tab separators are supported. At most 200 rows and 200000 UTF-8 bytes. This field does not fetch URLs or read local files.

## `dataset_id` (type: `string`):

Read a dataset owned by your current Apify account, using this run's scoped client. Paste its ID only, not a URL, token or name. At most 200 source rows. No storage is created and no other Actor is run. Your run must have read permission for that dataset.

## `dataset_website_field` (type: `string`):

Top-level field containing company websites in the source dataset (for example website or url). Nested expressions are not accepted. Imported lists currently do not support private monitor_id history.

## `buyer_profile` (type: `string`):

Primary research and sorting profile. With additional profiles, include this profile in the list. If omitted, the first selected profile is used; without additional profiles, general company research is used. Scores are public observations, not verified buying intent.

## `buyer_profiles` (type: `array`):

The example selects all ten perspectives from the same fetched evidence. Include your primary profile; it controls ranking. Selected analyses share one delivered company report event. Clear or reduce this list for a focused run; omitting it retains single-profile API behavior.

## `contact_requirement` (type: `string`):

Filter the inspected batch using contacts observed in this run. A published address is not delivery verification or permission to contact.

## `min_opportunity_score` (type: `integer`):

0–100 profile-specific evidence priority. Start at 0 to understand coverage; higher thresholds may return no results. Only inspected companies are ranked.

## `exclude_domains` (type: `array`):

Optional domains to omit, for example example.com. Domain and subdomain matches are excluded. Up to 100 entries.

## `sector` (type: `string`):

26 reviewed broad and neighborhood-scale sectors (including imbiss, kiosks, corner shops, bakeries, salons, repair shops and offices), adapted to local OSM tags and, when configured, Overture taxonomy.

## `cities` (type: `array`):

One to three cities. Offline list works without credentials; GeoNames can resolve more places. Search-only works globally using your own Google-backed search key.

## `country_code` (type: `string`):

ISO 3166-1 alpha-2 country code. Non-map web-search results are not independently geolocated.

## `latitude` (type: `number`):

Provide both coordinates for a single custom search center. Explicit coordinates take precedence over city lookup.

## `longitude` (type: `number`):

Provide together with latitude. This does not call Nominatim or another public geocoder.

## `radius_km` (type: `integer`):

Radius applies to geolocated map results; search-only web search cannot enforce geographic distance.

## `query` (type: `string`):

Optional case-insensitive substring filter over company name, address and inspected visible website text. Leave empty for the widest sector search. Not executable code or a custom Overpass query.

## `language` (type: `string`):

Assessment language (DE/EN/TR), not a universal translation. International discovery searches use English sector labels outside DACH countries.

## `max_results` (type: `integer`):

Upper bound, not a promised result count. Empty and partial runs are possible.

## `max_requests` (type: `integer`):

Shared request budget for discovery and website inspection. Stop when exhausted instead of continuing an unbounded crawl.

## `max_pages_per_company` (type: `integer`):

Bound website inspection to a few relevant public pages. This is not a full website audit.

## `timeout_seconds` (type: `integer`):

Engine time budget; network calls also have their own timeouts. Set an Apify run timeout as an additional outer limit.

## `contact_email` (type: `string`):

Optional public operator contact used to identify requests to public data services. It may appear in their request logs; do not enter a private secret. Required for SEC EDGAR public fair-access policy.

## `paid_provider` (type: `string`):

None keeps discovery in the free public-data mode. Selecting a provider requires your own key and may spend that provider's credits. Publisher keys are never used.

## `paid_api_key` (type: `string`):

Encrypted secret input. Required only when paid_provider is enabled. The key is not copied to the dataset or run report.

## `max_paid_requests` (type: `integer`):

Total paid HTTP attempts per run, shared across cities and pages. Google Places phone/website fields incur Enterprise SKU charges on your Google account. No paid fallback.

## `ai_provider` (type: `string`):

None keeps assessment deterministic and makes no LLM calls. AI is optional interpretation of retrieved evidence, not proof of purchase intent.

## `ai_api_key` (type: `string`):

Encrypted secret input. The selected provider bills your account. No publisher environment key is used as a fallback.

## `include_web_experience` (type: `boolean`):

Optional real-user origin metrics where Google has enough data. Requires your own Chrome UX Report API key. No data means unavailable, not a poor score. Uses the existing run time/request budget.

## `crux_api_key` (type: `string`):

Restrict this key to Chrome UX Report API. The API is free subject to Google quotas. No publisher key is used by the public Actor.

## `max_crux_calls` (type: `integer`):

Upper limit on unique origin lookups; existing request and runtime limits still apply.

## `ai_model` (type: `string`):

Enter an explicit model supported by your selected provider and account. There is no automatic model or price choice; verify current availability and pricing before enabling AI.

## `max_ai_calls` (type: `integer`):

Additional cap on paid AI requests. Setting ai_provider to none disables all AI requests regardless of this value.

## `max_output_tokens` (type: `integer`):

Limits generated output only; provider input tokens may also be billed. Set your provider's account budget separately.

## `include_jobs` (type: `boolean`):

Read JobPosting structured data and supported public ATS boards linked by the employer website. A careers link alone is not a vacancy.

## `job_keywords` (type: `array`):

Optional role keywords; at most ten. Requires job inspection. Empty means no role filter.

## `job_max_age_days` (type: `integer`):

0 disables this filter. A missing posting date is unknown; observation time is never used as a posting date.

## `max_jobs_per_company` (type: `integer`):

Upper bound on job observations retained for a company.

## `max_job_requests_per_company` (type: `integer`):

Public job endpoints share the total HTTP and runtime budgets. Set 0 to use only already retrieved pages.

## `require_jobs` (type: `boolean`):

Return only companies with qualifying observed jobs. This does not imply that the employer buys recruitment services.

## `employer_filter` (type: `string`):

Classification is evidence-based and can remain unknown. Direct only excludes uncertain classifications.

## `check_email_domains` (type: `boolean`):

Optional public DNS-over-HTTPS MX lookup. Checks domain mail configuration only, not the mailbox, deliverability or consent. Shares the total HTTP budget.

## `max_email_domain_checks` (type: `integer`):

Run-level limit; checks only run when enabled. No SMTP probes.

## `monitor_id` (type: `string`):

Optional stable slug (max 80 characters). Enables private run-owner scoped history on Apify with Limited permissions. Leave empty for one-time research. Use one non-overlapping schedule per monitor.

## `only_changes` (type: `boolean`):

Requires monitor_id. The first run is a baseline: new means first observed by this monitor, never newly opened. All change events remain in CHANGES_JSON.

## `location_provider` (type: `string`):

Offline uses curated cities. GeoNames resolves other cities when a username is supplied. Search only uses a paid web-search provider and does not enforce distance.

## `geonames_username` (type: `string`):

Needed only for GeoNames city lookup; subject to public API credits and attribution.

## `registry_provider` (type: `string`):

Candidate legal entities only; results require independent identity matching and never prove revenue.

## `registry_api_key` (type: `string`):

Only required for Companies House and OpenCorporates. Supply your own authorized key.

## `max_registry_requests` (type: `integer`):

0 disables registry calls even if a provider is selected. Bounds external registry queries per run.

## `free_source_mode` (type: `string`):

Resilient automatically uses independent French company registry and Wikidata sources where available, with public OpenStreetMap discovery. Sources share one strict HTTP and runtime budget; no source guarantees complete coverage.

## `required_technologies` (type: `array`):

Keep records with supported technology references. Evidence is static and does not verify an installation.

## `excluded_technologies` (type: `array`):

Drop records with these observed references. An unobserved reference does not prove absent software.

## `required_business_signals` (type: `array`):

Keep records with these positive source-backed website observations. Routes are not functionally tested.

## `signal_match` (type: `string`):

all or any within each positive list. Different nonempty lists are combined with AND; observed excluded technologies always reject.

## `include_crm_review` (type: `boolean`):

Generate explained possible-duplicate candidates for the delivered research list. Records are never merged or deleted. Native RapidFuzz engine; no network or AI call.

## `include_documents` (type: `boolean`):

Read bounded, observed same-company PDF links. Preserve source URL, hash, date, page number, text and tables. Scanned documents require OCR and are labelled explicitly. Uses this run request/time budget.

## `max_documents_per_company` (type: `integer`):

Only used with include_documents=true.

## `max_document_pages` (type: `integer`):

Only used with include_documents=true; output is bounded and truncation disclosed.

## `include_browser` (type: `boolean`):

Unavailable in the standard lean build; rejected before research. Requires Dockerfile.apify-browser, its deployment capability flag, and at least 1024 MiB. Render the public company page with Playwright, collect a bounded JPEG and limited observed DOM checks. No full accessibility/performance certification. Costs are not yet benchmarked; opt in for small lists.

## `browser_timeout_seconds` (type: `integer`):

Shares the run time and HTTP request budget; resources may be blocked by robots or request limits.

## Actor input object example

```json
{
  "websites": [
    "https://www.iana.org/"
  ],
  "dataset_website_field": "website",
  "buyer_profiles": [
    "general",
    "recruiting",
    "web_agency",
    "automation_agency",
    "seo_agency",
    "ecommerce_agency",
    "crm_consulting",
    "analytics_consulting",
    "customer_support",
    "hospitality_tech"
  ],
  "contact_requirement": "any",
  "min_opportunity_score": 0,
  "exclude_domains": [],
  "sector": "professional_services",
  "cities": [
    "Hamburg"
  ],
  "country_code": "DE",
  "radius_km": 10,
  "language": "en",
  "max_results": 1,
  "max_requests": 12,
  "max_pages_per_company": 1,
  "timeout_seconds": 45,
  "paid_provider": "none",
  "max_paid_requests": 5,
  "ai_provider": "none",
  "include_web_experience": false,
  "max_crux_calls": 5,
  "max_ai_calls": 10,
  "max_output_tokens": 500,
  "include_jobs": false,
  "job_keywords": [],
  "job_max_age_days": 0,
  "max_jobs_per_company": 10,
  "max_job_requests_per_company": 2,
  "require_jobs": false,
  "employer_filter": "all",
  "check_email_domains": false,
  "max_email_domain_checks": 10,
  "monitor_id": "",
  "only_changes": false,
  "location_provider": "offline",
  "registry_provider": "none",
  "max_registry_requests": 0,
  "free_source_mode": "resilient",
  "signal_match": "all",
  "include_crm_review": false,
  "include_documents": false,
  "max_documents_per_company": 1,
  "max_document_pages": 3,
  "include_browser": false,
  "browser_timeout_seconds": 15
}
```

# Actor output Schema

## `runProgress` (type: `string`):

Acknowledged dataset record count and spending-limit status. Ordinary runs save each completed record; monitoring delivers after comparing the batch.

## `opportunityReport` (type: `string`):

Interactive shortlist with profile priorities, company briefs, source evidence, contacts, jobs, filters and CSV download. Opens as a portable single HTML file; no external assets or AI call.

## `companies` (type: `string`):

Discovered businesses, public contacts, source links, timestamps and uncertain research signals.

## `companiesCsv` (type: `string`):

Apify dataset CSV export. Prefer the HTML shortlist CSV or CLI CSV for formula-safe spreadsheet output; JSON preserves nested evidence.

## `runReport` (type: `string`):

Request/call statistics, limitations, source attribution and warnings. Contains no provider keys or input snapshot.

## `unbilledRecords` (type: `string`):

Website, status and reason only for reports excluded by the quality policy. These are not paid dataset items. Platform usage and the start event remain separate.

## `noWebsiteLeads` (type: `string`):

Map listings that publish no website, with name, address, phone and listing link. Not paid dataset items. Verify before outreach.

## `changes` (type: `string`):

Events from monitoring; missing observations never establish closure. Empty when monitoring is off.

## `crmRows` (type: `string`):

Flat CRM rows, including opportunity scores, proposed next steps, proof URLs, contact freshness and bounded evidence JSON.

## `snapshot` (type: `string`):

Bounded history for this run. Present only when monitor_id is supplied; no provider keys or input snapshot.

## `customerProfiles` (type: `string`):

Localized customer questions, actual signals, deliverables and known limits for all ten profiles.

## `duplicateReview` (type: `string`):

Present with include_crm_review=true. Explains candidate matches among delivered records; preserves branches and never modifies CRM data.

# 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 = {
    "websites": [
        "https://www.iana.org/"
    ],
    "buyer_profiles": [
        "general",
        "recruiting",
        "web_agency",
        "automation_agency",
        "seo_agency",
        "ecommerce_agency",
        "crm_consulting",
        "analytics_consulting",
        "customer_support",
        "hospitality_tech"
    ],
    "sector": "professional_services",
    "language": "en",
    "max_results": 1,
    "max_requests": 12,
    "max_pages_per_company": 1,
    "timeout_seconds": 45,
    "include_jobs": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("ryanbot_research/ryanbot-company-research").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 = {
    "websites": ["https://www.iana.org/"],
    "buyer_profiles": [
        "general",
        "recruiting",
        "web_agency",
        "automation_agency",
        "seo_agency",
        "ecommerce_agency",
        "crm_consulting",
        "analytics_consulting",
        "customer_support",
        "hospitality_tech",
    ],
    "sector": "professional_services",
    "language": "en",
    "max_results": 1,
    "max_requests": 12,
    "max_pages_per_company": 1,
    "timeout_seconds": 45,
    "include_jobs": False,
}

# Run the Actor and wait for it to finish
run = client.actor("ryanbot_research/ryanbot-company-research").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 '{
  "websites": [
    "https://www.iana.org/"
  ],
  "buyer_profiles": [
    "general",
    "recruiting",
    "web_agency",
    "automation_agency",
    "seo_agency",
    "ecommerce_agency",
    "crm_consulting",
    "analytics_consulting",
    "customer_support",
    "hospitality_tech"
  ],
  "sector": "professional_services",
  "language": "en",
  "max_results": 1,
  "max_requests": 12,
  "max_pages_per_company": 1,
  "timeout_seconds": 45,
  "include_jobs": false
}' |
apify call ryanbot_research/ryanbot-company-research --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ryanbot_research/ryanbot-company-research"
        }
    }
}
```

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/oICdrQcN4y6yciROf/builds/f8oz64w4id3LOTryE/openapi.json
