QueryTracker Literary Agent Directory Scraper
QueryTracker Literary Agent Directory Scraper
Extract literary agent profiles from QueryTracker — the #1 querying-author platform with no Apify competitors. Scrapes agent name, agency, genres, query status (open/closed), query method, social links, agency website, and profile last-updated date from every public /agent/<id> profile page.
QueryTracker's public profile pages expose agent data without a login. Premium-tier fields (per-user query history, full response statistics) are member-gated and are not scraped.
Features
- Enumerates agents by sequential numeric ID across the full QueryTracker namespace (IDs 4901–21852+, ~2,000 active profiles)
- Skips non-existent agent IDs gracefully — no errors, no wasted PPE charges
- Extracts all publicly-visible fields: name, agency, website, genres (fiction and nonfiction sub-genres), query status, query method, Twitter/social links, and last-updated date
- Detects open vs. closed query status from the profile page without any member login
- Configurable start/end ID range so you can scrape a slice or the full directory
- Polite crawl rate (5 concurrent requests) — no proxy required, no Cloudflare, no CAPTCHA
Who Uses Literary Agent Data?
- Query-CRM builders — import the full agent directory into your tool so authors can track which agents they have queried
- Author-services platforms — match manuscripts to agents by genre and query status
- Literary data resellers and enrichment pipelines — combine with Poets & Writers data for a complete agent intelligence layer
- Academic and market researchers — analyze genre coverage, query method distribution, and open-vs-closed rates across the agent market
- Book startup founders — build genre-specific agent shortlists for recommendation features
How It Works
- The actor generates candidate URLs for each numeric agent ID in your configured range (default 4901–5000 for fast runs; full range 4901–21852 for bulk scrapes).
- Each page is fetched with a Cheerio HTML crawler — no JavaScript rendering needed, all profile data is server-rendered.
- Pages that return "Agent Not Found" are silently skipped; only real agent profiles produce output records.
- Data is extracted from structured sections: General (website, socials), Query Methods, Genres, and Profile History (last update).
Input
Quick start: 10 agents from the default range
{
"startId": 4901,
"endId": 4950,
"maxItems": 10,
"sp_intended_usage": "Building an agent directory",
"sp_improvement_suggestions": ""
}
Full directory crawl
{
"startId": 4901,
"endId": 21852,
"maxItems": 0,
"sp_intended_usage": "Full directory export",
"sp_improvement_suggestions": ""
}
Single agent by ID
{
"startId": 4901,
"endId": 4901,
"maxItems": 1,
"sp_intended_usage": "Spot check",
"sp_improvement_suggestions": ""
}
Input Parameters
| Field | Type | Default | Description |
|---|---|---|---|
| startId | integer | 4901 | First agent ID to try in the enumeration range |
| endId | integer | 5000 | Last agent ID to try. Set to 21852 for the full known namespace |
| maxItems | integer | — | Maximum number of agent profiles to return. Set to 0 for no limit |
Output
Each record represents one public agent profile on QueryTracker:
{
"agent_id": "4901",
"agent_name": "Ms. Alice Speilburg",
"agency": "Speilburg Literary Agency",
"agency_website": "http://speilburgliterary.com",
"genres": "Action/Adventure, Crime/Police, Fantasy, Historical, Horror, Mystery, Science Fiction, Thrillers/Suspense",
"is_accepting_queries": false,
"query_method": "QueryManager",
"response_stats_summary": "",
"bio": "",
"profile_url": "https://querytracker.net/agent/4901",
"social_links": "https://twitter.com/alicespeilburg",
"last_updated": "05/16/2026 - Closed to queries."
}
Output Fields
| Field | Type | Notes |
|---|---|---|
| agent_id | string | QueryTracker numeric agent ID |
| agent_name | string | Agent full name with honorific (e.g. "Ms. Alice Speilburg") |
| agency | string | Literary agency name |
| agency_website | string | Agency website URL from the General section |
| genres | string | Comma-separated fiction/nonfiction genre list |
| is_accepting_queries | boolean | true if open to unsolicited queries, false if closed |
| query_method | string | How the agent accepts queries: QueryManager, email, form, postal mail, etc. |
| response_stats_summary | string | Aggregate response stats (empty on public profiles — member-gated) |
| bio | string | Agent bio (empty on public profiles — member-gated) |
| profile_url | string | Canonical QueryTracker profile URL |
| social_links | string | Comma-separated social media URLs (Twitter/X, Instagram, etc.) |
| last_updated | string | Most recent profile update date and change summary |
Note on member-gated fields: QueryTracker shows response statistics (average response days, reply rate) and agent bios only to logged-in members. The response_stats_summary and bio fields are intentionally empty — only public data is scraped per QueryTracker's access model.
ID Range Guide
QueryTracker uses a sparse numeric namespace. Not all IDs in a range correspond to active agents — the actor skips "Agent Not Found" pages automatically. Typical yield:
| Range | Approx. active agents |
|---|---|
| 4901–5000 | ~5–10 |
| 4901–10000 | ~200–400 |
| 4901–21852 | ~1,800–2,200 (full directory) |
For a full directory export, set endId: 21852 and maxItems: 0.
Legal Note
QueryTracker's public /agent/<id> profile pages are freely accessible without authentication. This actor scrapes only the information visible to any anonymous visitor. Premium-tier fields are not scraped. Always review QueryTracker's terms of service before using scraped data commercially.