Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/healthrecordrights-com:healthrecordrights-com-countries-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Health Record Rights Index Countries API
version: '1'
summary: Read-only JSON. Open, no sign-up, no key.
description: Health record rights in countries and territories (scores out of 100, with sources), what each of the 50 states and DC adds to federal law (answers, no scores), and published real cases. Data version 1.0. Fields in v1 are never removed or renamed. Not legal advice.
license:
name: CC BY 4.0 (data and scores; quoted law, source titles and linked pages are not relicensed)
url: https://creativecommons.org/licenses/by/4.0/
contact:
url: https://healthrecordrights.com/developers/
servers:
- url: https://healthrecordrights.com/api/v1
tags:
- name: Countries
paths:
/countries:
get:
summary: All countries and territories
description: Overall score out of 100, band, rank or lead group, likely rank and confidence. Highest score first; the lead group together, A to Z.
parameters: []
responses:
'200':
description: The list.
headers:
ETag:
schema:
type: string
Cache-Control:
schema:
type: string
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
properties:
count:
type: integer
confidenceCounts:
type: object
properties:
high:
type: integer
medium:
type: integer
low:
type: integer
ties:
type: string
countries:
type: array
items:
$ref: '#/components/schemas/CountrySummary'
'400':
description: A query parameter could not be used. The body says why.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not found, with a plain message and, for a name or alias, the code to use.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests. Wait the number of seconds in Retry-After.
headers:
Retry-After:
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: listCountries
tags:
- Countries
/countries/{iso3}:
get:
summary: One country or territory
description: Every category with its score, summary, detail and sources; laws; recent news; real cases.
parameters:
- name: iso3
in: path
required: true
description: ISO 3166-1 alpha-3 code, like FIN.
schema:
type: string
example: FIN
responses:
'200':
description: The country.
headers:
ETag:
schema:
type: string
Cache-Control:
schema:
type: string
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
$ref: '#/components/schemas/Country'
'400':
description: A query parameter could not be used. The body says why.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not found, with a plain message and, for a name or alias, the code to use.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Too many requests. Wait the number of seconds in Retry-After.
headers:
Retry-After:
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
operationId: getCountry
tags:
- Countries
components:
schemas:
CountrySummary:
type: object
properties:
iso3:
type: string
iso2:
type:
- string
- 'null'
name:
type: string
region:
type: string
overall:
type: integer
minimum: 0
maximum: 100
description: Overall score out of 100.
band:
type: string
enum:
- Poor
- Weak
- Mixed
- Strong
- Leading
rank:
type:
- integer
- 'null'
description: 'Rank among all countries and territories. Tied countries share a number (1, 2, 2, 4). Null for the lead group: allowing for scoring error, any of them could rank first.'
tieRange:
type: object
properties:
low:
type: integer
high:
type: integer
description: The overall scores that tie with this one (4 or fewer points away). A tie never changes a band.
rankTied:
type:
- boolean
- 'null'
description: Whether the rank is shared. Null for the lead group, which has no rank.
leadGroup:
type: boolean
likelyRank:
type:
- object
- 'null'
properties:
low:
type: integer
high:
type: integer
required:
- low
- high
description: 'The 90% likely rank range: in 90% of simulations the country ranks between low and high.'
likelyRankText:
type:
- string
- 'null'
description: The same range in words, like "50 to 60".
confidence:
type: string
enum:
- high
- medium
- low
keysModel:
type: string
enum:
- Individual
- Shared
- Institutional
- State
apiUrl:
type: string
description: This country in the API.
pageUrl:
type: string
Case:
type: object
properties:
date:
type: string
headline:
type: string
paraphrase:
type: string
source:
type: string
url:
type: string
archiveUrl:
type: string
description: 'Optional: a Wayback Machine copy of the source, saved when the case was published.'
theme:
type: string
status:
type: string
enum:
- finding
- admitted
- alleged
- self_reported
id:
type: string
description: 'The case id, like FIN-S001: it never changes and is never given to another case.'
pageUrl:
type: string
description: The case on /real-cases/, the address to cite.
countryUrl:
type: string
description: The country brief.
why:
type: string
description: Why it matters to patients, in our words.
sourceType:
type: string
enum:
- regulator_decision
- court_judgment
- parliament_testimony
- journalism
- advocacy_case
- own_blog
description: The kind of source.
lang:
type: string
description: Two-letter code of the source's language. Our summary is always English (inLanguage).
providerName:
type: string
description: 'Optional: the hospital, company or other organization, named only when a regulator or court decided against it or it admitted the problem itself.'
lastVerified:
type: string
format: date
description: When the case was last checked against its source.
addedOn:
type: string
format: date
description: The day the case was added to the index; cases already in it when it was published carry October 2, 2026.
archivedOn:
type: string
format: date
description: 'Optional: the day the archived copy was made.'
inLanguage:
type: string
description: 'The language of our headline and summary: en.'
Error:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: 'null'
error:
type: object
properties:
status:
type: integer
code:
type: string
enum:
- not_found
- not_rated
- use_code
- not_covered
- bad_request
- method_not_allowed
- rate_limited
- server_error
- gone
message:
type: string
suggestions:
type: array
items:
type: object
properties:
code:
type: string
name:
type: string
url:
type: string
removed:
type: object
properties:
id:
type: string
removedOn:
type: string
removalClass:
type: string
enum:
- window
- withdrawn
description: 'A case taken down (410 only): its id, the day and why, as a class: past the two-year window (window) or withdrawn (withdrawn). Nothing else about the case is kept.'
required:
- status
- code
- message
Category:
type: object
properties:
name:
type: string
weight:
type: integer
score:
type: integer
summary:
type: string
detail:
type: array
items:
type: string
description: The longer review, one paragraph per item.
sources:
type: array
items:
$ref: '#/components/schemas/Source'
Country:
allOf:
- $ref: '#/components/schemas/CountrySummary'
- type: object
properties:
tiedWith:
type: array
items:
type: string
description: 'ISO3 codes of the countries whose overall score is 4 or fewer points away: treat them as the same. A tie never changes a band.'
verdict:
type: string
description: 'One line: the name, the overall score out of 100, the band and what the band means. Give this first.'
keySources:
type: array
items:
type: object
properties:
title:
type: string
url:
type: string
date:
type: string
category:
type: string
description: Up to five official, legal or intergovernmental sources behind the scores, the ones to cite first. Titles are third-party text.
dataAsOf:
type: string
description: When this country was last researched.
rankText:
type: string
headline:
type: string
confidenceDetail:
type: object
properties:
label:
type: string
thinEvidenceOn:
type: array
items:
type: string
note:
type:
- string
- 'null'
keysModelPlain:
type: string
evidenceGrade:
type:
- object
- 'null'
properties:
grade:
type: integer
tier:
type: string
tierCapped:
type: boolean
underReview:
type: array
items:
type: string
categories:
type: object
description: The eight categories, keyed access, control, privacy, journey, commercial, clinical, research, ai.
additionalProperties:
$ref: '#/components/schemas/Category'
laws:
type: array
items:
type: object
properties:
name:
type: string
jurisdiction:
type: string
description: National, Supranational, State/Provincial or Regional.
yearText:
type:
- string
- 'null'
description: The year as recorded, which may be a range or a note such as "undated".
what:
type: string
url:
type: string
news:
type: array
items:
type: object
properties:
date:
type: string
headline:
type: string
source:
type: string
url:
type: string
why:
type: string
description: 'What changed: recent news about health records in this country.'
cases:
type: array
items:
$ref: '#/components/schemas/Case'
casesUrl:
type: string
Envelope:
type: object
properties:
api:
const: v1
version:
type: string
description: The index (data) version, like 1.0. Not the API version, which is api.
asOf:
type: string
format: date
description: The release date of the data, the same on every route. A country or state also carries its own date in data.
dataSha256:
type: string
description: 'The release hash: SHA-256 of the country files behind the scores; the paper records the same hash. State answers are covered by statesSha256.'
statesSha256:
type: string
description: 'State routes only: SHA-256 of the state files.'
casesSha256:
type: string
description: 'Country and case routes: SHA-256 of the real cases, which the weekly refresh can change while dataSha256 stays the same.'
casesAsOf:
type: string
format: date
description: 'Country and case routes: the day the real cases last changed (a case added or taken off), from the changes journal. The index asOf is the data date and stays separate.'
license:
$ref: '#/components/schemas/License'
citation:
type: string
description: How to cite the index.
pageUrl:
type: string
description: The page on healthrecordrights.com that shows the same thing.
data: {}
required:
- api
- version
- asOf
- dataSha256
- license
- citation
- pageUrl
- data
Source:
type: object
properties:
title:
type: string
description: 'The page title as published: third-party text, not relicensed; MCP answers wrap it in [quoted] ... [/quoted].'
url:
type: string
date:
type: string
publisherClass:
type: string
License:
type: object
properties:
id:
type: string
url:
type: string
credit:
type: string
covers:
type: string
excludes:
type: string
required:
- id
- url
- credit