Default shortlist
https://applydra.io/api/v1/jobs?limit=100Current, canonical job listings and filtered counts. Anonymous, read-only, cursor-paginated, and rate limited per client IP.
No account, token, cookie, or SDK is required.
https://applydra.io/api/v1 curl --fail 'https://applydra.io/api/v1/jobs?limit=100'With no filters, the API returns current canonical, link-present tech roles that are remote-classified, US-classified, and observed at their source within the last 7 days. Every query excludes recorded-closed and known-duplicate rows.
https://applydra.io/api/v1/jobs?limit=100https://applydra.io/api/v1/jobs?source=all&relevance=all&remote=all&geo=all&actionable=all&observedWithin=alllimit is an integer from 1 to 500 and defaults to 100. cursor is opaque. Unknown parameters, repeated scalar parameters, and malformed values return 400.
| Parameter | Default | Meaning |
|---|---|---|
| q | — | Searches title only using a literal case-insensitive substring; up to 100 characters. |
| relevance | tech | tech (technical plus analytical desk roles), non_tech, unknown, or all. |
| remote | remote | remote, hybrid, onsite, unknown, or all. |
| seniority | all | intern, junior, mid, senior, staff+, leadership, or all; leadership is people/organizational rank. |
| source | all | ATS/source key such as greenhouse; omit or use all for every source. |
| geo | us | us, eligible (US plus unknown), or all. |
| postedWithin | — | Posting age in days, from 1 to 3650. |
| observedWithin | 7 | Days since Applydra last observed the listing at its source, from 1 to 3650, or all. |
| firstSeenAfter | — | RFC 3339 instant; only roles whose firstSeenAt is strictly later, oldest first. For incremental sync. |
| changedAfter | — | RFC 3339 instant; only roles whose changedAt is strictly later, oldest first. Change feed; not combinable with firstSeenAfter. |
| comp | — | Requires the stated annual USD range to reach the threshold; from 1 to 10,000,000. |
| stack | — | Comma-separated ANY-of terms; up to 5 unique terms, 40 characters each. |
| sponsors | — | 1 requires explicit sponsorship availability. |
| clearance | — | no excludes explicitly required clearance; unknown remains. |
| citizenship | — | no excludes explicitly required US citizenship; unknown remains. |
| maxExperienceYears | — | 0 to 20; excludes roles whose stated required minimum years exceed it; roles stating none remain. |
| empl | — | full_time, part_time, contract, temporary, or internship. |
| actionable | 1 | 1 requires an apply URL; all disables that condition. |
unknown is an explicit unresolved classification for fields such as relevance, geo, and remote; it is not JSON null.
remoteConflict: true means authoritative structured workplace metadata conflicts with role text. Explicit restrictive role text can resolve the canonical workplace to hybrid or onsite; a direct unresolved clash is served as unknown. Heuristic-only uncertainty does not set this indicator. Strict remote filters exclude every non-remote verdict, while broadened queries retain them.
JSON null means a field was not stated or not established. For work-authorization booleans, false means the posting explicitly says the requirement does not apply, while null means it is silent or unresolved. A null url appears only after actionable=all; a null sourceSnapshotAt does not mean the listing was never observed.
freshness compares observedAt with the traversal's stable meta.asOf. stale means the listing was not observed in 48 hours; it remains distinct from a recorded closure.
links.next until nullResults are ordered by source posting time, newest first, with a stable ID tie-breaker and unknown timestamps last. A cursor is bound to its filters and carries a stable relative-date boundary. You may change limit, but do not inspect or edit the cursor.
let next = 'https://applydra.io/api/v1/jobs?limit=100';
while (next) {
const response = await fetch(next);
if (!response.ok) throw new Error(`Applydra returned ${response.status}`);
const page = await response.json();
for (const job of page.data) console.log(job.id, job.title);
next = page.links.next;
}import json
from urllib.request import urlopen
next_url = 'https://applydra.io/api/v1/jobs?limit=100'
while next_url:
with urlopen(next_url) as response:
page = json.load(response)
for job in page['data']:
print(job['id'], job['title'])
next_url = page['links']['next']Store the greatest firstSeenAt you received and pass it as firstSeenAfter on the next run. With firstSeenAfter, pages are ordered oldest-first by firstSeenAt rather than by posted date. The bound is strict at the served millisecond, and roles first seen within 5 minutes of meta.asOf are held back until writes that commit out of order have landed, so a resuming client neither repeats nor skips a role. firstSeenAt is first discovery: a role that starts matching your other filters later keeps its original value and is not returned again.
To also receive roles that start matching later, use the change feed instead: store the greatest changedAt you received and pass it as changedAfter. Pages are ordered oldest-first by changedAt, with the same strict millisecond bound and 5-minute hold-back. New roles, reclassified roles and reopened roles all move changedAt; company-level fields do not. A role that changes again mid-traversal can be delivered twice, and re-entry purely through observedWithin or postedWithin is not a change. changedAfter cannot be combined with firstSeenAfter.
let since = loadWatermark(); // greatest firstSeenAt from the previous run
let next = `https://applydra.io/api/v1/jobs?limit=500&firstSeenAfter=${encodeURIComponent(since)}`;
let newest = since;
while (next) {
const page = await fetch(next).then((response) => response.json());
for (const job of page.data) {
handleNewRole(job);
if (job.firstSeenAt > newest) newest = job.firstSeenAt;
}
next = page.links.next;
}
saveWatermark(newest);Seniority uses a conservative title fallback when evidence-grounded labeling is disabled or in shadow. In active allowlisted mode, exact posting evidence may establish, correct, or clear the canonical value. mid is an established rank distinct from null; leadership means people or organizational rank, not every occupational Manager title.
Stable Applydra ID, readable employer name, and source title.
Normalized source key plus explicit listing relevance and geographic classifications.
Source location plus normalized workplace and canonical seniority; mid is distinct from null.
Canonical seniority provenance: deterministic, llm, or null.
Source posting link and employer/source posting clock.
Best known application destination (the employer ATS link a source page points to, else url; not verified live) and the platform recognized from its host, or null when employer-hosted or unrecognized.
Provenance of company: posting, benchmark, listing, host, or slug.
Employer-published requisition ID when the source states one; null otherwise.
First and latest persisted Applydra observations of this listing identity.
Last time a served job field changed, or first discovery, since change tracking began; null when unchanged since then.
fresh when observed within 48 hours of meta.asOf; stale is retained coverage, not proof applications remain open.
Latest complete persisted source snapshot; nullable for sources without that lifecycle.
Workplace-evidence provenance and retained source-contradiction indicator.
Compensation exactly as stated; no estimates or conversions.
Field-scoped provenance for the compensation quartet: authoritative, llm, or null.
Explicit or supported technologies and employment type.
Posting-supported work authorization constraints.
Largest required minimum years of experience the description states; null when not stated.
{
"data": [{
"id": "job_12345",
"company": "Acme",
"title": "Platform Engineer",
"source": "greenhouse",
"relevance": "tech",
"geo": "us",
"location": "Remote, US",
"remote": "remote",
"seniority": "mid",
"senioritySource": "llm",
"url": "https://example.com/apply/123",
"applyUrl": "https://job-boards.greenhouse.io/acme/jobs/123",
"applyPortal": "greenhouse",
"companyNameSource": "posting",
"requisitionId": null,
"posted": "2026-07-23T12:00:00.000Z",
"firstSeenAt": "2026-07-20T14:30:00.000Z",
"changedAt": "2026-07-22T09:15:00.000Z",
"observedAt": "2026-07-24T11:55:00.000Z",
"freshness": "fresh",
"sourceSnapshotAt": "2026-07-24T11:50:00.000Z",
"remoteSource": "authoritative",
"remoteConflict": false,
"compMin": 150000,
"compMax": 190000,
"compCurrency": "USD",
"compPeriod": "year",
"compSource": "authoritative",
"stack": ["typescript", "postgres"],
"employmentType": "full_time",
"sponsorship": null,
"clearanceRequired": false,
"citizenshipRequired": null,
"experienceYearsMin": 3
}]
} OpenAPI is the current wire authority. This early-stage version 1 contract may change in place; no deprecation period, changelog, compatibility shim, migration window, or new major path is promised.
GET /statsdata.total counts matching jobs, data.remote counts the matching rows labeled remote, and data.companies counts distinct employers. Metadata includes generation time, matching-data observation time, and normalized effective filters.
{
"error": {
"code": "invalid_request",
"message": "Invalid query parameters",
"details": [{ "parameter": "limit", "reason": "must be an integer from 1 to 500" }]
}
} Application errors use a stable JSON envelope. Database messages, SQL, and stack traces are never returned. Applydra IDs are opaque; source-native posting identifiers are never exposed. requisitionId is the employer-published requisition when a source states one. 404 means a job ID is malformed or was never issued, or the /api/v1 path does not exist; other methods than GET and OPTIONS answer 405 in the same envelope.
308: the listing was folded into a canonical duplicate; follow Location. 410 gone: the listing was recorded closed; the body carries id and closedAt.
The edge proxy owns rate limiting, so its 429 body may not use the JSON envelope. Back off and retry rather than rotating identities.
List and stats responses cache for 30 seconds; job detail for 60 seconds; discovery documents for one hour. Send If-None-Match with the returned ETag to receive 304.
The operational request rules are stated in Acceptable use.
Effective July 28, 2026. The service operator is displayed as Applydra. No account or API key is required for the published anonymous read-only endpoints.
The current version 1 contract may change in place, including removal of fields or parameters and changes to defaults or meaning. No deprecation period, changelog, compatibility shim, migration window, or new major path is promised; consumers are expected to follow the current OpenAPI document and adapt. Applydra may block clients that bypass rate limits or other published controls and does not promise continued service availability.
Use bounded concurrency, cache responses and revalidate with ETags, treat cursors as opaque, follow links.next, and honor 429 and Retry-After. Traversal and caching within the published controls are allowed. Do not rotate identities, evade controls, or create disruptive load. No elevated-rate or bulk endpoint is promised.
To the extent Applydra owns the relevant rights, Applydra-authored factual metadata and derived fields may be reused for analysis, aggregation, redistribution, commercial work, and model training when attribution is retained and service controls are respected.
Use this attribution: Data source: Applydra — https://applydra.io/developers/api
This permission excludes employer and source-provided content, names and marks, posting URLs, and any rights Applydra does not own and therefore cannot grant.
Anonymous means no account or API credential; it does not make network use invisible. Applydra application code sets no authentication cookie. Client IP addresses may be processed in memory or by the proxy for rate limiting, but the application does not persist client IP addresses or query history.
When enabled, website pages load self-hosted, cookieless Umami analytics. It records page views with search parameters removed, plus three interaction events: a title search ran (never its text), an employer link opened (with the company name), and this API page was viewed. Umami stores no IP address; it derives coarse location and an anonymous rotating visitor hash from each request. API requests are not tracked.
Infrastructure providers may retain network metadata, so Applydra does not make an application-level no-logs guarantee for the entire delivery path. Do not put sensitive data in title queries. Employer links leave Applydra and are governed by the destination's policies.
The public API exposes the current canonical view, not an archive or tombstone feed. Listings and fields may change or disappear when lifecycle or known-duplicate state changes. No listing-version retention, tombstone retention, or service-availability retention period is guaranteed.
There is no public support channel or support SLA yet.
There is no public vulnerability intake yet. Vulnerabilities in employer, ATS, or other source systems are outside the Applydra security scope.
/api/health, /api/metrics, /healthz, and /readyz operate the Applydra service. They are deliberately absent from OpenAPI and carry no v1 job-data compatibility promise.