Get persona
Retrieve a specific persona's details
Authorization
bearerAuth In: header
Path Parameters
Persona id. A value that does not parse is 400 personas_m.invalid_persona_id.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/personas/497f6eca-6276-4993-bfeb-53cbbbba6f08"{
"first_name": "string",
"last_name": "string",
"date_of_birth": "2019-08-24",
"date_of_death": "2019-08-24",
"nationality": "string",
"hash_id": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"active": true,
"metadata": {},
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"modified_at": "2019-08-24T14:15:22Z",
"modified_by": "e8d4374d-93a1-4e98-a6c6-fdcf00c5059f"
}{
"status": 400,
"message": "Invalid persona ID",
"code": "personas_m.invalid_persona_id",
"class": "validation"
}{
"status": 401,
"message": "Unauthorized",
"code": "common.unauthorized",
"class": "business"
}{
"status": 403,
"message": "No access to the record",
"code": "common.rbac_no_rec_access",
"class": "business"
}{
"status": 404,
"message": "Record not found",
"code": "common.record_not_found",
"class": "business"
}{
"status": 429,
"message": "Rate limit exceeded",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 500,
"message": "Internal server error",
"code": "common.server_error",
"class": "business"
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}Returns a BARE ARRAY of every persona the caller may read — not the shared list envelope. There is no total, no keys, and NO PAGINATION OR FILTERING AT ALL: no query parameter is read, so limit, offset, sort and search.<field> are ignored and the whole permitted set comes back in one response. Use GET /v2/personas when you need any of that. Inactive personas are included: the query applies no active filter. Scoping: a caller with read-all gets every row; otherwise the handler collects the record ids granted to the caller or to any of their roles and filters on those.
Delegates to the shared common/links helper, whose body is links.UpdateLinkInput. THE 200 ABOVE IS UNREACHABLE TODAY. Before the link row is read, UpdateLink calls validateRecordExistence, which hands checkRecExistence the RECORD-TYPE id — not rec_idx or rec_idy — and that counts rows with that id in the table <type>.<type>. A record-type id is never a row id in the entity table, so the count is zero and every well-formed body ends as 404 common.record_not_found without the link being touched. What the body must still satisfy to get that far, and what will apply once the handler is fixed: each side needs exactly one record-type selector — neither and both are the same 400 common.invalid_input, so a body of only {"active": false} is refused earlier still — and the write is a full replace, not a patch, since updateLinkFields assigns rec_idx, rec_idy, metadata and active unconditionally before Save.