{"openapi":"3.1.0","info":{"title":"Centrix API","version":"0.0.1","description":"Create, retrieve, update, and delete persons. All callers can read and modify the shared records without authentication."},"paths":{"/persons":{"get":{"operationId":"listPersons","summary":"List persons","tags":["Persons"],"security":[],"responses":{"200":{"description":"Page ordered by UUID ascending","headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonPage"},"example":{"items":[{"id":"8b7f8b7d-3ac0-4ce2-b85f-578f3113022d","full_name":"Alex Morgan","email":"alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}],"limit":25,"offset":0,"has_more":false}}}},"400":{"description":"Invalid input or an empty, unsupported, malformed, comma-combined or repeated API-Version header. Invalid versions return a problem response before handlers and never fall back.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Malformed request or invalid field value.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"405":{"description":"Method Not Allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"Method Not Allowed","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Allow":{"schema":{"type":"string"},"example":"GET, HEAD, POST"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"406":{"description":"Not Acceptable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Acceptable","status":406,"detail":"The Accept header must allow application/json.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"415":{"description":"Unsupported Media Type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unsupported Media Type","status":415,"detail":"A JSON request body is required.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"500":{"description":"Internal Server Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error occurred.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The Person store is temporarily unavailable.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}}},"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":2147483647,"default":0}},{"$ref":"#/components/parameters/ApiVersion"}]},"post":{"operationId":"createPerson","summary":"Create person","tags":["Persons"],"security":[],"responses":{"201":{"description":"Person created","headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Location":{"schema":{"type":"string"},"example":"/persons/8b7f8b7d-3ac0-4ce2-b85f-578f3113022d"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"},"example":{"id":"8b7f8b7d-3ac0-4ce2-b85f-578f3113022d","full_name":"Alex Morgan","email":"alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}}}},"400":{"description":"Invalid input or an empty, unsupported, malformed, comma-combined or repeated API-Version header. Invalid versions return a problem response before handlers and never fall back.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Malformed request or invalid field value.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"405":{"description":"Method Not Allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"Method Not Allowed","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Allow":{"schema":{"type":"string"},"example":"GET, HEAD, POST"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"406":{"description":"Not Acceptable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Acceptable","status":406,"detail":"The Accept header must allow application/json.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"415":{"description":"Unsupported Media Type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unsupported Media Type","status":415,"detail":"A JSON request body is required.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"500":{"description":"Internal Server Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error occurred.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The Person store is temporarily unavailable.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonWrite"},"example":{"full_name":"Alex Morgan","email":"alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/persons/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"operationId":"getPerson","summary":"Retrieve person","tags":["Persons"],"security":[],"responses":{"200":{"description":"Person","headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"},"example":{"id":"8b7f8b7d-3ac0-4ce2-b85f-578f3113022d","full_name":"Alex Morgan","email":"alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}}}},"400":{"description":"Invalid input or an empty, unsupported, malformed, comma-combined or repeated API-Version header. Invalid versions return a problem response before handlers and never fall back.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Malformed request or invalid field value.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"Person was not found in this scope.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"405":{"description":"Method Not Allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"Method Not Allowed","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Allow":{"schema":{"type":"string"},"example":"GET, HEAD, PUT, DELETE"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"406":{"description":"Not Acceptable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Acceptable","status":406,"detail":"The Accept header must allow application/json.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"415":{"description":"Unsupported Media Type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unsupported Media Type","status":415,"detail":"A JSON request body is required.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"500":{"description":"Internal Server Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error occurred.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The Person store is temporarily unavailable.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"put":{"operationId":"replacePerson","summary":"Replace person","tags":["Persons"],"security":[],"responses":{"200":{"description":"Person replaced","headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"},"example":{"id":"8b7f8b7d-3ac0-4ce2-b85f-578f3113022d","full_name":"Updated Alex Morgan","email":"updated.alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}}}},"400":{"description":"Invalid input or an empty, unsupported, malformed, comma-combined or repeated API-Version header. Invalid versions return a problem response before handlers and never fall back.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Malformed request or invalid field value.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"Person was not found in this scope.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"405":{"description":"Method Not Allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"Method Not Allowed","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Allow":{"schema":{"type":"string"},"example":"GET, HEAD, PUT, DELETE"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"406":{"description":"Not Acceptable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Acceptable","status":406,"detail":"The Accept header must allow application/json.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"415":{"description":"Unsupported Media Type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unsupported Media Type","status":415,"detail":"A JSON request body is required.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"500":{"description":"Internal Server Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error occurred.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The Person store is temporarily unavailable.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonWrite"},"example":{"full_name":"Updated Alex Morgan","email":"updated.alex.morgan@example.com","phone_number":"2025550123","country_code":"+1"}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"delete":{"operationId":"deletePerson","summary":"Delete person","tags":["Persons"],"security":[],"responses":{"204":{"description":"Person deleted; empty response body","headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"400":{"description":"Invalid input or an empty, unsupported, malformed, comma-combined or repeated API-Version header. Invalid versions return a problem response before handlers and never fall back.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Malformed request or invalid field value.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"404":{"description":"Not Found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Found","status":404,"detail":"Person was not found in this scope.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"405":{"description":"Method Not Allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"Method Not Allowed","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"Allow":{"schema":{"type":"string"},"example":"GET, HEAD, PUT, DELETE"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"406":{"description":"Not Acceptable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Not Acceptable","status":406,"detail":"The Accept header must allow application/json.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"415":{"description":"Unsupported Media Type","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Unsupported Media Type","status":415,"detail":"A JSON request body is required.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"500":{"description":"Internal Server Error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error occurred.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}},"503":{"description":"Service Unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Service Unavailable","status":503,"detail":"The Person store is temporarily unavailable.","instance":"/persons"}}},"headers":{"Cache-Control":{"schema":{"type":"string"},"example":"no-store"},"API-Version":{"description":"Resolved API version for business requests. Present on success and operation errors after successful negotiation; absent when API-Version is invalid.","schema":{"type":"string","enum":["0.0.1"]},"example":"0.0.1"},"Vary":{"description":"Business responses vary on API-Version, preserving existing values such as Origin for CORS.","schema":{"type":"string"},"example":"API-Version"}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}}},"servers":[{"url":"https://api.centrixiso.com"}],"security":[],"x-centrix-source":{"repository":"https://github.com/Centrix-Platform/centrix-backend","revision":"1d6f8b920229d33aa2cbc4df9301644ea71a0edf","path":"api/persons.openapi.json","sha256":"7c3ea971aac678042ca05542a6c6fdcafce6db74d35eba5d68604197906bf964"},"components":{"schemas":{"PersonWrite":{"type":"object","additionalProperties":false,"required":["full_name","email","phone_number","country_code"],"properties":{"full_name":{"type":"string","minLength":1,"maxLength":255,"description":"Trimmed Unicode full name."},"email":{"type":"string","format":"email","maxLength":254,"pattern":"^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)+$"},"phone_number":{"type":"string","pattern":"^[0-9]+$","minLength":1,"maxLength":14,"description":"National digits preserving leading zeros. Combined dialing prefix and national digits must match ^\\+[1-9][0-9]{1,14}$."},"country_code":{"type":"string","pattern":"^\\+[1-9][0-9]{0,2}$","description":"Telephone dialing prefix, never an ISO country identifier."}}},"Person":{"type":"object","additionalProperties":false,"required":["id","full_name","email","phone_number","country_code"],"properties":{"id":{"type":"string","format":"uuid","readOnly":true},"full_name":{"type":"string","minLength":1,"maxLength":255,"description":"Trimmed Unicode full name."},"email":{"type":"string","format":"email","maxLength":254,"pattern":"^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)+$"},"phone_number":{"type":"string","pattern":"^[0-9]+$","minLength":1,"maxLength":14,"description":"National digits preserving leading zeros. Combined dialing prefix and national digits must match ^\\+[1-9][0-9]{1,14}$."},"country_code":{"type":"string","pattern":"^\\+[1-9][0-9]{0,2}$","description":"Telephone dialing prefix, never an ISO country identifier."}}},"PersonPage":{"type":"object","additionalProperties":false,"required":["items","limit","offset","has_more"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0},"has_more":{"type":"boolean"}}},"Problem":{"type":"object","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}}}},"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Omit this header or send latest to select the latest supported API version (currently 0.0.1). Send 0.0.1 to pin this contract. Values are case-sensitive after trimming. Empty, unsupported, comma-combined or repeated headers return 400 before handlers; invalid versions never fall back.","schema":{"type":"string","enum":["latest","0.0.1"],"default":"latest"}}}}}