Everything below was run against the live API and pasted in. If a response here does not match what you get back, the page is wrong and we want to know.
Open the app, go to API, press Generate new key. It is shown once — only a SHA-256 digest is stored, so there is no way to recover it later. Calls you make inside the app are not billed; calls carrying a key are.
The apikey above is the project's publishable key and is printed in full on purpose — it identifies the project and grants nothing on its own. Every row you can reach is decided by a policy in the database, which is why it can sit in this page and in the site's own JavaScript. The one in p_key is yours, is not publishable, and is the one that is billed.
Every endpoint is a POST, including the reads. That is deliberate: it keeps your key out of URLs, where it would end up in server logs, browser history and anything that ships a referrer header.
Takes a ticker, a ten-digit CIK, or part of a name. Returns the identifier the other two calls take. A company with three listings is one entity here, because resolution happens on the CIK.
Two entities, correctly kept apart. events is how many events read by the model have reached it, which is a reasonable way to pick when a name is ambiguous.
Companies one or two relationships away, ranked by bridges — how many independent paths reach them. One shared director is a coincidence; seventeen is a relationship.
via_name is null at one hop — there is no intermediate, the two are connected directly. At two hops it names the company or the person the path runs through: TransDigm is reached from Honeywell by way of BWX Technologies, which selects both as compensation peers.
Ranking puts every one-hop neighbour ahead of every two-hop one, because a direct link always has more independent paths behind it. Honeywell has 81 companies at one hop, so a p_limit below that returns nothing but hops: 1 however you set p_hops — which is why the call above asks for 100. Set it by how deep you want to read, not by how many rows you want back.
p_id accepts a ticker, a CIK or a node_id, so you can skip /search when you already hold an identifier.
Events read by the model indexed by the company they reached, not the company they were about. Watching Honeywell surfaces a press release about Moog.
The evidence field is pipe-separated and its first segment is the document. Four shapes, and they are distinguishable without asking:
topics_semi.csv and topics_commodity.csv read the same way. The segment after the pipe is the pair or the topic rather than a filing: vendor peer list|RLJ->CLDT, topics_semi.csv|fpga. There is no URL to build, which is the point of labelling it — you can tell it from a filing without looking it up.Every call needs an account. Pass p_key, or call from a signed-in session — the interface does the second, which is why using the app is not billed. A call with neither is refused with 28000. An account and a key are free; the free plan simply has the lowest ceiling. Usage appears in the app under API as it accrues.
Per hour, per account, enforced inside the database rather than in this page. A limit a static site imposes is a suggestion — the same function is one curl away. Going over returns 54000, with the count and the cap in the message.
There is no anonymous traffic to leave unbounded. Requiring an account is what makes the ceiling above real: every call belongs to someone, so every call can be counted. p_limit is capped inside each function as well, so no single call can be large regardless of plan.
invalid or revoked API key — the key does not match a live one. Revoked keys fail the same way as wrong ones.no company matches ZZZZ — the identifier resolved to nothing. Try /search.statement timeout — the query ran past the limit. Lower p_hops to 1, or retry: the first call for a company is the cold one.