{"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, and Quebec Law 25 compliance guidance. 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","const":"en"},"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":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}},"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","const":"en"},"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":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}},"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]$"}}],"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","const":"en"},"data":{"type":"object","required":["items","meta"],"properties":{"items":{"type":"array","items":{"type":"object","required":["term","slug","definition"],"properties":{"term":{"type":"string"},"slug":{"type":"string"},"definition":{"type":"string"},"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":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}}}}},"/glossary/{term}":{"get":{"summary":"One glossary term","parameters":[{"name":"term","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","const":"en"},"data":{"type":"object","required":["term","slug","definition"],"properties":{"term":{"type":"string"},"slug":{"type":"string"},"definition":{"type":"string"},"related":{"type":"array","items":{"type":"string"}},"updated":{"type":"string","format":"date"}},"title":"GlossaryTerm"},"meta":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}},"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","const":"en"},"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":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}}}}},"/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","const":"en"},"data":{"type":"object","properties":{"version":{"type":"string"},"terms":{"type":"string"}}},"meta":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time"},"version":{"type":"string"}}}}}}}}}}},"/health":{"get":{"summary":"Service health","responses":{"200":{"description":"OK"}}}}}}