Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

quivad

Net short positions disclosed to nineteen market regulators, since 2010.

Net short positions as disclosed to the nineteen market regulators that publish them - France, Belgium, Netherlands, Germany, Austria, Spain, Italy, Poland, the United Kingdom, Sweden, Norway, Ireland, Denmark, Finland, Greece, Luxembourg, plus Japan, Australia and the United States.

The asset is the history: positions go back to 2010 for the oldest regimes, and a regulator publishes what is open today and drops the rest.

No API key, no account, no quota to apply for. Every figure here was published by a public source; whoever republishes it should say so, and every answer carries the sentence to do it with.

Install

npm install quivad
import { moves, company, positions, ApiError } from 'quivad';

// What moved, and what the drift rules held back rather than serve wrong.

Zero dependencies, ESM, Node 18 or newer. The client is a thin layer: it builds the addresses, reads refusals as problem documents, and follows pages. Nothing stops you from calling the API with curl.

Endpoints

Address Answers
GET /api/moves What moved over the last thirty days, qualified
GET /api/company/{slug} One company: who is short of it now, and its archive
GET /api/fund/{slug} One fund, across every register that names it
GET /api/isins Every declared company: one ISIN and one address per line
GET /api/positions.jsonl.gz Every open position, in one file
GET /api/openapi.json The contract, generated from the constants the code serves
GET /api The human documentation, in five languages

The conventions, which are the same across the fleet

This API answers by the same convention as its two siblings (auregistre, titelia, quivad). What holds for one holds for the three.

  • No version in the address, and none in the body. The promise that replaces it is written in x-stability of the contract: a field may be added, none is removed or renamed under a caller, and an address does not move.
  • Refusals are RFC 9457 problem documents, served as application/problem+json. type is a documentation anchor that opens in a browser; title, status and detail say the rest. An error is never an HTML page - a program that calls .json() on one gets a parse error and goes looking for the fault in the wrong place.
  • Long collections are cut by limit and offset, never silently. The page block carries total, more, and the absolute address of the next and previous pages; the same two links travel in the Link header. An unreadable parameter falls back to the default rather than refusing, and an offset past the end is an empty list, not an error.
  • Every address in an answer is absolute. A response stored on somebody's disk has to say which host it came from.
  • source and served_by answer two different questions: who PRODUCED the figures, and who ANSWERED. Confusing them is how a republished figure gets credited to the wrong party.
  • Every answer carries a weak ETag and honours If-None-Match: hand it back and get a 304 with no body.
  • Discovery links on every answer (RFC 8631): service-desc points at the contract, service-doc at the human documentation. One answer in hand is enough to find the whole specification.
  • Rate limited by address, on /api only, and a cached answer does not count. A 429 carries retry-after and says how long to wait in the body.

What the data does not say

  • A position is the most recent declaration of a fund, never a sum. A fund redeclares at every move, and several regulators leave the end date empty on all of those lines: adding them up gave 3 242% of one company's capital.
  • A market the drift rules flag is held back, and named in held_back. A truncated register shows every fund as having left.
  • Japan, Australia and the United States are not under EU regulation 236/2012. They are here because they are the large markets outside Europe that publish this at all.
  • FINRA counts SHARES, where every European register counts a share of capital. The unit travels with every figure and the two are never added.
  • The United Kingdom stopped naming position holders on 13 July 2026 (FCA PS26/5). Those rows say so: holder is null and aggregated is true.

Examples

Runnable, in examples/: curl.sh, node.mjs, python.py.

Licence

The client code in this repository is MIT (see LICENSE).

The data is not covered by that licence: Public registers of the market authorities. Cite the source when you republish it - every answer carries the sentence to do it with.

Reporting something wrong

A wrong line is worth an issue: https://github.com/quivad/api/issues. Name the address you called and what you expected; the answer carries served_by, which is what says the figure came from here rather than from the register itself.

About

Net short positions disclosed to nineteen market regulators, since 2010. Official zero-dependency client for the QuiVad API.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages