Developer API · v1

78,437 verified realtor contacts, one GET away

The same dataset behind our lists — as a REST API for Clay tables, Zapier zaps, n8n flows and your own code. Free key, free counts; you only spend credits when you pull contact rows.

Get your free API key →

Quickstart

# 1. Create a free key at agentroster.ca/account → “API access”
# 2. Counts are free — how many Top Producer brokers in Durham?
curl "https://agentroster.ca/api/v1/count?region=Durham&producer_tier=Top%20Producer&is_broker=Y" \
  -H "Authorization: Bearer ar_your_key_here"

# → {"count": 63, "one_time_csv_price_cad": 29, ...}

# 3. Pull the rows (1 credit each)
curl "https://agentroster.ca/api/v1/agents?region=Durham&producer_tier=Top%20Producer&is_broker=Y&limit=100" \
  -H "Authorization: Bearer ar_your_key_here"

Endpoints

Endpoint Returns Cost
GET /api/v1/me Key info: email, credit balance, active subscriptions. Free
GET /api/v1/regions Filterable regions with agent counts. Free
GET /api/v1/cities Filterable cities with agent counts. Free
GET /api/v1/count Exact match count for any filter set (+ the one-time CSV price). Free
GET /api/v1/agents Full contact rows: name, email, phone, brokerage, website, awards… 1 credit / row
GET /api/v1/events The Signals feed: new agents, brokerage moves, departures — with dates. Signals/Intel sub

Auth: Authorization: Bearer ar_… or X-API-Key header. All responses JSON. Limits: 100 units a minute per key, and a call uses one unit per 100 /agents rows, rounded up (so at most 10,000 rows or 100 calls a minute); past that the answer is 429, so wait a minute. 402 means the page needs more credits than the key holds. 503 means busy, so retry the same call in a few seconds. A refused call is never charged.

Filters (query params on /count and /agents)

region e.g. Toronto, Peel, Durham — values from /regions
city e.g. Mississauga — values from /cities
source Royal LePage · Century 21 · RE/MAX · Right at Home · Sutton
producer_tier Top Producer (award winners)
website_type custom = agents with their own site
email_type personal_domain = own-brand email
is_broker / has_phone / has_website Y to require the flag
top1pct 1 = top producers who also own a website
limit / offset paging on /agents — limit ≤ 1000, default 100

Recipes

Clay — enrich or source rows

Add an HTTP API column → GET https://agentroster.ca/api/v1/agents?city={{City}}&limit=25 with header Authorization: Bearer ar_…. Map agents[].email / .phone / .brokerage into columns. Use /count first (free) to size a market before spending credits.

Zapier / n8n / Make — new-agent automation

Poll /api/v1/events?type=new_agent on a schedule (weekly matches our scan cadence; dedupe on id) and pipe every new licensee in your market straight into your CRM, cold-email tool or Slack. Requires an active Signals or Brokerage Intel subscription on the key's email — the API is just another way to receive what you already pay for.

Plain code

const res = await fetch(
  'https://agentroster.ca/api/v1/agents?region=Calgary&website_type=custom&limit=200',
  { headers: { Authorization: `Bearer ${process.env.AGENTROSTER_KEY}` } }
);
const { agents, credits_remaining } = await res.json();

Credits

1 credit = 1 contact row from /agents. Counts, metadata and the events feed never use credits. Buy from your account page — credits never expire.

Starter pack
$49 CAD
1,000 credits · $0.049/row
Growth pack
$199 CAD
10,000 credits · $0.020/row

Need bigger volume or a partnership (Clay data provider, reseller)? Email hello@agentroster.ca.

Business contact data compiled from public brokerage rosters. API use is subject to our terms — you're responsible for CASL-compliant outreach, and agent opt-outs propagate to API responses. No reselling raw data.

Where should we send the file?

The CSV and your Stripe receipt go to this address. Nothing else, and it is never shared.

Bounce guarantee: email the list within 30 days. For every address that hard-bounces, send us the bounce report and we refund that row's share of what you paid.

See 25 free contacts first