Objects
Info
The objects collection endpoint provides paginated access to all objects in the Design Museum Gent collection. For full metadata on a single object, use the object endpoint.
endpoint:
GET https://data.designmuseumgent.be/v2/id/objects
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
itemsPerPage | integer | 10 | Number of objects per page (max 100) |
fullRecord | boolean | false | Return full CIDOC-CRM records instead of lightweight stubs |
modifiedSince | date | — | Only return records modified on or after this date. Format: YYYY-MM-DD |
q | string | — | Full text search on titles, descriptions and object number |
hasImages | boolean | false | Only return objects that have a IIIF manifest |
hasParts | boolean | false | Only return koepelrecords — objects that are composed of a set of member objects |
isPartOf | boolean | false | Only return set members — objects that belong to a koepelrecord |
onDisplay | boolean | — | Tri-state. Omit for all objects, true for objects currently on display, false for objects not on display. See below. |
language | string | — | Only return objects with a title in the specified language. Supported: NLD, FRA, ENG |
type | string | — | Filter by object type label. Comma-separated for multiple (AND). Use /v2/id/types to discover available values |
material | string | — | Filter by material label. Comma-separated for multiple (AND). Use /v2/id/materials to discover available values |
color | string | — | Filter by base color. Comma-separated for multiple (AND). Use /v2/id/colors to discover available values |
cssColor | string | — | Filter by named color tone. Comma-separated for multiple (AND) |
colors | boolean | false | Include color data in full records. Requires fullRecord=true |
hasColors | boolean | false | Only return objects processed by the color tagger |
agent | string | — | Filter by agent PID or full URI. Returns objects where the agent is designer or producer |
date | string | — | Filter by production date range using EDTF interval notation. Format: YYYY/YYYY |
dateFrom | integer | — | Only return objects produced from this year onwards |
dateTo | integer | — | Only return objects produced up to and including this year |
concept | string | — | Filter by concept PID or URI — exact match, expands to include narrower concepts |
conceptSearch | string | — | Filter by concept label — searches the thesaurus and expands to narrower concepts |
koepels | string | — | Set to exclude to hide koepelrecords from results. Useful for image-based browsing where koepelrecords typically have no image |
sortBy | string | objectNumber | Field to sort by. Supported: objectNumber, modified, titleNL, titleFR, titleEN, dateBegin, dateEnd |
sortOrder | string | asc | Sort direction. asc or desc |
What this collection contains
Every response is filtered to healthy, canonical records. Two rules are applied before any of your filters:
- Health — records that failed validation against the source system are excluded.
- Canonicity — a record whose persistent URI redirects elsewhere (because it was merged into another record, renumbered, or withdrawn) is excluded from this collection.
Excluded records remain fully resolvable at /v2/id/object/{PID}, where they return 301 Moved Permanently with a Location header, or 410 Gone. This is deliberate: persistent URIs keep working for anyone who already holds one, while the collection only ever lists records that are current.
For site builders
If you are building a site or index on top of this collection, you do not need to filter out merged or withdrawn objects yourself — every member of hydra:member is a current, canonical record. hydra:totalItems reflects the same filtered set.
Filter reference
Full text search — ?q=
Supports natural language search syntax across Dutch, French and English titles, descriptions and object numbers. Titles and object numbers are weighted higher than descriptions.
GET https://data.designmuseumgent.be/v2/id/objects?q=roze+glas&hasImages=true
GET https://data.designmuseumgent.be/v2/id/objects?q="opaalglas"&fullRecord=true
GET https://data.designmuseumgent.be/v2/id/objects?q=glas+OR+keramiek
On display — ?onDisplay=
This parameter has three states, not two:
| Value | Result |
|---|---|
| omitted | All objects, regardless of display status |
true (or 1) | Only objects currently in the collection presentation |
false (or 0) | Only objects not currently in the collection presentation |
Warning
onDisplay=false is not the same as omitting the parameter. It actively selects the objects that are not on display, which is a much smaller and different set than "everything".
# objects in the collection presentation
GET https://data.designmuseumgent.be/v2/id/objects?onDisplay=true
# objects in storage — not the same as omitting the parameter
GET https://data.designmuseumgent.be/v2/id/objects?onDisplay=false
Objects on display also carry crm:P55_has_current_location in their full record, pointing at the collection presentation place URI.
By agent — ?agent=
Returns all objects where the specified agent appears as designer (crm:P94i_was_created_by) or producer (crm:P108i_was_produced_by). Accepts PID or full URI:
GET https://data.designmuseumgent.be/v2/id/objects?agent=DMG-A-00162
GET https://data.designmuseumgent.be/v2/id/objects?agent=DMG-A-00162&hasImages=true&fullRecord=true
By production date — ?date=, ?dateFrom=, ?dateTo=
Filters by production or creation date using overlap logic — an object is returned when its production period overlaps the requested range. EDTF uncertainty markers are stripped before storing.
GET https://data.designmuseumgent.be/v2/id/objects?date=1950/1969
GET https://data.designmuseumgent.be/v2/id/objects?dateFrom=1950&dateTo=1969
GET https://data.designmuseumgent.be/v2/id/objects?dateFrom=1900
GET https://data.designmuseumgent.be/v2/id/objects?date=1920/1940&agent=DMG-A-00162
Info
Objects with no recorded production or creation date are excluded from date-filtered results.
By color — ?color=, ?cssColor=
Colors are extracted from digital images using background removal, KMeans clustering and LAB color distance matching.
Available base colors: red orange yellow green blue purple pink brown grey black white
GET https://data.designmuseumgent.be/v2/id/objects?color=pink
GET https://data.designmuseumgent.be/v2/id/objects?color=pink,grey
GET https://data.designmuseumgent.be/v2/id/objects?cssColor=Old+rose
GET https://data.designmuseumgent.be/v2/id/objects?hasColors=true&colors=true&fullRecord=true
Info
The values accepted by ?cssColor= are names from the extended Wikipedia/xkcd color lists, not CSS keywords. Use /v2/id/colors to discover valid values — that endpoint also returns a renderable hex for each one.
By type and material
GET https://data.designmuseumgent.be/v2/id/objects?type=vaas
GET https://data.designmuseumgent.be/v2/id/objects?type=vaas,bord
GET https://data.designmuseumgent.be/v2/id/objects?material=glas+%28materiaal%29
GET https://data.designmuseumgent.be/v2/id/objects?type=vaas&material=glas+%28materiaal%29&onDisplay=true
By concept — ?concept=, ?conceptSearch=
Both parameters automatically expand to include narrower concepts from the thesaurus hierarchy via recursive CTE.
# exact match by PID
GET https://data.designmuseumgent.be/v2/id/objects?concept=530000049
# search by label — expands to narrower concepts
GET https://data.designmuseumgent.be/v2/id/objects?conceptSearch=stoel
GET https://data.designmuseumgent.be/v2/id/objects?conceptSearch=glas&hasImages=true
Concepts are matched across object types, materials, techniques and sub-collections.
Object hierarchy — ?hasParts=, ?isPartOf=
?hasParts=true returns koepelrecords — objects that are administratively composed of a set of member objects (e.g. a cutlery service, a series). On these records the response includes crm:P106_is_composed_of listing all members.
?isPartOf=true returns the individual set members. On these records the response includes crm:P46i_forms_part_of pointing to the parent koepelrecord.
Note that crm:P46_has_component on any object expresses something different — the named physical parts (fysiekeOnderdelen) that physically constitute the object, such as individual ceramic forms or a wooden box. These are always present when recorded, regardless of koepelrecord status.
GET https://data.designmuseumgent.be/v2/id/objects?hasParts=true
GET https://data.designmuseumgent.be/v2/id/objects?isPartOf=true
Excluding koepelrecords — ?koepels=exclude
By default the collection includes koepelrecords alongside individual objects. Pass koepels=exclude to hide them — useful for image-based browsing interfaces where koepelrecords typically carry no IIIF image of their own.
GET https://data.designmuseumgent.be/v2/id/objects?koepels=exclude
GET https://data.designmuseumgent.be/v2/id/objects?koepels=exclude&hasImages=true&fullRecord=true
Tips
To browse only koepelrecords, use ?hasParts=true instead. To browse only the individual members of sets, use ?isPartOf=true.
Sorting — ?sortBy=, ?sortOrder=
By default results are sorted by objectNumber ascending. Use sortBy and sortOrder to change this.
sortBy value | Sorts on | Notes |
|---|---|---|
objectNumber | Object number | Default |
modified | Last modification date | Use with sortOrder=desc to get recently updated objects first |
titleNL | Dutch title | Objects without a Dutch title appear last |
titleFR | French title | Objects without a French title appear last |
titleEN | English title | Objects without an English title appear last |
dateBegin | Start of production date range | Objects with no recorded date appear last |
dateEnd | End of production date range | Objects with no recorded date appear last |
# most recently modified first
GET https://data.designmuseumgent.be/v2/id/objects?sortBy=modified&sortOrder=desc
# alphabetical by Dutch title
GET https://data.designmuseumgent.be/v2/id/objects?sortBy=titleNL&hasImages=true
# oldest objects first
GET https://data.designmuseumgent.be/v2/id/objects?sortBy=dateBegin&sortOrder=asc
# most recently modified, full records
GET https://data.designmuseumgent.be/v2/id/objects?sortBy=modified&sortOrder=desc&fullRecord=true&itemsPerPage=25
Info
Sorting is not applied on ?agent= queries — those results are returned in object number order from the RPC.
Language — ?language=
Returns only objects with a title in the specified language. Useful for identifying translation gaps:
GET https://data.designmuseumgent.be/v2/id/objects?language=FRA
GET https://data.designmuseumgent.be/v2/id/objects?language=ENG&itemsPerPage=1
Incremental harvesting — ?modifiedSince=
GET https://data.designmuseumgent.be/v2/id/objects?modifiedSince=2026-05-01&fullRecord=true&itemsPerPage=50
Active filters are preserved in all Hydra pagination links. An invalid date format returns 400 Bad Request.
Incremental sync does not report removals
?modifiedSince= returns records that changed on or after the given date. It cannot tell you that a record has left the collection — an object that was merged or withdrawn simply stops appearing, without any signal.
If you maintain a local mirror, periodically reconcile against a full pass rather than relying on incremental sync alone. A record that has disappeared from this collection can be checked individually at /v2/id/object/{PID}, which will return 301 or 410 and tell you what happened to it.
Response format
Data is returned as a Hydra Collection with CIDOC-CRM members.
| Code | Description |
|---|---|
| 200 | Successful request |
| 400 | Invalid modifiedSince date format |
| 500 | Server error |
Pagination — hydra:view
All active filters are preserved in pagination links. An RFC 8288 Link header is also included on every response.
Harvesting the full collection
async function harvest(url) {
const res = await fetch(url)
const data = await res.json()
// process data["hydra:member"]
if (data["hydra:view"]["hydra:next"]) {
await new Promise(r => setTimeout(r, 250)) // polite delay
await harvest(data["hydra:view"]["hydra:next"])
}
}
harvest('https://data.designmuseumgent.be/v2/id/objects?fullRecord=true&itemsPerPage=50')
Members — hydra:member
Lightweight stub (default)
| Field | Description |
|---|---|
@id | Internal DMG URI — resolvable to full record |
@type | Always crm:E22_Human-Made_Object |
rdfs:label | Dutch title |
crm:P129i_is_subject_of | IIIF manifest link if available |
Full record (?fullRecord=true)
Each member contains the complete CIDOC-CRM JSON-LD record — identical in structure to the single object endpoint. Includes production and creation events, acquisition, materials, dimensions, physical parts with their own dimensions, set composition, sub-collection membership, exhibitions, color data and IIIF images.
Performance
Full records return significantly larger payloads. Keep itemsPerPage at 50 or lower to avoid timeouts.
Example response (lightweight)
{
"@context": {
"crm": "http://www.cidoc-crm.org/cidoc-crm/",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"hydra": "http://www.w3.org/ns/hydra/core#",
"owl": "https://www.w3.org/2002/07/owl#"
},
"@id": "https://data.designmuseumgent.be/v2/id/objects",
"@type": "hydra:Collection",
"hydra:totalItems": 8423,
"hydra:view": {
"@id": "https://data.designmuseumgent.be/v2/id/objects?page=1&itemsPerPage=10",
"@type": "hydra:PartialCollectionView",
"hydra:first": "https://data.designmuseumgent.be/v2/id/objects?page=1&itemsPerPage=10",
"hydra:last": "https://data.designmuseumgent.be/v2/id/objects?page=843&itemsPerPage=10",
"hydra:next": "https://data.designmuseumgent.be/v2/id/objects?page=2&itemsPerPage=10"
},
"hydra:member": [
{
"@id": "https://data.designmuseumgent.be/v2/id/object/1987-1105",
"@type": "crm:E22_Human-Made_Object",
"rdfs:label": "Beeldje van een vis in opaalglas",
"crm:P129i_is_subject_of": {
"@id": "https://api.collectie.gent/iiif/presentation/v2/manifest/dmg:1987-1105",
"@type": "crm:E73_Information_Object"
}
},
{
"@id": "https://data.designmuseumgent.be/v2/id/object/2016-0017",
"@type": "crm:E22_Human-Made_Object",
"rdfs:label": "Artefacts of a New History",
"crm:P129i_is_subject_of": {
"@id": "https://api.collectie.gent/iiif/presentation/v2/manifest/dmg:2016-0017",
"@type": "crm:E73_Information_Object"
}
}
]
}