Data and API
Everything on this site is available as JSON, read only, without a key. 6 endpoints, CC BY 4.0, one rule that shapes all of it.
No field is ever a boolean. "iso_27001": true would be the sentence “this vendor is certified” – a statement of fact about a real company. What you get instead is found, not_found or not_measured, each with the address we read it at and the date. not_found means we did not find it at the addresses listed in checked; it is not a statement that the vendor has none.
Endpoints
| Endpoint | Answers |
|---|---|
/api/v1/criteria | What do you measure, and how is it weighted? The full catalogue with the weight of each criterion. This is the same source the methodology page reads. |
/api/v1/categories | Which categories exist? Every category we have measured at least once, with the number of vendors in it. |
/api/v1/categories/crm | Who is in a category, and in what order? The ranking of one category: rank, score, and how many criteria we could measure for each vendor. |
/api/v1/vendors/stripe.com | What did you find at one vendor? One vendor by domain, with every criterion, its source, the addresses we checked, and the quotes we read. |
/api/v1/details | What values did you read off their pages? The catalogue of measured details: certifications named, hosting locations, uptime figures, subprocessors, third-party hosts. |
/api/v1/details/certifications | Which vendors name a given value? One detail type with every value that has enough vendors to have a page. |
All of them are GET. Anything else answers 405: corrections go through the form so a human reads them. Access-Control-Allow-Origin: * is set, so you can call them from a browser.
Fields every response carries
| Field | What it means |
|---|---|
snapshot | The id of the data snapshot this response was rendered from, for example r42.71638. Two figures are only comparable when they carry the same id. |
snapshot_run | The highest completed measurement run that contributed to the snapshot. |
snapshot_results | How many results the snapshot holds. It moves when a partial run lands, even if the run number does not. |
snapshot_measured_through | The newest measurement timestamp in the snapshot. |
license | The licence the figures are published under: CC BY 4.0. Attribution is the link back. |
score_version | The version of the transparency score. It is frozen, and a new criterion does not change an existing figure. |
The three states, and the fourth thing that is not a state
| Value | What it means | Who it describes |
|---|---|---|
found | We found it, and source is where. | the vendor |
not_found | We reached at least one address and none of them carried it. checked lists which. | the vendor |
not_measured | We reached no address at all, or robots.txt asked us not to. It falls out of the numerator and the denominator of the score. | us |
A quoted detail carries a fourth thing, and it is not a state but a subject: whose sentence it is. anbieter (the vendor itself), infrastruktur (their data centres or infrastructure), dienstleister (a named provider of theirs), erwaehnt (named without a certification claim), unklar (unclear from the sentence). Only anbieter is aggregated into a value page – a sentence about a vendor's data centre does not belong in a list called “vendors that name ISO 27001 for themselves”.
The score
The score is Transparency Score v1: the share of the summed weights of 12 criteria that we found. It is frozen. Adding a criterion would change every figure ever published, including the one in a procurement file from last week, without the vendor doing anything; new criteria are therefore measured and returned as facts and do not enter the figure. Below 9 measured criteria there is no score at all – score is null, never 0.
| Band | Score |
|---|---|
A | 85 to 100 |
B | 70 to 84 |
C | 55 to 69 |
D | 40 to 54 |
E | 25 to 39 |
F | 0 to 24 |
The 12 criteria
| Key | Name | Weight | Scored |
|---|---|---|---|
dpa | Data processing agreement | 3 | yes (v1) |
subprozessoren | Subprocessor list | 3 | yes (v1) |
datenregion | Data location stated | 3 | yes (v1) |
statusseite | Status page with history | 2 | yes (v1) |
preise | Public pricing | 2 | yes (v1) |
zertifizierungen | Certifications named | 1 | yes (v1) |
sla | Uptime SLA with a figure | 1 | yes (v1) |
transport | HTTPS enforced with HSTS | 2 | yes (v1) |
tracker_vor_einwilligung | No third-party tracking before consent | 2 | yes (v1) |
security_txt | security.txt (RFC 9116) | 1 | yes (v1) |
subprozessor_meldung | Notice before subprocessors change | 2 | yes (v1) |
datenschutzkontakt | Named privacy contact | 1 | yes (v1) |
The 10 detail types
| Key | Name | From criterion | Has value pages |
|---|---|---|---|
zertifikat | Certification named | zertifizierungen | yes |
datenregion | Hosting location named | datenregion | yes |
sla_prozent | Uptime figure | sla | yes |
subprozessor | Subprocessor named | subprozessoren | yes |
meldefrist_tage | Subprocessor notice period | subprozessor_meldung | yes |
datenschutzkontakt_art | Privacy contact | datenschutzkontakt | yes |
drittanbieter | Third-party host on first load | tracker_vor_einwilligung | yes |
hsts_frist | HSTS max-age | transport | no |
hsts_option | HSTS option | transport | no |
security_txt_ablauf | security.txt expiry | security_txt | no |
A response, in full
{
"snapshot": "r6.60658",
"snapshot_run": 6,
"score_version": "v1",
"license": "CC BY 4.0",
"domain": "example.com",
"score": 68,
"measured": 12,
"of": 12,
"criteria": {
"dpa": {
"result": "found",
"source": "https://example.com/legal/dpa",
"checked": [
{
"url": "https://example.com/dpa",
"outcome": "404"
},
{
"url": "https://example.com/legal/dpa",
"outcome": "200"
}
],
"note": null,
"measured_on": "2026-09-04T02:41:18.000Z"
},
"security_txt": {
"result": "not_found",
"source": null,
"checked": [
{
"url": "https://example.com/.well-known/security.txt",
"outcome": "404"
}
],
"note": null,
"measured_on": "2026-09-04T02:41:24.000Z"
}
},
"details": [
{
"key": "zertifikat",
"name": "Certification named",
"value": "iso-27001",
"subject": "anbieter",
"quote": "We are ISO/IEC 27001 certified, audited annually.",
"source": "https://example.com/trust",
"measured_on": "2026-09-04T02:41:20.000Z",
"path": "/data/certifications/iso-27001"
}
]
}
Bulk: the evidence pack
Every vendor profile carries a downloadable pack for a procurement file, in two formats:
/<category>/<vendor>/evidence.csv– two tables in one file: 13 columns per criterion (vendor,domain,category,criterion,criterion_key,weight,result,source_url,addresses_checked,note,measured_on,snapshot,score_version), then the quoted details (vendor,domain,detail,detail_key,value,subject,quote,source_url,measured_on)./<category>/<vendor>/evidence.json– the same, nested, with the full list of addresses we checked.
Both carry the snapshot id and the disclaimer. There is no PDF: the container that serves this page has no browser to render one, and the page itself prints.
Rate limits, and what we ask instead
There is no key and no counted quota. What we ask is the thing a rate limit would enforce badly: take the snapshot once and work from it, rather than fetching ten thousand vendor documents one at a time. A full copy of the ranking is /api/v1/categories plus one call per category.
If your use needs something we do not offer – a full dump, a webhook, an older snapshot – tell us. We would rather build the endpoint than watch someone scrape the pages.
Versioning
The path carries the version: /api/v1/. Inside a version we add fields and never repurpose one. A field that would have to mean something else gets a new name, and the old one keeps its meaning until the next version. The score has its own version, printed in every response, for the same reason.