GET /people | | { "people": [Person] } |
POST /people | { "displayName", "org"?, "identities"?: [{ "provider", "value" }], "source"?: "contact" | "invite" } | 201 Person. A handle that already exists joins that person |
GET /people/:id | | Person plus "facts": [string] |
PATCH /people/:id | any of displayName, avatar, notes, org, replyPin (null clears) | Person. A pin on a channel the person lacks is 400 |
POST /people/:id/identities | { "provider", "value" } | { "linked": bool, "person": Person }; 409 belongs_to_another_person with personId when the handle is someone else’s (a proposal is queued) |
POST /people/:id/merge | { "fromId" } | the surviving Person |
POST /people/:id/split | { "identityId" } | { "person": Person, "split": Person } |
POST /people/:id/facts | { "fact", "botId"?, "threadId"? } | { "personId", "facts": [{ "id", "fact", "botId", "createdAt" }] } |
DELETE /people/:id/facts/:factId | none | { "removed": true }, 404 not_found when the note isn’t the caller’s |
POST /people/:id/message | { "text", "channel"? } | { "sent": true, "provider", "reason": "requested" | "pinned" | "last_used" | "fallback" }; 409 no_channel, 503 not_configured |
GET /people-links | | { "links": [{ "id", "reason", "score", "a": Person, "b": Person }] } |
POST /people-links/:id/confirm | | the surviving Person (the older one) |
POST /people-links/:id/dismiss | | { "dismissed": true } |