API

Search the index from your own model.

Send a query. Get ten papers. Open the one you need. If you already have an investigation on Institrace, the model can read that file first and start from what you have pinned.

A trial key includes 200 searches, 20 paper opens, and 30 joins. A paid seat has the monthly allowance. Resolve counts as a join. Packs stay on the site. They are included on every seat, and they are not part of this API.

How a search works

The call is small on purpose. You do not ask for a council. You ask for words. The answer is a page of hits: title, body, date, the council's own file, and a short snippet of the text.

Opening a hit is a second call. That one returns the held text, capped so a single huge pack of papers cannot leave in one response. If the paper is longer, send the same words again and the extra windows come back.

Ten hits a page. Ten pages at most. A snippet is the paper. It is not a finding.

Three steps: Query, Hits, Open.
Query, then hits, then the text of one paper.

Your investigation is the context

The model reads the investigation first, searches for what is missing, and pins the result back.
The model reads the file, searches what is missing, and pins the result back.

An investigation on Institrace is the file you are already keeping: the title, your note, the papers and people you pinned, and the notes you wrote. The API can hand that file to any model before it searches.

The model then knows the matter. It does not start from a blank query. It searches for what is still missing, opens the papers the hits name, and pins anything worth keeping back onto the same file. The dashboard shows the pin and the note.

A new account has no files. The first call creates one: POST /api/v1/investigations with a title such as SC-01. The id that comes back is the file. Search, open, and pin against that id. Do not attach papers to a file about a different matter. The dashboard shows the same file as soon as the pin is saved.

Allowance

SeatPriceSearches / monthPapers / monthJoins / monthSearches / dayPapers / dayJoins / day
Trial14 days200203080108
Researcher£99 a month2,0001501504004020
Practice£349 a month8,0006004001,20012040
NewsroomQuoted25,0002,0008004,00040080

Listing an investigation, pinning, and writing a note do not spend an allowance. Resolve counts as a join. Opening a paper spends a paper open. When the month is used the call returns 402. Too many calls already running, or the daily cap, returns 429. Browsing the site is separate and stays included. A script that walks a body, or the join graph, is a breach of the terms.

Sign in to see this seat's usage, or see API top-ups.

Instructions for a model

Copy this into the model. The same text is shown whether you are signed in or not. Put the key in the Authorization header yourself. The instructions do not contain the key. Sign in to create a key.

Institrace API

Institrace holds UK public records that have been loaded. Committee papers are for bodies that have been scraped, not every body and not every year. Companies House officers and land titles are looked up by number. Payment rows exist only where a spend file was loaded. FOI archives, closed papers, and court judgments are not in this index. An empty result means not in this index, not that the record does not exist. On joins for a body, coverage and lastPaperAt are what this index holds for that body.

Use this to search papers, open them, pin them to an investigation, and read the joins on a body, a person, a company number, or a land title.
JSON only. A trial key includes 200 searches and 20 paper opens for the whole trial. A paid seat has the monthly allowance on the account page.
You only see investigations this key's seat can open. A shared reader does not receive the activity log.
A snippet is the paper. It is not a finding. A name in a paper is not a join. A label is a payment name attached to a number. It is not a join.
An empty spend section means no payment rows matched this call. It does not mean the body never paid anyone. Rows are not a total.
charged is search, paper, or join. Opening a paper spends a paper open. Resolve and joins spend a join. Joins has its own allowance, smaller than search.

Base: https://www.institrace.co.uk/api/v1
Auth: Authorization: Bearer {YOUR_API_KEY}
Put the key in the header only. Do not paste it into this brief.

1. Open a file for this matter before you search. A new account has none.
GET https://www.institrace.co.uk/api/v1/investigations
If no file is this matter, create one. Do not pin onto a file about something else.
POST https://www.institrace.co.uk/api/v1/investigations  {"title":"SC-01"}
The response id is the file. Use it on every later call.
GET https://www.institrace.co.uk/api/v1/investigations/{id}
You receive the title, the note, every pin, and the notes. A paper pin has an id and a title, not the text.

2. Search for what is still missing, then open the paper.
GET https://www.institrace.co.uk/api/v1/search?q=&investigation={id}
q is 3 to 120 characters. Optional: source (id, slug, or exact name), type, from, to, mid, page (max 10). Quote a phrase when the words must stay together.
Hits include title, date, council file URL, id, and a snippet. Papers with the words in the title come first. A named paper is listed before an agenda pack. A missing date is filled from the title when the title has one. A common word returns the newest papers that contain it. Add a year, a place, or a company number when those hits are incidental.
GET https://www.institrace.co.uk/api/v1/papers/{id}?q=&investigation={id}
You receive the text (capped), the date, any company number stamped on that paper, and the other papers from the same meeting. charged is paper. A paper id that is not on the index is JSON 404.

3. Pin what belongs on the file, and write a note when the sentence should be kept.
POST https://www.institrace.co.uk/api/v1/investigations/{id}/pins  {"kind":"paper","targetId":"...","title":"...","href":"..."}
kind is person, company, source, paper, register, search, pack, or date.
A paper pin ignores the title and link you send and uses the index record. A register or pack pin only keeps https links on institrace.co.uk, gov.uk, modgov.co.uk, moderngov.co.uk, or cmis.uk.com, or a path that starts with /.
POST https://www.institrace.co.uk/api/v1/investigations/{id}/notes  {"body":"...","pinId":"...","documentId":"...","quote":"..."}
DELETE https://www.institrace.co.uk/api/v1/investigations/{id}/pins/{pinId}
Deleting a pin deletes the notes that were on it.
DELETE https://www.institrace.co.uk/api/v1/investigations/{id}
That removes the file, its pins, and its notes. Only the seat that owns the file can delete it.
The dashboard shows the same file.

4. Resolve a supplier word to a company number before you ask for joins on it.
GET https://www.institrace.co.uk/api/v1/resolve?q=Oracle
If several companies match, open the one with paymentRows or officers. A company that is only the bare word is not that company. charged is join.
GET https://www.institrace.co.uk/api/v1/joins?subject=company:{number}
That returns the Companies House officer snapshot, appointments, and land titles on that number. charged is join.
GET https://www.institrace.co.uk/api/v1/joins?subject=source:{id}&matter=spend&from=2024
That is a capped list of payment rows for that body and year. It is not a total. An empty list means this index has no rows for that call. The response includes lastPaperAt, the newest stamped paper date on that body.
GET https://www.institrace.co.uk/api/v1/joins?subject=source:{id}&matter=supplier name
Payment rows are labels unless the number is already stamped.
GET https://www.institrace.co.uk/api/v1/joins?subject=title:MS509220
A title number is a register lookup. It will not appear from a paper word such as covenant.
Each row has a grain: join, name, seat, label, or meeting. Mention rows include documentId. Open that id with /papers/{id}. A meeting row is omitted when the paper count is zero. If joins sets more to true, the call was too wide. Add a company number or a year and try again.

401 missing, revoked, or paused key. 402 allowance used. 403 a file this seat cannot change. 429 daily cap, or too many calls already running.

OpenAPI: https://www.institrace.co.uk/api/v1/openapi.json
Human page: https://www.institrace.co.uk/developers