Registry API v1

Artworks

The core resource. Every artwork carries a permanent Collect24 Art ID (C24-1234) that stays stable across ownership, gallery, status and location changes.

Endpoints

MethodPathScope
GET/api/v1/artworksartworks:read
POST/api/v1/artworksartworks:write
GET/api/v1/artworks/{id}artworks:read
PATCH/api/v1/artworks/{id}artworks:write

{id} accepts a collect24_id or the record uuid.

Query parameters

ParameterTypeNotes
qstringFree text over title, artist name and medium.
artiststringArtist slug or uuid.
gallerystringGallery slug or uuid.
museumstringMuseum slug or uuid.
collectionstringCollection slug or uuid.
mediumstringPartial match on medium.
yearstringYear of creation as recorded.
availabilitystringfor_sale, not_for_sale, on_loan, private_collection and other public states.
collect24_idstringExact permanent id lookup.
price_minnumberOnly works with a public price.
price_maxnumberOnly works with a public price.
updated_sinceISO 8601Switches ordering to ascending (updated_at, id).
limit1–100Default 25.
offset0–100000Default 0.

Query strings are strict: an unknown parameter returns 400 invalid_query with per-parameter issues, rather than being silently ignored. Filter values are sanitised before they reach the database, so commas, parentheses and operator syntax cannot alter a filter.

400 invalid_query
{
  "error": {
    "code": "invalid_query",
    "message": "One or more query parameters are invalid.",
    "issues": [{ "path": "limit", "message": "Number must be less than or equal to 100" }]
  }
}

Artwork object

FieldTypeNotes
objectstringAlways "artwork".
collect24_idstringPermanent identifier. Store this.
iduuidRecord uuid, also accepted in paths.
titlestring | null
artistobject | nullid, name, slug.
year_createdstring | nullAs recorded, may be a range or circa.
mediumstring | null
dimensions_cmobject | nullheight, width, depth.
availabilitystringPublic availability state.
priceobject | nullamount and currency, only when public.
locationobject | nullCountry only, and only when shown publicly.
current_collectionobject | nullslug, name, type, city, country.
imagesobjectcover_url and thumbnail_url when available.
provenance_summarystring | nullPublic provenance statement.
linksobjectself and public_page.
created_atISO 8601
updated_atISO 8601Use for incremental sync.

Serializers are explicit allow-lists. Owner and user identifiers, private notes, valuations, acquisition prices, ownership rows, documents, offers, transactions, private provenance, admin review columns and internal pipeline state are never returned.

Publishing an artwork

POST /api/v1/artworks
curl -X POST https://collect24.art/api/v1/artworks \
  -H "Authorization: Bearer c24_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: INV-2024-113" \
  -d '{
    "title": "Untitled",
    "artist_name": "Jane Doe",
    "year_created": "2024",
    "medium": "Oil on linen",
    "height_cm": 120,
    "width_cm": 90,
    "depth_cm": null,
    "availability": "for_sale",
    "price": { "amount": 8500, "currency": "EUR" },
    "cover_image_url": "https://gallery.example/img/1.jpg",
    "external_id": "INV-2024-113",
    "source_url": "https://gallery.example/works/untitled",
    "inventory_ref": "INV-2024-113"
  }'
ResultMeaning
201, duplicate: falseRegistered. The response contains the new collect24_id.
200, duplicate: trueAn existing artwork matched; it is returned and nothing is created.
403 no_write_targetYour organisation has no linked gallery or collection profile.
422 invalid_bodyZod issues per field.
422 protected_fieldYou sent a field Collect24 manages.

Protected fields

Bodies are validated strictly: an unknown field returns 422 invalid_body. Fields that determine ownership or placement return 422 protected_field listing the offending names — collection_id, gallery_id, organization_id, owner_id, claimed_by, collect24_ref, id, source, match_fingerprint, timestamps and admin/review columns. Placement is derived server-side from your key's organisation.

422 protected_field
{
  "error": {
    "code": "protected_field",
    "message": "These fields are managed by Collect24 and cannot be set.",
    "fields": ["collection_id", "owner_id"]
  }
}

Updating an artwork

PATCH accepts the same fields, all optional, and only updates artworks inside your own profile — anything else returns 403 not_permitted. Moving a work to availability: "fully_private" withdraws it from the public projection: the response is 200 with data: null and public: false, and later reads return 404 artwork_not_found.

PATCH /api/v1/artworks/{id}
curl -X PATCH https://collect24.art/api/v1/artworks/C24-4711 \
  -H "Authorization: Bearer c24_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "availability": "not_for_sale", "medium": "Oil and wax on linen" }'

Full error reference: Errors.