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.
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.
https://www.enginerds.com/v1/signalCompass 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.
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.
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.
/no keyDiscovery — 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.
/searchResolve 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 kind — entity or org — telling you which endpoint to call next.
/coverage-mixWhat 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.
/velocityTop movers by recent velocity (which way coverage is accelerating). Params: node (a single entity id — returns just that one), limit (1–200, default 50).
/emergenceNewly appearing or rising-from-a-low-base entities. Param: limit (1–200, default 50).
/connectionsWhat 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.
/evidenceThe 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).
/event-windowBefore/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.
/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.
/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.
/orgsThe organization directory + "on the move" rail. Params: sort (size | movers, default size), limit (1–200, default 40).
/cooccurrenceThe topic co-movement matrix — how strongly topics' coverage volumes move together over time, with the cell count of co-active months.
/bridgeslegacyPairwise 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).
/ontologyExpand 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).
/changesWhat'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).
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 computedtotalArticles— size of the analyzed corpuscorpusStartUtc/corpusEndUtc— the span the signals coverextractionCoverage— 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 ofextractionCoverage.window— the measurement window (currentlyall-time)signalVersion— the signal-computation versionattribution/license— how to credit and the terms of usequotaRemaining— your remaining allowance
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 exampleentity,q, ormonthinyyyy-MMform).401— no key, an unrecognised key, or a revoked key. The response carriesWWW-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.
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.
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.
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.