{"info":{"title":"myAbode Public API","version":"1.0.0","description":"The `/v1` surface. Authenticate with `Authorization: Bearer mya_…`. A member key reads what its member reads; a service key reads its brokerage. Every failure is an RFC 9457 Problem Details body served as `application/problem+json`; branch on its `code`."},"servers":[{"url":"https://api.myabode.ca"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An API key of the form `mya_…`, sent as `Authorization: Bearer mya_…`. The secret is shown once, when the key is created."}},"schemas":{"Brokerage":{"type":"object","properties":{"object":{"const":"brokerage"},"id":{"type":"string"},"name":{"type":"string"}},"required":["object","id","name"],"additionalProperties":false,"description":"A brokerage this key may read with at least one of its scopes."},"BrokerageList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Brokerage"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","has_more","next_cursor"],"description":"Brokerages in `id` order. A reference set: re-list it on your own schedule to learn of new or revoked grants."},"Deal":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"},"brokerage":{"type":"string"},"office":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"enum":["SUBMITTED","IN_PROGRESS","READY_FOR_PAYOUT","PAID_OUT","COMPLETED","FELL_THROUGH"],"type":"string","description":"Deal status. New values may be added; this is not a breaking change. Handle unknown values."},"deal_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"mls_number":{"anyOf":[{"type":"string"},{"type":"null"}]},"jurisdiction_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"type":"object","properties":{"line1":{"anyOf":[{"type":"string"},{"type":"null"}]},"line2":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"province":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["line1","line2","city","province","postal_code"],"additionalProperties":false},"list_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"accepted_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"sale_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"monthly_rent":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"lease_term_months":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"offer_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"accepted_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"firm_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"close_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"lease_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"listing_expiry_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"is_exclusive_listing":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"url":{"type":"string"},"agents":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},"role":{"anyOf":[{"enum":["PRIMARY","CO_AGENT","ASSISTANT","REFERRAL"],"type":"string","description":"Agent role. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"side":{"anyOf":[{"enum":["LISTING","COOP"],"type":"string","description":"Deal side. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"is_primary":{"type":"boolean"}},"required":["user","role","side","is_primary"],"additionalProperties":false}},"parties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"enum":["PERSON","ORGANIZATION"],"type":"string","description":"Party type. New values may be added; this is not a breaking change. Handle unknown values."},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"enum":["BUYER","SELLER","TENANT_PARTY","LANDLORD_PARTY","BUYER_LAWYER","SELLER_LAWYER","COOP_AGENT","LISTING_AGENT"],"type":"string","description":"Party role. New values may be added; this is not a breaking change. Handle unknown values."},"participant_type":{"enum":["CLIENT","COUNTERPARTY","PROFESSIONAL","EXTERNAL_AGENT"],"type":"string","description":"Participant type. New values may be added; this is not a breaking change. Handle unknown values."},"side":{"enum":["LISTING","COOP"],"type":"string","description":"Deal side. New values may be added; this is not a breaking change. Handle unknown values."},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","type","name","organization_name","role","participant_type","side","email","phone"],"additionalProperties":false}}},"required":["object","id","brokerage","office","status","deal_type","title","mls_number","jurisdiction_code","address","list_price","accepted_price","sale_price","monthly_rent","lease_term_months","offer_date","accepted_date","firm_date","close_date","lease_start_date","listing_expiry_date","is_exclusive_listing","created_at","updated_at","url","agents","parties"],"additionalProperties":false,"description":"A deal as `/v1` publishes it: the deal itself plus its assignments (`agents`) and parties. Money is a fixed-2dp decimal string, calendar dates are `YYYY-MM-DD`, timestamps are ISO 8601 UTC, and `null` means the column is not captured rather than zero or empty."},"DealListItem":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"},"brokerage":{"type":"string"},"office":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"enum":["SUBMITTED","IN_PROGRESS","READY_FOR_PAYOUT","PAID_OUT","COMPLETED","FELL_THROUGH"],"type":"string","description":"Deal status. New values may be added; this is not a breaking change. Handle unknown values."},"deal_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"mls_number":{"anyOf":[{"type":"string"},{"type":"null"}]},"jurisdiction_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"type":"object","properties":{"line1":{"anyOf":[{"type":"string"},{"type":"null"}]},"line2":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"province":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["line1","line2","city","province","postal_code"],"additionalProperties":false},"list_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"accepted_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"sale_price":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"monthly_rent":{"anyOf":[{"type":"string","pattern":"^-?\\d+\\.\\d{2}$"},{"type":"null"}]},"lease_term_months":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"offer_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"accepted_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"firm_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"close_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"lease_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"listing_expiry_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"is_exclusive_listing":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"url":{"type":"string"},"agents":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},"role":{"anyOf":[{"enum":["PRIMARY","CO_AGENT","ASSISTANT","REFERRAL"],"type":"string","description":"Agent role. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"side":{"anyOf":[{"enum":["LISTING","COOP"],"type":"string","description":"Deal side. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"is_primary":{"type":"boolean"}},"required":["user","role","side","is_primary"],"additionalProperties":false}}},"required":["object","id","brokerage","office","status","deal_type","title","mls_number","jurisdiction_code","address","list_price","accepted_price","sale_price","monthly_rent","lease_term_months","offer_date","accepted_date","firm_date","close_date","lease_start_date","listing_expiry_date","is_exclusive_listing","created_at","updated_at","url","agents"],"additionalProperties":false,"description":"A deal as a list row — every field of the deal except `parties`, which `GET /v1/deals/{id}` and `expand=deal` carry."},"DealList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/DealListItem"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","has_more","next_cursor"],"description":"The `/v1` list envelope. `data` holds this page in `updated_at` descending order; `has_more` says whether another page exists, and when it does `next_cursor` is the opaque token to send back as `cursor` to fetch it. There is no total — count what you page through."},"Event":{"anyOf":[{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.created"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.updated"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.status_changed"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"status":{"type":"object","properties":{"from":{"enum":["SUBMITTED","IN_PROGRESS","READY_FOR_PAYOUT","PAID_OUT","COMPLETED","FELL_THROUGH"],"type":"string","description":"Deal status. New values may be added; this is not a breaking change. Handle unknown values."},"to":{"enum":["SUBMITTED","IN_PROGRESS","READY_FOR_PAYOUT","PAID_OUT","COMPLETED","FELL_THROUGH"],"type":"string","description":"Deal status. New values may be added; this is not a breaking change. Handle unknown values."}},"required":["from","to"],"additionalProperties":false}},"required":["status"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.deleted"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.restored"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.agent_added"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"agent":{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false}},"required":["agent"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.agent_removed"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"agent":{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false}},"required":["agent"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"deal.primary_agent_changed"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"deal"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"primary_agent":{"type":"object","properties":{"from":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"to":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]}},"required":["from","to"],"additionalProperties":false}},"required":["primary_agent"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"task.created"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"task"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"task.status_changed"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"task"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"status":{"type":"object","properties":{"from":{"enum":["open","held","done","dismissed"],"type":"string","description":"Task status. New values may be added; this is not a breaking change. Handle unknown values."},"to":{"enum":["open","held","done","dismissed"],"type":"string","description":"Task status. New values may be added; this is not a breaking change. Handle unknown values."}},"required":["from","to"],"additionalProperties":false},"outcome":{"anyOf":[{"enum":["abandoned","accepted_as_is","answered","applied","approved","bound_to_existing","bound_to_existing_listing","chased","classified","completed","corrected","deal_created","discarded","materialized","nothing_owed","not_applicable","not_a_deal","not_extractable","no_residual_owed","rejected","replied","returned_for_corrections","routed_manually","settled","superseded","typed","unprocessable","withdrawn"],"type":"string","description":"Task outcome, read together with the task type. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","outcome","reason"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false},{"type":"object","properties":{"object":{"const":"event"},"id":{"type":"string"},"type":{"const":"task.reassigned"},"created_at":{"type":"string","format":"date-time"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"type":"object","properties":{"object":{"const":"task"},"id":{"type":"string"}},"required":["object","id"],"additionalProperties":false},"actor":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]},"impersonated_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"withheld"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["type","id","name","on_behalf_of","impersonated_by"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"data":{"anyOf":[{"type":"object","properties":{"assignee":{"type":"object","properties":{"from":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"role"},"role":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"required":["type","role"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"}},"required":["type","id","name"],"additionalProperties":false}]},{"type":"null"}]},"to":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"role"},"role":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"required":["type","role"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"}},"required":["type","id","name"],"additionalProperties":false}]}},"required":["from","to"],"additionalProperties":false},"reason":{"type":"string"}},"required":["assignee","reason"],"additionalProperties":false},{"type":"null"}],"description":"Null only when the stored event’s details could not be read."}},"required":["object","id","type","created_at","brokerage","deal","subject","actor","data"],"additionalProperties":false}],"description":"Something that happened. Fetch the subject for its current state."},"EventList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"has_more":{"type":"boolean"},"next_cursor":{"type":"string","description":"Never null. Poll from it again; has_more false means caught up."}},"required":["object","data","has_more","next_cursor"]},"Office":{"type":"object","properties":{"object":{"const":"office"},"id":{"type":"string"},"brokerage":{"type":"string"},"name":{"type":"string"},"teams":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false}}},"required":["object","id","brokerage","name","teams"],"additionalProperties":false,"description":"An office and its teams. A reference set: re-list it rather than polling for changes."},"OfficeList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Office"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","has_more","next_cursor"],"description":"Offices in `id` order."},"Task":{"type":"object","properties":{"object":{"const":"task"},"id":{"type":"string"},"brokerage":{"type":"string"},"deal":{"anyOf":[{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/Deal"}]},{"type":"null"}],"description":"The deal id; the whole deal with `expand=deal`; null for work with no deal."},"type":{"enum":["address_rejected_tradesheet","answer_deal_question","answer_inbound_message","approve_deal_update","approve_for_tradesheet_gen","approve_mutual_release","approve_tradesheet","chase_deal_question","chase_overdue_condition","confirm_client_payment","confirm_commission","confirm_deal_closed","create_commission_stmt","create_final_tradesheet","create_upload_invoice","create_upload_tradesheet","materialization_failed","obtain_client_payment","obtain_lawyer_info","process_segment","process_source_document","provide_client_payment","release_deposit_funds","resolve_new_deal_intent","review_agent_help_request","review_agent_message","review_amendment","review_condition_resolution","review_conversation_thread","review_document_classification","review_extraction_issues","review_listing","review_listing_suspension","review_listing_cancellation","approve_listing_update","review_unclassified_deal","review_unread_conditions","review_unsupported_deal_type","send_initial_checklist","sign_tradesheet","upload_agent_payment","upload_agent_payment_coop","upload_coop_invoice","upload_coop_payment","upload_deposit_receipt","upload_listing_brokerage_receipt","upload_vendor_payment"],"type":"string","description":"Task type. New values may be added; this is not a breaking change. Handle unknown values."},"label":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the work is, in words a person can act on. May name clients."},"priority":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"A relative queue rank: lower is more urgent. Values may be re-scaled and are comparable only within one brokerage."},"status":{"enum":["open","held","done","dismissed"],"type":"string","description":"Task status. New values may be added; this is not a breaking change. Handle unknown values."},"outcome":{"anyOf":[{"enum":["abandoned","accepted_as_is","answered","applied","approved","bound_to_existing","bound_to_existing_listing","chased","classified","completed","corrected","deal_created","discarded","materialized","nothing_owed","not_applicable","not_a_deal","not_extractable","no_residual_owed","rejected","replied","returned_for_corrections","routed_manually","settled","superseded","typed","unprocessable","withdrawn"],"type":"string","description":"Task outcome, read together with the task type. New values may be added; this is not a breaking change. Handle unknown values."},{"type":"null"}]},"assignee":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"role"},"role":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"required":["type","role"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"}},"required":["type","id","name"],"additionalProperties":false}]},"assigned_at":{"type":"string","format":"date-time","description":"When the task reached its current holder. Tasks created before 2026-10-10 carry created_at."},"accountable_role":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."},"due_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"The due date, when the task has one. No workflow sets one yet, so expect null and use the deal's dates."},"created_at":{"type":"string","format":"date-time"},"created_by":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]}},"required":["type","id","name","on_behalf_of"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"resolved_by":{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"ai_agent"},"id":{"const":"abby"},"name":{"const":"Abby"},"on_behalf_of":{"anyOf":[{"type":"object","properties":{"type":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id","name"],"additionalProperties":false},{"type":"null"}]}},"required":["type","id","name","on_behalf_of"],"additionalProperties":false},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]},"url":{"type":"string","description":"Opens the task in the myAbode web app at /go/task/<id>. This path is part of the public contract."},"updated_at":{"type":"string","format":"date-time","description":"Also moves when unpublished fields change, so `updated_since` can return a task with no visible change."}},"required":["object","id","brokerage","deal","type","label","description","priority","status","outcome","assignee","assigned_at","accountable_role","due_at","created_at","created_by","resolved_at","resolved_by","url","updated_at"],"additionalProperties":false,"description":"A piece of work on a brokerage's deals, and who holds it."},"TaskList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","has_more","next_cursor"],"description":"Tasks, newest `updated_at` first (or queue order with `sort=priority`). A cursor records its sort."},"User":{"type":"object","properties":{"object":{"const":"user"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"memberships":{"type":"array","items":{"type":"object","properties":{"brokerage":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"enum":["active","inactive"],"type":"string","description":"Membership status. New values may be added; this is not a breaking change. Handle unknown values."},"roles":{"type":"array","items":{"type":"object","properties":{"role":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."},"scope":{"type":"object","properties":{"type":{"enum":["brokerage","office","team"],"type":"string","description":"Role scope type. New values may be added; this is not a breaking change. Handle unknown values."},"id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","id"],"additionalProperties":false}},"required":["role","scope"],"additionalProperties":false}},"office":{"anyOf":[{"type":"string"},{"type":"null"}]},"team":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["brokerage","name","email","status","roles","office","team"],"additionalProperties":false}}},"required":["object","id","name","memberships"],"additionalProperties":false,"description":"A person with a role binding or membership in at least one brokerage this key may read, with one membership per such brokerage. Each membership carries the name and email that brokerage holds. Filters choose users; they never trim `memberships`."},"UserList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"has_more":{"type":"boolean"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","has_more","next_cursor"],"description":"Users in `id` order. A reference set: re-list it; there is no `updated_since`."},"ProblemDetails":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"code":{"type":"string"},"request_id":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"pointer":{"type":"string"},"code":{"type":"string"},"detail":{"type":"string"},"resource":{"type":"string"}},"required":["pointer","code","detail"]}}},"required":["type","title","status","detail","code","request_id"],"additionalProperties":false,"description":"RFC 9457 Problem Details — the only error body the `/v1` surface emits, served as `application/problem+json` on every failure. Branch on `code`, not on `title` or `detail`; quote `request_id` (also the `Request-Id` response header) in a support request. `errors` is present only on a 400, carrying one entry per rejected field."}}},"openapi":"3.1.1","paths":{"/v1/brokerages":{"get":{"operationId":"brokerages.list","summary":"List brokerages","description":"Returns every brokerage this key may read. Any read scope may call it.","parameters":[{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrokerageList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/deals":{"get":{"operationId":"deals.list","summary":"List deals","description":"Returns the deals the member the key belongs to can read, most recently updated first, in the standard list envelope. Every filter narrows within that fence and ANDs with the others; `id` returns the readable deals among up to 100 ids, and a `brokerage` the key cannot read matches nothing. Page by passing `next_cursor` back as `cursor`. Requires the `deals:read` scope.","parameters":[{"name":"id","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"brokerage","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"address","in":"query","schema":{"type":"string","minLength":2,"maxLength":200},"allowEmptyValue":true,"allowReserved":true},{"name":"mls_number","in":"query","schema":{"type":"string","minLength":1,"maxLength":50},"allowEmptyValue":true,"allowReserved":true},{"name":"status","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["SUBMITTED","IN_PROGRESS","READY_FOR_PAYOUT","PAID_OUT","COMPLETED","FELL_THROUGH"],"type":"string","description":"Deal status. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/deals/{id}":{"get":{"operationId":"deals.get","summary":"Retrieve a deal","description":"Returns the deal when the member the key belongs to can read it. A deal that does not exist and a deal that member cannot see both return 404 NOT_FOUND with an identical body. Requires the `deals:read` scope.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/events":{"get":{"operationId":"events.list","summary":"List events","description":"Every deal and task transition in transaction order, oldest first. Two changes to one subject can arrive out of commit order, so fetch the subject for its current state rather than replaying from/to. Poll forward from next_cursor; has_more false means caught up. Requires `events:read`, plus `tasks:read` for task events.","parameters":[{"name":"type","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["deal.created","deal.updated","deal.status_changed","deal.deleted","deal.restored","deal.agent_added","deal.agent_removed","deal.primary_agent_changed","task.created","task.status_changed","task.reassigned"],"type":"string","description":"Event type. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"brokerage","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"start","in":"query","schema":{"const":"latest"},"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"410":{"description":"The cursor is from an earlier feed epoch (`CURSOR_EXPIRED`). Re-run the initial sync from `start=latest`. The epoch changes only after a database restore or a major-version upgrade.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/offices":{"get":{"operationId":"offices.list","summary":"List offices","description":"Returns the offices of the brokerages this key may read. Requires `offices:read`.","parameters":[{"name":"brokerage","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficeList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/offices/{id}":{"get":{"operationId":"offices.get","summary":"Retrieve an office","description":"An absent office and one this key cannot read both return 404 NOT_FOUND. Requires `offices:read`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Office"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/tasks":{"get":{"operationId":"tasks.list","summary":"List tasks","description":"Every filter ANDs with the others. `assignee_role` reads a role queue and never matches a person or Abby; `accountable_role` matches who answers for the work, whoever holds it. `sort=priority` is the inbox queue order: `priority` ascending, then newest first. `expand=deal` needs `deals:read`. Requires `tasks:read`.","parameters":[{"name":"id","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"brokerage","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"deal","in":"query","schema":{"type":"string","minLength":1},"allowEmptyValue":true,"allowReserved":true},{"name":"status","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["open","held","done","dismissed"],"type":"string","description":"Task status. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"type","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["address_rejected_tradesheet","answer_deal_question","answer_inbound_message","approve_deal_update","approve_for_tradesheet_gen","approve_mutual_release","approve_tradesheet","chase_deal_question","chase_overdue_condition","confirm_client_payment","confirm_commission","confirm_deal_closed","create_commission_stmt","create_final_tradesheet","create_upload_invoice","create_upload_tradesheet","materialization_failed","obtain_client_payment","obtain_lawyer_info","process_segment","process_source_document","provide_client_payment","release_deposit_funds","resolve_new_deal_intent","review_agent_help_request","review_agent_message","review_amendment","review_condition_resolution","review_conversation_thread","review_document_classification","review_extraction_issues","review_listing","review_listing_suspension","review_listing_cancellation","approve_listing_update","review_unclassified_deal","review_unread_conditions","review_unsupported_deal_type","send_initial_checklist","sign_tradesheet","upload_agent_payment","upload_agent_payment_coop","upload_coop_invoice","upload_coop_payment","upload_deposit_receipt","upload_listing_brokerage_receipt","upload_vendor_payment"],"type":"string","description":"Task type. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"assignee_type","in":"query","schema":{"enum":["user","role","ai_agent"],"type":"string","description":"Assignee type. New values may be added; this is not a breaking change. Handle unknown values."},"allowEmptyValue":true,"allowReserved":true},{"name":"assignee_user","in":"query","schema":{"type":"string","minLength":1},"allowEmptyValue":true,"allowReserved":true},{"name":"assignee_role","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"accountable_role","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"allowEmptyValue":true,"allowReserved":true},{"name":"sort","in":"query","schema":{"enum":["updated_at","priority"],"type":"string","description":"Sort. New values may be added; this is not a breaking change. Handle unknown values.","default":"updated_at"},"allowEmptyValue":true,"allowReserved":true},{"name":"expand","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["deal"],"type":"string","description":"Expandable field. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/tasks/{id}":{"get":{"operationId":"tasks.get","summary":"Retrieve a task","description":"An absent task and one this key cannot read both return 404 NOT_FOUND. `expand=deal` needs `deals:read`. Requires `tasks:read`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"expand","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["deal"],"type":"string","description":"Expandable field. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/users":{"get":{"operationId":"users.list","summary":"List users","description":"The membership filters (`brokerage`, `status`, `office`, `role`) must all hold on the same membership. `id` returns the readable users among up to 100 ids. Requires `users:read`.","parameters":[{"name":"id","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"brokerage","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"status","in":"query","schema":{"enum":["active","inactive"],"type":"string","description":"Membership status. New values may be added; this is not a breaking change. Handle unknown values."},"allowEmptyValue":true,"allowReserved":true},{"name":"office","in":"query","schema":{"type":"string","minLength":1},"allowEmptyValue":true,"allowReserved":true},{"name":"role","in":"query","schema":{"type":"array","maxItems":100,"items":{"enum":["system_admin","org_admin","brokerage_admin","office_admin","team_leader","deal_processor","closing_processor","listing_processor","deal_processor_manager","agent","assistant"],"type":"string","description":"Role. New values may be added; this is not a breaking change. Handle unknown values."}},"style":"form","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string","minLength":1,"description":"Opaque: send back a next_cursor unchanged."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserList"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/users/{id}":{"get":{"operationId":"users.get","summary":"Retrieve a user","description":"404 NOT_FOUND when the person has no membership this key can read. Requires `users:read`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"A parameter failed validation — a filter, a paging value or the path id. `errors[]` names each rejected value with a JSON Pointer. A `cursor` this API cannot read, or one sent with a different `sort`, is `INVALID_CURSOR` and fails the same way on every retry: drop it and re-run the initial sync (on `/v1/events`, from `start=latest`, as for a 410).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"401":{"description":"No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a credential this API will not accept (`API_KEY_INVALID`). Unknown, revoked and expired keys are one outcome.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"The key is valid but does not hold the scope this route requires (`INSUFFICIENT_SCOPE`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No such resource, or none this key may read — the two answers are identical bar `request_id` (`NOT_FOUND`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"The key spent its per-minute request budget (`RATE_LIMITED`). `Retry-After` carries the seconds to wait.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}}}