{"openapi":"3.1.0","info":{"title":"AppealGo API","version":"2026-09-17","description":"Scan a UK parking ticket, council PCN, private parking charge, bus lane, ULEZ or Clean Air Zone notice, get the grounds and a drafted appeal, and have AppealGo file it. Checking is free; filing costs £6.99 per notice or is covered by an Unlimited plan. Each key may run 25 scans per day. An MCP server exposing the same operations is at https://appealgo.com/api/mcp.","contact":{"email":"support@appealgo.com","url":"https://appealgo.com/developers"}},"servers":[{"url":"https://appealgo.com/api/v1"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Authorization: Bearer ag_live_... — create keys at /profile."}},"schemas":{"Notice":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"reference":{"type":"string","example":"PCN-4471A2B9"},"created_at":{"type":"string","nullable":true},"status":{"type":"object","properties":{"stage":{"type":"string","enum":["incomplete_scan","awaiting_payment","preparing_submission","awaiting_confirmation","submitted","closed","support_required","archived"]},"label":{"type":"string"},"summary":{"type":"string"},"next_steps":{"type":"array","items":{"type":"string"}},"payment":{"type":"string"},"appeal":{"type":"string"}}},"notice":{"type":"object","properties":{"category":{"type":"string","nullable":true},"category_label":{"type":"string"},"pcn_number":{"type":"string","nullable":true},"issuer":{"type":"string","nullable":true},"vehicle_registration":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"contravention_code":{"type":"string","nullable":true},"contravention_description":{"type":"string","nullable":true},"notice_date":{"type":"string","nullable":true},"penalty_amount":{"type":"number","nullable":true},"discounted_amount":{"type":"number","nullable":true},"deadline_date":{"type":"string","nullable":true}}},"assessment":{"type":"object","properties":{"grounds":{"type":"array","items":{"type":"string"}},"strength_score":{"type":"number","nullable":true},"recommended_strategy":{"type":"string","nullable":true},"evidence_checklist":{"type":"array","items":{"type":"string"}}}},"appeal_letter":{"type":"string","nullable":true,"description":"The drafted representations, ready to file."},"submission":{"type":"object","nullable":true,"properties":{"reference":{"type":"string"},"method":{"type":"string","nullable":true},"submitted_at":{"type":"string","nullable":true}}},"pricing":{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string","enum":["GBP"]},"paid":{"type":"boolean"}}},"links":{"type":"object","properties":{"self":{"type":"string"},"file":{"type":"string"},"web":{"type":"string"},"track":{"type":"string"}}}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"paths":{"/notices":{"get":{"summary":"List this account's notices","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"notices":{"type":"array","items":{"$ref":"#/components/schemas/Notice"}},"count":{"type":"integer"}}}}}}}},"post":{"summary":"Scan a notice","description":"Upload a photo or PDF of the notice. Returns the read details, the grounds found and a drafted appeal. Takes 20–90 seconds.","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"force":{"type":"boolean"}},"required":["file"]}},"application/json":{"schema":{"type":"object","properties":{"image_url":{"type":"string","format":"uri"},"image_base64":{"type":"string"},"content_type":{"type":"string"},"file_name":{"type":"string"},"force":{"type":"boolean"}}}}}},"responses":{"201":{"description":"Scanned","content":{"application/json":{"schema":{"type":"object","properties":{"notice":{"$ref":"#/components/schemas/Notice"},"scans_remaining_today":{"type":"integer","nullable":true}}}}}},"409":{"description":"Already appealed on this account (pass force=true to override)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily scan allowance used"}}}},"/notices/{id}":{"get":{"summary":"Get a notice","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"notice":{"$ref":"#/components/schemas/Notice"}}}}}},"404":{"description":"Not found"}}}},"/notices/{id}/file":{"post":{"summary":"File the appeal","description":"Files the drafted appeal with the issuer in the customer's name. If the notice is unpaid and not covered by a plan, responds 402 with a Stripe checkout_url; after payment the appeal is filed automatically.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"}}}}}},"responses":{"200":{"description":"Filed (or already filed)"},"400":{"description":"Name and address missing"},"402":{"description":"Payment required","content":{"application/json":{"schema":{"type":"object","properties":{"checkout_url":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"}}}}}}}}},"/status":{"get":{"summary":"Public status by customer reference","security":[],"parameters":[{"name":"reference","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/guides":{"get":{"summary":"Search the appeal guides","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string","enum":["notice-types","operators","councils","codes"]}},{"name":"limit","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"}}}},"/guides/{slug}":{"get":{"summary":"Read a guide as Markdown","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/codes":{"get":{"summary":"List or search contravention codes","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/codes/{code}":{"get":{"summary":"Explain a contravention code","security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","example":"12"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/deadlines":{"get":{"summary":"Calculate the statutory deadlines for a notice","security":[],"parameters":[{"name":"notice_type","in":"query","required":true,"schema":{"type":"string","enum":["council_parking","council_postal","london_moving","tfl_charge","clean_air_zone","private_anpr","private_windscreen"]}},{"name":"notice_date","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"event_date","in":"query","schema":{"type":"string","format":"date"}},{"name":"notice_to_owner_date","in":"query","schema":{"type":"string","format":"date"}},{"name":"rejection_date","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad input"}}}},"/keys":{"get":{"summary":"List API keys","responses":{"200":{"description":"OK"}}},"post":{"summary":"Create an API key (shown once)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Created"}}},"delete":{"summary":"Revoke an API key","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked"}}}}}}