Docs. What Legible answers, how an answer reads, and every function.
What Legible answers
Legible hands out Europe’s official facts: laws in their own words, company records from the official registers, statistics, how companies are connected, and the Slovak accounting rulebook. Every answer is what a publisher published, and names that publisher. It comes down to six kinds of question.
A law’s passage on a date
What does § 6 ods. 1 of the hunting act say?
The passage word for word as the official collection of laws publishes it, in the version in force on the day you name (today when you name none), with that version’s dates and a link to it. Slovak acts come from Slov-Lex, EU acts from EUR-Lex.
Who the company is (its names, LEI, ISINs, country), every kind of record held about it with the newest few of each, and its links to other parties. Name one kind of record and you get its rows, newest first. When several companies carry the name, you get the list to pick from.
Rows of that one kind of record across companies, newest first, each row with the register it was published in. A register that is not held for a country is said so in the answer.
The series as dated points, newest first. A revised figure is a point of its own, so the series shows what was published when. When the words fit more than one series, you get the list to pick from.
Short sellers of VolkswagenHow is BlackRock connected to Volkswagen?
The parties linked to a company or to any other party (a fund, a holder, an authority, a person), each link named with its newest figure and the dates it was seen. Name a second party and you get the link between the two with the register rows that prove it, or the shortest chains from one to the other and everyone linked to both.
Paid the office rent by bank transfer. Which accounts?
The debit and credit accounts of the Slovak chart of accounts with their names, the rule and the paragraph of the accounting procedures it is quoted from, and when it applies. An account’s number instead returns what belongs on that account. It is the rulebook’s answer for a kind of transaction, never a booking of yours.
Each kind can be asked in a sentence or called as a function. What is held differs by kind of fact and by country: the list of what is reachable says what there is.
How an answer reads
Every answer, whichever way you ask, is one object with the same fields. Its status says what you got. Four of them you will meet every day.
An answeranswer
The fact is in data, with its source and the day it is for.
A choicechoose
More than one thing fits what you said. choose.options lists them, and every option carries the exact call to send next.
One questionquestion
One thing is missing. question is the sentence to ask, and choose.call is the call to send once you have the answer.
Nothing heldnot_held
Nothing is held for this. The notes say what is missing. Nothing is put in its place.
Nothing is guessed. What you name is read by its identifier first, then by its name in any spelling. When that does not settle on one thing, you get a choice or one question, and it always carries the exact call to send next, so nothing has to be pieced together.
What is held is handed out; what is not is said. Register rows, statistics and connections come from what is held. They are not fetched from a publisher while you wait, and a gap is not filled with a near match.
One answer, field by field
The answer to What does § 6 ods. 1 of the hunting act say?, as it arrives.
"legible": "1",
The version of this shape.
"function": "law_text",
The function that answered.
"status": "answer",
What kind of reply this is: an answer, a choice, one question, nothing held, or one of the rarer ones listed above.
"kind": "law.text",
What data holds, so software knows how to read it.
"route": "stored",
How the answer was reached.
storedread from what is held
livea law only: fetched from the official collection of laws for this answer (an act asked for the first time, an earlier version, an act’s list of versions)
not_heldnothing is held
"owner": "collider",
Which collection the answer was read from.
colliderthe laws
exalticcompany records, registers, statistics and connections
lledgerthe Slovak accounting rulebook
legibleLegible’s own list of what it reaches
"as_of": "2026-11-10",
The day the answer is for: the date you gave, or today.
"source": {
"publisher": "Slov-Lex (the Slovak Collection of Laws)",
"url": "https://static.slov-lex.sk/static/SK/ZZ/2009/274/20260601.html",
"citation": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"version": "20260601",
"valid_from": "2026-06-01",
"valid_to": null,
"checked_at": "2026-10-28T17:54:26+01:00"
},
Where the fact was published: the publisher, a link, the citation, the version and when it was last checked against the publisher. In a list of register rows, every row carries its own source as well.
"found": {
"act": {
"value": "274/2009",
"label": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"by": "name"
},
"passage": {
"value": "par-6.ods-1",
"label": "§ 6 ods. 1",
"by": "id"
}
},
How each thing you named was understood: its exact form in value, its name in label, and how it was settled in by.
idan identifier you gave
namea name that matched one thing
modelchosen from a short list of candidates, and only when the choice was sure
giventaken as you sent it
personpicked by you from a choice
"data": {
"act": {
"ref": "274/2009",
"title": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"kind": "zákon"
},
"version": {
"label": "20260601",
"valid_from": "2026-06-01",
"valid_to": null,
"in_force_on": "2026-11-10"
},
"passage": "par-6.ods-1",
"language": "sk",
"norms": [
{
"path": "par-6.ods-1",
"citation": "§ 6 ods. 1",
"kind": "odsek",
"text": "(1) Samostatnou zvernicou na účely tohto zákona je druh oploteného poľovného revíru s vhodnými podmienkami na intenzívny chov raticovej zveri, …",
"cites": []
}
],
"total": 1,
"truncated": false
},
The answer itself. Its shape follows kind; each function below says what it holds.
"choose": null,
Set when the status is a choice or a question, otherwise null.
"question": null,
The one question to ask, when the status is question.
"notes": [],
Sentences for the reader: what was assumed, what is missing, what a date changes. Pass them on.
"took_ms": 191
How long the answer took, in milliseconds.
A choice, and the call that settles it
Who is Erste Group? fits more than one company, so the answer is a choice. Send the picked option’s call as it is: the function, its arguments, and follow_up_of, which ties your pick to the question it answers. A question works the same way: choose.call holds the call, and your answer goes in as the argument choose.argument names.
{
"status": "choose",
"choose": {
"question": "Which company do you mean?",
"argument": "query",
"options": [
{
"value": "9e5aafdb-5afc-48b5-a419-e8d6437c00ff",
"label": "ERSTE GROUP BANK AG",
"detail": "AT, LEI PQOH26KWDF7CG10L6792, EBO",
"call": {
"function": "company",
"args": {
"query": "9e5aafdb-5afc-48b5-a419-e8d6437c00ff"
},
"follow_up_of": 306
}
},
{
"value": "88af6977-e974-45fd-92d7-4fe4839109f8",
"label": "Erste Group Immorent AG",
"detail": "AT, LEI 52990010424WD4ZP3J39",
"call": {
"function": "company",
"args": {
"query": "88af6977-e974-45fd-92d7-4fe4839109f8"
},
"follow_up_of": 306
}
}
]
}
}
The rarer statuses
Being taken intaking_in
A law asked for the first time is being taken in from its official source. Ask again in a minute.
Outsideoutside
The question is not about a kind of fact Legible hands out, or it asks only for a calculation or advice.
Not answeredrefused
The call cannot be made as sent: a function that does not exist, an argument it does not take, or a kind of fact the key does not cover. The note says which.
No reply from the sourceunavailable
The collection that holds this kind of fact did not reply. Nothing was made up instead. Try again shortly.
A failureerror
The request failed on Legible’s side and the failure is recorded. Nothing was guessed.
Three ways in
The same functions and the same answers stand behind all three. Choose by who is asking: you, your assistant, or your software.
This site
Type a question into the field on the front page. The answer is drawn for its kind: a law as text, a statistic as a line with its table, connections as a map, and under each, everything the answer holds. A choice is a list to pick from and a question is a field to fill. Signed out, it needs no key. Signed in, each question counts against your key.
Add Legible to an AI chat that takes custom connectors (MCP). Your assistant then calls the functions itself, asks you when Legible needs a choice, and cites the source. The connector’s address:
https://legible.one/api/mcp
Add a custom connector in your chat’s settings, with this address.
Your chat opens Legible’s sign-in. Give your e-mail and type the six-digit code that arrives.
Allow the connection.
Your e-mail is one key. Every chat you connect and the API share it, and every call your assistant makes counts against its daily limit.
At the limit a call answers that the limit is used up and starts again tomorrow.
The sign-in sends at most 5 codes an hour to one e-mail, and 5 wrong codes end a sign-in; a new code starts the next.
For software. Sign in and make your API key on your account page. It is shown once; making a new one stops the earlier one. It is the same key your chat uses, with the same daily limit.
Send the key in the X-API-Key header. Call a function with POST and its arguments as JSON, or with GET and its arguments in the query:
https://api.legible.one/v1/{function}
One request and its answer
The request
curl -X POST 'https://api.legible.one/v1/law_text' \
-H "X-API-Key: $LEGIBLE_KEY" \
-H "content-type: application/json" \
-d '{"act":"zákon o poľovníctve","passage":"§ 6 ods. 1"}'
Its answer
{
"legible": "1",
"function": "law_text",
"status": "answer",
"kind": "law.text",
"route": "stored",
"owner": "collider",
"as_of": "2026-11-10",
"source": {
"publisher": "Slov-Lex (the Slovak Collection of Laws)",
"url": "https://static.slov-lex.sk/static/SK/ZZ/2009/274/20260601.html",
"citation": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"version": "20260601",
"valid_from": "2026-06-01",
"valid_to": null,
"checked_at": "2026-10-28T17:54:26+01:00"
},
"found": {
"act": {
"value": "274/2009",
"label": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"by": "name"
},
"passage": {
"value": "par-6.ods-1",
"label": "§ 6 ods. 1",
"by": "id"
}
},
"data": {
"act": {
"ref": "274/2009",
"title": "Zákon o poľovníctve a o zmene a doplnení niektorých zákonov",
"kind": "zákon"
},
"version": {
"label": "20260601",
"valid_from": "2026-06-01",
"valid_to": null,
"in_force_on": "2026-11-10"
},
"passage": "par-6.ods-1",
"language": "sk",
"norms": [
{
"path": "par-6.ods-1",
"citation": "§ 6 ods. 1",
"kind": "odsek",
"text": "(1) Samostatnou zvernicou na účely tohto zákona je druh oploteného poľovného revíru s vhodnými podmienkami na intenzívny chov raticovej zveri, …",
"cites": []
}
],
"total": 1,
"truncated": false
},
"choose": null,
"question": null,
"notes": [],
"took_ms": 191
}
A sentence, or a function
ask takes any sentence, works out which functions it needs and runs them. When the sentence leaves that open, it comes back with a choice. Calling a function yourself skips that step: use it when your software already knows what it wants.
In a sentence
curl -X POST 'https://api.legible.one/v1/ask' \
-H "X-API-Key: $LEGIBLE_KEY" \
-H "content-type: application/json" \
-d '{"text":"What does Article 5 of GDPR say?"}'
To follow a choice, send the picked option’s call, with its follow_up_of as an argument or as the header X-Follow-Up-Of. The functions and their arguments are also served as JSON, without a key, at https://api.legible.one/functions.
Limits
Every key has its own daily limit, counted across the API, your chat and this site when you are signed in. Every call counts, whatever its status.
A key made by signing in is on the free plan. Your account page shows its limit and today’s count.
At the limit the API answers 429 and says the day’s calls are spent. The count starts again the next day.
When a call does not answer
Almost everything arrives as a normal reply with a status; only three things arrive as an HTTP error.
401
No key, or a key that is not valid. Send your key in the X-API-Key header.
429
The key’s calls for the day are spent. It starts again tomorrow.
422
follow_up_of is not the number an option’s call carried. Send it back unchanged.
refuseda status
The call cannot be made as sent: a function that does not exist, an argument it does not take, or a kind of fact the key does not cover. The note says which.
unavailablea status
The collection that holds this kind of fact did not reply. Nothing was made up instead. Try again shortly.
errora status
The request failed on Legible’s side and the failure is recorded. Nothing was guessed.
The functions
14 functions, by the kind of fact they answer. An argument that names a thing takes what you have: a number or an identifier, a name in any spelling, or a description.
A date takes 2025-01-01, 1. 1. 2025, a year, or words such as last year; with no date, today. Send the required arguments and none that a function does not list.
Any question
A sentence in, the right answer out.
Ask in your own words
ask
Any question in a sentence, in any language.
Legible decides what it asks for, then runs the right function, or several when the sentence asks several things, each answered from its own source. It never calculates or advises; it says so and still gives the text or records named.
Argument
What to put
Example
textrequired
the question, as a person would write it
Čo hovorí § 6 ods. 1 zákona o poľovníctve?
datea date
the day it should be answered for (default today)
Example, the arguments of POST /v1/ask
{
"text": "What does Article 5 of GDPR say?"
}
Comes back
kind
that of the function it ran, or parts
data
The answer of the function the sentence called for, in that function’s shape. A sentence that asks several things returns parts: a list of whole answers, each with its own status and source.
Law
Slovak and EU acts, in their own words, as in force on a day.
Read a law
law_text
The text of a Slovak or EU law, a whole act or one passage, as in force on a date (today when no date is given).
act takes whatever you have: a number (595/2003, 32016R0679, Regulation (EU) 2016/679), a name in any form (zákon o poľovníctve, polovnictvo, GDPR, ZDP) or a description. passage takes § 6 ods. 1, článok 5 ods. 1 písm. a), article 5(1)(a), or put it in act ("§ 6 ZDP"). The text is the source’s own, with its version and link. An act not held yet is taken in from its official source the first time it is asked for.
Argument
What to put
Example
actrequired
the act: number, name or description
zákon o poľovníctve
passage
a passage of it
§ 6 ods. 1
datea date
the day the text should be in force (default today)
2025-01-01
language
EU acts only: a 3-letter language (eng, slk, deu, fra …)
act (its number and title), version (its label and the days it is in force from and to), norms (the passages in order, each with its citation, heading, text and what it cites), total and truncated for a long act.
Search the law by meaning
law_meaning
Passages of the laws Legible holds, ranked by what they mean rather than the words they use, current text only.
Optionally inside one act (named any way law_text accepts). An act not held yet is taken in first; the answer then says so.
Argument
What to put
Example
queryrequired
what you are looking for, in your words
company cars
act
only inside this act
ZDP
Example, the arguments of POST /v1/law_meaning
{
"query": "company car used privately",
"act": "595/2003"
}
Comes back
kind
law.meaning
data
items: the passages ranked, each with its act, citation, text, score and link; acts_searched.
Find laws
law_find
Which acts exist: every Slovak and EU act in force, found by number, name or description.
With no query it lists the areas of law; with an area, the acts in it.
Argument
What to put
Example
query
a number, a name or words from a title
poľovníctvo
area
an area code from the list of areas
09
channel
sk (Slovak law) or eu (EU law)
sk
Example, the arguments of POST /v1/law_find
{
"query": "hunting"
}
Comes back
kind
law.find
data
acts: each with its number, title (and English title), kind, area, whether it is in force and whether it is held. With no query, areas.
An act’s versions
law_versions
Every version of an act at its source, with the day each took effect, which one is in force today, which are coming, which Legible holds.
Argument
What to put
Example
actrequired
the act: number, name or description
595/2003
Example, the arguments of POST /v1/law_versions
{
"act": "595/2003"
}
Comes back
kind
law.versions
data
versions: each with its label, the days it is in force from and to, whether it is in force today, whether it is still to come and whether it is held; count.
Compare a passage across two dates
law_compareIn your AI chat only
One passage of an act as in force on two dates, side by side, with whether its text changed, two reads in one call.
changed (true or false) and the passage as in force on each of the two dates.
Companies
Who a company is and what the official registers record about it.
Who a company is
company
A company’s identity, its names, LEI, ISINs, tickers, country, every kind of record Legible holds about it, with the latest few of each, and its links to others by kind (shareholders, short sellers, subsidiaries …), each with the call that opens it.
query takes a name in any spelling, an LEI, ISIN, ticker or SEC CIK.
Argument
What to put
Example
queryrequired
the company: name, LEI, ISIN, ticker or CIK
Erste Group
Example, the arguments of POST /v1/company
{
"query": "Erste Group"
}
Comes back
kind
company
data
identity (name, LEI, country, other names, ISINs), records (each kind of record with its count, first and last date and newest rows), connections (its links by kind, each with the call that opens it).
A company’s records
company_records
A company’s records from the official registers, insider dealings, short positions, major holdings, buy-backs, insolvencies, prospectuses and more, newest first.
kind narrows to one kind of record (in your words); since/until to a window.
Argument
What to put
Example
companyrequired
the company: name, LEI, ISIN, ticker or CIK
Volkswagen
kind
one kind of record, in your words
insider dealings
sincea date
from this day
2025-01-01
untila date
up to this day
limita whole number
rows per kind
20
Example, the arguments of POST /v1/company_records
company, and kinds: one group per kind of record with its rows, newest first. Each row is the register’s own, with its source.
Registers
One kind of record across every company, by country and window.
Rows from a register
register
Rows from one kind of official register, across companies, optionally for one country, one company and a window, from what is held.
A register that is not held for a country is said so plainly, and the ask is remembered.
Argument
What to put
Example
kindrequired
the kind of record, in your words
short positions
country
a country (name or two-letter code)
SE
company
only this company
sincea date
from this day
2025-06-01
untila date
up to this day
limita whole number
how many rows
50
Example, the arguments of POST /v1/register
{
"kind": "insolvencies",
"country": "SK"
}
Comes back
kind
records
data
kind, label, country and rows: the register’s rows, newest first, each with its source.
Connections
Who holds, shorts, owns or sues whom, and the chain between two.
Who is linked to a company
connections
Who a company or a party is linked to in the official registers: its shareholders and what it holds, who is short it and what it is short, its parent and its subsidiaries, its insiders, the parties it shares a merger case or a lawsuit with, the authorities behind its contracts, aid and penalties.
of takes a company or any other party, a fund, a holder, an authority, a person, in your words. relation narrows to one kind of link (shareholders, holdings, short sellers, short positions, owner, subsidiaries, insiders, lawsuits, mergers …). with names a second party: the answer is then the link between the two, with the register rows that prove it. Every name in the answer carries the exact call that opens it, so you can go from anyone to anyone. The links are the registers’ own; Legible adds nothing.
Argument
What to put
Example
ofrequired
the company or the party, in your words (or node:<id>, as an answer names it)
Volkswagen
relation
one kind of link, in your words (or <kind>:<direction>, as an answer names it)
shareholders
with
a second company or party: the link between the two
node (the party), relations (its links by kind with their counts), links (each other party with the kind of link, its newest figure, first and last date, and the calls that open the party or the proof), shown, total and more for the next page. With with: a, b and edges, each edge with the register rows behind it.
How two are connected
chain
How two companies or parties are connected through the official registers: the shortest chains of links from the first to the second, the chains running the other way, and everyone linked to both.
Each step names its kind of link (holds, is short, owns …) and carries the call that shows the register rows behind it. from and to take a company or any other party in your words. When nothing connects the two, the answer says so.
Argument
What to put
Example
fromrequired
the first company or party, in your words (or node:<id>)
BlackRock
torequired
the second company or party, in your words (or node:<id>)
Volkswagen
max_hopsa whole number
the longest chain to look for, in steps (default 4)
4
Example, the arguments of POST /v1/chain
{
"from": "BlackRock",
"to": "Volkswagen"
}
Comes back
kind
chain
data
paths (the shortest chains from the first to the second, step by step), reverse (the chains running the other way), common (everyone linked to both). Empty lists and a note when nothing connects the two.
Statistics
Rates, prices and indices as dated series.
A statistic
series
Points of a statistical series, rates, prices, indices and other numbers official sources publish, point in time (a revised value is its own row), newest first.
Argument
What to put
Example
queryrequired
the series, in your words or its key
euro area inflation
sincea date
from this day
2024-01-01
untila date
up to this day
limita whole number
how many points
100
Example, the arguments of POST /v1/series
{
"query": "ECB deposit facility rate"
}
Comes back
kind
series
data
series (its publisher and key, unit, frequency, how many points it has and from when to when) and points: each with the day it is for, its value and the day that value was published, newest first.
Accounting
The Slovak rulebook: which accounts a transaction is booked on.
Which account to book it on
which_account
A transaction in your words, Slovak or English, and the accounts the Slovak rulebook books it on: the operation from the rulebook’s catalog, its debit and credit accounts with their names, the rule and the paragraph it is quoted from, when it applies, and the alternatives it was told apart from.
An account’s number instead (518, účet 343) gives what belongs on that account and the operations that post to it. The rulebook’s answer for a kind of transaction, never a booking of yours, never a calculation.
Argument
What to put
Example
transactionrequired
the transaction in your words, or an account’s number
prijatá faktúra za nájom kancelárie
operation
one operation of the catalog, by its id (as a choice offers it)
limita whole number
how many candidates to return
5
Example, the arguments of POST /v1/which_account
{
"transaction": "paid the office rent by bank transfer"
}
Comes back
kind
accounting.booking, or accounting.account for an account’s number
data
operation, debit and credit (accounts with their names), rule (the citation and the quoted paragraph), applies_when, why and alternatives. For an account’s number: account and the operations that post to it.
What is reachable
The list of everything Legible hands out.
What Legible reaches
sources
The library: every kind of fact Legible hands out, who owns it and how it is served, and which registers are read in which country.
With a query, only what matches, and if nothing does, Legible says so and remembers that someone asked.
Argument
What to put
Example
query
a kind of fact, a country or a publisher
Swedish short positions
Example, the arguments of POST /v1/sources
{
"query": "insolvency Slovakia"
}
Comes back
kind
sources
data
lines (every kind of fact handed out), readers (which register is read in which country, with the publisher’s address) and law (the two collections of laws).
What Legible does not do
Legible hands out what was published. What it means for you is not its answer to give.
No advice
It does not recommend, warn or tell you what to do. A sentence that asks for advice is told so, and still gets the law text or the records it names.
No computation, no verdicts
It does not work out a tax, a deadline, a ratio or whether a rule applies to you. It hands out the text, the rows and the numbers as published; what follows from them is yours to work out.
No bookings, no trades
It names the accounts the rulebook gives for a kind of transaction and never books yours. It reports holdings and short positions and never places an order.
No written answers
No model writes what you read. The text of a law is the collection’s own, a row is the register’s own, a figure is the publisher’s own, each with its source.
No personal details passed on
Where a filing carries a person’s private details, those fields are withheld from every row Legible hands out.
When nothing is held
“Not held” means there is nothing held for what you asked: a register that is not held for a country, a series that was never taken in, a source Legible has no way to read. The answer then carries the status not_held and a note saying what is missing. Nothing is put in its place: no near match, no summary, no guess. The ask is remembered, so what people looked for is known.
A law is the one thing taken in on request: an act asked for the first time is taken in from its official collection, and the answer says so until it is there.