Explore the RiC model - every entity, attribute and relation, plain and navigable. Open the model navigator ↗

Describes the current state. Live figures are on current status.

Proof of implementation

Live endpoints. Concrete mappings. Labelled data.

OpenRiC is a contract. This page is the evidence that the contract works - a live reference implementation, concrete ISAD(G) → RiC-O mappings, and end-to-end use cases you can follow with curl. Example data is labelled with what kind of evidence it is.

Reference implementation

The OpenRiC reference API at ric.theahg.co.za runs on the database of Heratio, the archival platform of The Archive and Heritage Digital Commons Group. Much of what it holds is demonstration material rather than an institution’s holdings; the examples on this page say which is which.

How many records, agents, places and other entities it holds right now is on the current status page, read live from the service each time you open it. This page does not repeat the figures, because typed-in counts go out of date.

The list endpoints - /records, /agents, /repositories, /places, /activities, /rules, /instantiations, /relations - are content-negotiated and open to every origin for reads, with no key needed.

End-to-end use case

Scenario: a curator has a single archival record - Egyptian Boat (identifier BM-125320) - and wants it to appear in a third-party graph viewer, harvested by an OAI consumer, and validated against SHACL. Here is the path the OpenRiC contract defines for it.

Synthetic demonstration data. The catalogue record was assembled on the reference service for demonstration. Its holder in the data is the fictional Meridian Museum of Antiquities and its description was machine-generated from an image of the 3D model. It is not a British Museum catalogue record, and the British Museum has not reviewed or endorsed this demonstration.

1

Cataloguing

A curator describes the record in Heratio (or any OpenRiC-compliant producer) using standard ISAD(G) fields - title, identifier, dates, creator, scope, extent, repository.

Inputs live in the producer. OpenRiC does not dictate the editing UI.

2

Mapping - ISAD(G) → RiC-O

The producer maps ISAD(G) fields into RiC-O classes and predicates (see the mapping table below) and exposes each entity at a stable HTTP URL. The reference service does this automatically; other producers can follow the canonical mapping, §7.

3

Publishing - JSON-LD over HTTP

The record is live at /api/ric/v1/records/egyptian-boat, content-negotiated, with an embedded rico:hasOrHadHolder link to its holding repository and a stable @id anyone can follow.

curl https://ric.theahg.co.za/api/ric/v1/records/egyptian-boat
4

Graph traversal

A third-party viewer calls /graph?uri=...&depth=2 and receives a normalized Subgraph envelope - nodes, edges, canonical rico:* predicates on every edge. The specification requires this shape from every conformant server; so far only the reference service implements graph traversal, so that has not yet been shown on a second one.

curl "https://ric.theahg.co.za/api/ric/v1/graph?uri=https://ric.theahg.co.za/informationobject/egyptian-boat&depth=2"
5

Validation - SHACL

A validator (for example openric-validate, shipped in the spec repo) runs the published JSON-LD against the spec's SHACL shapes. Shapes catch missing identifiers, dangling references, and wrong cardinalities before they reach downstream consumers.

openric-validate --record https://ric.theahg.co.za/api/ric/v1/records/egyptian-boat
6

Harvesting - OAI-PMH

An aggregator (think Europeana, DPLA, a national portal) harvests the record via OAI-PMH /oai, with metadata prefixes oai_dc and rico_ld. No bespoke integration - it is the same verb set every OpenRiC server speaks.

curl "https://ric.theahg.co.za/api/ric/v1/oai?verb=ListRecords&metadataPrefix=rico_ld"
7

Embedding

A research institution drops the viewer component into their own portal and points it at ric.theahg.co.za - or at their own conformant server. Same embed, different backend; that is the interoperability dividend.

That is the contract: one record, seven touchpoints, zero bespoke adapters. Steps 3, 4 and 6 run live against the reference service with the commands shown; step 5 runs the validator from the specification repository.

Example entities - one of each type

Each card links to a real JSON-LD document served by the reference API. Open any of them in your browser (or curl them) - they are unauthenticated reads.

rico:Record

Egyptian Boat

Identifier BM-125320. Synthetic demonstration record - see the label above.

/records/egyptian-boat

rico:Record

Gilded dining suite

Identifier OPENRIC-DEMO-3D-1. A glTF 3D model attached as an instantiation. The model and the image it was generated from are AI-generated; it depicts no real object.

/records/gilded-dining-suite-ai-generated-3d-model

rico:Agent

Person agent

Minimal rico:Person - name, culture, stable @id. Canonical in agent-person-simple.

/agents/d6mh-ktzy-h6qz

rico:CorporateBody

Meridian Museum of Antiquities

ISDIAH repository holding the demonstration record above. Holdings linked via rico:isOrWasHolderOf. A fictional institution.

/repositories/meridian-museum-of-antiquities

rico:Place

Egypt

A place entity; it appears in the Egyptian Boat record's graph.

/places

rico:Activity

Production event

Creation event linking a record to its creator agent plus a date range. See activity-production.

/activities

rico:Rule

Egyptian Antiquities Law

Law 117/1983 - a rico:Rule governing an activity. Demonstrates mandate + legal-context chaining.

/rules

rico:Instantiation

TIFF digital object

Derivative instantiation of a physical record - MIME, byte count, checksum, IIIF manifest link where present.

/instantiations

openricx:Function

ISDF function

Function / activity-context description - used to model why a record was created and by which business process.

/functions

Sample mapping - ISAD(G) → RiC-O

An excerpt of the ISAD(G) rows of the mapping. The authoritative table is mapping §7.1, which also covers ISAAR(CPF), ISDIAH and ISDF; where this excerpt and the mapping differ, the mapping is right. The reference service emits a subset of these rows.

ISAD(G) elementRiC-O predicateNotes
3.1.1 Reference coderico:identifier
3.1.2 Titlerico:titleLanguage-tagged.
3.1.3 Datesopenricx:hasDateRangeSetThe API shape; in RDF it expands to rico:hasCreationDate, rico:hasBeginningDate and rico:hasEndDate.
3.1.4 Level of descriptionthe class, and rico:hasRecordSetTypefonds, series, file and so on.
3.1.5 Extent and mediumrico:hasExtentA rico:RecordResourceExtent with the text on rico:textualValue.
3.2.1 Name of creatorrico:hasCreatorLink to a rico:Agent.
3.2.2 Administrative/biographical historyrico:history on the AgentNot on the record itself.
3.2.3 Archival historyrico:history on the record
3.2.4 Immediate source of acquisitionrico:isOrWasAffectedBy a transfer rico:ActivityWith rico:hasOrHadParticipant pointing to the source Agent.
3.3.1 Scope and contentrico:scopeAndContentServers that sent openricx:description send both until at least v0.48.0.
3.3.4 System of arrangementrico:structure
3.4.1 Conditions governing accessrico:conditionsOfAccess
3.4.3 Languagerico:hasOrHadLanguage on a record; rico:hasOrHadAllMembersWithLanguage or rico:hasOrHadSomeMembersWithLanguage on a record setISO 639-3 code. RiC-O 1.1 does not allow rico:hasOrHadLanguage on a record set.
3.4.4 Physical characteristicsrico:physicalCharacteristicsNoteOn the record's rico:Instantiation.
3.5.1 Existence and location of originalsrico:hasOrHadLocation
3.5.2 Existence and location of copiesrico:hasOrHadInstantiationEach copy or format is its own rico:Instantiation.
3.5.3 Related units of descriptionrico:isRelatedTo
3.7.2 Rules or conventionsrico:isOrWasRegulatedByLink to a rico:Rule.
Repositoryrico:hasOrHadHolderLink to a rico:CorporateBody holding the material.

The fixture pack at fixtures/ pins 36 concrete input/output pairs.

Example dataset - a demonstration mini-fonds you can rebuild

The Egyptian Boat above is not created by any command; it was assembled on the reference service by hand. To build a coherent example dataset on your own server, the reference implementation ships an openric:seed-demo Artisan command. It creates a small fonds about an imaginary Stellenbosch family, with every entity type the API serves:

Synthetic demonstration data. Everything this command creates is invented for demonstration, and every name carries the suffix (OpenRiC demo). The one exception is the watercolour image, which is a public-domain upload from Wikimedia Commons.

Run it on your own server:

php artisan openric:seed-demo
php artisan openric:rebuild-nested-set

See it running

Browse view · Graph viewer · API Explorer (Swagger UI) · Capture client

Going further

The strongest evidence that a spec is implementable is a spec that’s implemented. Everything on this page is running now on the reference service. Its database is shared with Heratio and is restored every night from a demonstration snapshot; records assembled by hand, such as the Egyptian Boat, are part of that snapshot, so the reset puts them back as they were rather than removing them.