{"openapi":"3.1.0","info":{"title":"movahedi.ca Public API","version":"1.0.0","description":"Free read-only API: Canadian privacy enforcement actions, a privacy glossary, Quebec Law 25 compliance guidance, a cookie and tracker pattern knowledge base, and the AI Crawler Registry. English only. Anonymous quota 2,000 calls/day/IP; free API keys raise it to 10,000/day.","contact":{"url":"https://movahedi.ca/developers"},"license":{"name":"Terms","url":"https://movahedi.ca/api/v1/terms"}},"servers":[{"url":"https://movahedi.ca/api/v1"}],"paths":{"/enforcement":{"get":{"summary":"List enforcement actions","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"regulator","in":"query","schema":{"type":"string","enum":["cai","opc"]}},{"name":"year","in":"query","schema":{"type":"integer","minimum":2000}},{"name":"sort","in":"query","schema":{"type":"string","enum":["date_desc","date_asc"],"default":"date_desc"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["items","meta"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"regulator":{"type":"string","enum":["cai","opc"]},"date":{"type":"string","format":"date"},"summary":{"type":"string"},"penalty":{"type":["number","null"]},"source_url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["sap","order","decision"]}},"title":"EnforcementAction"}},"meta":{"type":"object","required":["page","per_page","total"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}}}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/enforcement/{id}":{"get":{"summary":"One enforcement action","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9-]{1,64}$"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"regulator":{"type":"string","enum":["cai","opc"]},"date":{"type":"string","format":"date"},"summary":{"type":"string"},"penalty":{"type":["number","null"]},"source_url":{"type":"string","format":"uri"},"type":{"type":"string","enum":["sap","order","decision"]}},"title":"EnforcementAction"},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/glossary":{"get":{"summary":"List glossary terms","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"letter","in":"query","schema":{"type":"string","pattern":"^[a-z]$"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["en","fr"],"default":"en"},"description":"Response language. fr serves the first-class French definition (all 333 glossary terms are complete); terms without French would fall back to English with french_completeness_status partial_marked."}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["items","meta"],"properties":{"items":{"type":"array","items":{"type":"object","required":["term","slug","definition","lang","french_completeness_status"],"properties":{"term":{"type":"string"},"slug":{"type":"string"},"definition":{"type":"string"},"lang":{"type":"string","enum":["en","fr"],"description":"Language actually served. Falls back to en when no French definition exists."},"french_completeness_status":{"type":"string","enum":["complete","partial_marked"],"description":"complete: first-class French definition; partial_marked: English served, French pending."},"related":{"type":"array","items":{"type":"string"}},"updated":{"type":"string","format":"date"}},"title":"GlossaryTerm"}},"meta":{"type":"object","required":["page","per_page","total"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}}}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}}}}},"/glossary/{term}":{"get":{"summary":"One glossary term","parameters":[{"name":"term","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9-]{1,64}$"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["en","fr"],"default":"en"},"description":"Response language. fr serves the first-class French definition (all 333 glossary terms are complete); terms without French would fall back to English with french_completeness_status partial_marked."}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["term","slug","definition","lang","french_completeness_status"],"properties":{"term":{"type":"string"},"slug":{"type":"string"},"definition":{"type":"string"},"lang":{"type":"string","enum":["en","fr"],"description":"Language actually served. Falls back to en when no French definition exists."},"french_completeness_status":{"type":"string","enum":["complete","partial_marked"],"description":"complete: first-class French definition; partial_marked: English served, French pending."},"related":{"type":"array","items":{"type":"string"}},"updated":{"type":"string","format":"date"}},"title":"GlossaryTerm"},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/law25/checklist":{"get":{"summary":"Law 25 compliance checklist","parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["Governance","Transparency","Individual rights","Data lifecycle","Transfers","Consent","Incident response","Minors","Automated decisions","Oversight"]}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","required":["id","category","title","requirement","guidance"],"properties":{"id":{"type":"string"},"category":{"type":"string","enum":["Governance","Transparency","Individual rights","Data lifecycle","Transfers","Consent","Incident response","Minors","Automated decisions","Oversight"]},"title":{"type":"string"},"requirement":{"type":"string"},"guidance":{"type":"string"}},"title":"Law25Check"}},"categories":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}}}}},"/cookies":{"get":{"summary":"List cookie and tracker patterns","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":128}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["results","total_count","has_more","next_offset"],"properties":{"results":{"type":"array","items":{"type":"object","required":["pattern","match","vendor","legal_party","purpose","typical_retention","control_class"],"properties":{"pattern":{"type":"string"},"match":{"type":"string","enum":["exact","prefix"]},"vendor":{"type":"string"},"legalParty":{"type":"string"},"legal_party":{"type":"string"},"purpose":{"type":"string"},"typicalRetention":{"type":"string"},"typical_retention":{"type":"string"},"controlClass":{"type":"string","enum":["a","b","c"]},"control_class":{"type":"string","enum":["a","b","c"]},"source":{"type":"string"},"reviewDate":{"type":"string"},"review_date":{"type":"string"},"cnameTargets":{"type":"array","items":{"type":"string"}},"cname_targets":{"type":"array","items":{"type":"string"}}},"title":"CookiePattern"}},"total_count":{"type":"integer"},"has_more":{"type":"boolean"},"next_offset":{"type":["integer","null"]},"data_version":{"type":"string"},"cookie_kb_version":{"type":"string"}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/cookies/classify":{"get":{"summary":"Classify a cookie name","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["name","known","pattern","vendor","legal_party","purpose","typical_retention","control_class"],"properties":{"name":{"type":"string"},"known":{"type":"boolean"},"pattern":{"type":["string","null"]},"matched_pattern":{"type":["string","null"]},"match":{"type":["string","null"]},"match_type":{"type":["string","null"]},"vendor":{"type":["string","null"]},"legal_party":{"type":"string"},"legalParty":{"type":"string"},"purpose":{"type":"string"},"typical_retention":{"type":["string","null"]},"typicalRetention":{"type":["string","null"]},"control_class":{"type":["string","null"]},"controlClass":{"type":["string","null"]},"source":{"type":["string","null"]},"review_date":{"type":["string","null"]},"data_version":{"type":"string"},"cookie_kb_version":{"type":"string"}},"title":"CookieClassification"},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/crawlers":{"get":{"summary":"List AI crawler registry records","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":128}},{"name":"operator","in":"query","schema":{"type":"string","maxLength":60}},{"name":"purpose","in":"query","schema":{"type":"string","enum":["training","search-index","user-triggered","search-and-training","other"]}},{"name":"status","in":"query","schema":{"type":"string","enum":["active","retired","renamed"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["results","total_count","has_more","next_offset"],"properties":{"results":{"type":"array","items":{"type":"object","required":["token","operator","purpose","honors_robots_txt","vendor_doc_url","first_documented","status","verified_at"],"properties":{"token":{"type":"string"},"operator":{"type":"string"},"purpose":{"type":"string","enum":["training","search-index","user-triggered","search-and-training","other"]},"honors_robots_txt":{"type":"string","enum":["yes","no","disputed"]},"vendor_doc_url":{"type":"string","format":"uri"},"ip_ranges_url":{"type":["string","null"],"format":"uri"},"first_documented":{"type":"string"},"status":{"type":"string","enum":["active","retired","renamed"]},"successor":{"type":["string","null"]},"verified_at":{"type":"string","format":"date"},"notes":{"type":"string"},"source_note":{"type":"string"},"dataset_version":{"type":"string"}},"title":"Crawler"}},"total_count":{"type":"integer"},"has_more":{"type":"boolean"},"next_offset":{"type":["integer","null"]},"dataset_version":{"type":"string"},"dataset_updated":{"type":"string","format":"date"}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/crawlers/meta":{"get":{"summary":"AI crawler registry metadata: version, counts, coverage, citation","responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["dataset","dataset_version","record_count"],"properties":{"dataset":{"type":"string"},"dataset_version":{"type":"string"},"dataset_updated":{"type":"string","format":"date"},"record_count":{"type":"integer"},"operator_count":{"type":"integer"},"operators":{"type":"array","items":{"type":"string"}},"purposes":{"type":"array","items":{"type":"string"}},"by_purpose":{"type":"object","additionalProperties":{"type":"integer"}},"statuses":{"type":"array","items":{"type":"string"}},"last_verified":{"type":"string","format":"date"},"citation":{"type":"string"}},"title":"CrawlerRegistryMeta"},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}}}}},"/crawlers/{token}":{"get":{"summary":"One AI crawler registry record by user-agent token (case-insensitive)","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","required":["token","operator","purpose","honors_robots_txt","vendor_doc_url","first_documented","status","verified_at"],"properties":{"token":{"type":"string"},"operator":{"type":"string"},"purpose":{"type":"string","enum":["training","search-index","user-triggered","search-and-training","other"]},"honors_robots_txt":{"type":"string","enum":["yes","no","disputed"]},"vendor_doc_url":{"type":"string","format":"uri"},"ip_ranges_url":{"type":["string","null"],"format":"uri"},"first_documented":{"type":"string"},"status":{"type":"string","enum":["active","retired","renamed"]},"successor":{"type":["string","null"]},"verified_at":{"type":"string","format":"date"},"notes":{"type":"string"},"source_note":{"type":"string"},"dataset_version":{"type":"string"}},"title":"Crawler"},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","docs"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"docs":{"type":"string","format":"uri"},"key_url":{"type":"string","format":"uri"}}}}}}}}}}},"/breach-deadlines":{"get":{"summary":"Breach notification rules by regime: trigger, clock, who to notify, retention. No fixed deadline.","parameters":[{"name":"regime","in":"query","schema":{"type":"string","enum":["pipeda","quebec","alberta"]}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","properties":{"regimes":{"type":"array","items":{"type":"object"}}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}}}}},"/openapi.json":{"get":{"summary":"This OpenAPI document","responses":{"200":{"description":"OK"}}}},"/terms":{"get":{"summary":"API terms of use","responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["lang","data","meta"],"properties":{"lang":{"type":"string","enum":["en","fr"],"description":"Language of the payload: the requested language, or the resolved entry language for single-term lookups."},"data":{"type":"object","properties":{"version":{"type":"string"},"terms":{"type":"string"}}},"meta":{"type":"object","properties":{"version":{"type":"string","description":"API data bundle version, pinned to the site corpus version."},"corpus_version":{"type":"string","description":"movahedi.ca corpus version every tool output pins."}}}}}}}}}}},"/health":{"get":{"summary":"Service health","responses":{"200":{"description":"OK"}}}},"/vm-health":{"get":{"summary":"Oracle Micro VM health via Cloudflare Tunnel (degraded fallback when the tunnel is unreachable)","responses":{"200":{"description":"OK"}}}}}}