Skip to main content
← Compass Signal Feed (API) · v1

Compass signals, delivered as JSON.

Not a stream of pages — a stream of measurements. The coverage endpoints deliver each topic's stories already classified by story type, claim stage, and framing; the movement, connection, and rollup endpoints return the measured fields behind that signal — always scored against the topic's own history. Your systems get the same source-linked signals that power Compass: coverage mix, movers, emerging topics, connections, organization rollups, and per-topic profiles. Read-only, dated, versioned, and traceable to cited articles — with the work of turning a raw feed into classified, baselined measurements already done before it reaches you.

Overview

Built for workflows, agents, and client work.

Use Compass measurements inside dashboards, briefing bots, research pipelines, alerts, and internal agents — and inside the client-facing work you produce, with attribution. Every response includes the corpus window and compute time, so each result is traceable. Measurements only: no predictions, verdicts, or buy/sell signals.

Base URL https://www.enginerds.com/v1/signal
Who it's for

Compass for systems & workflows

For builders, analysts, and teams that need Compass signals inside their own systems.

Best for: internal dashboards, briefing bots, client-monitoring workflows, research pipelines, and alert systems.

Not for: resale, public data products, raw article scraping, training datasets, market-data claims, or prediction workflows.

Pro vs. Signal API. Pro is for people using Compass directly in the app. The Signal API is for systems that need the same measured signals as JSON. Same price — different job.

Authentication

One key, on every request

Pass your API key on each call — as an X-Api-Key header or a bearer token. Keys come with the Signal Feed (API) plan (and with Plus, alongside the dashboard). The discovery endpoint is the one exception — it needs no key.

curl -H "X-Api-Key: <your-key>" \
  "https://www.enginerds.com/v1/signal/velocity?limit=10"

# or, equivalently:
curl -H "Authorization: Bearer <your-key>" \
  "https://www.enginerds.com/v1/signal/velocity?limit=10"

Your key carries a daily request quota — 5,000 requests/day by default — and every authenticated response returns the remaining allowance in an X-RateLimit-Remaining header (also mirrored as quotaRemaining in the response meta). Error responses and the keyless discovery endpoint carry neither. There's no uptime SLA yet — it's earned, not promised. What we do publish is live service status: whether measurements are current, how many sources are responding, and how much of the cited archive still resolves.

Endpoints

API endpoints

Each path below is shown relative to the base URL — append it to https://www.enginerds.com/v1/signal. All require a key except discovery. Most endpoints take an entity id — use /search first to resolve a name to one.

GET/no key

Discovery — the base URL itself. Service status, version, the corpus as-of date, and the list of endpoints. A free health check before you wire anything up.

GET/search

Resolve a name to an id (so you never have to guess internal ids). Params: q (required), limit (1–50, default 12). Each hit carries a kindentity or org — telling you which endpoint to call next.

GET/coverage-mix

What the coverage is made of — the flagship read. Per-period composition across story type × claim stage × framing tone, the individual coverage-event atoms (each with its cited sources), and the storyline threads. Param: entity (required). Measurements of the coverage, never a verdict on the product.

GET/velocity

Top movers by recent velocity (which way coverage is accelerating). Params: node (a single entity id — returns just that one), limit (1–200, default 50).

GET/emergence

Newly appearing or rising-from-a-low-base entities. Param: limit (1–200, default 50).

GET/connections

What an entity is covered alongside, ranked by measured shared coverage + cited events — each row carries the citedEvents behind it. Params: entity (required), limit (1–100, default 40). Co-coverage, not a claim of any formal relationship.

GET/evidence

The sources behind a number. Resolves an entity (or comma-separated org family) + month to the full cited source list (outlet, title, date, link) and the "what happened" events. Params: entity (required), month (yyyy-MM, required).

GET/event-window

Before/after: how the make-up of an entity's coverage differs on each side of a date. Params: entity (required), date (ISO, required), days (14 / 30 / 90, default 30). Measures what changed in the coverage around the date — not that the event caused it.

GET/entity/{id}

The full signal profile for one entity — velocity, persistence, emergence, monthly presence, and its connections — plus provenanceRefs for the source articles behind it.

GET/org/{id}

An organization roll-up — the actor plus its confirmed family (subsidiaries, products, models), rolled into one profile with family-level metrics, members, and outward connections.

GET/orgs

The organization directory + "on the move" rail. Params: sort (size | movers, default size), limit (1–200, default 40).

GET/cooccurrence

The topic co-movement matrix — how strongly topics' coverage volumes move together over time, with the cell count of co-active months.

GET/bridgeslegacy

Pairwise edges with the legacy topicDistance / crossDomain fields. Retained for v1 stability; for new integrations prefer /connections, which leads with the evidence-grounded reads. Params: topicDistanceMin (0–1), crossOnly (bool, default true), limit (1–500, default 100).

POST/ontology

Expand a graph outward from one or more seeds. POST only because the query structure is nested — this is a read-only query that creates and changes nothing on the server. JSON body: start (comma-separated ids), hops (1–3), fanout (2–12), forcesOnly, minDistance (0–1), crossOnly. Returns nodes + edges (capped, with a truncated flag).

GET/changes

What's new: top movers, emerging, and connections in one call — ideal for a weekly digest. Params: limit (1–60), since (ISO timestamp; when run history exists, returns only what's new since the nearest prior run).

Response shape

Every response is an envelope

Each call returns data (the payload for that endpoint), meta (always present), and, where it applies, provenanceRefs (the source-article ids behind the result). Field names are camelCase. The meta block carries:

  • computedAtUtc — when this run was computed
  • totalArticles — size of the analyzed corpus
  • corpusStartUtc / corpusEndUtc — the span the signals cover
  • extractionCoverage — of the articles read in this run, the share Compass identified at least one company or technology in (0–1). It is the ceiling on how much of the corpus the signals could draw on.
  • citationCoverage — of the same articles, the share carrying at least one parsed source citation (0–1). Citation parsing is best-effort and older material is thinner, so this moves independently of extractionCoverage.
  • window — the measurement window (currently all-time)
  • signalVersion — the signal-computation version
  • attribution / license — how to credit and the terms of use
  • quotaRemaining — your remaining allowance
Errors

When something goes wrong

Every failure returns the matching HTTP status and a JSON body with a single error string explaining it in plain language. There is no meta block on an error, so quotaRemaining and the corpus stamps appear on successful responses only.

{ "error": "Daily quota of 5000 requests exceeded. Resets at 00:00 UTC." }
  • 400 — a required parameter is missing (for example entity, q, or month in yyyy-MM form).
  • 401 — no key, an unrecognised key, or a revoked key. The response carries WWW-Authenticate: Bearer.
  • 403 — the key is valid but the account's plan does not include API access.
  • 404 — the entity or the requested measurement does not exist. A topic Compass has not measured is a 404, not an empty success — you can tell "no coverage" from "no such thing".
  • 429 — the daily quota is spent. It resets at 00:00 UTC; the message names the limit.

An empty data array on a 200 means the query ran and matched nothing — that is a real answer about the coverage, not a failure, and it is worth handling separately from the error cases above.

Versioning

What we will and will not change under you

The path carries the major version (/v1/). Adding a field to a response is not a breaking change, so parse defensively and ignore fields you do not recognise. For a breaking change to a stable version we give 90 days' notice and keep the prior behaviour live throughout — shorter only where security, law, or data integrity leaves no choice. Every response carries signalVersion, so you can tell a measurement change from a schema change. See the API Terms for the full commitment.

Sample responses

What you actually get back

Illustrative. The field names and response shape below are exactly what you receive; the figures are a fixed, hand-picked example for readability — not a live response, and not the current corpus. For live values (as-of date, corpus size, current numbers), call the keyless discovery endpoint or any live endpoint with your key.

GET /v1/signal/velocity?limit=2 (illustrative)

{
  "data": [
    {
      "id": "openai",
      "name": "OpenAI",
      "type": "company",
      "isForce": false,
      "velocity": 4.7,
      "direction": "rising",
      "acceleration": 1.2,
      "persistenceCurrentRun": 9,
      "persistenceLongestRun": 14,
      "articleCount": 1320,
      "topics": ["Artificial Intelligence", "Developer Tools"]
    },
    {
      "id": "post-quantum-cryptography",
      "name": "Post-Quantum Cryptography",
      "type": "technology",
      "isForce": true,
      "velocity": 1.8,
      "direction": "rising",
      "acceleration": 0.4,
      "persistenceCurrentRun": 7,
      "persistenceLongestRun": 11,
      "articleCount": 214,
      "topics": ["Cybersecurity", "Standards"]
    }
  ],
  "meta": {
    "computedAtUtc": "2026-07-22T06:00:00Z",
    "totalArticles": 340000,
    "corpusStartUtc": "2025-04-01T00:00:00Z",
    "corpusEndUtc": "2026-07-21T18:40:00Z",
    "extractionCoverage": 0.93,
    "citationCoverage": 0.99,
    "window": "all-time",
    "signalVersion": "compass-signal-v2",
    "attribution": "Enginerds Compass",
    "license": "For your internal use and for attributed client-facing professional deliverables. Redistribution of the feed is prohibited. See /compass/api-terms. Measurements, not conclusions; correlational and coverage-limited.",
    "quotaRemaining": 4972
  }
}

GET /v1/signal/entity/post-quantum-cryptography (illustrative, trimmed)

{
  "data": {
    "id": "post-quantum-cryptography",
    "name": "Post-Quantum Cryptography",
    "type": "technology",
    "isForce": true,
    "articleCount": 214,
    "ubiquity": 0.0007,
    "topicSpread": ["Cybersecurity", "Standards"],
    "firstSeenUtc": "2025-04-18T00:00:00Z",
    "lastSeenUtc": "2026-07-06T00:00:00Z",
    "velocity": 1.8,
    "velocityDirection": "rising",
    "isEmerging": false,
    "emergenceScore": 0.21,
    "eventLinkCount": 12,
    "monthlyPresence": [
      { "month": "2026-06", "count": 14 },
      { "month": "2026-07", "count": 11 }
    ],
    "neighbors": [
      {
        "id": "nist",
        "name": "NIST",
        "type": "organization",
        "topic": "Standards",
        "crossDomain": true,
        "topicDistance": 0.62,
        "nPmi": 0.41,
        "score": 0.78,
        "eventLinkCount": 5
      }
    ]
  },
  "meta": { "...": "as above" },
  "provenanceRefs": ["article:8f2a91c4", "feed:1c9d77e0"]
}

provenanceRefs ids resolve to the source articles behind the entity — editorial ids map to the Enginerds reader; feed: ids map to the originating outlet.

Terms & use

What you can do with it

The Signal Feed is licensed for your internal workflows — briefings, internal tools, agents, monitoring, content pipelines — and for attributed measurements inside your own client-facing professional deliverables (advisory work, briefings, reports you prepare for your clients or audience). Redistribution or resale of the feed, public-facing data products built on it, and training datasets aren't covered by this plan. Always credit measurements to Enginerds Compass and keep the measurement framing.

And the standing rule, in the data itself: these are measurements, not conclusions — correlational and coverage-limited. They describe what the technology press is covering and how, not what will happen. The judgment stays yours.

Full terms: API Terms & Data License · Subscription & Billing · Terms of Service. Use of the API is subject to the API Terms and rate limits; outputs may not be resold, mirrored, or used to build a competing data feed.

Get a key — Signal Feed (API), $59/mo → See what's in the corpus See the weekly signal map
Source: Enginerds Compass — measurements over a longitudinal technology corpus. Correlational & coverage-limited; not investment advice. © Enginerds.