Skip to content
alder API

Developers

Open tech jobs, company hiring trends, posted salaries and market signals as JSON, and as tools for AI assistants over MCP. Read-only, no personal data. Free without a key; results are cached for 5 to 15 minutes. Cite alder and the date you read.

REST API

curl "https://alderhq.app/api/v1/companies/stripe/hiring?days=30"
curl "https://alderhq.app/api/v1/jobs?role=backend-engineer&country=DE&remote=true&limit=10"
curl "https://alderhq.app/api/v1/salaries?role=software-engineer&geo=nyc"
GET /api/v1/companies/{id}
Company profile: open roles, opened and closed in 30 and 90 days, top families, signals
GET /api/v1/companies/{id}/jobs
A company's open roles, newest first
GET /api/v1/companies/{id}/hiring
Daily series of open, opened and closed roles, with trend (?days=7..365)
GET /api/v1/jobs
Search: ?q= &role= &country= &remote= &company= &seniority=
GET /api/v1/jobs/{id}
One job with posted pay and sponsorship intel
GET /api/v1/salaries
Posted-pay percentiles: ?role= (required) &geo= (country or metro) &seniority=
GET /api/v1/signals
Market signals: open roles, openings and closings, by role family, fastest hirers
GET /api/v1/events
Typed job and company events (API key required, see below)
  • Responses are { data, next_cursor, citations, attribution }. Pass next_cursor back as ?cursor= for the next page; it is opaque.
  • citations lists the alder pages behind the data. Quote them.
  • ETag on every response: send If-None-Match and get 304. CORS is open for GET.
  • Free tier: 100 requests a day per IP (UTC). With a key (Authorization: Bearer alk_..., created in your profile) the key's own daily quota applies. X-RateLimit-Remaining and X-RateLimit-Reset on every response; 429 carries Retry-After.
  • OpenAPI 3.1: /openapi.json. Discovery: /.well-known/api-catalog, /llms.txt.

MCP server for AI assistants

Remote MCP over Streamable HTTP at https://alderhq.app/mcp. Read-only, no sign-in on the free tier (300 tool calls a day per IP). Every result is compact JSON with alder citation URLs. Server card: /.well-known/mcp/server-card.json.

search_jobs
Open roles by role, country, remote, company
get_company
Company hiring profile
company_hiring_trend
Daily open/opened/closed series and trend
salary_benchmark
Posted-pay p25, median, p75
list_signals
Market-wide hiring signals
is_company_hiring
Short yes/no answer with 30-day numbers

Claude

claude.ai and Claude Desktop: Settings, Connectors, Add custom connector, URL https://alderhq.app/mcp, no authentication. Claude Code:

claude mcp add --transport http alder https://alderhq.app/mcp

Claude Desktop through a config file (claude_desktop_config.json):

{
  "mcpServers": {
    "alder": { "command": "npx", "args": ["-y", "mcp-remote", "https://alderhq.app/mcp"] }
  }
}

ChatGPT

Settings, Connectors, Advanced, turn on Developer mode, then Create: name alder, MCP server URL https://alderhq.app/mcp, authentication none. Menu names change; the URL is all it needs.

Cursor

Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "alder": { "url": "https://alderhq.app/mcp" }
  }
}

Clients that send headers can use an API key for a per-key quota instead of the per-IP one:

{
  "mcpServers": {
    "alder": { "url": "https://alderhq.app/mcp", "headers": { "Authorization": "Bearer alk_..." } }
  }
}

Events feed

Typed job and company events with evidence. Needs an API key.

Request

curl -H "Authorization: Bearer alk_..." \
  "https://alderhq.app/api/v1/events?company=stripe&type=company&since=2026-10-01"

Keys are created and revoked in your profile. Read-only, newest first, JSON.

Parameters

company
company id, comma separated, up to 20
type
event type, comma separated, or job / company
since
ISO date or time, or epoch ms. Default: last 7 days
limit
1 to 100, default 50
cursor
next_cursor of the previous page

Event types

job.opened · job.updated · job.closed · job.reposted · job.reopened · job.salary_added · job.salary_changed · company.hiring_spike · company.hiring_contraction · company.new_department · company.geographic_expansion · company.compensation_shift

Response

{
  "data": [{
    "id": "48213",
    "type": "company.hiring_spike",
    "company": "stripe",
    "job": null,
    "detected_at": "2026-11-04T05:41:12.000Z",
    "window": { "from": "2026-10-28T00:00:00.000Z", "to": "2026-11-04T00:00:00.000Z" },
    "prev": { "opened_per_week_mean": 6.5, "opened_per_week_sd": 2.1, "weeks": 4 },
    "new": { "opened_7d": 31, "ratio": 4.8 },
    "evidence": [{ "kind": "company_daily", "from": "2026-10-28", "to": "2026-11-03", "daily_added": [4, 5, 3, 6, 5, 4, 4] }],
    "confidence": 0.9,
    "method_version": "1.0",
    "basis": "observed"
  }],
  "next_cursor": "ZToxMjM"
}
  • basis: observed, employer_provided, reconstructed or inferred.
  • window: when it happened. A job event is between two polls of the board; a company event covers the days compared.
  • Company events compare a company with its own history. A board with a failed poll in the window, or too little history, emits none: a missed poll is not a hiring freeze.
  • A role leaving a board does not mean it was filled. Posted pay is not actual pay.

Limits

1,000 requests a day per key (UTC), 120 a minute. 429 with Retry-After past either; X-RateLimit-Remaining on every response. Cite alder and the date you read.