{"openapi":"3.0.0","info":{"title":"Awesome Privacy API","version":"1.0.0","description":"\n  The API allows you to browse awesome-privacy's data programmatically.\n  It also runs some lookups/checks on listings to surface useful insights\n  to add additional context to listings, and save time when comparing software / services.\n  <br>\n  These endpoints are used by as part of the website generation,\n  the PR review process and the scheduled listing audits.\n  You're also free to use it for your own purposes.\n  <br>\n  > [!IMPORTANT]\n  > It's very important not to rely on this data for any decision making,\n  > as it only gives a very narrow slice of the picture.\n  > There's also many real privacy issues which the automated lookups have no way of detecting,\n  > as well as the possibility for false positives/negatives.\n  > **Always do your own research**.\n\n<details>\n<summary>Authenticating</summary>\n\nThe enrichment endpoints are public, but anonymous requests are rate-limited.\nOn the hosted instance, sending a valid `Authorization: Bearer <token>` header\nexempts the request from rate limiting. Self-hosters can set the `API_TOKEN`\nenv var to enable the same bypass for their own token.\nTo lock the endpoints down entirely, set `REQUIRE_AUTH` (alongside `API_TOKEN`):\nrequests without a valid token are then rejected with a 401.\n</details>\n\n<details>\n<summary>Caching</summary>\n\nSome responses are cached to reduce load on upstream services.\nWhen configured, successful enrichment results are cached in KV and served while fresh\n(from a week up to 90 days, depending on the endpoint). Stale entries are refreshed on\ndemand, falling back to the cached copy if the upstream is unavailable.\n</details>\n\n<details>\n<summary>Self-Hosting</summary>\n\nSee the [repo](https://github.com/lissy93/awesome-privacy/tree/main/api) for\ndeployment and development guides, as well as instructions for self-hosting, contributing and usage.\n</details>\n\n  "},"servers":[{"url":"/"}],"tags":[{"name":"Public","description":"Endpoints to browse the awesome-privacy dataset programatically"},{"name":"Enrichment","description":"Endpoints to fetch additional data about listings from external sources"}],"components":{"schemas":{"Service":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"description":{"type":"string"},"icon":{"type":"string"},"github":{"type":"string"},"followWith":{"type":"string"},"securityAudited":{"type":"boolean"},"openSource":{"type":"boolean"},"acceptsCrypto":{"type":"boolean"},"tosdrId":{"anyOf":[{"type":"number"},{"type":"string"}]},"androidApp":{"type":"string"},"iosApp":{"type":"string"},"subreddit":{"type":"string"},"discordInvite":{"type":"string"}},"required":["name","url"]},"FlatService":{"allOf":[{"$ref":"#/components/schemas/Service"},{"type":"object","properties":{"slug":{"type":"string"},"category":{"type":"string"},"categorySlug":{"type":"string"},"section":{"type":"string"},"sectionSlug":{"type":"string"}},"required":["slug","category","categorySlug","section","sectionSlug"]}]},"Pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["page","limit","total","hasMore"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["NOT_FOUND","BAD_REQUEST","UNAUTHORIZED","RATE_LIMITED","UPSTREAM_ERROR","INTERNAL"]},"message":{"type":"string"},"status":{"type":"number"}},"required":["code","message","status"]}},"required":["error"]},"Category":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"sections":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["name","slug"]}}},"required":["name","slug","sections"]},"Section":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"intro":{"type":"string"},"furtherInfo":{"type":"string"},"wordOfWarning":{"type":"string"},"alternativeTo":{"type":"array","items":{"type":"string"}},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}},"required":["name","slug","services"]},"SearchHit":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"categorySlug":{"type":"string"},"section":{"type":"string"},"sectionSlug":{"type":"string"},"score":{"type":"number"}},"required":["slug","name","url","category","categorySlug","section","sectionSlug","score"]},"Stats":{"type":"object","properties":{"categories":{"type":"number"},"sections":{"type":"number"},"services":{"type":"number"},"openSource":{"type":"number"},"securityAudited":{"type":"number"},"acceptsCrypto":{"type":"number"}},"required":["categories","sections","services","openSource","securityAudited","acceptsCrypto"]},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"uptime":{"type":"number"}},"required":["status","uptime"]},"TosdrService":{"type":"object","properties":{},"description":"ToS;DR v3 service record, passthrough"},"GithubRepo":{"type":"object","properties":{"info":{"type":"object","properties":{"ownerUsername":{"type":"string"},"ownerAvatar":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"homepage":{"type":"string"},"language":{"type":"string"},"topics":{"type":"array","items":{"type":"string"}},"license":{"type":"string"},"licenseName":{"type":"string"},"isFork":{"type":"boolean"},"isArchived":{"type":"boolean"},"forkParent":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"pushedAt":{"type":"string"},"size":{"type":"number"},"starCount":{"type":"number"},"forksCount":{"type":"number"},"watchersCount":{"type":"number"},"openIssues":{"type":"number"}},"required":["ownerUsername","ownerAvatar","description","url","homepage","language","topics","license","licenseName","isFork","isArchived","forkParent","createdAt","updatedAt","pushedAt","size","starCount","forksCount","watchersCount","openIssues"]},"languages":{"type":"object","additionalProperties":{"type":"number"}},"versions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"commit":{"type":"string"},"zipball":{"type":"string"},"tarball":{"type":"string"}},"required":["name","commit","zipball","tarball"]}},"contributors":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string"},"avatar":{"type":"string"},"url":{"type":"string"},"contributions":{"type":"number"}},"required":["username","avatar","url","contributions"]}},"commits":{"type":"array","items":{"type":"object","properties":{"sha":{"type":"string"},"authorName":{"type":"string"},"authorDate":{"type":"string"},"message":{"type":"string"},"authorUsername":{"type":"string"},"authorAvatar":{"type":"string"}},"required":["sha","authorName","authorDate","message","authorUsername","authorAvatar"]}}},"required":["info","languages","versions","contributors","commits"]},"ItunesApp":{"type":"object","properties":{},"description":"iTunes lookup result, passthrough"},"AndroidReport":{"type":"object","properties":{},"description":"Exodus Privacy trackers merged with Plexus de-Googled compatibility (degoogled)"},"DiscordInvite":{"type":"object","properties":{"inviteCode":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"memberCount":{"type":"number","nullable":true},"memberOnlineCount":{"type":"number","nullable":true},"channel":{"type":"string","nullable":true},"icon":{"type":"string","nullable":true},"banner":{"type":"string","nullable":true},"inviter":{"type":"string","nullable":true}},"required":["inviteCode","name","memberCount","memberOnlineCount","channel","icon","banner","inviter"]},"Subreddit":{"type":"object","properties":{"info":{"type":"object","properties":{"name":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"longDescription":{"type":"string","nullable":true},"icon":{"type":"string","nullable":true},"banner":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"subscribers":{"type":"number","nullable":true},"activeSubscribers":{"type":"number","nullable":true},"dateCreated":{"type":"number","nullable":true},"descriptionHtml":{"type":"string","nullable":true}},"required":["name","title","description","longDescription","icon","banner","color","subscribers","activeSubscribers","dateCreated","descriptionHtml"]},"posts":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"},"upVotes":{"type":"number"},"downVotes":{"type":"number"},"date":{"type":"number"},"url":{"type":"string"}},"required":["title","body","upVotes","downVotes","date","url"]}}},"required":["info","posts"]},"WebsiteReport":{"type":"object","properties":{},"description":"APIVoid url reputation report, passthrough"},"TrackersReport":{"type":"object","properties":{"finalUrl":{"type":"string"},"trackers":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"owner":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}}},"required":["domain","owner","categories"]}}},"required":["finalUrl","trackers"]},"SecurityReport":{"type":"object","properties":{"repo":{"type":"string"},"scorecard":{"type":"object","properties":{"available":{"type":"boolean"},"overallScore":{"type":"number","nullable":true},"generatedAt":{"type":"string"},"checks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"number"},"reason":{"type":"string"},"url":{"type":"string"}},"required":["name","score","reason","url"]}}},"required":["available","overallScore","generatedAt","checks"]},"advisories":{"type":"object","properties":{"count":{"type":"number"},"items":{"type":"array","items":{"type":"object","properties":{"ghsaId":{"type":"string"},"cveId":{"type":"string","nullable":true},"summary":{"type":"string"},"severity":{"type":"string"},"cvssScore":{"type":"number","nullable":true},"publishedAt":{"type":"string"},"url":{"type":"string"},"firstPatchedVersion":{"type":"string","nullable":true},"vulnerableRange":{"type":"string"},"isPatched":{"type":"boolean"}},"required":["ghsaId","cveId","summary","severity","cvssScore","publishedAt","url","firstPatchedVersion","vulnerableRange","isPatched"]}}},"required":["count","items"]},"fuzzed":{"type":"boolean"}},"required":["repo","scorecard","advisories","fuzzed"]},"DockerInfo":{"type":"object","properties":{},"description":"Portainer template, Docker Hub metrics and generated run/compose usage"}},"parameters":{}},"paths":{"/v1/services":{"get":{"tags":["Public"],"summary":"List services","parameters":[{"schema":{"type":"string"},"required":false,"name":"category","in":"query"},{"schema":{"type":"string"},"required":false,"name":"section","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FlatService"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"]}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/services/{slug}":{"get":{"tags":["Public"],"summary":"Get service","parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FlatService"}},"required":["data"]}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/categories":{"get":{"tags":["Public"],"summary":"List categories","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"]}}}}}}},"/v1/categories/{slug}":{"get":{"tags":["Public"],"summary":"Get category","parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Category"}},"required":["data"]}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sections/{slug}":{"get":{"tags":["Public"],"summary":"Get section","parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Section"}},"required":["data"]}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/search":{"get":{"tags":["Public"],"summary":"Search","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"q","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SearchHit"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"]}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/stats":{"get":{"tags":["Public"],"summary":"Stats","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Stats"}},"required":["data"]}}}}}}},"/v1/health":{"get":{"tags":["Public"],"summary":"Health","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Health"}},"required":["data"]}}}}}}},"/v1/enrich/privacy/{tosdrId}":{"get":{"tags":["Enrichment"],"summary":"Privacy policy info","parameters":[{"schema":{"type":"string"},"required":true,"name":"tosdrId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TosdrService"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/github/{owner}/{repo}":{"get":{"tags":["Enrichment"],"summary":"GitHub repo info","parameters":[{"schema":{"type":"string"},"required":true,"name":"owner","in":"path"},{"schema":{"type":"string"},"required":true,"name":"repo","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GithubRepo"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/ios/{bundleId}":{"get":{"tags":["Enrichment"],"summary":"iOS app info","parameters":[{"schema":{"type":"string"},"required":true,"name":"bundleId","in":"path"},{"schema":{"type":"string","minLength":2,"maxLength":2},"required":false,"name":"country","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItunesApp"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/android/{pkg}":{"get":{"tags":["Enrichment"],"summary":"Android app info","parameters":[{"schema":{"type":"string"},"required":true,"name":"pkg","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AndroidReport"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/discord/{invite}":{"get":{"tags":["Enrichment"],"summary":"Discord server info","parameters":[{"schema":{"type":"string","minLength":4},"required":true,"name":"invite","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscordInvite"}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/reddit/{sub}":{"get":{"tags":["Enrichment"],"summary":"Subreddit info","parameters":[{"schema":{"type":"string"},"required":true,"name":"sub","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subreddit"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/website":{"get":{"tags":["Enrichment"],"summary":"Website info","parameters":[{"schema":{"type":"string","format":"uri"},"required":true,"name":"url","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteReport"}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/trackers":{"get":{"tags":["Enrichment"],"summary":"Website trackers","description":"Third-party trackers a web page loads, as classified by DuckDuckGo's Tracker Blocklist (CC BY-NC-SA 4.0). Only the HTML is checked, so trackers that other scripts load later are not seen.","parameters":[{"schema":{"type":"string","format":"uri"},"required":true,"name":"url","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackersReport"}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/security/{owner}/{repo}":{"get":{"tags":["Enrichment"],"summary":"Repo security","parameters":[{"schema":{"type":"string"},"required":true,"name":"owner","in":"path"},{"schema":{"type":"string"},"required":true,"name":"repo","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityReport"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/enrich/docker/{name}":{"get":{"tags":["Enrichment"],"summary":"Docker image info","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"name","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerInfo"}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}