---
title: "Update person-grain facts (avatarUrl)"
method: PATCH
path: "/api/v1/ackdb/persons/{personId}"
tags: ["ackDB"]
---

# Update person-grain facts (avatarUrl)

`PATCH /api/v1/ackdb/persons/{personId}`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/ackdb/persons/{personId}`
- Auth: HTTP bearer

The person-level setter for facts about the HUMAN. Today that is `avatarUrl` — the photo URL projected onto every contact read (#372). `null` clears it; a string replaces it (latest non-null wins, like `name`). http(s) URLs only — ackDB stores the link, never the bytes. A merged (tombstoned) id resolves to its survivor first. No event is emitted — presentation metadata, the entity-logo precedent.

## Path parameters

- `personId` string, required

## Request body

- AckdbPersonUpdateRequest: Person-grain fact update (#372, #544). At least one field must be provided.
  - `avatarUrl` string, nullable: Photo URL (http(s) only, ≤2048 chars). `null` clears it.
  - `primaryContactId` string, nullable: The person's PRIMARY affiliation (#544). A contact id makes that edge primary (`primarySource: manual`, sticky while the edge is active; must be this person's ACTIVE edge at an active company → 400, unknown → 404). `null` clears the override and lets the rule re-pick. Emits `contact.primary_changed` when the pointer moves.

## Response `200`

`{ data: Person }`.

- object
  - `data` unknown, required

## Other responses

- `400`: No updatable field provided, or an invalid avatarUrl (non-http(s), too long).
- `404`: Person not found.

---

[API](https://skmtc.dev/floqer/apis/floqer-public-api.md) - [All operations](https://skmtc.dev/floqer/apis/floqer-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/floqer/apis/floqer-public-api/revisions/fce50dc07b20?raw)
