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 }. Passnext_cursorback as?cursor=for the next page; it is opaque. citationslists the alder pages behind the data. Quote them.ETagon every response: sendIf-None-Matchand get304. 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-RemainingandX-RateLimit-Reseton every response;429carriesRetry-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.