Recap a contact
An aggregated snapshot of one contact for an on-demand recap: identity and VIP status, realized spend (total, works acquired, average acquisition), interaction cadence (first touch, last touch, total count), the most recent touches, open follow-up tasks, and pipeline positions. This is read material for composing a natural-language brief — one query instead of paging the timeline, tasks, and sales separately.
An aggregated snapshot of one contact for an on-demand recap: identity and VIP status, realized spend (total, works acquired, average acquisition), interaction cadence (first touch, last touch, total count), the most recent touches, open follow-up tasks, and pipeline positions. This is read material for composing a natural-language brief — one query instead of paging the timeline, tasks, and sales separately.
Authorization
bearerAuth contacts:readA gallery API key, sent as Authorization: Bearer gpk_… (or the x-api-key header).
In: header
Scope: contacts:read
Path Parameters
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
{ "contact_id": "string", "name": "string", "contact_type": "collector", "company": "string", "lead_status": "new", "vip": true, "spend": { "total_spend_cents": -9007199254740991, "works_acquired": -9007199254740991, "avg_acquisition_cents": -9007199254740991 }, "first_interaction_at": "string", "last_interaction_at": "string", "interaction_count": -9007199254740991, "recent_interactions": [ { "occurred_at": "string", "type": "note", "direction": "inbound", "summary": "string", "artwork_id": "string" } ], "open_task_count": -9007199254740991, "next_task": { "id": "string", "title": "string", "due_at": "string" }, "pipelines": [ { "list_id": "string", "list_name": "string", "kind": "pipeline", "stage_name": "string" } ]}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}List a contact's private notes GET
Returns the contact's editor-only confidential notes, newest first. RLS restricts this tier to gallery editors — viewers receive an empty set.
Restore an archived contact POST
Takes the contact off the archive shelf, returning it to the default roster. The inverse of POST /gallery/contacts/{id}/archive.