Public API

RemNavi API — for journalists, researchers, and curious operators

Four read-only endpoints, all CORS-enabled, no auth, no API key, no rate-card. The data behind every editorial piece on this site is reproducible from these URLs. Cite the responses in research; subscribe to a feed of any filter; verify our claims against the live corpus.

Licensed CC BY 4.0. Attribution: link back to remnavi.com.

GET /jobs_api.php

jobs_api.php — current corpus + facets

The primary read endpoint. Returns the current job corpus with optional filters and a small facet engine for hybrid mix, HTS by company, and trend snapshots.

Examples

  • Default — most-recent listings

    curl 'https://remnavi.com/jobs_api.php?limit=10&order=recent'
  • Filter by category

    curl 'https://remnavi.com/jobs_api.php?category=engineering&limit=20'
  • Filter by ATS source

    curl 'https://remnavi.com/jobs_api.php?source=Greenhouse&limit=20'
  • Hybrid-mix facet — corpus-level remote / hybrid / unclear breakdown

    curl 'https://remnavi.com/jobs_api.php?facet=hybrid_mix'
  • HTS by company — disclosure quality for the named hubs

    curl 'https://remnavi.com/jobs_api.php?facet=hts_by_company'
  • Trend overview — daily corpus metrics, last 30 days

    curl 'https://remnavi.com/jobs_api.php?facet=trend_overview&days=30'

Response shape

{
  "total": 8889,
  "jobs": [
    {
      "id": 9964119,
      "title": "Staff Software Engineer",
      "company": "okta",
      "url": "https://...",
      "source": "Greenhouse:okta",
      "category": "Tech",
      "location": "Bengaluru, India",
      "salary": null,
      "posted_at": "2026-05-01T08:53:30+00:00",
      "hybrid_classification": "hybrid",
      "hybrid_transparency_score": 10
    }
  ]
}

Limit defaults to 100, max 5000. Order options: recent, alpha. Facets are mutually exclusive — pick one per request.

GET /feed.php

feed.php — RSS 2.0 of any filter

Same filter surface as jobs_api.php but emits RSS 2.0. Subscribe in any feed reader (Feedly, Inoreader, Slack RSS bot, NetNewsWire) for a live view of any cut of the corpus.

Examples

  • All recent listings

    curl 'https://remnavi.com/feed.php' -H 'Accept: application/rss+xml'
  • $120k+ AI/ML roles

    curl 'https://remnavi.com/feed.php?q=ai&salary_min=120000'
  • Greenhouse-sourced engineering, RRS ≥ 70

    curl 'https://remnavi.com/feed.php?source=Greenhouse&category=engineering&rrs_min=70'
  • Include hybrid listings (default is fully-remote only)

    curl 'https://remnavi.com/feed.php?remote=include_hybrid'

Response shape

application/rss+xml — channel + 50 latest <item> elements with title, link (via /go.php for click attribution), pubDate, guid, dc:creator.

Standard RSS 2.0 with atom:self-link. ttl=10. Parameters: q, category, source, salary_min, rrs_min, posted_within (days, default 30), remote (strict | include_hybrid | only_hybrid | any).

GET /repost_clusters.php

repost_clusters.php — ghost-jobs / repost analysis

Returns clusters where the same role title and employer appear multiple times in the current corpus. Three tiers: duplicate (2 listings), persistent (3-4), chronic (5+). Powers the /editorial/ghost-jobs/ data piece.

Examples

  • Top 50 clusters across the whole corpus

    curl 'https://remnavi.com/repost_clusters.php?top=50'
  • Filter to a single employer

    curl 'https://remnavi.com/repost_clusters.php?company=Datadog&top=20'
  • Just the corpus-level summary

    curl 'https://remnavi.com/repost_clusters.php?top=0' | jq '.summary'

Response shape

{
  "as_of": "2026-05-01T...",
  "corpus_total": 8889,
  "summary": {
    "unique_role_keys": 7484,
    "clustered_role_keys": 846,
    "total_reposts": 1405,
    "repost_pct": 15.8,
    "tier_breakdown": { "duplicate": 614, "persistent": 163, "chronic": 69 }
  },
  "top_clusters": [
    { "title": "...", "company": "...", "count": 19,
      "tier": "chronic", "first_seen": "...", "last_seen": "..." }
  ]
}

Observational data, not accusatory. Some duplicates are legitimate cross-team or cross-region postings. See /editorial/ghost-jobs/ for the methodology.

GET /health.php

health.php — uptime + corpus integrity

Public health endpoint. Returns 200 with status:ok when all checks pass, 503 with status:degraded when any critical check fails. Suitable for journalist sceptics, uptime monitors, and integrity audits.

Examples

  • Just the status code

    curl -s -o /dev/null -w '%{http_code}\n' 'https://remnavi.com/health.php'
  • Full payload

    curl 'https://remnavi.com/health.php' | jq

Response shape

{
  "status": "ok",
  "timestamp": "2026-05-01T...",
  "checks": [
    { "name": "db_reachable",            "pass": true },
    { "name": "corpus_nonempty",         "pass": true, "detail": { "listings": 8889 } },
    { "name": "metrics_recorder_recent", "pass": true },
    { "name": "ingest_recent",           "pass": true }
  ],
  "corpus": { "listings": 8889, "metrics_last_run_utc": "..." }
}

Failing checks: DB unreachable, jobs table empty, metrics recorder ran > 36h ago, most recent listing > 36h old. Designed for external uptime monitors with one ping = many signals.

Reasonable use

The endpoints have no enforced rate limit but please be reasonable — a single-digit number of requests per minute is fine; pulling the full corpus thousands of times an hour is not. If you have a research project that needs heavier access, email press@remnavi.com and we'll find a path that doesn't pressure the database.

All responses ship CORS headers (Access-Control-Allow-Origin: *) so the endpoints work from any browser-side application without proxying.

Citing the data

For academic or editorial use, a suggested citation: RemNavi (2026). Live remote-tech corpus, accessed [date], from https://remnavi.com/jobs_api.php. Per-listing audit trails are also citable individually — see /editorial/ghost-jobs/ and /editorial/hybrid-transparency-score/ for editorial pieces that document methodology.

What is not in this API

No applicant data. No employer-private endpoints. No internal analytics. The endpoints expose the same data that powers the public site — nothing more. If you find something on remnavi.com you can't get from these endpoints, that's a documentation gap; please flag it via the corrections form.