{"info":{"title":"Abide.Rent API","summary":"Product API · OpenAPI 3.1","version":"0.1.0","description":"The signed-in product and the API are the same /api/v1 surface, with the same permissions and legal holds. Amounts are integer pence. There is no /serve route. CRM connectors and outbound webhooks are planned and are not part of the API yet. Not legal advice.\n\n## Authentication\nSend `Authorization: Bearer <token>`. The token is either a session JWT from `POST /api/v1/auth/sign_in`, or an API key issued in the product under Developers → API keys (`abk_test_…` / `abk_live_…`). A key acts as the paying account; it cannot sign notices or record service.\n\n## Choosing a workspace\nOne person can be an agent, a landlord and a tenant. Every call except sign-in names the workspace: `X-Abide-Rent-Context: agency | landlord | tenant` and `X-Abide-Rent-Context-Id: <id>`. `GET /api/v1/me` lists the workspaces the bearer can open. Without them the API answers 409 `CONTEXT_REQUIRED`.\n\n## Conventions\n- Money is integer pence in fields ending `_pence` (£750.00 is `75000`).\n- Dates end `_on` (`YYYY-MM-DD`); timestamps end `_at` (ISO 8601, UTC).\n- Success is `{ \"data\": …, \"meta\"?: … }`. Errors are `{ \"error\": { \"code\", \"message\", \"details\" } }` — branch on `code`, not on the message.\n- Lists accept `page` and `per_page` where shown; `meta` carries the totals.\n\n## Limits\n300 requests a minute per person or API key; sign-in and one-time codes have tighter per-address limits. Over the limit the API answers 429 `RATE_LIMITED` with `Retry-After`.\n\n## Never over the API\nThere is no `/serve` route: serving a notice is always done and recorded by a person. The PRS Database has no public API. Alto has no open API. Not legal advice.","x-not-legal-advice":true},"tags":[{"name":"Auth"},{"name":"Keys"},{"name":"Properties"},{"name":"Reviews"},{"name":"Notices"},{"name":"Compliance"},{"name":"Statements"},{"name":"Tenants"},{"name":"Comparables"},{"name":"Tribunal referrals"},{"name":"Landlords"},{"name":"Repairs"}],"paths":{"/api/v1/me":{"get":{"tags":["Auth"],"summary":"Current person","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"email":{"type":"string"},"last_name":{"type":"string"},"first_name":{"type":"string"}}},"contexts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"label":{"type":"string"},"subtitle":{"type":"string"}}}},"current_context":{"type":["string","null"]}}}}},"example":{"data":{"person":{"id":1,"email":"string","last_name":"string","first_name":"string"},"contexts":[{"id":1,"kind":"agency","label":"Northgate Residential","subtitle":"Agency"}],"current_context":null}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Who the bearer is, and which workspaces they can open. Send the chosen one as X-Abide-Rent-Context and X-Abide-Rent-Context-Id on other calls.","operationId":"me"}},"/api/v1/band":{"post":{"tags":["Reviews"],"summary":"Quote a defensible band","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"source":{"type":"string"},"message":{"type":["string","null"]},"evidence":{"type":"boolean"},"available":{"type":"boolean"},"frequency":{"type":"string"},"low_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"synthetic":{"type":"boolean"},"tier_note":{"type":["string","null"]},"high_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tier_label":{"type":"string"},"anchor_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"fallback_reason":{"type":["string","null"]},"own_lettings_count":{"type":"integer"},"used_determinations":{"type":"boolean"}}}}},"example":{"data":{"source":"own_lettings","message":null,"evidence":true,"available":true,"frequency":"monthly","low_pence":86000,"synthetic":false,"tier_note":null,"high_pence":96000,"tier_label":"Own lettings","anchor_pence":91000,"fallback_reason":null,"own_lettings_count":4,"used_determinations":false}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property.\n\n`PLAN_RESTRICTED` — The plan does not include this (for example Solo’s 1-property limit). Reading and export keep working."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency tool. Comparable lettings first (source comparables, tier_label “Comparable lettings”), then your own lettings, current or ended (own_lettings), then an ONS PIPR anchor (ons_pipr), then an LHA floor (lha); missing when there is no row at all, with available false and a message. evidence is true only for comparables and own lettings; for ons_pipr and lha, tier_note says it is an area average, not evidence, and fallback_reason says why the band fell back. anchor_pence is the figure the band is built on (the median of the lettings, or the PIPR or LHA level); own_lettings_count is how many of your own lettings qualified. Figures are per month (frequency monthly). Determinations are never used as comparables (used_determinations is always false), and nothing is synthesised (synthetic is always false).","operationId":"band","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"bedrooms":{"type":"integer"},"postcode_district":{"type":"string"}}},"example":{"bedrooms":2,"postcode_district":"M26"}}},"required":true}}},"/api/v1/duties":{"get":{"tags":["Compliance"],"summary":"Duty matrix","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"holder":{"type":"string"},"status":{"type":"string"},"transfer":{"type":"string"},"performed_by":{"type":"string"},"transferable":{"type":"boolean"},"legally_liable":{"type":"string"}}}},"meta":{"type":"object","properties":{"stats":{"type":"object","properties":{"tracked":{"type":"integer"},"transferred":{"type":"integer"},"landlord_liable":{"type":"integer"},"performed_by_agency":{"type":"integer"}}},"property":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"address":{"type":"string"},"postcode":{"type":"string"},"managed_by":{"type":"string"},"service_level":{"type":"string"},"service_level_label":{"type":"string"}}}}}}},"example":{"data":[{"name":"gas_safety","label":"Gas safety","holder":"agency","status":"valid","transfer":"yes","performed_by":"Agency","transferable":true,"legally_liable":"Agency — transferred in writing"}],"meta":{"stats":{"tracked":12,"transferred":2,"landlord_liable":7,"performed_by_agency":9},"property":{"id":1,"address":"49 Essex Drive","postcode":"B90 1AA","managed_by":"Northgate Residential","service_level":"fully_managed","service_level_label":"Fully managed"}}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"property_id","schema":{"type":"integer"},"required":false,"description":"Property whose instruction to read"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Who holds each duty on one property under its current instruction: holder (agency or landlord), who performs it, who is legally liable, and whether it has moved to the agency (transfer: yes, no or n/a for the agency’s own duties). Only Right to Rent and gas safety can transfer, and both must be in writing. Agency and landlord workspaces only: a tenant context answers 403 ACCOUNT_REQUIRED. Without property_id the first property in address order is used. meta.property describes it and meta.stats counts the rows.","operationId":"duties"}},"/api/v1/api-keys":{"get":{"tags":["Keys"],"summary":"List API keys","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"name":{"type":"string"},"last4":{"type":"string"},"active":{"type":"boolean"},"prefix":{"type":"string"}}}}}},"example":{"data":[{"id":1,"name":"Production","last4":"4c71","active":true,"prefix":"abk_test"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency context required. The raw token is never listed.","operationId":"keys-index"},"post":{"tags":["Keys"],"summary":"Create an API key","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"token":{"type":"string"}}}}},"example":{"data":{"id":1,"token":"abk_test_…"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service.\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"The raw token is returned once. POST /api-keys/{id}/reveal works for ten minutes, then is gone.","operationId":"keys-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}},"example":{"name":"Reporting","scopes":["read"]}}},"required":true}}},"/api/v1/prs/pack":{"get":{"tags":["Compliance"],"summary":"A property’s PRS Database register pack","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"fix":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"value":{"type":["string","null"]},"status":{"type":"string"},"optional":{"type":"boolean"}}}},"ready":{"type":"boolean"},"steps":{"type":"array","items":{"type":"string"}},"region":{"type":"string"},"address":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}},"opens_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"fee_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"renews_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"registered":{"type":"boolean"},"deadline_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"fee_display":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"service_url":{"type":"string"},"service_name":{"type":"string"},"files_for_you":{"type":"boolean"},"not_legal_advice":{"type":"boolean"},"landlord_registration_number":{"type":["string","null"]},"property_registration_number":{"type":["string","null"]}}}}},"example":{"data":{"items":[{"fix":"Add the EICR date on the property’s Compliance tab","key":"eicr","label":"Electrical safety report (EICR)","value":null,"status":"missing","optional":false}],"ready":false,"steps":["string","string","string","string"],"region":"West Midlands","address":"49 Essex Drive, B90 1AA","missing":["Electrical safety report (EICR)"],"opens_on":"2026-12-15","fee_pence":6500,"renews_on":null,"registered":false,"deadline_on":"2027-03-14","fee_display":"£65 a year","property_id":1,"service_url":"https://www.gov.uk/","service_name":"Register your rental property","files_for_you":false,"not_legal_advice":true,"landlord_registration_number":null,"property_registration_number":null}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"property_id","schema":{"type":"integer"},"required":true,"description":"Property id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool prepare_prs_registration (read only). Each item GOV.UK’s “Register your rental property” service is expected to ask for, ready or missing with what to fix, the region’s window and deadline, the yearly fee and the steps. files_for_you is always false: the landlord registers on GOV.UK. Abide.Rent never registers for you.","operationId":"prs-pack"}},"/api/v1/prs/check":{"post":{"tags":["Compliance"],"summary":"Check a property’s PRS registration","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"lrn":{"type":"string"},"prn":{"type":"string"},"error":{"type":["string","null"]},"state":{"type":"string"},"source":{"type":"string"},"checked_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"property_id":{"type":"integer","description":"Id of the related record"}}}}},"example":{"data":{"lrn":"LL-123456","prn":"PRN-789","error":null,"state":"asserted","source":"stub","checked_at":"2026-10-13T10:00:00Z","property_id":1}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. Checks the recorded PRN and LRN and saves the result on the property (check_state, check_source). With no public register, source is stub (state asserted when both numbers are recorded, otherwise unchecked) or simulated. Not a check against the government register.","operationId":"prs-check","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"property_id":{"type":"integer","description":"Id of the related record"}}},"example":{"property_id":1}}},"required":true}}},"/api/v1/properties":{"get":{"tags":["Properties"],"summary":"List properties","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"uprn":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"occupancy":{"type":"string"},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}},"meta":{"type":"object","properties":{"per":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}}}},"example":{"data":[{"id":1,"uprn":"100012345678","address":"49 Essex Drive","postcode":"BL9 9JH","occupancy":"occupied","rent_pence":75000}],"meta":{"per":50,"page":1,"total":221}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"page","schema":{"type":"integer"},"required":false,"description":"1-based page"},{"in":"query","name":"per_page","schema":{"type":"integer"},"required":false,"description":"Default 50, max 100"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency book. Page and per_page (max 100). Rent and review dates come from the current tenancy.","operationId":"properties-index"},"post":{"tags":["Properties"],"summary":"Create a property, optionally with a tenancy","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"postcode":{"type":"string"},"address_line_1":{"type":"string"},"current_tenancy":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}}}},"example":{"data":{"id":41,"postcode":"BL9 9JH","address_line_1":"49 Essex Drive","current_tenancy":{"id":77,"rent_pence":75000,"started_on":"2025-11-01"}}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PLAN_RESTRICTED` — The plan does not include this (for example Solo’s 1-property limit). Reading and export keep working.\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`DUPLICATE_PRN` — That Property Registration Number is already on another property.\n\n`ADVANCE_RENT_BLOCKED` — Rent in advance above one rental period is not allowed (Renters’ Rights Act)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Push a dwelling we do not yet connect to. Omit tenancy to register a vacant property. The Property Registration Number is unique and reused for the next occupancy.","operationId":"properties-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tenant":{"type":"object","properties":{"email":{"type":"string"},"phone":{"type":"string"},"last_name":{"type":"string"},"first_name":{"type":"string"}}},"tenancy":{"type":"object","properties":{"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"rent_frequency":{"type":"string"},"last_increase_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"advance_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"advertised_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"statement_of_terms_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"written_agreement_held":{"type":"boolean"}}},"landlord":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"portal_access":{"type":"string"}}},"property":{"type":"object","properties":{"town":{"type":"string"},"uprn":{"type":"string"},"bedrooms":{"type":"integer"},"postcode":{"type":"string"},"furnished":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"address_line_2":{"type":["string","null"]},"landlord_registration_number":{"type":"string"},"property_registration_number":{"type":"string"}}},"compliance":{"type":"object","properties":{"epc_rating":{"type":"string"},"deposit_scheme":{"type":"string"},"gas_expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"eicr_expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"deposit_amount_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"deposit_protected_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"service_level":{"type":"string"}}},"example":{"tenant":{"email":"amy@example.com","phone":"07700 900123","last_name":"Hargreaves","first_name":"Amy"},"tenancy":{"rent_pence":75000,"started_on":"2025-11-01","rent_frequency":"monthly","last_increase_on":null,"advance_rent_pence":0,"advertised_rent_pence":75000,"statement_of_terms_on":"2025-11-01","written_agreement_held":true},"landlord":{"name":"Ashworth Holdings Ltd","email":"owner@example.co.uk","portal_access":"view_and_approve"},"property":{"town":"Bury","uprn":"100012345678","bedrooms":2,"postcode":"BL9 9JH","furnished":false,"property_type":"terraced","address_line_1":"49 Essex Drive","address_line_2":null,"landlord_registration_number":"LRN-…","property_registration_number":"PRN-…"},"compliance":{"epc_rating":"C","deposit_scheme":"dps","gas_expires_on":"2027-03-14","eicr_expires_on":"2029-06-30","deposit_amount_pence":86500,"deposit_protected_on":"2025-11-10"},"service_level":"fully_managed"}}},"required":true}}},"/api/v1/share-links":{"get":{"tags":["Compliance"],"summary":"Links to a property’s compliance record","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"live":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"string"},"expires_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"revoked_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"view_count":{"type":"integer"},"property_id":{"type":"integer","description":"Id of the related record"},"last_viewed_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"recipient_label":{"type":"string"}}}}}},"example":{"data":[{"id":5,"live":true,"created_at":"2026-10-01T09:00:00Z","created_by":"Asha Patel","expires_at":"2026-10-31T23:59:59Z","revoked_at":null,"view_count":2,"property_id":1,"last_viewed_at":"2026-10-02T14:12:00Z","recipient_label":"Mortgage lender"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"property_id","schema":{"type":"integer"},"required":true,"description":"Property id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"The read-only links on one property, live and ended, newest first, up to 50. The address itself is shown only once, when the link is made.","operationId":"share-links-index"},"post":{"tags":["Compliance"],"summary":"Make a read-only link","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"url":{"type":"string"},"live":{"type":"boolean"},"expires_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"view_count":{"type":"integer"},"property_id":{"type":"integer","description":"Id of the related record"},"recipient_label":{"type":"string"}}}}},"example":{"data":{"id":5,"url":"https://app.abide.rent/share/abshare_…","live":true,"expires_at":"2026-11-12T23:59:59Z","view_count":0,"property_id":1,"recipient_label":"Mortgage lender"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. A link to the property’s compliance record (score, current certificates, deadlines, energy rating) for someone without an Abide.Rent sign-in. days is 1 to 90 (default 30). The url is returned once.","operationId":"share-links-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer"},"property_id":{"type":"integer","description":"Id of the related record"},"recipient_label":{"type":"string"}}},"example":{"days":30,"property_id":1,"recipient_label":"Mortgage lender"}}},"required":true}}},"/api/v1/auth/sign_in":{"post":{"tags":["Auth"],"summary":"Sign in","security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"email":{"type":"string"}}},"contexts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"label":{"type":"string"}}}},"expires_in":{"type":"integer"},"access_token":{"type":"string"},"refresh_token":{"type":"string"},"current_context":{"type":["string","null"]}}}}},"example":{"data":{"person":{"id":1,"email":"string"},"contexts":[{"id":1,"kind":"agency","label":"Northgate Residential"}],"expires_in":900,"access_token":"string","refresh_token":"string","current_context":null}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"description":"Returns a short-lived access token (JWT) and a refresh token, with the person and the workspaces they can open. API keys (abk_test_…) skip this and authenticate as the paying account.","operationId":"sign-in","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"password":{"type":"string"}}},"example":{"email":"string","password":"string"}}},"required":true}}},"/api/v1/certificates":{"get":{"tags":["Compliance"],"summary":"List certificates","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"issuer":{"type":"string"},"rating":{"type":["string","null"]},"status":{"type":"string"},"address":{"type":"string"},"filename":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"can_delete":{"type":"boolean"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"superseded":{"type":"boolean"},"can_archive":{"type":"boolean"},"can_restore":{"type":"boolean"},"property_id":{"type":"integer","description":"Id of the related record"},"downloadable":{"type":"boolean"},"historic_note":{"type":["string","null"]},"superseded_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"historic_entry":{"type":"boolean"},"superseded_by_id":{"type":["string","null"],"description":"Id of the related record"},"certificate_number":{"type":"string"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"tenant_received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"delete_blocked_reason":{"type":"string"}}}},"meta":{"type":"object","properties":{"per":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}}}},"example":{"data":[{"id":7,"kind":"gas","issuer":"Corgi Heating Ltd","rating":null,"status":"valid","address":"49 Essex Drive","filename":"gas-2026.pdf","issued_on":"2026-03-14","can_delete":false,"expires_on":"2027-03-13","superseded":false,"can_archive":true,"can_restore":false,"property_id":1,"downloadable":true,"historic_note":null,"superseded_at":null,"historic_entry":false,"superseded_by_id":null,"certificate_number":"GS-118204","given_to_tenant_on":"2026-03-20","tenant_received_at":null,"delete_blocked_reason":"Kept as evidence for 6 years"}],"meta":{"per":100,"page":1,"total":1}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"property_id","schema":{"type":"integer"},"required":false,"description":"Only this property"},{"in":"query","name":"kind","schema":{"type":"string"},"required":false,"description":"Only this kind, for example gas or eicr"},{"in":"query","name":"status","schema":{"type":"string"},"required":false,"description":"expired, expiring, valid or missing"},{"in":"query","name":"include_superseded","schema":{"type":"boolean"},"required":false,"description":"Also list certificates that have been replaced"},{"in":"query","name":"page","schema":{"type":"integer"},"required":false,"description":"Page number, from 1"},{"in":"query","name":"per_page","schema":{"type":"integer"},"required":false,"description":"Rows a page (default 100, at most 100)"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Safety records and licences on the properties this workspace can see, soonest expiry first. Kinds: gas, eicr, epc (required) and fire_risk, legionella, pat, alarms, hmo_licence, selective_licence. status is valid, expiring, expired or missing (alarms have no expiry: valid once issued_on is set). Replaced certificates are left out unless include_superseded=true. can_delete, can_archive and delete_blocked_reason say what the retention rules allow. Paginated, 100 a page by default.","operationId":"certificates-index"},"post":{"tags":["Compliance"],"summary":"Add a certificate","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"},"reminder":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"property_id":{"type":"integer","description":"Id of the related record"},"prs_refresh":{"type":"object","properties":{"state":{"type":"string"},"source":{"type":"string"},"refreshed":{"type":"boolean"}}},"downloadable":{"type":"boolean"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":7,"kind":"gas","status":"valid","reminder":"Update the government’s PRS entry if this dwelling is registered (s.78). We do not file.","issued_on":"2026-03-14","expires_on":"2027-03-13","property_id":1,"prs_refresh":{"state":"asserted","source":"stub","refreshed":false},"downloadable":true,"given_to_tenant_on":"2026-03-14"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. The file is optional: send it as multipart `file`, or as `file_base64` (a bare base64 string or a data: URL) with `filename`. It must be a PDF of at most 10 MB. Only one current certificate of each kind per property. Dates are checked (422 VALIDATION_FAILED): issued_on (the check) cannot be in the future or more than ten years ago; expires_on must be after it and cannot run more than 14 months from a gas check, five years from an EICR inspection or ten years from an EPC assessment (counted from today when issued_on is left out). Leave expires_on out with issued_on given and it defaults to the check plus 12 months (gas), five years (EICR) or ten years (EPC). A record older than the property’s current one of that kind (an earlier check date, or an expiry already passed and earlier than the current one’s) is filed as history: the answer has superseded=true and superseded_by_id set, the current record stays current and nothing is given to the tenants. Otherwise gas safety records, EICRs and EPCs are given to the current tenants straight away unless give_to_tenant=false. The answer carries a reminder to update the government’s PRS entry (s.78): Abide.Rent does not file it.","operationId":"certificates-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"issuer":{"type":"string"},"rating":{"type":["string","null"]},"filename":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"file_base64":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"give_to_tenant":{"type":"boolean"},"certificate_number":{"type":"string"}}},"example":{"kind":"gas","issuer":"Corgi Heating Ltd","rating":null,"filename":"gas-2026.pdf","issued_on":"2026-03-14","expires_on":"2027-03-13","file_base64":"JVBERi0…","property_id":1,"give_to_tenant":true,"certificate_number":"GS-118204"}}},"required":true}}},"/api/v1/prs/register":{"post":{"tags":["Compliance"],"summary":"Ask to register a property (files nothing)","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"lrn":{"type":["string","null"]},"prn":{"type":["string","null"]},"state":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"accepted":{"type":"boolean"},"checked_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"property_id":{"type":"integer","description":"Id of the related record"}}}}},"example":{"data":{"lrn":null,"prn":null,"state":"unchecked","reason":"no_operator","source":"stub","accepted":false,"checked_at":"2026-10-13T10:00:00Z","property_id":1}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. Kept for a future operator connection; it files nothing today. Abide.Rent never registers for you: the answer is accepted=false with reason no_operator, and the landlord registers through the government service. Not an MCP tool — assistants use prepare_prs_registration (GET /api/v1/prs/pack) instead.","operationId":"prs-register","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"property_id":{"type":"integer","description":"Id of the related record"}}},"example":{"property_id":1}}},"required":true}}},"/api/v1/rent-reviews":{"get":{"tags":["Reviews"],"summary":"List rent reviews","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"risk":{"type":"string"},"band_low_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"band_high_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}}},"example":{"data":[{"id":1,"risk":"some","band_low_pence":86000,"band_high_pence":96000,"proposed_rent_pence":96000}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Status, band, risk and approval. The tribunal cannot award more than the proposal.","operationId":"reviews-index"},"post":{"tags":["Reviews"],"summary":"Price a proposal","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"status":{"type":"string"},"approval_status":{"type":"string"}}}}},"example":{"data":{"id":1,"status":"priced","approval_status":"pending"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PLAN_RESTRICTED` — The plan does not include this (for example Solo’s 1-property limit). Reading and export keep working."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Let-only instructions cannot create a review. Self-managed books approve themselves. Leave proposed_effective_on out to use the earliest date the notice allows: two months counted from the deemed date of service by first class post (the second working day after the generation date), aligned to the next rent day and to the 52-week rule, not two months from today. The review’s validity notes then carry a sentence saying the default allows for first class post. A date you choose must leave the full two months after the day the notice is actually served.","operationId":"reviews-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tenancy_id":{"type":"integer","description":"Id of the related record"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"proposed_effective_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"tenancy_id":1,"proposed_rent_pence":96000,"proposed_effective_on":"2026-12-01"}}},"required":true}}},"/api/v1/activity-feed":{"get":{"tags":["Landlords"],"summary":"What the agent did: the landlord activity feed","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"days":{"type":"integer"},"items":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string"},"by":{"type":"string"},"href":{"type":"string"},"kind":{"type":"string"},"tone":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"},"address":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"}}}},"since":{"type":"string"},"counts":{"type":"object","properties":{"certificate_given":{"type":"integer"}}},"viewer":{"type":"string"},"headline":{"type":"string"},"attention":{"type":"integer"},"property_count":{"type":"integer"}}}}},"example":{"data":{"days":30,"items":[{"at":"2026-10-21T09:02:00Z","by":"Northgate Residential","href":"/properties/1?tab=compliance","kind":"certificate_given","tone":"moss","title":"Gas safety record given to the tenant","detail":"string","address":"49 Essex Drive","property_id":1}],"since":"2026-09-23","counts":{"certificate_given":1},"viewer":"landlord","headline":"This week your agent added 1 gas safety record and gave it to the tenant","attention":0,"property_count":3}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"property_id","schema":{"type":"integer"},"required":false,"description":"One property"},{"in":"query","name":"landlord_person_id","schema":{"type":"integer"},"required":false,"description":"Agency workspace: one landlord"},{"in":"query","name":"days","schema":{"type":"integer"},"required":false,"description":"How far back (default 30)"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool list_landlord_activity. Landlord or agency workspace. Statutory and evidential events on the landlord’s properties, across accounts, for as long as the agency manages them: notice_served, tenant_response, certificate_added, certificate_given, deposit_protected, deposit_information, repair_reported, repair_closed, repair_overdue, inspection, right_to_rent, prs_registered. No internal notes and no tenant contact details. attention counts the items that need a look (tone oxide).","operationId":"activity-feed"}},"/api/v1/calendar-feed":{"get":{"tags":["Compliance"],"summary":"Is a private calendar address on?","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"last_fetched_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"active":true,"created_at":"2026-10-12T10:00:00Z","last_fetched_at":"2026-10-13T06:00:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property.\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, signed-in person. Whether this person has a live calendar address for the workspace, and when it was last fetched.","operationId":"calendar-feed-show"},"post":{"tags":["Compliance"],"summary":"Make a private calendar address","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"url":"https://api.abide.rent/calendar/abcal_….ics","active":true,"created_at":"2026-10-12T10:00:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property.\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, signed-in person. Returns, once, a private iCalendar address with every open deadline in the workspace as an all-day event on its due date. Only a digest of the token is kept; making a new address stops the old one. The address stops working when the person leaves the workspace. Not legal advice.","operationId":"calendar-feed"},"delete":{"tags":["Compliance"],"summary":"Turn the calendar address off","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"active":{"type":"boolean"}}}}},"example":{"data":{"active":false}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property.\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, signed-in person. The address stops working at once.","operationId":"calendar-feed-delete"}},"/api/v1/prs/readiness":{"get":{"tags":["Compliance"],"summary":"PRS Database readiness, by region","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"checker":{"type":"string"},"regions":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"opens_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"deadline_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"property_count":{"type":"integer"},"registered_count":{"type":"integer"}}}},"fee_plan":{"type":"object","properties":{"months":{"type":"array","items":{"type":"object","properties":{"first":{"type":"integer"},"month":{"type":"string"},"pence":{"type":"integer"},"renewals":{"type":"integer"}}}},"fee_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"total_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}},"opens_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"schedule":{"type":"array","items":{}},"properties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"postcode":{"type":"string"},"occupancy":{"type":"string"},"prs_region":{"type":"string"},"check_state":{"type":"string"},"missing_lrn":{"type":"boolean"},"missing_prn":{"type":"boolean"},"advert_ready":{"type":"boolean"},"check_source":{"type":"string"},"prs_opens_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"prs_renews_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"address_line_1":{"type":"string"},"prs_deadline_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"prs_registered_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"landlord_registration_number":{"type":["string","null"]},"property_registration_number":{"type":["string","null"]}}}},"unique_prn":{"type":"boolean"},"missing_lrn":{"type":"integer"},"missing_prn":{"type":"integer"},"live_checker":{"type":"boolean"},"vacant_count":{"type":"integer"},"files_for_you":{"type":"boolean"},"missing_count":{"type":"integer"},"property_count":{"type":"integer"},"all_registered_by":{"type":"string"},"annual_cost_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"advert_ready_count":{"type":"integer"},"region_deadline_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"unknown_region_count":{"type":"integer"}}},"meta":{"type":"object","properties":{"per":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}}}},"example":{"data":{"checker":"stub","regions":[{"region":"West Midlands","opens_on":"2026-12-15","deadline_on":"2027-03-14","property_count":4,"registered_count":1}],"fee_plan":{"months":[{"first":4,"month":"2026-12","pence":26000,"renewals":0}],"fee_pence":6500,"total_pence":39000},"opens_on":"2026-12-15","schedule":[],"properties":[{"id":1,"postcode":"B90 1AA","occupancy":"occupied","prs_region":"West Midlands","check_state":"unchecked","missing_lrn":true,"missing_prn":true,"advert_ready":false,"check_source":"asserted","prs_opens_on":"2026-12-15","prs_renews_on":null,"address_line_1":"49 Essex Drive","prs_deadline_on":"2027-03-14","prs_registered_on":null,"landlord_registration_number":null,"property_registration_number":null}],"unique_prn":true,"missing_lrn":9,"missing_prn":12,"live_checker":false,"vacant_count":2,"files_for_you":false,"missing_count":12,"property_count":16,"all_registered_by":"2027-11-14","annual_cost_pence":6500,"advert_ready_count":3,"region_deadline_on":"2027-03-14","unknown_region_count":0},"meta":{"per":50,"page":1,"total":16}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"page","schema":{"type":"integer"},"required":false,"description":"Page of properties, from 1"},{"in":"query","name":"per_page","schema":{"type":"integer"},"required":false,"description":"Properties a page (default 50, at most 100)"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Each property is placed in one of nine regions from its postcode. opens_on is the earliest opening across your properties and region_deadline_on the earliest regional deadline; regions lists each region with its window, property_count and registered_count; schedule is the national timetable. Every property carries its registration numbers, prs_region, prs_opens_on, prs_deadline_on, advert_ready and check_state. All landlords must be registered by all_registered_by. £65 per property per year, renewed yearly, is the government’s fee, not ours. fee_plan gives the next 12 months (first registrations and renewals, in pence). files_for_you is always false. No public register API exists: live_checker is false and checker says which stand-in is used. properties is paginated (meta). For one property’s register pack see GET /api/v1/prs/pack.","operationId":"prs"}},"/api/v1/rent-referrals":{"get":{"tags":["Tribunal referrals"],"summary":"List tribunal referrals","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"open":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"bytes":{"type":"integer"},"label":{"type":"string"},"sha256":{"type":"string"},"filename":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"uploaded_by":{"type":"string"},"content_type":{"type":"string"}}}},"forum":{"type":"string"},"status":{"type":"string"},"address":{"type":"string"},"next_step":{"type":"string"},"applied_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"hearing_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"forum_label":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"status_label":{"type":"string"},"determined_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"inspection_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"median_wait_days":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"hearing_requested":{"type":"boolean"},"statement_sent_by":{"type":["string","null"]},"current_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"paper_determination":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"expected_decision_by":{"type":"string"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_submitted_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}}},"example":{"data":[{"id":4,"open":true,"files":[{"id":9,"kind":"directions","bytes":81234,"label":"Directions","sha256":"string","filename":"directions.pdf","uploaded_at":"2026-11-16T10:00:00Z","uploaded_by":"string","content_type":"application/pdf"}],"forum":"first_tier_tribunal","status":"statement_due","address":"49 Essex Drive","next_step":"Send the landlord’s statement by 7 December 2026","applied_on":"2026-11-02","hearing_on":null,"forum_label":"First-tier Tribunal (Property Chamber)","property_id":1,"status_label":"Statement due","determined_on":null,"inspection_on":null,"case_reference":"MAN/00BN/MRA/2026/0101","rent_review_id":3,"median_wait_days":96,"not_legal_advice":true,"hearing_requested":false,"statement_sent_by":null,"current_rent_pence":120000,"issued_document_id":2,"paper_determination":true,"proposed_rent_pence":127500,"expected_decision_by":"2027-02-06","directions_received_on":"2026-11-16","statement_submitted_on":null,"tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"include_closed","schema":{"type":"boolean"},"required":false,"description":"Also list closed referrals"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool list_rent_referrals. A referral opens when the outcome application_made is recorded on a Form 4A and closes on determined or application_withdrawn. forum is first_tier_tribunal or voa_rent_service (for when rent cases move to the Valuation Office Agency). status is awaiting_directions, statement_due, submitted, awaiting_decision, determined or withdrawn. Abide.Rent files nothing with either body.","operationId":"referrals-index"}},"/api/v1/shared/{token}":{"get":{"tags":["Compliance"],"summary":"Open a shared compliance record","security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"note":{"type":"string"},"energy":{"type":"object","properties":{}},"property":{"type":"object","properties":{"address":{"type":"string"},"epc_rating":{"type":"string"}}},"deadlines":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"status":{"type":"string"},"outcome":{"type":["string","null"]}}}},"shared_by":{"type":"string"},"expires_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"shared_with":{"type":"string"},"certificates":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"label":{"type":"string"},"status":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}},"compliance_score":{"type":"object","properties":{"band":{"type":"string"},"items":{"type":"array","items":{}},"score":{"type":"integer"}}},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":{"note":"A read-only view shared from Abide.Rent. Dates and statuses only; no documents or personal details.","energy":{},"property":{"address":"49 Essex Drive, Solihull, B90 1AA","epc_rating":"C"},"deadlines":[{"label":"EICR due","due_on":"2026-12-01","status":"due","outcome":null}],"shared_by":"Northgate Residential","expires_at":"2026-11-12T23:59:59Z","shared_with":"Mortgage lender","certificates":[{"kind":"gas","label":"Gas safety record","status":"valid","issued_on":"2026-03-14","expires_on":"2027-03-13","given_to_tenant_on":"2026-03-20"}],"compliance_score":{"band":"attention","items":[],"score":71},"not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"token","schema":{"type":"string"},"required":true,"description":"abshare_… token from the link"}],"description":"No sign-in and no workspace headers: the token is the key. Dates and statuses only, no documents or personal details. Unknown, ended and revoked links all answer 404. Each view is counted and recorded.","operationId":"shared-view"}},"/api/v1/properties/{id}":{"get":{"tags":["Properties"],"summary":"Show a property","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"identifiers":{"type":"object","properties":{"uprn":{"type":"string"},"property_registration_number":{"type":"string"}}}}}}},"example":{"data":{"id":1,"rent_pence":75000,"identifiers":{"uprn":"string","property_registration_number":"string"}}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Property id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Includes rent history and PRS identifiers when present.\n\nThe property response includes compliance_score: a score out of 100, a band (good ≥ 90, attention ≥ 60, at_risk below) and the items behind it. Valid scores 1, expiring or due 0.5, missing, expired or overdue 0. Items that do not apply are left out. Certificates also carry given_to_tenant_on and tenant_received_at.","operationId":"properties-show"}},"/api/v1/repair-settings":{"get":{"tags":["Repairs"],"summary":"Repair targets and ruleset","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ruleset":{"type":"string"},"rulesets":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}}}}}}}},"example":{"data":{"ruleset":"abide_default","rulesets":[{"label":"Your own targets","value":"abide_default"},{"label":"Awaab’s Law stages (proposed for private renting)","value":"awaab_prs_draft"}]}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Your response targets, and ruleset: abide_default (one target per repair, the default) or awaab_prs_draft (staged clocks, proposed for private renting). PATCH the same path to change them.","operationId":"repair-settings"},"patch":{"tags":["Repairs"],"summary":"Change the repair ruleset","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"ruleset":{"type":"string"}}}}},"example":{"data":{"ruleset":"awaab_prs_draft"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Manager seats. Switch between abide_default and awaab_prs_draft.","operationId":"repair-settings-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ruleset":{"type":"string"}}},"example":{"ruleset":"awaab_prs_draft"}}},"required":true}}},"/api/v1/comparables/{id}":{"get":{"tags":["Comparables"],"summary":"Show a comparable","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":false,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"agent_letter","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Comparable id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool get_comparable.","operationId":"comparables-show"},"patch":{"tags":["Comparables"],"summary":"Update a comparable","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":false,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"agent_letter","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Comparable id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool update_comparable. The same fields as adding one. A comparable made from your own letting keeps its source.","operationId":"comparables-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}}}},"example":{"note":"string","adjustments":[{"pence":-2500,"reason":"Smaller garden"}]}}},"required":true}}},"/api/v1/issued-documents":{"get":{"tags":["Notices"],"summary":"List issued documents","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"voided":{"type":"boolean"},"legal_hold":{"type":"boolean"}}}}}},"example":{"data":[{"id":1,"kind":"form_4a","voided":false,"legal_hold":false}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Notices and evidence packs. Each party keeps their own copy.","operationId":"docs-index"},"post":{"tags":["Notices"],"summary":"Generate or preview a notice","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"preview_text":{"type":"string"},"can_record_service":{"type":"boolean"}}}}},"example":{"data":{"id":1,"preview_text":"…","can_record_service":false}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PLAN_RESTRICTED` — The plan does not include this (for example Solo’s 1-property limit). Reading and export keep working."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`PACK_INCLUDED_ON_MANAGE` — The pack is already included on this plan; no purchase is needed.\n\n`SOLICITOR_REVIEW_REQUIRED` — This notice kind needs the solicitor-reviewed flag before it can be generated."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Form 4A waits on an acknowledgment that the prescribed form has been checked against the gov.uk library. This does not serve.","operationId":"docs-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"solicitor_reviewed":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}},"example":{"kind":"form_4a","property_id":1,"solicitor_reviewed":true,"proposed_rent_pence":96000}}},"required":true}}},"/api/v1/share-links/{id}":{"delete":{"tags":["Compliance"],"summary":"End a read-only link","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"live":{"type":"boolean"},"revoked_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"id":5,"live":false,"revoked_at":"2026-10-13T10:00:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Share link id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. The link stops working at once; its record and view count are kept.","operationId":"share-links-delete"}},"/api/v1/tenant/tenancies":{"get":{"tags":["Tenants"],"summary":"Tenant’s tenancies","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"address":{"type":"string"}}}}}},"example":{"data":[{"id":1,"address":"49 Essex Drive"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Tenant context. Always free. Documents already issued cannot be confiscated.","operationId":"tenant-tenancies"}},"/api/v1/certificates/{id}":{"get":{"tags":["Compliance"],"summary":"Get a certificate","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"can_delete":{"type":"boolean"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"property_id":{"type":"integer","description":"Id of the related record"},"storage_key":{"type":"string"},"downloadable":{"type":"boolean"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"tenant_received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"id":7,"kind":"gas","status":"valid","issued_on":"2026-03-14","can_delete":false,"expires_on":"2027-03-13","property_id":1,"storage_key":"certificates/7/gas-2026.pdf","downloadable":true,"given_to_tenant_on":"2026-03-20","tenant_received_at":null}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"One certificate, with the same fields as the list plus storage_key. downloadable is true only when the file is actually in storage.","operationId":"certificates-show"},"patch":{"tags":["Compliance"],"summary":"Change or replace a certificate","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"superseded":{"type":"boolean"}}}}},"example":{"data":{"id":7,"kind":"gas","status":"valid","expires_on":"2027-03-20","superseded":false}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`IMMUTABLE_RECORD` — The record is part of the evidence trail and cannot be changed.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. Send any of kind, issued_on, expires_on, issuer, certificate_number, rating, and optionally a new PDF (file or file_base64). When kind, issued_on or expires_on is in the request the same date rules as on create apply (422 VALIDATION_FAILED: check not in the future or over ten years ago; expiry after the check and at most 14 months for gas, five years for an EICR, ten for an EPC). Send superseded=true to mark it replaced, or superseded=false to restore it. A certificate that is part of the evidence trail cannot be changed: 403 IMMUTABLE_RECORD.","operationId":"certificates-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"certificate_number":{"type":"string"}}},"example":{"expires_on":"2027-03-20","certificate_number":"GS-118204A"}}},"required":true}},"delete":{"tags":["Compliance"],"summary":"Delete a certificate","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean"},"storage_kept":{"type":"boolean"}}}}},"example":{"data":{"deleted":true,"storage_kept":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`LEGAL_HOLD_PREVENTS_DELETE` — A legal hold keeps this record. It cannot be deleted while the case is live.\n\n`IMMUTABLE_RECORD` — The record is part of the evidence trail and cannot be changed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys and seats that can edit tenancies. Allowed only when can_delete is true. A legal hold answers 403 LEGAL_HOLD_PREVENTS_DELETE; a record kept as evidence answers 403 IMMUTABLE_RECORD, with the reason in the message. The stored file is kept.","operationId":"certificates-delete"}},"/api/v1/properties/import":{"post":{"tags":["Properties"],"summary":"Import a CSV","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"}}}}},"example":{"data":{"id":1,"kind":"import","status":"queued"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Imports row by row; a bad row never stops the others. Headers are matched on letters and digits only, with common aliases. Columns: address, postcode, town, property_type, bedrooms, rent, started_on, last_increase_on, landlord, landlord_email; for gas, eicr and epc each of {kind}_expires_on, {kind}_checked_on and {kind}_given_on; tenant_1_name to tenant_4_name with _email and _phone; deposit_amount, deposit_received_on, deposit_scheme (DPS, TDS or mydeposits), deposit_reference, deposit_protected_on; information_sheet_served_on, statement_of_terms_served_on, written_agreement, right_to_rent_checked_on; and prescribed_info_served_on and last_section13_served_on (warnings only). Each row’s result lists gaps (for example “No EICR”, “Deposit not recorded”), and the job totals them, with the header preset it matched. No emails or portal invitations are sent. A check date or date given is a past event: it is kept as given and marked as entered later (historic_entry), never replaced by the day of the import. A row that would go over the Solo limit is skipped with a warning. Evidence is never deleted.","operationId":"properties-import","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"csv":{"type":"string"},"mapping":{"type":"object","properties":{}}}},"example":{"csv":"address,postcode,town,property_type,bedrooms,gas_expires_on,gas_checked_on,gas_given_on\n…","mapping":{}}}},"required":true}}},"/api/v1/reference/figures":{"get":{"tags":["Reviews"],"summary":"Reference figures and how fresh they are","security":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"corpus":{"type":"object","properties":{"as_of":{"type":"string"},"sample":{"type":"integer"},"computed":{"type":"boolean"},"waits_sample":{"type":"integer"}}},"freshness":{"type":"object","properties":{"determinations":{"type":"object","properties":{"as_of":{"type":"string"},"label":{"type":"string"},"stale":{"type":"boolean"},"source":{"type":"string"},"display":{"type":"string"},"records":{"type":"integer"},"last_success_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}}}}}},"example":{"data":{"corpus":{"as_of":"2026-10-19","sample":77,"computed":true,"waits_sample":846},"freshness":{"determinations":{"as_of":"2026-09-10","label":"Published First-tier Tribunal rent decisions","stale":false,"source":"gov.uk","display":"Published First-tier Tribunal rent decisions to 10 September 2026","records":846,"last_success_at":"2026-10-19T05:10:00Z"}}}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"description":"Public. The tribunal and market figures Abide.Rent uses, with freshness for each source (published tribunal decisions, ONS private rents, Local Housing Allowance): when it was last updated, how many records, and whether it is stale. Figures may be computed from the decisions corpus.","operationId":"reference-figures"}},"/api/v1/rent-reviews/{id}":{"get":{"tags":["Reviews"],"summary":"Show a rent review","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"furnished":{"type":"string"},"comparables":{"type":"object","properties":{"ready":{"type":"boolean"},"needed":{"type":"integer"},"headline":{"type":"string"},"strong_count":{"type":"integer"},"ready_threshold":{"type":"integer"}}},"condition_notes":{"type":["string","null"]},"not_legal_advice":{"type":"boolean"},"tenant_damage_notes":{"type":["string","null"]},"tenant_improvements":{"type":"array","items":{}},"tribunal_assessment":{"type":"object","properties":{"tribunal_data_as_of":{"type":"string"},"below_current_sentence":{"type":"string"},"tribunal_can_go_below_current":{"type":"boolean"}}},"below_current_warning":{"type":"string"},"landlord_improvements":{"type":"array","items":{}},"tribunal_can_go_below_current":{"type":"boolean"},"tribunal_cannot_exceed_proposal":{"type":"boolean"}}}}},"example":{"data":{"id":1,"furnished":"unfurnished","comparables":{"ready":false,"needed":1,"headline":"2 of 3 strong comparables · proposed rent at the 62nd percentile","strong_count":2,"ready_threshold":3},"condition_notes":null,"not_legal_advice":true,"tenant_damage_notes":null,"tenant_improvements":[],"tribunal_assessment":{"tribunal_data_as_of":"2026-09-10","below_current_sentence":"string","tribunal_can_go_below_current":true},"below_current_warning":"If the tenant refers the increase, the tribunal decides the open-market rent. It can be below the current rent.","landlord_improvements":[],"tribunal_can_go_below_current":true,"tribunal_cannot_exceed_proposal":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Detail includes validity notes, the tribunal ceiling flag, tribunal_can_go_below_current and below_current_warning (which names the market figure when comparables sit below today’s rent), the condition record, and the comparables summary (without rows). tribunal_assessment carries below_current_sentence and tribunal_data_as_of.","operationId":"reviews-show"},"patch":{"tags":["Reviews"],"summary":"Update a review, including its condition record","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"furnished":{"type":"string"},"condition_notes":{"type":"string"},"tenant_damage_notes":{"type":["string","null"]},"tenant_improvements":{"type":"array","items":{}},"below_current_warning":{"type":"string"},"landlord_improvements":{"type":"array","items":{}},"tribunal_can_go_below_current":{"type":"boolean"}}}}},"example":{"data":{"id":3,"furnished":"unfurnished","condition_notes":"string","tenant_damage_notes":null,"tenant_improvements":[],"below_current_warning":"If the tenant refers the increase, the tribunal decides the open-market rent. It can be below the current rent.","landlord_improvements":[],"tribunal_can_go_below_current":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Also takes the condition record: furnished (furnished, part_furnished, unfurnished), condition_notes, landlord_improvements and tenant_improvements ([{what, on, cost_pence}]) and tenant_damage_notes. The tribunal disregards tenant improvements and damage caused by the tenant (Housing Act 1988, s.14(2)). A condition-only change works until the review is cancelled, even when it can no longer be edited otherwise, and does not reset the landlord’s approval.","operationId":"reviews-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"furnished":{"type":"string"},"condition_notes":{"type":"string"},"tenant_damage_notes":{"type":"string"},"tenant_improvements":{"type":"array","items":{"type":"object","properties":{"on":{"type":"string"},"what":{"type":"string"},"cost_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}},"landlord_improvements":{"type":"array","items":{"type":"object","properties":{"on":{"type":"string"},"what":{"type":"string"},"cost_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}}},"example":{"furnished":"unfurnished","condition_notes":"Kitchen fitted 2019; bathroom dated.","tenant_damage_notes":"string","tenant_improvements":[{"on":"2024-05-01","what":"Fitted wardrobes","cost_pence":80000}],"landlord_improvements":[{"on":"2025-11-01","what":"New boiler","cost_pence":240000}]}}},"required":true}}},"/api/v1/trails/{kind}/{id}":{"get":{"tags":["Compliance"],"summary":"Message trail for a record","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string"},"id":{"type":"string","description":"Abide.Rent id"},"role":{"type":"string"},"error":{"type":["string","null"]},"event":{"type":"string"},"label":{"type":"string"},"party":{"type":"string"},"status":{"type":"string"},"channel":{"type":"string"},"read_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"sent_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"subject":{"type":"string"},"opened_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"recipient":{"type":"string"},"bounced_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"delivered_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}}},"example":{"data":[{"at":"2026-03-20T09:00:00Z","id":"delivery-41","role":"tenant","error":null,"event":"certificate_given","label":"Safety record given","party":"tenant","status":"delivered","channel":"email","read_at":null,"sent_at":"2026-03-20T09:00:00Z","subject":"Your gas safety record","opened_at":null,"recipient":"J. Smith","bounced_at":null,"delivered_at":"2026-03-20T09:00:04Z"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"kind","schema":{"type":"string"},"required":true,"description":"certificates | rent-reviews | inspections | landlord-statements | deposits | signed-documents"},{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Record id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Who was told what about a record, by which channel, and when each message was sent, delivered, opened or read. kind is certificates, rent-reviews, inspections, landlord-statements, deposits or signed-documents. Staff see every message on a record their workspace can see; a tenant sees only messages sent to them about their own tenancy. Anything else is 404.","operationId":"trails"}},"/api/v1/landlord-statements":{"get":{"tags":["Statements"],"summary":"Monthly landlord statements","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"score":{"type":"integer"},"issued_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"period_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"period_label":{"type":"string"}}}}}},"example":{"data":[{"id":3,"score":82,"issued_at":"2026-10-01T08:00:00Z","period_on":"2026-10-01","period_label":"October 2026"}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Statements visible to the caller: an agency sees the ones it issued, a landlord sees the ones issued to them. Newest first, up to 50. Statements go out automatically at 09:00 London time on the 1st of each month.","operationId":"landlord-statements"}},"/api/v1/rent-referrals/{id}":{"get":{"tags":["Tribunal referrals"],"summary":"Show a referral","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"open":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"bytes":{"type":"integer"},"label":{"type":"string"},"sha256":{"type":"string"},"filename":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"uploaded_by":{"type":"string"},"content_type":{"type":"string"}}}},"forum":{"type":"string"},"status":{"type":"string"},"address":{"type":"string"},"next_step":{"type":"string"},"applied_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"hearing_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"forum_label":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"status_label":{"type":"string"},"determined_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"inspection_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"median_wait_days":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"hearing_requested":{"type":"boolean"},"statement_sent_by":{"type":["string","null"]},"current_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"paper_determination":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"expected_decision_by":{"type":"string"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_submitted_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":4,"open":true,"files":[{"id":9,"kind":"directions","bytes":81234,"label":"Directions","sha256":"string","filename":"directions.pdf","uploaded_at":"2026-11-16T10:00:00Z","uploaded_by":"string","content_type":"application/pdf"}],"forum":"first_tier_tribunal","status":"statement_due","address":"49 Essex Drive","next_step":"Send the landlord’s statement by 7 December 2026","applied_on":"2026-11-02","hearing_on":null,"forum_label":"First-tier Tribunal (Property Chamber)","property_id":1,"status_label":"Statement due","determined_on":null,"inspection_on":null,"case_reference":"MAN/00BN/MRA/2026/0101","rent_review_id":3,"median_wait_days":96,"not_legal_advice":true,"hearing_requested":false,"statement_sent_by":null,"current_rent_pence":120000,"issued_document_id":2,"paper_determination":true,"proposed_rent_pence":127500,"expected_decision_by":"2027-02-06","directions_received_on":"2026-11-16","statement_submitted_on":null,"tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool get_rent_referral. Includes the next step, the median wait and the expected decision date.","operationId":"referrals-show"},"patch":{"tags":["Tribunal referrals"],"summary":"Update a referral","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"open":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"bytes":{"type":"integer"},"label":{"type":"string"},"sha256":{"type":"string"},"filename":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"uploaded_by":{"type":"string"},"content_type":{"type":"string"}}}},"forum":{"type":"string"},"status":{"type":"string"},"address":{"type":"string"},"next_step":{"type":"string"},"applied_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"hearing_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"forum_label":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"status_label":{"type":"string"},"determined_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"inspection_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"median_wait_days":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"hearing_requested":{"type":"boolean"},"statement_sent_by":{"type":["string","null"]},"current_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"paper_determination":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"expected_decision_by":{"type":"string"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_submitted_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":4,"open":true,"files":[{"id":9,"kind":"directions","bytes":81234,"label":"Directions","sha256":"string","filename":"directions.pdf","uploaded_at":"2026-11-16T10:00:00Z","uploaded_by":"string","content_type":"application/pdf"}],"forum":"first_tier_tribunal","status":"statement_due","address":"49 Essex Drive","next_step":"Send the landlord’s statement by 7 December 2026","applied_on":"2026-11-02","hearing_on":null,"forum_label":"First-tier Tribunal (Property Chamber)","property_id":1,"status_label":"Statement due","determined_on":null,"inspection_on":null,"case_reference":"MAN/00BN/MRA/2026/0101","rent_review_id":3,"median_wait_days":96,"not_legal_advice":true,"hearing_requested":false,"statement_sent_by":null,"current_rent_pence":120000,"issued_document_id":2,"paper_determination":true,"proposed_rent_pence":127500,"expected_decision_by":"2027-02-06","directions_received_on":"2026-11-16","statement_submitted_on":null,"tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool update_rent_referral. case_reference, inspection_on, hearing_requested, hearing_on, note, and a file with its file_kind.","operationId":"referrals-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"},"filename":{"type":"string"},"file_kind":{"type":"string"},"file_base64":{"type":"string"},"inspection_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"hearing_requested":{"type":"boolean"}}},"example":{"note":"string","filename":"letter.pdf","file_kind":"other","file_base64":"string","inspection_on":"2027-01-12","case_reference":"MAN/00BN/MRA/2026/0101","hearing_requested":false}}},"required":true}}},"/api/v1/tenant/certificates":{"get":{"tags":["Tenants"],"summary":"Safety records given to the tenant","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"tenant_received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"}}}}}},"example":{"data":[{"id":7,"kind":"gas","given_to_tenant_on":"2026-10-12","tenant_received_at":null}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Tenant context. Gas safety records, EICRs and EPCs given for the tenant’s tenancies, with given_to_tenant_on and tenant_received_at.","operationId":"tenant-certificates"}},"/api/v1/certificates/summary":{"get":{"tags":["Compliance"],"summary":"Certificate summary","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"as_of":{"type":"string"},"valid":{"type":"integer"},"expired":{"type":"integer"},"missing":{"type":"array","items":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string"}},"address":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"}}}},"undated":{"type":"integer"},"expiring_30d":{"type":"integer"}}}}},"example":{"data":{"as_of":"2026-10-13","valid":14,"expired":2,"missing":[{"kinds":["gas","epc"],"address":"12 Acacia Avenue, Bury","property_id":7}],"undated":0,"expiring_30d":1}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace only. Counts of current gas safety records, EICRs and EPCs by expiry (expired, expiring within 30 days, valid, undated), and each property missing one of them. An EPC rating recorded on the property counts as its EPC. Archived properties are left out.","operationId":"certificates-summary"}},"/api/v1/comparables/{id}/file":{"get":{"tags":["Comparables"],"summary":"Download a comparable’s document","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"filename":{"type":"string"},"file_base64":{"type":"string"},"content_type":{"type":"string"}}}}},"example":{"data":{"filename":"letter.pdf","file_base64":"string","content_type":"application/pdf"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Comparable id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool download_comparable_file.","operationId":"comparables-file"}},"/api/v1/reports/evidence-gaps":{"get":{"tags":["Compliance"],"summary":"Report: evidence gaps","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"key":{"type":"string"},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Abide.Rent id"},"area":{"type":"string"},"days":{"type":"integer"},"href":{"type":"string"},"since":{"type":"string"},"action":{"type":"string"},"record":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}},"property_id":{"type":"integer","description":"Id of the related record"},"missing_text":{"type":"string"},"property_address":{"type":"string"}}}},"count":{"type":"integer"},"title":{"type":"string"},"total":{"type":"integer"},"capped":{"type":"boolean"},"summary":{"type":"object","properties":{"notice":{"type":"integer"},"tenancy":{"type":"integer"},"certificate":{"type":"integer"}}},"max_rows":{"type":"integer"},"explanation":{"type":"string"},"generated_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":{"key":"evidence-gaps","rows":[{"id":"certificate-7","area":"certificate","days":207,"href":"/properties/1?tab=compliance","since":"2026-03-20","action":"Open compliance","record":"Gas safety record given to the tenant","missing":["Tenant's confirmation of receipt"],"property_id":1,"missing_text":"Tenant's confirmation of receipt","property_address":"49 Essex Drive"}],"count":3,"title":"Evidence gaps","total":3,"capped":false,"summary":{"notice":1,"tenancy":0,"certificate":2},"max_rows":2000,"explanation":"string","generated_on":"2026-10-13","not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, any seat. Records that would be thin in front of a tribunal: served notices without a tenant receipt or delivery evidence, safety records given but not confirmed by the tenant, and current tenancies missing a written statement, Information Sheet or deposit evidence. area is notice, certificate or tenancy. Not legal advice.","operationId":"report-evidence-gaps"}},"/api/v1/reports/prs-readiness":{"get":{"tags":["Compliance"],"summary":"Report: PRS readiness by region","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"key":{"type":"string"},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Abide.Rent id"},"href":{"type":"string"},"action":{"type":"string"},"region":{"type":"string"},"window":{"type":"string"},"opens_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"with_prn":{"type":"integer"},"properties":{"type":"integer"},"deadline_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"without_prn":{"type":"integer"},"days_to_deadline":{"type":"integer"}}}},"count":{"type":"integer"},"title":{"type":"string"},"total":{"type":"integer"},"capped":{"type":"boolean"},"summary":{"type":"object","properties":{"with_prn":{"type":"integer"},"properties":{"type":"integer"},"without_prn":{"type":"integer"}}},"max_rows":{"type":"integer"},"explanation":{"type":"string"},"generated_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":{"key":"prs-readiness","rows":[{"id":"west-midlands","href":"/prs","action":"Add the numbers","region":"West Midlands","window":"string","opens_on":"2026-12-15","with_prn":1,"properties":4,"deadline_on":"2027-03-14","without_prn":3,"days_to_deadline":152}],"count":12,"title":"PRS readiness by region","total":1,"capped":false,"summary":{"with_prn":4,"properties":16,"without_prn":12},"max_rows":2000,"explanation":"string","generated_on":"2026-10-13","not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, any seat. Per PRS Database region, how many properties have a Property Registration Number and how many do not, beside the region’s window. A border postcode with no region set is counted under “Region not known”, never guessed. count is the number of properties without a PRN. Not legal advice.","operationId":"report-prs-readiness"}},"/api/v1/certificates/bulk-read":{"post":{"tags":["Compliance"],"summary":"Read several certificate files","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"ok":{"type":"boolean"},"kind":{"type":"string"},"notes":{"type":"array","items":{}},"token":{"type":"string"},"issuer":{"type":"string"},"reader":{"type":"string"},"filename":{"type":"string"},"has_text":{"type":"boolean"},"postcode":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"candidates":{"type":"array","items":{}},"confidence":{"type":"string"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"match_score":{"type":"number"},"property_id":{"type":"integer","description":"Id of the related record"},"address_text":{"type":"string"},"expiry_inferred":{"type":"boolean"},"property_address":{"type":"string"},"certificate_number":{"type":"string"}}}},"meta":{"type":"object","properties":{"reader":{"type":"string"},"max_files":{"type":"integer"},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":[{"ok":true,"kind":"gas","notes":[],"token":"string","issuer":"Corgi Heating Ltd","reader":"text","filename":"gas-49-essex.pdf","has_text":true,"postcode":"B90 1AA","issued_on":"2026-03-14","candidates":[],"confidence":"high","expires_on":"2027-03-13","match_score":0.92,"property_id":1,"address_text":"49 Essex Drive","expiry_inferred":false,"property_address":"49 Essex Drive, B90 1AA","certificate_number":"GS-118204"}],"meta":{"reader":"text","max_files":10,"not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Step 1 of a bulk upload. Agency or landlord workspace, seats that can edit tenancies. Up to 10 files, each { file_base64, filename, content_type }. Nothing is saved: each file comes back as a review row with the suggested kind, dates, number, matched property, confidence and a token for step 2. property_id limits matching to one property. meta.reader says whether the assistant or plain text matching read the files.","operationId":"certificates-bulk-read","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"file_base64":{"type":"string"},"content_type":{"type":"string"}}}},"property_id":{"type":"integer","description":"Id of the related record"}}},"example":{"files":[{"filename":"gas-49-essex.pdf","file_base64":"JVBERi0…","content_type":"application/pdf"}],"property_id":1}}},"required":true}}},"/api/v1/certificates/bulk-save":{"post":{"tags":["Compliance"],"summary":"Save checked certificate rows","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"ok":{"type":"boolean"},"kind":{"type":"string"},"token":{"type":"string"},"status":{"type":"string"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"property_id":{"type":"integer","description":"Id of the related record"},"certificate_id":{"type":"integer","description":"Id of the related record"}}}}}},"example":{"data":[{"ok":true,"kind":"gas","token":"string","status":"valid","expires_on":"2027-03-13","property_id":1,"certificate_id":7}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Step 2 of a bulk upload. Up to 10 rows, each with the token from bulk-read and the confirmed fields. Each row is saved like a single upload (the same date rules and default expiry as POST /api/v1/certificates; a row with an impossible expiry or check date answers ok=false with the reason; an older record than the current one is filed as history with superseded=true; otherwise given to the tenant unless give_to_tenant=false). The answer has one result per row: 201 when any row was saved, 200 with each row’s reason when none was. A token from an expired upload answers ok=false.","operationId":"certificates-bulk-save","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"token":{"type":"string"},"issuer":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"expires_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"property_id":{"type":"integer","description":"Id of the related record"},"give_to_tenant":{"type":"boolean"},"certificate_number":{"type":"string"}}}}}},"example":{"rows":[{"kind":"gas","token":"string","issuer":"Corgi Heating Ltd","issued_on":"2026-03-14","expires_on":"2027-03-13","property_id":1,"give_to_tenant":true,"certificate_number":"GS-118204"}]}}},"required":true}}},"/api/v1/reports/compliance-risk":{"get":{"tags":["Compliance"],"summary":"Report: compliance risk","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"key":{"type":"string"},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Abide.Rent id"},"key":{"type":"string"},"band":{"type":"string"},"days":{"type":"integer"},"href":{"type":"string"},"label":{"type":"string"},"score":{"type":"integer"},"action":{"type":"string"},"bucket":{"type":"string"},"due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"status":{"type":"string"},"outcome":{"type":["string","null"]},"landlord":{"type":"string"},"postcode":{"type":"string"},"tenancy_id":{"type":"integer","description":"Id of the related record"},"property_id":{"type":"integer","description":"Id of the related record"},"certificate_kind":{"type":"string"},"property_address":{"type":"string"}}}},"count":{"type":"integer"},"title":{"type":"string"},"total":{"type":"integer"},"capped":{"type":"boolean"},"summary":{"type":"object","properties":{"30":{"type":"integer"},"60":{"type":"integer"},"90":{"type":"integer"},"expired":{"type":"integer"}}},"max_rows":{"type":"integer"},"explanation":{"type":"string"},"generated_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":{"key":"compliance-risk","rows":[{"id":"eicr-Property-1","key":"eicr","band":"attention","days":19,"href":"/properties/1?tab=clocks","label":"EICR due","score":71,"action":"Book the EICR","bucket":"30","due_on":"2026-11-01","status":"due","outcome":null,"landlord":"R. Khan","postcode":"B90 1AA","tenancy_id":2,"property_id":1,"certificate_kind":"eicr","property_address":"49 Essex Drive"}],"count":4,"title":"Compliance risk","total":4,"capped":false,"summary":{"30":2,"60":0,"90":1,"expired":1},"max_rows":2000,"explanation":"string","generated_on":"2026-10-13","not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, any seat. Certificates and duties that have passed their date or fall due within 30, 60 or 90 days, with each property’s compliance score. Same dates as the property’s clocks. rows is capped at max_rows; total and capped say if more exist. Not legal advice.","operationId":"report-compliance-risk"}},"/api/v1/comparables/{id}/archive":{"post":{"tags":["Comparables"],"summary":"Archive a comparable","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":true,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"agent_letter","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Comparable id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool archive_comparable. Takes it out of the summary and the pack. Nothing is deleted.","operationId":"comparables-archive"}},"/api/v1/compliance-registrations":{"get":{"tags":["Compliance"],"summary":"Registrations checklist","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"hint":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"note":{"type":["string","null"]},"label":{"type":"string"},"status":{"type":"string"},"provider":{"type":"string"},"reference":{"type":"string"},"renews_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}},"not_open":{"type":"boolean"}}}}}},"example":{"data":[{"hint":"string","kind":"redress_scheme","label":"Redress scheme membership","entries":[{"id":3,"kind":"redress_scheme","note":null,"label":"Redress scheme membership","status":"due_soon","provider":"The Property Ombudsman","reference":"T01234","renews_on":"2026-11-01","started_on":"2025-11-01"}],"not_open":false}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property.\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"query","name":"holder","schema":{"type":"string"},"required":false,"description":"account (default), or a landlord key from GET /landlords"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace. The memberships and registrations the business (holder=account, the default) or one of an agency’s landlords (holder=landlord key) should hold, with what is recorded against each. Kinds: redress_scheme, client_money_protection, ico_registration, pi_insurance, trade_body, landlord_ombudsman, other; which apply depends on the holder. Entry status is valid, due_soon (within 30 days), expired or no_date. not_open is true while the Landlord Ombudsman has no opening date.","operationId":"registrations-index"},"post":{"tags":["Compliance"],"summary":"Record a registration","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"note":{"type":"string"},"label":{"type":"string"},"status":{"type":"string"},"provider":{"type":"string"},"reference":{"type":"string"},"renews_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":3,"kind":"redress_scheme","note":"string","label":"Redress scheme membership","status":"due_soon","provider":"The Property Ombudsman","reference":"T01234","renews_on":"2026-11-01","started_on":"2025-11-01"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys. The business’s own records need an owner or manager seat; a landlord’s need a seat that can edit tenancies.","operationId":"registrations-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string"},"note":{"type":"string"},"holder":{"type":"string"},"provider":{"type":"string"},"reference":{"type":"string"},"renews_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"kind":"redress_scheme","note":"string","holder":"account","provider":"The Property Ombudsman","reference":"T01234","renews_on":"2026-11-01","started_on":"2025-11-01"}}},"required":true}}},"/api/v1/issued-documents/historic":{"post":{"tags":["Notices"],"summary":"Record a notice served before Abide.Rent","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"served_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"historic_note":{"type":"string"},"historic_entry":{"type":"boolean"}}}}},"example":{"data":{"id":41,"kind":"uploaded_notice","served_on":"2026-02-02","historic_note":"Served before we used Abide.Rent","historic_entry":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Brings onto the record a Form 4A or Section 8 notice served outside Abide.Rent, with the day it was served (served_on), not the day it is entered. historic_note (at least 5 characters) says where the record comes from. The dates are checked against the rules and the result is shown, never hidden. Nothing is sent to the tenant. A notice still live, and any Section 8, is put under legal hold. The PDF is optional (base64, up to 15 MB). Not for tenants.","operationId":"docs-record-historic","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string"},"filename":{"type":"string"},"served_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"file_base64":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"alleged_kind":{"type":"string"},"historic_note":{"type":"string"},"notice_months":{"type":"integer"},"tenant_response":{"type":"string"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenant_responded_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"proposed_effective_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"channel":"first_class","filename":"form-4a.pdf","served_on":"2026-02-02","file_base64":"string","property_id":12,"alleged_kind":"form_4a","historic_note":"Served before we used Abide.Rent","notice_months":2,"tenant_response":"accept","proposed_rent_pence":95000,"tenant_responded_on":"2026-02-20","proposed_effective_on":"2026-04-06"}}},"required":true}}},"/api/v1/landlords/{id}/statements":{"get":{"tags":["Statements"],"summary":"Months a statement can be sent for","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"periods":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"sent_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"complete":{"type":"boolean"},"period_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_id":{"type":["string","null"],"description":"Id of the related record"}}}},"statements":{"type":"array","items":{}},"next_run_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"default_period":{"type":"string"}}}}},"example":{"data":{"enabled":true,"periods":[{"label":"September 2026","sent_at":null,"complete":true,"period_on":"2026-09-01","statement_id":null}],"statements":[],"next_run_on":"2026-11-01","default_period":"2026-09-01"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"Landlord key from GET /landlords"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency context only. This month so far and up to 12 months before it (never before the account opened), each with whether its statement was sent, the month chosen by default (the one just ended), the next automatic run and the statements already sent.","operationId":"landlord-statement-months"},"post":{"tags":["Statements"],"summary":"Send a statement now","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"score":{"type":"integer"},"period_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":4,"score":82,"period_on":"2026-09-01"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"Landlord key from GET /landlords"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency context, read_write keys only. Saves the statement for the month given (period=YYYY-MM, default the month just ended), stores the PDF and emails the landlord. A month already sent is not rewritten: the answer is 409.","operationId":"landlord-statement-issue","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"period":{"type":"string"}}},"example":{"period":"2026-09"}}},"required":true}}},"/api/v1/properties/{id}/tenancies":{"post":{"tags":["Properties"],"summary":"Start occupancy on a vacant property","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"occupancy":{"type":"string"},"property_registration_number":{"type":"string"}}}}},"example":{"data":{"id":1,"occupancy":"occupied","property_registration_number":"PRN-…"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`TENANCY_CURRENT` — The property already has a current tenancy. End it before starting the next.\n\n`ADVANCE_RENT_BLOCKED` — Rent in advance above one rental period is not allowed (Renters’ Rights Act).\n\n`RELET_RESTRICTED` — The property cannot be re-let yet after a possession ground that restricts reletting."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Property id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"The next tenancy on an existing dwelling. The Property Registration Number does not change. Refuses with TENANCY_CURRENT if the property is already occupied.","operationId":"properties-occupancy","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tenant":{"type":"object","properties":{"last_name":{"type":"string"},"first_name":{"type":"string"}}},"tenancy":{"type":"object","properties":{"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"started_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"tenant":{"last_name":"Reed","first_name":"Sam"},"tenancy":{"rent_pence":85000,"started_on":"2026-10-01"}}}},"required":true}}},"/api/v1/rent-reviews/{id}/approve":{"post":{"tags":["Reviews"],"summary":"Landlord approves","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"approval_status":{"type":"string"}}}}},"example":{"data":{"approval_status":"approved"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Only the landlord decides. Agency members receive FORBIDDEN.","operationId":"reviews-approve","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"}}},"example":{"note":"string"}}},"required":true}}},"/api/v1/certificates/{id}/download":{"get":{"tags":["Compliance"],"summary":"Download a certificate","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"filename":{"type":"string"},"pdf_base64":{"type":"string"},"storage_key":{"type":"string"},"content_type":{"type":"string"},"download_url":{"type":"string"}}}}},"example":{"data":{"filename":"gas-2026.pdf","pdf_base64":"string","storage_key":"certificates/7/gas-2026.pdf","content_type":"application/pdf","download_url":"https://…"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"The PDF as base64 in the envelope, plus a short-lived download_url. 404 when the certificate has no file.","operationId":"certificates-download"}},"/api/v1/issued-documents/{id}/sign":{"post":{"tags":["Notices"],"summary":"Record a signature","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"signed_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"signed_at":"2026-09-13T10:00:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`ALREADY_SERVED` — Service is already recorded on this notice.\n\n`IMMUTABLE_RECORD` — The record is part of the evidence trail and cannot be changed."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Document id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"A void notice cannot be signed.","operationId":"docs-sign"}},"/api/v1/reports/landlord-scorecard":{"get":{"tags":["Compliance"],"summary":"Report: landlord scorecard","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"key":{"type":"string"},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Abide.Rent id"},"band":{"type":"string"},"href":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"score":{"type":"integer"},"action":{"type":"string"},"overdue":{"type":"integer"},"owner_id":{"type":"integer","description":"Id of the related record"},"owner_type":{"type":"string"},"properties":{"type":"integer"},"open_notices":{"type":"integer"},"last_statement_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}},"count":{"type":"integer"},"title":{"type":"string"},"total":{"type":"integer"},"capped":{"type":"boolean"},"summary":{"type":"object","properties":{"at_risk":{"type":"integer"},"landlords":{"type":"integer"},"with_overdue":{"type":"integer"}}},"max_rows":{"type":"integer"},"explanation":{"type":"string"},"generated_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"not_legal_advice":{"type":"boolean"}}}}},"example":{"data":{"key":"landlord-scorecard","rows":[{"id":"Person-12","band":"attention","href":"/landlords/Person-12","kind":"person","name":"R. Khan","score":74,"action":"Open landlord","overdue":1,"owner_id":12,"owner_type":"Person","properties":3,"open_notices":0,"last_statement_on":"2026-10-01"}],"count":6,"title":"Landlord scorecard","total":6,"capped":false,"summary":{"at_risk":1,"landlords":6,"with_overdue":2},"max_rows":2000,"explanation":"string","generated_on":"2026-10-13","not_legal_advice":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`ACCOUNT_REQUIRED` — The call needs an agency or landlord workspace."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency or landlord workspace, any seat. One row per landlord (current title owners): properties, average compliance score and band, overdue items, open notices and the last monthly statement. A prompt, not a legal finding.","operationId":"report-landlord-scorecard"}},"/api/v1/properties/{id}/instruction":{"patch":{"tags":["Properties"],"summary":"Change the instruction on a property","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"instruction":{"type":"object","properties":{"service_level":{"type":"string"},"landlord_approval_required":{"type":"boolean"},"gas_duty_accepted_in_writing":{"type":"boolean"},"right_to_rent_accepted_in_writing":{"type":"boolean"}}},"address_line_1":{"type":"string"}}}}},"example":{"data":{"id":1,"instruction":{"service_level":"fully_managed","landlord_approval_required":true,"gas_duty_accepted_in_writing":false,"right_to_rent_accepted_in_writing":true},"address_line_1":"49 Essex Drive"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Property id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Only the account that manages the property (403 FORBIDDEN otherwise). service_level is let_only, rent_collection, fully_managed, guaranteed_rent or self_managed. The two duties that can transfer to an agent, Right to Rent and gas safety, transfer only when accepted in writing: right_to_rent_accepted_in_writing and gas_duty_accepted_in_writing. While a written management agreement covers the property those two flags follow the agreement’s terms, so sending either is refused with 422 VALIDATION_FAILED naming the agreement: change them on the agreement instead. Answers with the property detail and the instruction now in force.","operationId":"properties-instruction","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"service_level":{"type":"string"},"gas_duty_accepted_in_writing":{"type":"boolean"},"right_to_rent_accepted_in_writing":{"type":"boolean"}}},"example":{"service_level":"fully_managed","gas_duty_accepted_in_writing":false,"right_to_rent_accepted_in_writing":true}}},"required":true}}},"/api/v1/compliance-registrations/{id}":{"patch":{"tags":["Compliance"],"summary":"Change a registration","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"},"renews_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":3,"kind":"redress_scheme","status":"valid","renews_on":"2027-11-01"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Registration id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Same fields as create, except kind, which cannot change. A new renews_on restarts the renewal reminders.","operationId":"registrations-update","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reference":{"type":"string"},"renews_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"reference":"T01234","renews_on":"2027-11-01"}}},"required":true}},"delete":{"tags":["Compliance"],"summary":"Remove a registration","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}},"example":{"data":{"deleted":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action.\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Registration id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"read_write keys, with the same seat rules as create.","operationId":"registrations-delete"}},"/api/v1/issued-documents/{id}/respond":{"post":{"tags":["Notices"],"summary":"Tenant accepts, queries or refers","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tenant_response":{"type":"string"}}}}},"example":{"data":{"tenant_response":"refer"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`NOTICE_ALREADY_RESPONDED` — The tenant has already accepted, queried or referred this notice.\n\n`NOTICE_VOID` — The notice is void and cannot be responded to.\n\n`SECTION_8_NOT_REFERRABLE` — A Section 8 notice cannot be referred to the rent tribunal."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Document id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Only a named tenant. Tribunal fee is £47 on the tribunal site — we do not take it.","operationId":"docs-respond","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"decision":{"type":"string"}}},"example":{"decision":"refer"}}},"required":true}}},"/api/v1/rent-referrals/{id}/statement":{"get":{"tags":["Tribunal referrals"],"summary":"Draft the landlord’s statement","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"gaps":{"type":"array","items":{"type":"string"}},"text":{"type":"string"},"draft":{"type":"boolean"},"title":{"type":"string"},"sections":{"type":"array","items":{}},"referral_id":{"type":"integer","description":"Id of the related record"}}}}},"example":{"data":{"gaps":["No date for the new boiler in the condition record"],"text":"string","draft":true,"title":"Landlord’s statement","sections":[],"referral_id":4}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool prepare_tribunal_statement. A plain-text draft from the review, the comparables, the condition record and the notice, with the gaps to fix. A draft, not advice; nothing is sent.","operationId":"referrals-statement"}},"/api/v1/rent-referrals/{id}/submitted":{"post":{"tags":["Tribunal referrals"],"summary":"Record what was sent to the tribunal","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"open":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"bytes":{"type":"integer"},"label":{"type":"string"},"sha256":{"type":"string"},"filename":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"uploaded_by":{"type":"string"},"content_type":{"type":"string"}}}},"forum":{"type":"string"},"status":{"type":"string"},"address":{"type":"string"},"next_step":{"type":"string"},"applied_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"hearing_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"forum_label":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"status_label":{"type":"string"},"determined_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"inspection_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"median_wait_days":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"hearing_requested":{"type":"boolean"},"statement_sent_by":{"type":["string","null"]},"current_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"paper_determination":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"expected_decision_by":{"type":"string"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_submitted_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":4,"open":true,"files":[{"id":9,"kind":"directions","bytes":81234,"label":"Directions","sha256":"string","filename":"directions.pdf","uploaded_at":"2026-11-16T10:00:00Z","uploaded_by":"string","content_type":"application/pdf"}],"forum":"first_tier_tribunal","status":"submitted","address":"49 Essex Drive","next_step":"Send the landlord’s statement by 7 December 2026","applied_on":"2026-11-02","hearing_on":null,"forum_label":"First-tier Tribunal (Property Chamber)","property_id":1,"status_label":"Statement sent","determined_on":null,"inspection_on":null,"case_reference":"MAN/00BN/MRA/2026/0101","rent_review_id":3,"median_wait_days":96,"not_legal_advice":true,"hearing_requested":false,"statement_sent_by":null,"current_rent_pence":120000,"issued_document_id":2,"paper_determination":true,"proposed_rent_pence":127500,"expected_decision_by":"2027-02-06","directions_received_on":"2026-11-16","statement_submitted_on":null,"tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool record_tribunal_submission. statement_submitted_on and statement_sent_by (email, post, portal or hand) are required, and a file unless one is already attached. Records what a person sent; it sends nothing.","operationId":"referrals-submitted","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"file_base64":{"type":"string"},"statement_sent_by":{"type":"string"},"statement_submitted_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"filename":"statement.pdf","file_base64":"string","statement_sent_by":"email","statement_submitted_on":"2026-12-03"}}},"required":true}}},"/api/v1/rent-referrals/{id}/directions":{"post":{"tags":["Tribunal referrals"],"summary":"Record the tribunal’s directions","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"open":{"type":"boolean"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"bytes":{"type":"integer"},"label":{"type":"string"},"sha256":{"type":"string"},"filename":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"uploaded_by":{"type":"string"},"content_type":{"type":"string"}}}},"forum":{"type":"string"},"status":{"type":"string"},"address":{"type":"string"},"next_step":{"type":"string"},"applied_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"hearing_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"forum_label":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"status_label":{"type":"string"},"determined_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"inspection_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"case_reference":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"median_wait_days":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"hearing_requested":{"type":"boolean"},"statement_sent_by":{"type":["string","null"]},"current_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"paper_determination":{"type":"boolean"},"proposed_rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"expected_decision_by":{"type":"string"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"statement_submitted_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}}}},"example":{"data":{"id":4,"open":true,"files":[{"id":9,"kind":"directions","bytes":81234,"label":"Directions","sha256":"string","filename":"directions.pdf","uploaded_at":"2026-11-16T10:00:00Z","uploaded_by":"string","content_type":"application/pdf"}],"forum":"first_tier_tribunal","status":"statement_due","address":"49 Essex Drive","next_step":"Send the landlord’s statement by 7 December 2026","applied_on":"2026-11-02","hearing_on":null,"forum_label":"First-tier Tribunal (Property Chamber)","property_id":1,"status_label":"Statement due","determined_on":null,"inspection_on":null,"case_reference":"MAN/00BN/MRA/2026/0101","rent_review_id":3,"median_wait_days":96,"not_legal_advice":true,"hearing_requested":false,"statement_sent_by":null,"current_rent_pence":120000,"issued_document_id":2,"paper_determination":true,"proposed_rent_pence":127500,"expected_decision_by":"2027-02-06","directions_received_on":"2026-11-16","statement_submitted_on":null,"tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool record_tribunal_directions. directions_received_on and landlord_statement_due_on are required; tenant_statement_due_on, case_reference, paper_determination and the directions file are optional. The statement deadline appears on Today and in the deadlines (key tribunal_statement).","operationId":"referrals-directions","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"file_base64":{"type":"string"},"case_reference":{"type":"string"},"paper_determination":{"type":"boolean"},"directions_received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"tenant_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"landlord_statement_due_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"filename":"directions.pdf","file_base64":"string","case_reference":"MAN/00BN/MRA/2026/0101","paper_determination":true,"directions_received_on":"2026-11-16","tenant_statement_due_on":"2026-12-21","landlord_statement_due_on":"2026-12-07"}}},"required":true}}},"/api/v1/repairs/{id}/milestones/{kind}":{"post":{"tags":["Repairs"],"summary":"Mark a repair stage done","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"milestones":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"label":{"type":"string"},"due_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"done_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"overdue":{"type":"boolean"},"ruleset":{"type":"string"},"proposed_standard":{"type":"boolean"}}}}}}}},"example":{"data":{"id":2,"milestones":[{"kind":"written_summary","label":"Written summary to the tenant","due_at":"2026-10-26T17:00:00Z","done_at":"2026-10-24T11:20:00Z","overdue":false,"ruleset":"awaab_prs_draft","proposed_standard":true}]}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Repair id"},{"in":"path","name":"kind","schema":{"type":"string"},"required":true,"description":"make_safe, investigate, written_summary, start_works or complete"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool complete_repair_milestone. kind is make_safe, investigate, written_summary, start_works or complete. Stages exist when the account’s repair ruleset is awaab_prs_draft (the proposal for private renting, labelled as proposed, not law); under abide_default a repair has one target and no stages. written_summary needs a summary of at least 20 characters, which is emailed to the tenants and kept on the trail. Manager seats only.","operationId":"repair-milestone","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"},"summary":{"type":"string"}}},"example":{"note":"string","summary":"Damp from a blocked gutter; gutter cleared, wall treated, redecoration booked for 4 November."}}},"required":true}}},"/api/v1/tenancies/{tenancy_id}/deposit":{"patch":{"tags":["Compliance"],"summary":"Record a tenancy’s deposit","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deposit":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"cap":{"type":"object","properties":{"above":{"type":"boolean"},"weeks":{"type":"integer"},"cap_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}},"scheme":{"type":"string"},"outcome":{"type":["string","null"]},"received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"scheme_name":{"type":"string"},"amount_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"protected_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"amount_display":{"type":"string"},"deposit_status":{"type":"string"},"relevant_person":{"type":["string","null"]},"transaction_reference":{"type":"string"},"payment_proof_filename":{"type":["string","null"]},"payment_proof_has_file":{"type":"boolean"},"prescribed_info_given_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"prescribed_info_has_file":{"type":"boolean"},"scheme_deposit_reference":{"type":"string"},"payment_proof_uploaded_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"prescribed_info_served_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"},"prescribed_info_received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"relevant_person_pi_served_on":{"type":["string","null"],"description":"Date, YYYY-MM-DD, UK date"}}},"tenancy_id":{"type":"integer","description":"Id of the related record"},"deposit_status":{"type":"string"}}}}},"example":{"data":{"deposit":{"id":3,"cap":{"above":false,"weeks":5,"cap_pence":125000},"scheme":"tds","outcome":null,"received_on":"2026-09-01","scheme_name":"TDS Custodial","amount_pence":120000,"protected_on":"2026-09-20","amount_display":"£1,200.00","deposit_status":"held","relevant_person":null,"transaction_reference":"FP-2026-0901","payment_proof_filename":null,"payment_proof_has_file":false,"prescribed_info_given_at":null,"prescribed_info_has_file":false,"scheme_deposit_reference":"TDS-11223344","payment_proof_uploaded_at":null,"prescribed_info_served_on":null,"prescribed_info_received_at":null,"relevant_person_pi_served_on":null},"tenancy_id":1,"deposit_status":"held"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"tenancy_id","schema":{"type":"integer"},"required":true,"description":"Tenancy id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Seats that can edit tenancies. status is held or none. held keeps one deposit record up to date (amount_pence and received_on are needed the first time) and tracks the 30-day protection and prescribed-information deadlines from the date received; scheme is dps, mydeposits or tds. transaction_reference, scheme_name and scheme_deposit_reference are kept as typed; one sent blank is cleared, one not sent is left alone. prescribed_info_served_on is accepted only when the prescribed information document is already on file, is never in the future and never moves a recorded date later. none records that no deposit was taken: it is refused with 422 VALIDATION_FAILED when the deposit is protected, is being or has been settled, or carries evidence (the prescribed information document or the date it was given, or the proof of payment) — correct the deposit record instead; evidence is never deleted. A deposit above the Tenant Fees Act cap is saved and the warning recorded.","operationId":"tenancy-deposit","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"scheme":{"type":"string"},"status":{"type":"string"},"received_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"scheme_name":{"type":"string"},"amount_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"protected_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"transaction_reference":{"type":"string"},"scheme_deposit_reference":{"type":"string"}}},"example":{"scheme":"tds","status":"held","received_on":"2026-09-01","scheme_name":"TDS Custodial","amount_pence":120000,"protected_on":"2026-09-20","transaction_reference":"FP-2026-0901","scheme_deposit_reference":"TDS-11223344"}}},"required":true}}},"/api/v1/certificates/{id}/give-to-tenant":{"post":{"tags":["Compliance"],"summary":"Give a safety record to the tenant","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"issued_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"historic_note":{"type":"string"},"historic_entry":{"type":"boolean"},"given_to_tenant_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"tenant_received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"id":7,"kind":"gas","issued_on":"2026-03-14","historic_note":"Given to the tenant outside Abide.Rent on 20 March 2026","historic_entry":true,"given_to_tenant_on":"2026-03-20","tenant_received_at":null}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`SCOPE_INSUFFICIENT` — The API key’s scopes do not include this action."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Gas safety records, EICRs and EPCs only. Shares the certificate with the current tenants through their portal and records today's date. A copy handed over before Abide.Rent is recorded with outside=true and the day it was given (given_on): nothing is sent, and the date cannot be in the future or before the check (issued_on). The 28-day duty runs from issued_on, the date of the check. New certificates are given automatically unless give_to_tenant=false is sent on create. Returns 422 if the property has no current tenancy. read_write keys only.","operationId":"certificate-give","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"outside":{"type":"boolean"},"given_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"}}},"example":{"outside":true,"given_on":"2026-03-20"}}},"required":true}}},"/api/v1/landlords/{id}/statement-preview":{"get":{"tags":["Statements"],"summary":"Preview a month’s statement","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"score":{"type":"integer"},"properties":{"type":"array","items":{"type":"object","properties":{"score":{"type":"integer"},"address":{"type":"string"}}}},"period_label":{"type":"string"}}}}},"example":{"data":{"score":82,"properties":[{"score":71,"address":"49 Essex Drive"}],"period_label":"October 2026"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"Landlord key from GET /landlords"},{"in":"query","name":"period","schema":{"type":"string"},"required":false,"description":"Month, YYYY-MM"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency context only. Composes the statement for one landlord client without saving or sending it. period=YYYY-MM chooses the month (default: the month just ended). For the current month, as_of says the date the position is shown at.","operationId":"landlord-statement-preview"}},"/api/v1/landlord-statements/{id}/download":{"get":{"tags":["Statements"],"summary":"Download a statement as PDF","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"filename":{"type":"string"},"pdf_base64":{"type":"string"},"content_type":{"type":"string"}}}}},"example":{"data":{"filename":"compliance-statement-2026-10.pdf","pdf_base64":"string","content_type":"application/pdf"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Statement id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Base64 PDF in the envelope, with the filename compliance-statement-YYYY-MM.pdf.","operationId":"landlord-statement-download"}},"/api/v1/landlords/{id}/statement-settings":{"patch":{"tags":["Statements"],"summary":"Turn monthly statements on or off for a landlord","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"}}}}},"example":{"data":{"enabled":false}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true,"description":"Landlord key from GET /landlords"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Agency context, read_write keys only.","operationId":"landlord-statement-settings","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"}}},"example":{"enabled":false}}},"required":true}}},"/api/v1/rent-referrals/{id}/files/{file_id}":{"get":{"tags":["Tribunal referrals"],"summary":"Download a referral file","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"filename":{"type":"string"},"file_base64":{"type":"string"},"content_type":{"type":"string"}}}}},"example":{"data":{"filename":"directions.pdf","file_base64":"string","content_type":"application/pdf"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Referral id"},{"in":"path","name":"file_id","schema":{"type":"integer"},"required":true,"description":"File id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool download_rent_referral_file.","operationId":"referrals-file"}},"/api/v1/issued-documents/{id}/record_service":{"post":{"tags":["Notices"],"summary":"Record that a person served","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"confirmation":{"type":"string"},"service_recorded_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"confirmation":"Service recorded in the ledger. There is no /serve API.","service_recorded_at":"2026-09-13T10:05:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`PERSON_REQUIRED` — Only a signed-in person can do this. An API key cannot — for example signing or recording service."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`ALREADY_SERVED` — Service is already recorded on this notice.\n\n`LEGAL_HOLD_SUBJECT_LIVE` — The record is under a live legal hold."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Document id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Human confirmation only. The confirmation text is: “Service recorded in the ledger. There is no /serve API.” Let-only books cannot record service. Agency service waits on landlord approval.","operationId":"docs-record-service","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string"}}},"example":{"channel":"email"}}},"required":true}}},"/api/v1/tenant/certificates/{id}/acknowledge":{"post":{"tags":["Tenants"],"summary":"Confirm receipt of a safety record","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"tenant_received_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"}}}}},"example":{"data":{"id":7,"tenant_received_at":"2026-10-12T10:31:00Z"}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true,"description":"Certificate id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Tenant context. Records when the tenant confirmed they received it and tells the agency and landlord. Platform staff cannot confirm on a tenant’s behalf.","operationId":"tenant-certificate-acknowledge"}},"/api/v1/rent-reviews/{rent_review_id}/comparables":{"get":{"tags":["Comparables"],"summary":"List a review’s comparable lettings","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}},"ready":{"type":"boolean"},"total":{"type":"integer"},"needed":{"type":"integer"},"headline":{"type":"string"},"candidates":{"type":"array","items":{"type":"object","properties":{"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"status":{"type":"string"},"bedrooms":{"type":"integer"},"postcode":{"type":"string"},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":"integer","description":"Id of the related record"},"property_type":{"type":"string"},"same_district":{"type":"boolean"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"}}}},"weak_count":{"type":"integer"},"asking_count":{"type":"integer"},"source_kinds":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}}}},"strong_count":{"type":"integer"},"usable_count":{"type":"integer"},"achieved_count":{"type":"integer"},"decision_count":{"type":"integer"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"ready_threshold":{"type":"integer"},"not_legal_advice":{"type":"boolean"},"proposed_percentile":{"type":"integer"},"median_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"band_low_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"proposed_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"band_high_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"rows":[{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":false,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"agent_letter","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}],"ready":false,"total":4,"needed":1,"headline":"2 of 3 strong comparables · proposed rent at the 62nd percentile","candidates":[{"let_on":"2026-03-01","status":"ended","bedrooms":2,"postcode":"M14 6XY","rent_pence":125000,"tenancy_id":8,"property_type":"flat","same_district":true,"address_line_1":"Flat 2, 10 Hope Street","rent_frequency":"monthly"}],"weak_count":1,"asking_count":1,"source_kinds":[{"label":"Agent’s letter","value":"agent_letter"}],"strong_count":2,"usable_count":1,"achieved_count":3,"decision_count":0,"rent_review_id":3,"ready_threshold":3,"not_legal_advice":true,"proposed_percentile":62,"median_monthly_pence":126000,"band_low_monthly_pence":121000,"proposed_monthly_pence":127500,"band_high_monthly_pence":131000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"rent_review_id","schema":{"type":"integer"},"required":true,"description":"Rent review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool list_comparables. The summary (counts by grade and strength, median, band, where the proposal sits as a percentile, ready when at least 3 are strong, how many more are needed, a headline) with each comparable, the source kinds, and candidate lettings from your own book to add. Achieved rents beat asking rents at the tribunal. Not legal advice.","operationId":"comparables-index"},"post":{"tags":["Comparables"],"summary":"Add a comparable letting","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":false,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"agent_letter","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"rent_review_id","schema":{"type":"integer"},"required":true,"description":"Rent review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool add_comparable. source_kind is agent_letter, let_agreed_listing, asking_listing, tribunal_decision or other. Achieved kinds need address_line_1, postcode, bedrooms and let_on (422 otherwise); an asking listing is always graded as weak evidence. rent_frequency is monthly or weekly. Attach a PDF, JPG, PNG, HEIC or WebP up to 10 MB as file_base64 with filename. The seat must be allowed to price reviews (read-only and accounts seats get 403). Answers 201 with the row.","operationId":"comparables-create","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"bedrooms":{"type":"integer"},"filename":{"type":"string"},"postcode":{"type":"string"},"furnished":{"type":"string"},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_base64":{"type":"string"},"source_kind":{"type":"string"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"}}},"example":{"note":"string","let_on":"2026-06-01","bedrooms":2,"filename":"letter.pdf","postcode":"M14 5AB","furnished":"unfurnished","rent_pence":130000,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_base64":"string","source_kind":"agent_letter","property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly"}}},"required":true}}},"/api/v1/tenancies/{tenancy_id}/statement-of-terms":{"post":{"tags":["Compliance"],"summary":"Give or record the written statement of terms","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"statement":{"type":"object","properties":{"duty":{"type":"string"},"source":{"type":"string"},"document":{"type":["string","null"]},"given_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"receipts":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"tenant_id":{"type":"integer","description":"Id of the related record"},"received_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"acknowledgement_id":{"type":["string","null"],"description":"Id of the related record"}}}},"evidenced":{"type":"boolean"},"student_4a":{"type":["string","null"]},"received_by_you":{"type":["string","null"]},"information_sheet":{"type":["string","null"]},"acknowledgement_id":{"type":["string","null"],"description":"Id of the related record"},"issued_document_id":{"type":"integer","description":"Id of the related record"},"written_agreement_held":{"type":"boolean"}}},"issued_document_id":{"type":"integer","description":"Id of the related record"},"statement_of_terms_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"written_agreement_held":{"type":"boolean"}}}}},"example":{"data":{"id":1,"statement":{"duty":"statement_of_terms","source":"uploaded_agreement","document":null,"given_on":"2026-10-01","receipts":[{"name":"Sam Reed","tenant_id":5,"received_at":null,"acknowledgement_id":null}],"evidenced":true,"student_4a":null,"received_by_you":null,"information_sheet":null,"acknowledgement_id":null,"issued_document_id":12,"written_agreement_held":true},"issued_document_id":12,"statement_of_terms_on":"2026-10-01","written_agreement_held":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"tenancy_id","schema":{"type":"integer"},"required":true,"description":"Tenancy id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Seats that can edit tenancies, and only in the account that manages the tenancy: a landlord account that can see an agent-managed tenancy reads it and is refused with 403 FORBIDDEN. With a PDF (multipart file, or file_base64 with filename) and given_on, records the statement of terms or signed tenancy agreement given outside Abide.Rent, keeps the file with its SHA-256 under legal hold, closes the duty and answers with issued_document_id; given_on cannot be in the future and a date without a document is refused (422). Without a file, creates the working draft from the account’s template (or the Information Sheet cover letter where that is the duty), with every live named tenant asked to confirm receipt, and answers with signed_document_id; a draft already open is returned instead of a second one. Answers 201.","operationId":"tenancy-statement-issue","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"given_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"file_base64":{"type":"string"}}},"example":{"filename":"tenancy-agreement.pdf","given_on":"2026-10-01","file_base64":"JVBERi0…"}}},"required":true}}},"/api/v1/tenancies/{tenancy_id}/statement-of-terms/acknowledge":{"post":{"tags":["Compliance"],"summary":"Confirm the statement of terms was received","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"statement":{"type":"object","properties":{"received_by_you":{"type":"boolean"},"acknowledgement_id":{"type":"integer","description":"Id of the related record"},"issued_document_id":{"type":"integer","description":"Id of the related record"}}},"acknowledgement_id":{"type":"integer","description":"Id of the related record"},"statement_of_terms_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"written_agreement_held":{"type":"boolean"}}}}},"example":{"data":{"id":1,"statement":{"received_by_you":true,"acknowledgement_id":15,"issued_document_id":12},"acknowledgement_id":15,"statement_of_terms_on":"2026-10-01","written_agreement_held":true}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`FORBIDDEN` — Not allowed, or blocked by a legal hold or the instruction on the property."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field.\n\n`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"tenancy_id","schema":{"type":"integer"},"required":true,"description":"Tenancy id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"Tenant context, a named tenant who can act on the tenancy (403 FORBIDDEN otherwise). Records that this tenant received the statement and tells the managing side; 422 VALIDATION_FAILED when no statement is recorded yet. Answers with the tenancy’s statement file and acknowledgement_id.","operationId":"tenancy-statement-acknowledge"}},"/api/v1/rent-reviews/{rent_review_id}/comparables/from-tenancy":{"post":{"tags":["Comparables"],"summary":"Add one of your own lettings as a comparable","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"note":{"type":["string","null"]},"grade":{"type":"string"},"let_on":{"type":"string","format":"date","description":"Date, YYYY-MM-DD, UK date"},"parking":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"},"bedrooms":{"type":"integer"},"has_file":{"type":"boolean"},"postcode":{"type":"string"},"file_name":{"type":"string"},"furnished":{"type":"string"},"created_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"created_by":{"type":"object","properties":{"name":{"type":"string"}}},"distance_m":{"type":"integer"},"epc_rating":{"type":"string"},"mismatches":{"type":"array","items":{}},"rent_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"tenancy_id":{"type":["string","null"],"description":"Id of the related record"},"adjustments":{"type":"array","items":{"type":"object","properties":{"pence":{"type":"integer"},"reason":{"type":"string"}}}},"file_sha256":{"type":"string"},"source_kind":{"type":"string"},"source_label":{"type":"string"},"monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"},"outdoor_space":{"type":"boolean"},"property_type":{"type":"string"},"address_line_1":{"type":"string"},"rent_frequency":{"type":"string"},"rent_review_id":{"type":"integer","description":"Id of the related record"},"evidence_strength":{"type":"string"},"postcode_district":{"type":"string"},"adjusted_monthly_pence":{"type":"integer","description":"Amount in integer pence (£750.00 is 75000)"}}}}},"example":{"data":{"id":11,"note":null,"grade":"strong","let_on":"2026-06-01","parking":false,"reasons":["Same bedrooms","Within a mile","Let within 12 months"],"archived":false,"bedrooms":2,"has_file":true,"postcode":"M14 5AB","file_name":"letter.pdf","furnished":"unfurnished","created_at":"2026-10-23T09:00:00Z","created_by":{"name":"string"},"distance_m":640,"epc_rating":"C","mismatches":[],"rent_pence":130000,"tenancy_id":null,"adjustments":[{"pence":-5000,"reason":"No parking"}],"file_sha256":"string","source_kind":"own_letting","source_label":"Agent’s letter","monthly_pence":130000,"outdoor_space":false,"property_type":"flat","address_line_1":"12 Park Road","rent_frequency":"monthly","rent_review_id":3,"evidence_strength":"achieved","postcode_district":"M14","adjusted_monthly_pence":125000}}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint).\n\n`SEAT_FORBIDDEN` — The caller’s seat or the key’s scope does not allow this action.\n\n`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"rent_review_id","schema":{"type":"integer"},"required":true,"description":"Rent review id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"MCP tool add_comparable_from_tenancy. Any of the account’s lettings in the last 18 months, current or ended. Answers 201 with the row (source_kind own_letting).","operationId":"comparables-from-tenancy","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tenancy_id":{"type":"integer","description":"Id of the related record"}}},"example":{"tenancy_id":8}}},"required":true}}},"/api/v1/tenancies/{tenancy_id}/statement-of-terms/email-messages":{"get":{"tags":["Compliance"],"summary":"Emails about the statement of terms","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Abide.Rent id"},"kind":{"type":"string"},"status":{"type":"string"},"sent_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"subject":{"type":"string"},"opened_at":{"type":["string","null"],"description":"Timestamp, ISO 8601 UTC"},"to_address":{"type":"string"},"property_id":{"type":"integer","description":"Id of the related record"},"delivered_at":{"type":"string","format":"date-time","description":"Timestamp, ISO 8601 UTC"},"issued_document_id":{"type":"integer","description":"Id of the related record"}}}}}},"example":{"data":[{"id":40,"kind":"statement_of_terms","status":"delivered","sent_at":"2026-10-01T09:00:00Z","subject":"Your written statement of terms","opened_at":null,"to_address":"sam@example.com","property_id":1,"delivered_at":"2026-10-01T09:00:04Z","issued_document_id":12}]}}},"description":"Success. Every answer is an envelope: `{ data, meta? }`."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"UNAUTHENTICATED","details":{},"message":"No valid session or API key. Sign in again or check the key."}}}},"description":"`UNAUTHENTICATED` — No valid session or API key. Sign in again or check the key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_FORBIDDEN","details":{},"message":"This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."}}}},"description":"`CONTEXT_FORBIDDEN` — This call is not available in the workspace you chose (for example a tenant calling an agency endpoint)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"NOT_FOUND","details":{},"message":"No such record in the workspace you chose. Records in other workspaces are never visible."}}}},"description":"`NOT_FOUND` — No such record in the workspace you chose. Records in other workspaces are never visible."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"CONTEXT_REQUIRED","details":{},"message":"Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."}}}},"description":"`CONTEXT_REQUIRED` — Choose a workspace: send X-Abide-Rent-Context and X-Abide-Rent-Context-Id."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"VALIDATION_FAILED","details":{},"message":"A field is missing or invalid. `details` is keyed by field."}}}},"description":"`VALIDATION_FAILED` — A field is missing or invalid. `details` is keyed by field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"RATE_LIMITED","details":{},"message":"Too many requests. Wait for the number of seconds in Retry-After."}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}},"description":"`RATE_LIMITED` — Too many requests. Wait for the number of seconds in Retry-After."}},"parameters":[{"in":"path","name":"tenancy_id","schema":{"type":"integer"},"required":true,"description":"Tenancy id"},{"$ref":"#/components/parameters/Context"},{"$ref":"#/components/parameters/ContextId"}],"description":"The emails sent about a tenancy’s statement of terms, with delivery times. A tenant sees only mail addressed to them; an agency or landlord account sees only its own account’s mail, with tenant addresses masked for a seat without see_tenant_contact.","operationId":"tenancy-statement-emails"}}},"openapi":"3.1.0","servers":[{"url":"https://api.abide.rent","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"enum":["UNAUTHENTICATED","API_KEY_INVALID","API_KEY_REVOKED","SESSION_EXPIRED","CONTEXT_REQUIRED","CONTEXT_FORBIDDEN","CONTEXT_EXPIRED","ACCOUNT_REQUIRED","PERSON_REQUIRED","SEAT_FORBIDDEN","SCOPE_INSUFFICIENT","PLAN_RESTRICTED","FORBIDDEN","NOT_FOUND","CONFLICT","VALIDATION_FAILED","DUPLICATE_PRN","TENANCY_CURRENT","ADVANCE_RENT_BLOCKED","RELET_RESTRICTED","ALREADY_SERVED","IMMUTABLE_RECORD","NOTICE_ALREADY_RESPONDED","NOTICE_VOID","SECTION_8_NOT_REFERRABLE","SOLICITOR_REVIEW_REQUIRED","PACK_INCLUDED_ON_MANAGE","LEGAL_HOLD_PREVENTS_DELETE","LEGAL_HOLD_SUBJECT_LIVE","SERVE_NOT_AVAILABLE_OVER_API","RATE_LIMITED","NOT_AVAILABLE"],"type":"string","description":"Stable, machine-readable. Branch on this."},"details":{"type":"object","description":"For VALIDATION_FAILED, the problems keyed by field."},"message":{"type":"string","description":"Plain English, for people. May change."}}}}}},"parameters":{"Context":{"in":"header","name":"X-Abide-Rent-Context","schema":{"enum":["agency","landlord","tenant"],"type":"string"},"required":true,"description":"Which workspace to act in: agency, landlord or tenant. GET /api/v1/me lists them."},"ContextId":{"in":"header","name":"X-Abide-Rent-Context-Id","schema":{"type":"string"},"required":true,"description":"The id of that workspace, from GET /api/v1/me."}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Session JWT, or an API key issued in the product (Developers → API keys)."}}}}