Minute Book, home

Minute Book API

Search the board papers we hold from your own programs. The API is intended for Enterprise, when available. It gives you what the website gives you: extracts where an organisation hasn’t agreed to reuse, the full text where it has, and a link to the original every time.

The API is being tested internally. Customer access is not yet available.

EnterpriseVersion 1Full description for tools: /api/v1/openapi.json

Getting started

  1. An administrator of your organisation makes a key on the API keys page of their account. Give each program its own key.
  2. Copy the key straight away. We keep only a scrambled form of it, so we can’t show it to you again. If you lose it, revoke it and make a new one.
  3. Send the key with every request, in the Authorization header:
curl -H "Authorization: Bearer mb_live_…" \
  "https://minute-book.com/api/v1/search?q=corridor+care"

Every request starts /api/v1 and every answer is JSON, sent with Cache-Control: no-store so browsers and proxies don’t keep it. A path that doesn’t exist is a JSON 404 too.

Keeping keys safe

  • Put the key only in the Authorization header. Never put it in a web address, in code that runs in someone’s browser, or in anything you publish.
  • Your organisation can have up to 10 keys that work at once. Give each program its own, so you can stop one without stopping the others.
  • To change a key, rotate it on the API keys page rather than copying one key between programs. The old key keeps working for 24 hours so you can switch over, then stops by itself. A key being rotated counts as two of your 10 until then.
  • A revoked key stops working on the next request, and programs using it get 401 invalid_key.
  • A key belongs to your organisation, not to a person, and your organisation is responsible for everything done with it. Keep it out of email, chat, tickets and shared documents.

If a key leaks

Revoke it at once on the API keys page. It stops working on the next request, and programs using it get 401 invalid_key. Then make a new key for the program. If it may have leaked, don’t wait to rotate it.

Our staff may revoke a key, or all of an organisation’s keys, where we think they are being misused or threaten the service. It shows on your API keys page if we do.

Limits

Every request with a valid key counts, including ones that find nothing. Requests turned away for going over a limit don’t count. Months and days are UK time. If your agreement sets a higher monthly limit, that applies instead.

The API’s limits
LimitDefaultOver it, you get
Requests a calendar month, for your organisation10,000month_limit
Wait until the 1st; Retry-After counts down to it.
Requests a minute, for your organisation60minute_limit
Wait for the next minute.
Requests a minute, for one key60, or lower if an administrator set itkey_minute_limit
Wait for the next minute. Other keys keep working.
Find requests a UK day, for one key600 a day per key by default; it may be set differently by agreementfind_limit
Wait until midnight UK time. Search still works.
Find requests a UK day, for your organisation across all its keys1,800 a day by default; it may be set differently by agreementfind_limit
Wait until midnight UK time. Making another key doesn’t add to it.
Failed attempts with a missing or wrong key, from one address30 a minute, 300 a daytoo_many_attempts
Wait for Retry-After seconds, then check the key. While it lasts, even a valid key from that address is refused, for up to a day.
Keys that work at once, for your organisation10(on the API keys page)
Revoke a key you no longer use to make another.

A shared address can lock itself out. Once an address has failed with a missing or wrong key more than 30 times in a minute or 300 in a day, every request from it gets 429 too_many_attempts, even with a valid key, until the count falls: for up to a day. If several programs reach us through one shared address (a company network, say), one program with a wrong key can stop the others. Fix a failing key quickly, and give each program its own.

Administrators see how much each key has used on the API keys page. For 10,000 requests a month and 60 a minute, that is the default; if you need more, talk to us.

Headers that tell you where you stand

Answers to requests with a valid key carry these headers, including a 429 for a limit, which also has a Retry-After header giving the number of seconds to wait. Answers that refuse the key itself (401, 403 no_plan, 403 not_included, 429 too_many_attempts) and the 503 when we can’t check the key don’t. The find headers are on find requests only.

Rate limit headers
HeaderWhat it gives
X-RateLimit-Limit-MonthYour organisation’s requests a month
X-RateLimit-Remaining-MonthRequests left this month
X-RateLimit-Limit-MinuteYour organisation’s requests a minute
X-RateLimit-Remaining-MinuteRequests left this minute, for your organisation
X-RateLimit-Limit-Key-MinuteThis key’s requests a minute
X-RateLimit-Remaining-Key-MinuteRequests left this minute, for this key
X-RateLimit-Limit-Find-DayThis key’s find requests a UK day (find requests only)
X-RateLimit-Remaining-Find-DayFind requests left today, for this key (find requests only)
X-RateLimit-Limit-Org-Find-DayYour organisation’s find requests a UK day, across all its keys (find requests only)
X-RateLimit-Remaining-Org-Find-DayFind requests left today, for your organisation (find requests only)
Retry-AfterOn a 429 only: seconds to wait before trying again

Requests

There are four. The id of a document is the one search results give. For a coroner’s report or response (kind pfd-report or pfd-response), id is not a document id. Use url, the report’s page on Minute Book, and source_url, the report on judiciary.uk. The three document requests all answer 404 for it.

GET

Search board papers. Results come 20 at a time, newest first, with up to 3 matching pages for each document. Ask for more with page, or use sort=relevance. Repeat a parameter to give more than one value.

Parameters
NameWhat it doesExample
qRequiredThe words to search for.q=corridor+care
organisationsOrganisation slugs, as in the addresses of our organisation pages.organisations=northfell-hospitals
nationsengland, scotland, wales, northern_ireland, united_kingdom, england_and_wales (the last is for coroners’ reports).nations=wales
kindsminutes, board-pack, healthwatch-report, pfd-report (a coroner’s report) or pfd-response (a response to one).kinds=minutes
org_typestrust, board, icb, national, regulator, ijb, professional, healthwatch, coroner, other.org_types=icb
bodiesWhose meeting: board, committee, governors, scrutiny, health_and_wellbeing_board, integration_board. All when left out.bodies=committee
date_from, date_toMeeting dates, YYYY-MM-DD.date_from=2026-01-01
include_undatedtrue (the default) also includes papers with no meeting date; false leaves them out.include_undated=false
synonymstrue (the default) also searches NHS terms that mean the same, listed in synonyms in the answer; false searches only the words given.synonyms=false
sortnewest (the default) or relevance.sort=relevance
pageWhich page of 20 results, up to page 50.page=2

Example response, shortened

{
  "query": "corridor care",
  "total_documents": 214,
  "capped": false,
  "page": 1,
  "results": [
    {
      "document": {
        "id": "3c41e0…",
        "organisation": {
          "slug": "northfell-hospitals",
          "name": "Northfell Hospitals NHS Foundation Trust"
        },
        "meeting_body": { "type": "board", "name": "Board" },
        "meeting_date": "2026-09-10",
        "date_precision": "day",
        "kind": "minutes",
        "minutes_status": "draft",
        "draft_note": "These minutes were marked as a draft when we collected them. …",
        "reuse_status": "extracts_only",
        "extracts_only": true,
        "source_url": "https://www.northfell-hospitals.example/board/2026-09-minutes.pdf",
        "retrieved_at": "2026-09-12T07:41:00Z",
        "ocr": false,
        "page_known": true,
        "url": "https://minute-book.com/documents/3c41e0…?org=northfell-hospitals"
      },
      "matching_pages": 2,
      "hits": [
        { "page": 11, "snippet": { "text": "…corridor care had been used on 19 of the 31 days in August…" } }
      ]
    }
  ]
}

Errors 400 invalid_query, 400 invalid_page, 401, 403, 429, 503 query_timeout or 503 index_updating, and 502 unavailable for any other fault in our search service, each with a request_id. See Errors.

GET

/api/v1/documents/{id}?org={slug}

One board document’s details: minutes, board packs and Healthwatch reports, not coroners’ reports (a coroner’s report’s id in search results isn’t a file id; use its url). Doesn’t count towards your document allowance. The same file can be held for more than one organisation, when two publish it; give org, as the url in a search result does, to get that organisation’s details. Without it you get the first organisation we hold it for.

Gives title, organisation, meeting_body, kind, meeting_date with date_precision (a month or year is sent as its first day), page_count, minutes_status and draft_note, reuse_status, extracts_only, reuse_licence_url, source_url, collected_at, our_copy_available, archived_record, and its address on the site.

Errors 404 not_found if we don’t hold it or it isn’t a board document. 401, 403 and 429 as for every request.

GET

/api/v1/documents/{id}/find?q=…

The pages of one document that match some words, each with an extract. Where only extracts are allowed, only the first 3 matching pages are listed. Find requests have their own limits: 600 a day per key and 1,800 a day for your organisation across all its keys by default; they may be set differently by agreement.

Gives The query, and each matching page with its page number and extract. The document’s source and reuse status are on the document request.

Errors 400 invalid_query; 404 not_found, also for a coroner’s report’s id; 429 find_limit; 503 query_timeout or 503 index_updating, 503 not_configured if search isn’t set up on our server, and 502 unavailable for any other fault in our search service, each with a request_id where the search service gave one; and 401, 403 and 429 as for every request.

GET

/api/v1/documents/{id}/file

A link to our copy of the whole document, which works for five minutes. Only where the organisation publishes under the Open Government Licence or has agreed to reuse, or as an archived record when the original has gone from its website. Each document counts once a month towards your document allowance, and as a request.

Gives original_url, a link to our copy, whether it is an archived record, and how long the link works (expires_in).

Errors 403 extracts_only with the original_url; 404 not_found, also for a coroner’s report’s id; 404 no_copy if we have no copy to give; 403 document_limit; and 503 unavailable if we can’t make the link just now.

What you get back

Most organisations haven’t agreed that we can reuse their papers, so for those we give short extracts of up to 50 words, as on the site, and only the first 3 matching pages of a document. Where an organisation publishes under the Open Government Licence or has agreed to reuse, you get the full passage. Coroners’ reports are always in full. Each result says which with reuse_status and extracts_only.

Every result has the document’s source_url on the organisation’s own website, and when we collected it. On the document request, where the organisation has since taken the document down, archived_record is true and our unchanged copy is offered as an archived record (see the file request). Draft minutes keep their draft label: check minutes_status and show the draft_note with anything you quote from them. ocr: true means some text was read automatically from scanned pages, so it may contain errors.

What the values mean
FieldValueMeaning
reuse_statusfull_textThe organisation publishes under the Open Government Licence or has agreed to reuse: full passages. Coroners’ reports are always full_text.
reuse_statusextracts_onlyExtracts of up to 50 words only.
reuse_statusaskedWe’ve asked the organisation and are waiting for an answer. Extracts only until then.
reuse_statusunknownWe don’t have a status for it. Extracts only.
minutes_statusdraftDraft minutes. Show the draft_note with anything you quote.
minutes_statusapprovedMinutes the meeting has approved.
minutes_statusunknownWe couldn’t tell, or it isn’t a set of minutes.
page_knowntruePage numbers are the pages of the original.
page_knownfalseThe text was read before we kept page numbers. Don’t show or cite a page; page is null.

Not found in the papers we hold

A search that finds nothing returns total_documents: 0. That means it isn’t in the papers we hold, not that an organisation never discussed it: we may not hold every paper. If you show this to people, say “Not found in the papers we hold”. If you searched with bodies, name them: “Not found in the committee papers we hold”. Give the date you searched and the words you used, for example “Not found in the papers we hold, searched 29 Oct 2026 for ‘corridor care’”, and link to coverage. When capped is true with no results, the search couldn’t be completed; try narrower words.

Errors

Errors have a status, and a body with a code your program can check and a message you can show to a person:

{ "error": { "code": "key_minute_limit", "message": "Too many requests: up to 60 a minute for this key. Wait for the number of seconds in the Retry-After header, then try again." } }
Error statuses and codes
StatusCodeWhat it means
400invalid_queryThe search words are missing or can’t be searched.
400invalid_pageThe page number isn’t one we can give.
401missing_keyNo key in the Authorization header.
401invalid_keyThe key isn’t one of ours, has been revoked, or has expired after a rotation.
403no_planYour organisation doesn’t have a live plan, so its API keys don’t work.
403not_includedYour organisation’s plan doesn’t include the API. It is part of Enterprise.
403extracts_onlyWe only give extracts of this document. Use original_url to read it.
403document_limitYour organisation has opened its allowance of documents from our copy this month.
404not_foundNo such document, or no such path under /api/v1. Always JSON, like every other error.
404no_copyWe have no copy of this document to give.
429month_limitYour organisation has used this month’s requests.
429minute_limitYour organisation has used this minute’s requests.
429key_minute_limitThis key has used this minute’s requests.
429find_limitThis key, or your organisation across all its keys, has used today’s find requests.
429too_many_attemptsToo many requests with a missing or wrong key from your address.
503query_timeoutSearch and find: that search took too long. Try fewer or more specific words. Quote the request_id if you contact us.
503index_updatingSearch and find: we are updating the search index. Try again in a minute. Quote the request_id if you contact us.
502unavailableSearch and find: any other fault in our search service. Try again shortly, and quote the request_id if you contact us.
503unavailableWe couldn’t check your key, reach our search service, or (for a file) make a link to our copy just now. Try again shortly. Find can also give 503 not_configured, if search isn’t set up on our server.

Need more than your limits allow, or something the API doesn’t do? Talk to us.

Citing and reusing what you get

The terms apply to the API as to the site, and section 8.7 covers the API when available. Existing contracts retain their API promises until the required notice or express agreement. You may quote and cite what you find as long as you say where it came from. Cite it like this:

Example citation: board papers

Kerrow Hospitals NHS Foundation Trust, Board minutes, 10 September 2026, p. 4. Published 15 September 2026. Retrieved via Minute Book on 2 October 2026 from https://www.kerrowhospitals.example/board/2026-09-minutes.pdf

Organisation, what the paper is, meeting date, page. Then when it was published, and when we collected it and from where (source_url). Leave out what isn’t known; say “date unknown” for a missing meeting date. With draft minutes, keep the draft_note beside anything you quote.

Example citation: a coroner’s report

Coroner for Northfell, Prevention of future deaths report, 19 January 2026, p. 2. Published by the Courts and Tribunals Judiciary. Retrieved via Minute Book on 8 October 2026 from https://www.judiciary.uk/?p=990001 Contains public sector information licensed under the Open Government Licence v3.0.

Coroners’ reports and responses are published by the Courts and Tribunals Judiciary on judiciary.uk, under the Open Government Licence. Wherever you use one, credit it: “Contains public sector information licensed under the Open Government Licence v3.0. Source: Courts and Tribunals Judiciary, judiciary.uk.” Open Government Licence v3.0.

  • Extracts only means extracts. Where extracts_only is true, quote the extract and link to the original for the rest.
  • Don’t rebuild documents. Don’t chain searches or find requests to put a document, or large parts of it, back together from extracts. Link to the original instead. This is why find requests have a daily limit.
  • No bulk extraction. Don’t download or copy what we hold in bulk, or work around the limits.
  • No machine-learning training. Don’t use what you get to train or fine-tune machine-learning or AI models without our written agreement.
  • No competing dataset. Don’t build a database, dataset or service from it that stands in for Minute Book.
  • Keep the draft label. Anything you quote from draft minutes keeps its draft_note.
  • Not for sales, and not for targeting people. Don’t use the API for sales leads, tenders or marketing to the organisations whose papers we hold, or to harass, intimidate or target the people named in them.
  • Personal information. Results can contain personal information. Your organisation’s role follows why and how it uses that information, or the instructions it follows for another controller. Handle it in line with data protection law. Tell us promptly about requests to correct, restrict or remove information obtained from Minute Book so we can assess the request too. We notify recipients where the law requires it. Publisher licence and statutory rights remain.

Your searches and our logs

For API searches we count requests by key and kind of request, without keeping search words in those counts. Request addresses can include search or find words in our web host’s technical logs, as described in the privacy notice. See the privacy notice.