PROTOTYPE DRAFT FOR DISCUSSION: Materials Commons DSP Tier 1 (Public Datasets and Services)¶
Status of this document¶
This document defines Materials Commons DSP Tier 1, a provider-side interoperability profile for basic non-authenticated access to catalogs of public datasets and services.
This document is a normative specification. It profiles the Dataspace Protocol 2025-1, errata revision 1 and uses terms from DCAT 3 and ODRL 2.2. Where this document imposes a narrower requirement than DSP 2025-1, the narrower requirement applies to Materials Commons DSP Tier 1 conformance. This document does not relax any DSP requirement.
The separately specified
Materials Commons DCAT-AP GET Protocol Tier 0 provides an optional,
strict DCAT-AP 3.0.1 representation of the same public catalogue. The two
representations use the same complete catalogue JSON value except for
@context, after assembling pages when pagination is used; changing that
context repairs the one unavoidable RDF literal-versus-IRI conflict imposed by
DSP. Conformance to the companion protocol is not required for conformance to
this document.
Abstract¶
Materials Commons DSP Tier 1 defines a small, deterministic Dataspace Protocol provider profile for datasets and services that are already public. The profile aims to provide the minimum functionality needed to make such datasets accessible to DSP consumers supporting this profile without requiring authentication or access control.
It provides:
- unauthenticated DSP version discovery;
- unauthenticated DSP catalogue and individual-dataset discovery, with optional catalogue pagination;
- one unconditional ODRL
useoffer and one or more public HTTPS-pull distributions for each dataset; - the provider endpoints required for the selected DSP contract-negotiation and transfer-process flows;
- a direct, unauthenticated HTTPS data plane that is not protected by the DSP control plane;
- DCAT-AP 3.0.1-compatible catalogue metadata, with
dcat:endpointURLas the single unavoidable RDF range exception imposed by DSP; - an optional DSP-native advertisement of a Materials Commons DCAT-AP Tier 0 companion service; and
- an optional, discoverable
application/ld+jsonrepresentation obtained by replacing only the DSP context.
Tier 1 deliberately excludes authentication, authorization, confidential or
embargoed datasets, negotiated policy constraints, push transfer, catalogue
filters, proof exchange, and broker replication. The
DSP application/json response does not claim DCAT-AP conformance because its
official context necessarily expands dcat:endpointURL as an RDF literal. An
optional application/ld+json alternate representation can make the complete
DCAT-AP conformance claim without changing the catalogue payload.
Tier 1 deliberately goes beyond implementing the DSP Catalog Protocol alone. DSP requires each advertised Distribution to reference a DataService whose endpoint is used to initiate Contract Negotiation and Transfer Process operations. Consequently, a self-contained provider that has no existing DSP Connector must also provide these Connector operations for its catalogue to be actionable by DSP consumers supporting this profile's format-to-transport mapping. Tier 1 therefore defines the minimal contract-negotiation and transfer-process flows for otherwise directly accessible public datasets.
1. Conformance and requirement language¶
1.1 Normative language¶
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in BCP 14 when, and only when, they appear in all capitals.
Examples, explanatory notes, and sections explicitly marked non-normative are not conformance requirements.
1.2 Conformance target¶
The conformance target is a Materials Commons DSP Tier 1 Provider. A conforming Provider implements the provider-side HTTPS endpoints, messages, resource model, callbacks, state transitions, and public data plane defined by this document.
A Provider MAY additionally conform to Materials Commons DCAT-AP Tier 0. That is an independent conformance claim and MUST NOT be inferred merely because a DSP catalogue contains DCAT terms. It MAY be inferred from the exact machine-readable service advertisement defined in Section 9.
1.3 Relationship to DSP conformance¶
A Tier 1 Provider MUST satisfy the applicable requirements of the DSP conformance section, including the official DSP JSON Schemas and protected JSON-LD context.
The normative conformance identifier for this profile is:
This IRI identifies the profile. It does not prescribe the deployment URL of a Provider.
The tag: URIs in this specification are provisional prototype
identifiers (RFC 4151), marked (TBD) where they appear in prose, pending
a working-group decision.
1.4 Exact relationship to DCAT and DCAT-AP¶
DSP 2025-1 deliberately reuses DCAT classes and properties through a restricted DSP profile. Its catalogue is therefore recognizably DCAT-shaped, but the DSP JSON Schema and protected JSON-LD context are authoritative for DSP messages. A DSP catalogue is not automatically a conforming DCAT catalogue. Materials Commons DSP Tier 1 narrows the permitted DSP catalogue model so that its RDF expansion satisfies DCAT 3 and DCAT-AP 3.0.1 in every respect except the one conflict identified below.
There is a concrete incompatibility in the upstream standards. DSP requires
DataService.endpointURL to be serialized as a JSON string. The protected DSP
context maps that string to dcat:endpointURL without IRI coercion, so JSON-LD
expansion produces an RDF literal. DCAT 3 defines dcat:endpointURL as the
Web-resolvable IRI of the service, and DCAT-AP 3.0.1 requires an IRI or blank
node. The protected DSP term cannot be redefined by this profile. See the DSP
Schemas and Contexts,
the DSP
DataService requirements,
the DCAT 3
endpoint URL definition,
and the DCAT-AP
Data Service endpoint URL constraint.
The incompatibility concerns the RDF interpretation, not the JSON datatype:
the same JSON string is interpreted as an RDF IRI when an owned DCAT-AP context
defines endpointURL with "@type": "@id". This specification consequently
follows these rules:
- the DSP catalogue MUST validate against the official DSP JSON Schema and MUST use the protected official DSP context;
- its expanded RDF graph MUST satisfy the DCAT-AP 3.0.1 mandatory-property,
range, and controlled-vocabulary constraints except that every
dcat:endpointURLis a literal rather than an IRI; - every other RDF range, class assertion, controlled-vocabulary value, and datatype required by this profile MUST be represented explicitly in the common JSON value and MUST NOT depend on an implementation inference;
- the DSP
application/jsonresponse MUST NOT claim that its own RDF graph conforms to DCAT or DCAT-AP. The catalogue-leveldct:conformsTovalues required by Section 7.2 describe the common catalogue value and its context-substituted DCAT-AP representation, not the expansion of the DSP response itself; - an alternate DCAT-AP representation, when supplied, MUST change only the
top-level
@context, the HTTP representation headers, and serialization details that do not change the JSON value; and - expansion under that alternate context MUST satisfy all applicable DCAT-AP 3.0.1 constraints without exception.
When pagination is used, RDF conformance and complete-catalogue equality apply to the snapshot reconstructed under Section 7.5. Each DSP page MUST still satisfy its JSON Schema, and corresponding DSP and negotiated DCAT-AP pages differ only as permitted by Section 9.5.
The JSON-LD context is a mapping mechanism, not a complete validation language. Requirements such as class membership of an EU File Type concept are therefore stated normatively here and asserted explicitly in the payload, even though the official DSP context does not enforce them.
The separate Materials Commons DCAT-AP Tier 0 protocol supplies a
well-known-discoverable GET operation for conventional DCAT harvesters. The
optional content-negotiated representation in Section 9 gives DSP-aware
clients the same graph without inventing GET <base>/catalog.
2. Scope¶
2.1 Purpose¶
Tier 1 is intended for a provider that publishes finite datasets and public services for unrestricted discovery and retrieval. A consumer can discover and download a Tier 1 dataset without credentials, tokens, proofs, or prior authorization.
At this protocol tier, Contract Negotiation and Transfer Process are implemented only at the level needed to allow the standard DSP access protocol to give access to all distributions, and cannot be used to limit that access.
2.2 Included capabilities¶
Tier 1 includes:
- DSP 2025-1 version discovery over HTTPS;
- provider-side DSP catalogue, negotiation, and transfer endpoints;
- complete-catalogue retrieval without server-side filtering, optionally
across pages using DSP HTTP
Linkpagination; - retrieval of one dataset description by its exact identifier;
- one or more public distributions per dataset, with distinct format values;
- public, finite, consumer-pull transfer over HTTPS;
- an unconditional ODRL permission to perform the
useaction; - process termination, suspension, resumption, and completion within the constrained state transitions defined here;
- DCAT-AP-compatible publication metadata for formats, media types, licences, direct download URLs, optional byte sizes, and optional SHA-256 checksums;
- optional discovery of a Materials Commons DCAT-AP Tier 0 service through the DSP catalogue; and
- optional discovery and retrieval of a context-substituted DCAT-AP representation through the DSP catalogue request target.
2.3 Excluded capabilities¶
The following are outside Tier 1:
- authentication and authorization requirements;
- access tokens in DSP messages or data addresses;
- restricted, confidential, embargoed, or participant-specific catalogues;
- ODRL constraints, duties, obligations, and prohibitions;
- push transfer and consumer-supplied data addresses;
- non-finite streams;
- server-side catalogue filtering or query languages;
- catalogue proof-metadata endpoints;
- DID-based service discovery requirements;
- catalogue brokers and catalogue replication;
- data-plane protocols other than HTTPS pull; and
- a DCAT 3 or DCAT-AP conformance claim for the RDF graph obtained by expanding
the DSP
application/jsonresponse under the official DSP context. The catalogue still carries thedct:conformsTovalues of Section 7.2, which describe the common catalogue value rather than that expansion.
An implementation MAY provide excluded capabilities in another profile or tier. They MUST NOT be required to access a Tier 1 dataset or alter the semantics of a Tier 1 endpoint.
3. Terminology¶
Terms defined by the DSP terms and definitions and DCAT 3 vocabulary apply.
For this specification:
- Provider means the participant that publishes the Tier 1 catalogue and makes its datasets available.
- Consumer means a participant that discovers or retrieves those datasets.
- Connector root, written
<root>, means the externally visible, unversioned HTTPS URL prefix at which DSP version discovery is exposed. It may contain a path. - Version base, written
<base>, means the URL obtained by concatenating<root>with the selected DSP version entry'spath. - DSP access service means the DSP
DataServicethrough which negotiation and transfer processes are initiated. - DCAT-AP companion service means an optional service conforming to Materials Commons DCAT-AP Tier 0 and advertised as specified in Section 9.
- Public distribution means a distribution whose direct HTTPS URL is usable without authentication or authorization.
- Catalogue snapshot means one internally consistent complete catalogue and the dataset, offer, distribution, publisher, and service metadata used to construct it. A response MAY carry the whole snapshot or one page of it.
- Common catalogue value means the JSON value of a catalogue snapshot
after assembling any pages as specified in Section 7.5 and removing its
top-level
@contextmember. Object-member order, insignificant whitespace, and equivalent JSON number spellings are not part of this value. - Negotiated DCAT-AP feature means the optional Section 9 context-substitution operation advertised by the DSP access service.
4. Normative namespaces and identifiers¶
| Prefix or name | IRI |
|---|---|
| DSP context | https://w3id.org/dspace/2025/1/context.jsonld |
| DSP 2025-1-err1 specification | https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/ |
| Tier 1 DSP profile | (TBD) tag:materialscommons.eu,2026:dsp/prototype-tier-1 |
| Tier 0 DCAT-AP companion profile | (TBD) tag:materialscommons.eu,2026:mc-dcat-ap/prototype-tier-0 |
| Negotiated DCAT-AP feature | (TBD) tag:materialscommons.eu,2026:dsp/prototype-tier-1#dcat-ap-content-negotiation |
| DCAT-AP 3.0.1 profile | https://semiceu.github.io/DCAT-AP/releases/3.0.1/ |
dcat |
http://www.w3.org/ns/dcat# |
dct |
http://purl.org/dc/terms/ |
foaf |
http://xmlns.com/foaf/0.1/ |
odrl |
http://www.w3.org/ns/odrl/2/ |
spdx |
http://spdx.org/rdf/terms# |
xsd |
http://www.w3.org/2001/XMLSchema# |
| HTTP endpoint type | https://w3id.org/idsa/v4.1/HTTP |
| EU File Type authority | http://publications.europa.eu/resource/authority/file-type/ |
| IANA media-type identifiers | https://www.iana.org/assignments/media-types/ |
| SPDX SHA-256 algorithm | https://spdx.org/rdf/terms#checksumAlgorithm_sha256 |
All identifiers described as IRIs MUST be absolute IRIs. All public network URLs, callback URLs, endpoint URLs, access URLs, and download URLs MUST use HTTPS.
Catalogue, participant, publisher, dataset, offer, distribution, and service identifiers MUST be stable. Dataset, offer, and distribution identifiers MUST each be unique within a catalogue snapshot.
When no independent offer identifier has been assigned, a Provider SHOULD
derive one by appending #offer to the dataset identifier. A sole distribution
MAY similarly use #distribution. Multiple distributions MUST have distinct,
stable identifiers, for example #distribution-csv and #distribution-json.
5. HTTPS service organization¶
5.1 Location independence¶
This specification does not prescribe the path of <root> or <base>.
<root> MUST be an absolute HTTPS URL without user information, query, or
fragment. It MAY include a deployment path.
The DSP version path MUST be interpreted according to the DSP
HTTPS version-path rule.
The Provider and Consumer MUST derive <base> from version discovery and MUST
NOT assume that it ends in /2025-1.
The following is a non-normative deployment example:
The paths /dsp and /2025-1 are convenient but are not required.
5.2 Required provider endpoints¶
A Tier 1 Provider MUST expose these DSP endpoints:
| Method | URL | Function |
|---|---|---|
GET |
<root>/.well-known/dspace-version |
DSP version discovery |
POST |
<base>/catalog/request |
DSP catalogue request |
GET |
<base>/catalog/datasets/{id} |
DSP dataset request |
GET |
<base>/negotiations/{providerPid} |
Negotiation state |
POST |
<base>/negotiations/request |
Initial contract request |
POST |
<base>/negotiations/{providerPid}/request |
Counter-request |
POST |
<base>/negotiations/{providerPid}/events |
Negotiation event |
POST |
<base>/negotiations/{providerPid}/agreement/verification |
Agreement verification |
POST |
<base>/negotiations/{providerPid}/termination |
Negotiation termination |
GET |
<base>/transfers/{providerPid} |
Transfer state |
POST |
<base>/transfers/request |
Initial transfer request |
POST |
<base>/transfers/{providerPid}/start |
Resume transfer |
POST |
<base>/transfers/{providerPid}/suspension |
Suspend transfer |
POST |
<base>/transfers/{providerPid}/completion |
Complete transfer |
POST |
<base>/transfers/{providerPid}/termination |
Terminate transfer |
These paths follow the DSP catalogue HTTPS binding, negotiation provider paths, and transfer provider paths.
GET <base>/catalog is not a DSP 2025-1 endpoint and is not required or defined
by this specification.
5.3 Media type, context, and schemas¶
All DSP request and response bodies MUST use application/json, as required by
the HTTPS bindings for
catalogue,
negotiation,
and transfer.
Every contextualized DSP message MUST contain an @context array including
the exact official DSP context and MUST use the required @type. Incoming and
outgoing DSP documents MUST validate against the official DSP 2025-1 JSON
Schema for their message or resource type. Providers SHOULD validate against
pinned schemas without live retrieval during request processing.
The optional Section 9 application/ld+json representation is not a DSP
response message. It is an additional HTTP representation selected by an
explicit request and has its own context and media type. Its availability does
not alter the required DSP behavior for application/json requests and
responses.
6. DSP version discovery¶
GET <root>/.well-known/dspace-version MUST be unversioned, public, and
unauthenticated, following DSP
Exposure of Versions.
A successful response MUST return 200 OK and a DSP VersionResponse with at
least one entry having:
versionequal to2025-1;bindingequal toHTTPS;- an absolute URL path segment in
paththat produces<base>when appended to<root>; serviceIdequal to the stable DSP access-service identifier; and- no
authmember.
For the non-normative path arrangement in Section 5.1, that entry is:
{
"version": "2025-1",
"path": "/2025-1",
"binding": "HTTPS",
"serviceId": "https://provider.example/services/dsp"
}
Additional version entries MAY be present and are outside this profile.
7. DSP catalogue protocol¶
7.1 Catalogue request¶
Official catalogue discovery MUST use:
The request MUST be a DSP CatalogRequestMessage as defined by
DSP Section 5.2.1
and its
HTTPS endpoint.
filter MUST be absent or an empty array. A non-empty filter MUST produce
400 Bad Request with a CatalogError whose code identifies an unsupported
filter.
A successful request MUST return 200 OK and either the complete current DSP
catalogue or its first page, with navigation as specified in Section 7.5.
Pagination is OPTIONAL for Tier 1 Providers.
7.2 Catalogue response¶
The response MUST satisfy the DSP Catalog response requirements and contain:
- the official DSP context;
- an absolute catalogue
@id; @typeequal toCatalog;- a stable
participantId; - non-empty
dct:titleanddct:descriptionvalues; - a
dct:conformsToarray containing the Materials Commons DCAT-AP GET Protocol Tier 0 and DCAT-AP 3.0.1 profile IRIs, each represented as a typeddct:Standardobject; dct:publisherconforming to Section 8.2;- at least one dataset;
- exactly one DSP access service in the root
servicearray and referenced by every distribution; - zero or one DCAT-AP companion-service advertisement conforming to Section 9; and
- an optional negotiated DCAT-AP feature declaration on the DSP access service conforming to Section 9.
The response MUST be internally consistent. Dataset, offer, distribution, and service identifiers MUST be unique throughout the complete snapshot, including when its datasets are split across pages as specified in Section 7.5.
The response is a DSP document. Under the official DSP context its
endpointURL values remain RDF literals, so that JSON-LD expansion is not a
DCAT 3 or DCAT-AP conformant RDF representation. The catalogue-level
dct:conformsTo values identify the conformance targets of the shared
catalogue value and its context-substituted DCAT-AP representation; they MUST
NOT be interpreted as overriding the RDF-literal exception in Section 1.4. A
DataService MAY additionally claim conformance to a protocol that it
implements; such a service-level statement does not claim that the enclosing
DSP serialization removes that exception.
7.3 Dataset entries¶
Each dataset MUST satisfy the DSP Dataset response requirements and contain:
- an absolute, unique
@id; @typeequal toDataset;- non-empty
dct:titleanddct:descriptionvalues; - one publisher with an absolute IRI and non-empty name;
- exactly one
hasPolicyvalue conforming to Section 8.4; and - one or more
distributionvalues conforming to Section 8.5.
All datasets in one snapshot MUST use the catalogue publisher's identifier and name.
7.4 Individual dataset request¶
A Consumer retrieves one dataset using:
The identifier MUST be matched exactly after normal HTTP path decoding. This is the binding of the DSP Dataset Request Message defined by DSP Section 6.2.2.
A known identifier MUST return 200 OK and the same dataset metadata as the
catalogue, with the DSP context at the document root. An unknown identifier
MUST return 404 Not Found with CatalogError.
7.5 Filters, pagination, and compression¶
Tier 1 defines no filter language. Consumers MUST filter the returned catalogue locally, consistent with DSP Queries and Filter Expressions.
Providers MAY paginate catalogue responses following DSP
Pagination.
An unpaginated response MUST contain the complete snapshot. If pagination is
used, navigation MUST use the HTTP Link header with next and previous
relations for adjacent pages where they exist. The last page MUST omit next
and the first MUST omit previous. Consumers retrieving the complete catalogue
MUST follow next links until no next page remains.
For this profile, page links MUST be absolute HTTPS URLs accepting POST
with the same CatalogRequestMessage body and representation selection as
the initial request. Their query parameters are implementation-defined and
MUST be treated as opaque by Consumers. Page retrieval MUST remain
unauthenticated and satisfy the same response and error requirements as the
initial request. An expired or unknown page reference MUST return
404 CatalogError; a Consumer MAY restart from the initial catalogue request.
Each page MUST be a schema-conforming Catalog containing complete dataset
entries. Only the top-level dataset array varies across pages of a snapshot;
all other catalogue properties, including service metadata, MUST be identical.
Following all next links MUST yield every dataset in that snapshot exactly
once. The complete catalogue is reconstructed by concatenating those dataset
arrays and retaining the common catalogue properties. A page reference MUST
NOT silently switch to another snapshot when publication metadata changes.
HTTP content coding MAY be used independently of pagination when normal HTTP negotiation is respected and decoded content is unchanged.
7.6 RDF alignment and validation¶
Each complete catalogue snapshot, when expanded using the official DSP context, MUST satisfy the authoritative DCAT-AP 3.0.1 mandatory-property, range, and controlled-vocabulary SHACL constraints, with only the exception below. For paginated catalogues this requirement applies to the reconstructed complete snapshot from Section 7.5; each DSP page MUST still satisfy its JSON Schema and the publication requirements for the entries it carries.
This is an output-conformance requirement. A Provider MAY ensure it through validated publication inputs, pre-generated catalogues, JSON-LD/SHACL processing, or an equivalent method. Providers are not required to run a JSON-LD processor or SHACL engine, or to repeat validation during requests. Regardless of method, non-conforming output remains a conformance failure.
The reference procedure for conformance checking is to expand the complete snapshot and validate it against pinned, provenance-recorded copies of the authoritative shapes. Such checks MUST NOT depend on live network retrieval.
This requirement fixes the validation choices left to an implementing data exchange by the DCAT-AP validation guidance and applies its controlled-vocabulary requirements.
The only permitted validation results are those for which all of the following hold:
- the result path is
dcat:endpointURL; - the value is the DSP-required JSON string expanded as an RDF literal;
- replacing that literal with the absolute HTTPS IRI having the same lexical value makes the result conform; and
- no other triple is added, removed, or changed to obtain conformance.
A missing property, wrong class, wrong datatype, non-controlled value, cardinality error, or any result on another path is a Tier 1 conformance failure. Validation warnings that are not DCAT-AP conformance violations SHOULD be reported and reviewed but do not by themselves make the Provider non-conforming.
When a Section 9 alternate representation is generated, its context MUST
coerce every endpointURL value to an RDF IRI. The resulting graph MUST pass
the same validation without the exception above.
8. Tier 1 publication model¶
8.1 Catalogue metadata¶
One catalogue snapshot MUST define:
| Field | Cardinality | Requirement |
|---|---|---|
| Catalogue identifier | 1 |
Absolute stable IRI |
| Title | 1 |
Non-empty string |
| Description | 1 |
Non-empty string |
| Participant identifier | 1 |
Absolute stable IRI |
| Conformance | 2..* |
Tier 0 and DCAT-AP 3.0.1 profile IRIs, typed dct:Standard, per Section 7.2 |
| Publisher | 1 |
One shared Agent identifier and name |
| DSP access service | 1 |
Root service with stable ID, title, <base> endpoint, conformance, and served datasets |
| Dataset | 1..* |
At least one Tier 1 dataset |
| DCAT-AP companion service | 0..1 |
Optional Section 9 advertisement |
| Negotiated DCAT-AP feature | 0..1 |
Optional Section 9 declaration on the DSP access service |
8.2 Publisher¶
The publisher MUST have an absolute @id, type
http://xmlns.com/foaf/0.1/Agent, and a non-empty value for
http://xmlns.com/foaf/0.1/name. Full FOAF IRIs are used because the official
DSP context does not define the foaf prefix.
The same publisher object MUST appear as dct:publisher on the catalogue.
Each dataset MUST refer to the same publisher and MUST either include its name
or identify the catalogue publisher node carrying that name.
8.3 Dataset declaration¶
Each dataset MUST define the following metadata. Cardinalities for fields marked "per distribution" apply independently to each of its one or more distributions.
| Field | Cardinality | Requirement |
|---|---|---|
| Dataset identifier | 1 |
Absolute stable IRI; unique |
| Title | 1 |
Non-empty string |
| Description | 1 |
Non-empty string |
| Publisher identifier and name | 1 |
Equal to catalogue publisher |
| Offer identifier | 1 |
Absolute stable IRI; unique |
| Distribution identifier | 1 per distribution |
Absolute stable IRI; unique |
| Licence | 1 per distribution |
IRI of a published licence, typed dct:LicenseDocument |
| Public access URL | 1 per distribution |
Absolute HTTPS URL |
| EU file-type IRI | 1 per distribution |
EU File Type concept; distinct within the dataset |
| IANA media-type IRI | 1 per distribution |
Registered media-type IRI |
| Byte size | 0..1 per distribution |
Non-negative integer |
| SHA-256 digest | 0..1 per distribution |
64 lower-case hexadecimal characters |
Values beginning with / MAY be accepted as publication configuration and
resolved against the Provider's public HTTPS origin before serialization. A
serialized DSP access or download URL MUST be absolute. Other relative forms
MUST NOT be serialized.
8.4 Unconditional ODRL offer¶
Each dataset MUST have exactly one advertised ODRL Offer:
{
"@id": "https://provider.example/datasets/example#offer",
"@type": "Offer",
"permission": [{"action": "use"}]
}
The catalogue form MUST NOT contain target, because DSP derives it from the
enclosing dataset. The offer MUST NOT contain constraints, duties,
obligations, prohibitions, remedies, or nested targets.
The offer MUST carry exactly one permission, whose action MUST be use,
which the official DSP context maps to odrl:use.
The permission is not optional, because the DSP JSON Schema does not allow it
to be. Offer requires anyOf of permission or prohibition, and Section
2.3 excludes prohibitions, so the permission is the only rule a Tier 1 offer
may carry. Section 5.3 requires outgoing documents to validate against that
schema, so an offer without a rule is not a conforming Tier 1 catalogue.
It is fixed boilerplate rather than a rights statement: every Tier 1 dataset carries the identical four tokens, they convey nothing about the dataset, and they cannot restrict access. The rights statement is the licence required by Section 8.5.
This offer is not the licence. It expresses unconditional technical access, and it does not replace copyright, attribution, citation, or ethical-use metadata. The licence is carried separately and is REQUIRED by Section 8.5.
In a ContractRequestMessage, the same offer MUST have exactly one top-level
target equal to the dataset identifier, following the DSP
Contract Request Message.
8.5 Distribution and DCAT-AP-aligned metadata¶
Each dataset MUST have one or more DSP Distributions. Each Distribution MUST contain:
- absolute
@idand@typeequal toDistribution; formatequal to the full EU File Type IRI;- an explicit
dct:formatnode with that same@idand@typeequal todct:MediaTypeOrExtent; dcat:accessURLas an@idobject containing the public HTTPS URL;dcat:downloadURLas an@idobject containing that same direct URL;dcat:mediaTypeas an@idobject containing the IANA media-type IRI and@typeequal todct:MediaType;dct:licenseas an@idobject containing the IRI of a published licence, typeddct:LicenseDocument; and- one DSP
accessServiceobject identifying the root DSP access service.
The licence is REQUIRED, which is stricter than DCAT-AP, where Distribution licence is only recommended. Publishing a dataset with no licence would leave a consumer to infer that nothing is granted, which contradicts the unconditional offer in Section 8.4 that accompanies it. A well-known licence IRI, for example a Creative Commons one, SHOULD be used in preference to a bespoke document, and in preference to modelling the same terms in ODRL.
These requirements specialize the DCAT-AP properties for Distribution format, media type, access URL, download URL, and access service.
If known, it SHOULD also contain:
dcat:byteSizeas an explicitly typedxsd:nonNegativeIntegervalue; and- an SPDX SHA-256 checksum represented with the full SPDX property IRIs.
The DSP-required format member MUST remain a JSON string. The additional
dct:format member supplies the class assertion that DCAT-AP validation
requires but the protected DSP context cannot express for that string:
{
"format": "http://publications.europa.eu/resource/authority/file-type/CSV",
"dct:format": {
"@id": "http://publications.europa.eu/resource/authority/file-type/CSV",
"@type": "dct:MediaTypeOrExtent"
}
}
Both members MUST identify the same resource. They therefore produce one
dct:format value in the RDF graph, together with the required
rdf:type dct:MediaTypeOrExtent assertion. A Consumer MUST reject or ignore a
distribution in which the two identifiers differ.
Metadata MUST describe publisher-supplied facts. A Provider MUST NOT inspect a local file, compute its size, or hash its content merely to construct a DSP response unless that behavior is explicitly part of the publication system.
CSV and JSON MUST use these exact mappings:
| Representation | DSP format |
dcat:mediaType |
|---|---|---|
| CSV | http://publications.europa.eu/resource/authority/file-type/CSV |
https://www.iana.org/assignments/media-types/text/csv |
| JSON | http://publications.europa.eu/resource/authority/file-type/JSON |
https://www.iana.org/assignments/media-types/application/json |
Another representation MAY be published only with explicitly supplied EU File Type and IANA media-type IRIs.
Distributions within one dataset MUST have distinct DSP format values.
TransferRequestMessage.format MUST exactly match one advertised distribution
of the Agreement's target dataset. The Provider MUST select that distribution
and reject an unknown format. This permits, for example, CSV and JSON
representations of the same dataset under its single unconditional offer.
Within this profile, every advertised format value selects HTTPS consumer-pull behavior. This mapping is a Materials Commons profile convention; DSP alone does not define EU file-type IRIs as transport selections. Consumers using the DSP transfer flow MUST support this mapping. Direct public downloads remain available without DSP negotiation or transfer.
8.6 DSP access service¶
The DSP access service MUST have a stable absolute @id, @type equal to
DataService, a non-empty dct:title, and endpointURL equal to <base>. It
MUST occur in the root catalogue service array. It MUST contain
dct:conformsTo values for both the Materials Commons DSP Tier 1 profile and
DSP 2025-1-err1, expressed as @id objects with @type equal to
dct:Standard. It MUST contain dcat:servesDataset as @id objects naming
every dataset in the snapshot. When pagination is used, this complete list
and the rest of the service metadata MUST be repeated identically on each
page; it is not limited to the datasets carried by that page.
If the Section 9 negotiated DCAT-AP feature is supported, this service's
dct:conformsTo values MUST additionally include the negotiated DCAT-AP
feature IRI and the DCAT-AP 3.0.1 profile IRI, each typed dct:Standard.
Each distribution MUST identify that same service through accessService.
An embedded copy and the root copy, if both contain metadata, MUST be
identical after RDF node merging.
The prefixed spelling dcat:servesDataset is required, and MUST NOT be
shortened to a bare servesDataset. The DSP JSON Schema declares the bare
property, but the official DSP context defines no term for it, so a bare
servesDataset expands to no triple at all and the served-dataset list is
silently lost. The dcat prefix is defined in that context, so the prefixed
form expands correctly. Reported upstream as
DataspaceProtocol#277.
endpointURL MUST remain the DSP-required JSON string. A Provider MUST NOT
replace it with a JSON-LD @id object in an attempt to make the DSP response
DCAT-conformant, because doing so violates the DSP JSON Schema.
8.7 Optional byte size and checksum¶
When present, byte size MUST be the number of octets in the representation at
the public download URL. It MUST use an explicit JSON-LD value object whose
@type is the full xsd:nonNegativeInteger IRI:
{
"dcat:byteSize": {
"@value": "12345",
"@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
}
}
The lexical value MUST be a canonical non-negative integer: 0, or a sequence
beginning with 1 through 9 followed by zero or more decimal digits. A bare
JSON number is not conforming because JSON-LD expansion would assign a
different RDF datatype. This is the required RDF range for DCAT-AP
Distribution byte size.
The SHA-256 digest MUST be exactly 64 lower-case hexadecimal characters and use algorithm IRI:
The two values are independently OPTIONAL. They may become stale if a mutable file is replaced; the Provider SHOULD update them promptly.
Because the DSP context defines neither spdx nor its checksum terms, a
checksum in a DSP response MUST use full IRIs, as follows:
{
"http://spdx.org/rdf/terms#checksum": {
"@type": "http://spdx.org/rdf/terms#Checksum",
"http://spdx.org/rdf/terms#algorithm": {
"@id": "https://spdx.org/rdf/terms#checksumAlgorithm_sha256"
},
"http://spdx.org/rdf/terms#checksumValue": {
"@value": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"@type": "http://www.w3.org/2001/XMLSchema#hexBinary"
}
}
}
9. Discovery of Materials Commons DCAT-AP Tier 0¶
9.1 Optional capabilities¶
A Tier 1 Provider MAY expose a strict DCAT-AP catalogue by separately conforming to Materials Commons DCAT-AP Tier 0. Absence of that service does not affect DSP Tier 1 conformance.
If the companion service is present, it MUST be discoverable both:
- through the well-known discovery mechanism required by Materials Commons DCAT-AP Tier 0; and
- through a
DataServicein the root DSP catalogueservicearray as defined in Section 9.2.
A Provider exposing that companion service SHOULD also expose the
content-negotiated representation in Sections 9.3 through 9.5. Support for the
content-negotiated representation is OPTIONAL for DSP Tier 1 conformance. If
it is supported, every requirement stated for it in this section is mandatory
and its availability MUST be advertised in the DSP catalogue. It MUST NOT be
advertised unless the companion GET service is also present.
9.2 Companion GET service advertisement¶
The companion service advertisement MUST contain:
| Member | Cardinality | Requirement |
|---|---|---|
@id |
1 |
Stable absolute service IRI |
@type |
1 |
DataService |
dct:title |
1 |
Non-empty service title |
endpointURL |
1 |
Absolute HTTPS companion catalogue endpoint |
dct:conformsTo |
2..* |
dct:Standard IRI objects including both required profiles |
dcat:servesDataset |
1..* |
IRI objects for datasets in this DSP snapshot |
dct:conformsTo MUST include both:
tag:materialscommons.eu,2026:mc-dcat-ap/prototype-tier-0
https://semiceu.github.io/DCAT-AP/releases/3.0.1/
The exact Materials Commons profile IRI is the machine-readable discriminator. A Consumer MUST NOT identify the service from its title, path, hostname, or media type alone.
Each dct:conformsTo object MUST include @type equal to dct:Standard so
that the common payload satisfies the DCAT-AP range constraint.
endpointURL MUST be the URL whose GET response is the companion catalogue.
No relationship between that URL and <root> or <base> is required. It MAY
be on another HTTPS origin.
Every dcat:servesDataset value MUST identify a dataset in the current DSP
snapshot. Every DSP dataset MUST be listed.
9.3 Negotiated DCAT-AP feature advertisement¶
Support for the alternate application/ld+json representation MUST be
advertised on the existing DSP access service from Section 8.6. A Provider
MUST NOT invent a second distribution access service for this purpose.
The DSP access service's dct:conformsTo array MUST contain typed Standard
objects for at least these four identifiers:
tag:materialscommons.eu,2026:dsp/prototype-tier-1
https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/
tag:materialscommons.eu,2026:dsp/prototype-tier-1#dcat-ap-content-negotiation
https://semiceu.github.io/DCAT-AP/releases/3.0.1/
Each value MUST be an @id object with @type equal to dct:Standard. The
third IRI is the machine-readable feature discriminator. A Consumer that
recognizes it learns the HTTP method, request type, media type, context
substitution, and identity invariant from this section; it MUST NOT infer
support merely from an application/ld+json string, service title, or URL
pattern.
The DSP access service's endpointURL remains <base>, as required by DSP.
The feature operation is the standard DSP catalogue request target obtained by
appending /catalog/request. Advertising a capability of the existing
Connector through typed extension metadata neither changes the meaning of the
DSP service nor introduces a non-DSP route.
A compatible Consumer discovers the feature without path guessing:
- derive
<base>and the DSP access-service identifier through DSP version discovery; - request the ordinary DSP catalogue;
- locate the root
servicewhose@idequals that advertised service identifier and verify the exact feature IRI in itsdct:conformsTovalues; and - repeat the catalogue request at
<base>/catalog/requestusing the explicitAcceptrule in Section 9.4.
9.4 Content-negotiated retrieval¶
A Consumer invokes the advertised operation by sending a valid DSP
CatalogRequestMessage to <base>/catalog/request, where <base> is the
advertised DSP access-service endpointURL, using:
For this feature, an explicit JSON-LD request means an Accept field
containing exactly one acceptable media range, application/ld+json, with an
optional profile parameter equal to the DCAT-AP 3.0.1 profile IRI and with no
quality value other than 1. An absent Accept, */*,
or an Accept field that permits application/json but does not meet the
explicit JSON-LD rule selects the ordinary DSP response. A list containing any
other media range MUST NOT accidentally select the alternate representation.
When such a list excludes application/json, normal HTTP negotiation MAY
produce 406 Not Acceptable.
For a valid explicit JSON-LD request, a Provider advertising this feature MUST
return 200 OK with:
Content-Type: application/ld+json; profile="https://semiceu.github.io/DCAT-AP/releases/3.0.1/"
Vary: Accept
The response SHOULD also contain:
The response is an additional Materials Commons DCAT-AP representation, not a
DSP response message. Ordinary DSP catalogue requests and all DSP error
messages continue to use application/json as required by DSP. A Provider
that does not advertise this feature MAY return 406 Not Acceptable for a
request that accepts only application/ld+json.
9.5 Common-payload and context-substitution invariant¶
For one catalogue snapshot, the ordinary DSP response, the negotiated
DCAT-AP response, and the companion GET response MUST have the same Common
catalogue value. No dataset, service, policy, distribution, metadata property,
or conformance value may be added, removed, or changed between those
representations.
When DSP responses are paginated, this equality applies to the reconstructed
complete snapshot, not to an individual page. A negotiated DCAT-AP response
at a DSP page URL MUST contain the same page payload except for @context,
with the same navigation links and the Section 9.4 representation headers.
The companion GET service retains its separately specified retrieval
behavior; it need not share DSP page boundaries. Its complete catalogue MUST
equal the reconstructed DSP catalogue after removing @context.
The negotiated and companion responses MUST replace the complete top-level
DSP @context; they MUST NOT attempt to override terms in the protected DSP
context. Their owned context MUST include the equivalent of:
{
"dcat": "http://www.w3.org/ns/dcat#",
"endpointURL": {
"@id": "dcat:endpointURL",
"@type": "@id"
}
}
Every other compact term used by the Common catalogue value MUST expand to the
same RDF predicate, class, or resource under both contexts. Consequently, the
only RDF change caused by context substitution MUST be replacement of each
literal dcat:endpointURL value by the IRI with the same lexical form.
Structural identity is normative, not byte identity. Object-member order, whitespace, escaping choices, and RDF-irrelevant array order MAY differ. If metadata changes between separate requests, each response MUST still describe one internally consistent snapshot; a Provider SHOULD use validators or snapshot identifiers that allow a Consumer to determine whether two responses refer to the same snapshot.
The DCAT-AP response MUST NOT add a catalogue-level dct:conformsTo assertion
that is absent from the DSP response. DCAT-AP 3.0.1 does not require that
property on a Catalogue. Conformance of the alternate representation is
identified by its media-type profile, Link header, discovery record, and the
typed service-level dct:conformsTo statements above.
9.6 Advertisement example¶
The following is non-normative:
[
{
"@id": "https://provider.example/services/mc-dcat-ap",
"@type": "DataService",
"dct:title": "Public Materials Commons DCAT-AP catalogue",
"endpointURL": "https://provider.example/mc-dcat-ap/3.0.1/",
"dct:conformsTo": [
{
"@id": "tag:materialscommons.eu,2026:mc-dcat-ap/prototype-tier-0",
"@type": "dct:Standard"
},
{
"@id": "https://semiceu.github.io/DCAT-AP/releases/3.0.1/",
"@type": "dct:Standard"
}
],
"dcat:servesDataset": [
{"@id": "https://provider.example/datasets/example"}
]
},
{
"@id": "https://provider.example/services/dsp",
"@type": "DataService",
"dct:title": "Public DSP service",
"endpointURL": "https://provider.example/dsp/2025-1",
"dct:conformsTo": [
{
"@id": "tag:materialscommons.eu,2026:dsp/prototype-tier-1",
"@type": "dct:Standard"
},
{
"@id": "https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/",
"@type": "dct:Standard"
},
{
"@id": "tag:materialscommons.eu,2026:dsp/prototype-tier-1#dcat-ap-content-negotiation",
"@type": "dct:Standard"
},
{
"@id": "https://semiceu.github.io/DCAT-AP/releases/3.0.1/",
"@type": "dct:Standard"
}
],
"dcat:servesDataset": [
{"@id": "https://provider.example/datasets/example"}
]
}
]
The example path /mc-dcat-ap/3.0.1/ is not normative.
9.7 Consistency with the companion¶
When both protocols are exposed, their catalogue identifier, publisher, dataset identifiers, titles, descriptions, policies, distribution identifiers, public download URLs, formats, media types, byte sizes, checksums, and services MUST agree for the same snapshot in accordance with Section 9.5.
Temporary differences caused by independently completed requests SHOULD be minimized. A Provider MUST NOT deliberately advertise contradictory values.
10. Public HTTPS data plane¶
10.1 Direct public access¶
Every distribution access and download URL MUST resolve to the same direct public representation. It MUST be retrievable without negotiation, agreement, transfer process, authorization header, cookie, credential, or access token.
The DSP negotiation and transfer flow remains available for control-plane interoperability but does not gate the public URL.
10.2 HTTP behavior¶
The public distribution endpoint:
- MUST support
GET; - MUST support
HEADwith the same representation metadata and no body; - MUST return the advertised
Content-Type; - MUST report
Content-Lengthwhen known; - SHOULD support byte ranges and
206 Partial Content; - SHOULD provide
ETag,Last-Modified, or both; and - MUST return ordinary HTTP errors, including
404 Not Found, when absent.
File routing and DSP declarations are independent. The Provider MUST ensure that an advertised URL refers to the intended public representation.
11. Contract negotiation¶
11.1 Applicability and identifiers¶
Tier 1 retains DSP negotiation for protocol interoperability, not access enforcement. The Provider MUST implement the DSP Contract Negotiation Protocol for the Section 8.4 offer.
Each process MUST receive a unique providerPid. Provider-created process and
agreement identifiers SHOULD be urn:uuid: IRIs.
An initial request MUST contain a non-empty consumerPid, HTTPS
callbackAddress, and exact selected offer, and MUST omit providerPid.
Callback URLs MUST be absolute HTTPS URLs without user information, query, or
fragment.
11.2 Offer validation¶
The Provider MUST accept only an offer that:
- uses a currently advertised offer
@id; - has one top-level
targetequal to that offer's dataset; - has
@typeequal toOffer; - contains exactly the unconditional
usepermission; - contains no nested target; and
- is otherwise structurally equal to the advertised policy.
Unknown, modified, constrained, or retargeted offers MUST return
400 ContractNegotiationError.
11.3 States and direct-agreement flow¶
The Provider MUST enforce the DSP
negotiation states:
REQUESTED, OFFERED, ACCEPTED, AGREED, VERIFIED, FINALIZED, and
TERMINATED. FINALIZED and TERMINATED are terminal.
The required happy path is:
- Consumer posts a valid
ContractRequestMessageto<base>/negotiations/request. - Provider creates
REQUESTEDand returns201 CreatedwithContractNegotiation. - Provider sends
ContractAgreementMessageto{callbackAddress}/negotiations/{consumerPid}/agreement. - Provider commits
AGREEDonly after a2xxacknowledgement. - Consumer posts
ContractAgreementVerificationMessageto the verification endpoint. - Provider returns
200 OKand commitsVERIFIED. - Provider sends a
FINALIZEDnegotiation event to the Consumer callback. - Provider commits
FINALIZEDonly after a2xxacknowledgement.
Callback paths follow the DSP Consumer Path Bindings.
11.4 Optional offer branch¶
The Provider MAY send the unchanged offer to the Consumer offers callback and
commit OFFERED after acknowledgement. In OFFERED, the Consumer MAY send an
ACCEPTED event or return the exact same offer as a counter-request. Tier 1
does not permit changed terms.
The direct-agreement flow is sufficient for the initial implementation; sending offers need only be added when a target Consumer requires this optional branch. The required provider endpoints and state-transition checks remain applicable.
11.5 Agreement¶
The Agreement MUST contain a unique @id, @type equal to Agreement, target
equal to one catalogue dataset, assigner equal to the Provider participant,
assignee equal to the Consumer process identifier, a UTC XML Schema
dateTime, and a permission structurally equal to that of the selected
Offer. Rules inside the Agreement MUST NOT have their own targets.
11.6 Status, termination, and callbacks¶
GET <base>/negotiations/{providerPid} MUST return the current acknowledged
state or 404. Either party MAY terminate a nonterminal process. All route and
message process identifiers MUST match. Invalid transitions or mismatches MUST
return 400 without changing state.
An outbound state MUST NOT be committed before its callback receives 2xx.
Retry counts, timing, and backoff are implementation choices; Tier 1 does not
prescribe a fixed attempt count. Retries MUST preserve message and process
identity and MUST NOT overwrite a newer acknowledged state. After the
Provider abandons delivery, it SHOULD attempt termination and MUST NOT report
the unacknowledged target state. These rules also apply to transfer callbacks.
12. Transfer process¶
12.1 Preconditions and request¶
A transfer MUST refer to a current Agreement in FINALIZED whose target is a
currently published dataset. The Provider MUST implement DSP
Transfer Process Protocol
as finite public HTTPS pull.
POST <base>/transfers/request MUST accept a TransferRequestMessage with the
official context, correct type, non-empty consumerPid, finalized
agreementId, HTTPS callback address, and exact distribution format. It MUST
NOT contain dataAddress. A new valid request returns 201 Created with state
REQUESTED.
12.2 Idempotency¶
Transfer requests MUST be idempotent by consumerPid. Repeating the same
consumer PID, agreement, callback, and format MUST return the existing process.
Reusing it with different values MUST return 400 and preserve the process.
12.3 Start and DataAddress¶
After the initial response, the Provider MUST send TransferStartMessage to:
It MUST include both process identifiers and:
{
"@type": "DataAddress",
"endpointType": "https://w3id.org/idsa/v4.1/HTTP",
"endpoint": "https://provider.example/files/dataset.csv"
}
endpoint MUST equal the resolved public access and download URL of the
distribution selected by the request's format.
endpointProperties MUST NOT convey authorization, credentials, cookies, or
tokens. The Provider commits STARTED only after 2xx acknowledgement. This
implements DSP
pull transfer.
12.4 States and provider endpoints¶
The Provider MUST enforce DSP
transfer states:
REQUESTED, STARTED, SUSPENDED, COMPLETED, and TERMINATED.
| From | Action | To |
|---|---|---|
| — | Valid initial request | REQUESTED |
REQUESTED |
Start callback acknowledged | STARTED |
STARTED |
Suspension acknowledged | SUSPENDED |
SUSPENDED |
Start acknowledged | STARTED |
STARTED |
Completion acknowledged | COMPLETED |
REQUESTED, STARTED, or SUSPENDED |
Termination acknowledged | TERMINATED |
COMPLETED and TERMINATED are terminal. The status, start, suspension,
completion, and termination endpoints in Section 5.2 MUST enforce these
transitions and exact process-identifier matching. Invalid operations return
400 TransferError without state change; unknown processes return 404.
Outbound transfer state is committed only after the corresponding DSP
Consumer Callback
returns 2xx.
13. Errors and HTTP status codes¶
Catalogue, negotiation, and transfer errors MUST respectively use
CatalogError, ContractNegotiationError, and TransferError, with the
official context and exact type. A safe non-empty reason SHOULD be supplied.
Known process identifiers MUST be included where the schema requires them.
| Status | Use |
|---|---|
200 OK |
Successful retrieval or accepted non-creating transition |
201 Created |
New negotiation or transfer process |
400 Bad Request |
Invalid message, unsupported feature, mismatch, or invalid transition |
404 Not Found |
Unknown dataset, negotiation, transfer, or agreement where applicable |
406 Not Acceptable |
No acceptable catalogue representation, including an unsupported JSON-LD-only request |
409 Conflict |
Optional concurrent-transition conflict |
502 Bad Gateway |
Optional failure of a required synchronous callback |
Tier 1 endpoints and public distributions MUST NOT return 401 or 403
merely because Authorization is absent. Unexpected errors MAY return 500
without exposing implementation details.
14. Security and privacy¶
14.1 Public access and TLS¶
Tier 1 selects the unauthenticated option permitted by DSP Authorization. Catalogue content and public data MUST NOT vary by caller identity or credentials. All public and callback traffic MUST use HTTPS with certificate and hostname validation.
14.2 Callback safety¶
Callback addresses are untrusted outbound destinations. A Provider MUST:
- reject user information, query, fragments, and non-HTTPS schemes;
- reject loopback, link-local, private, multicast, unspecified, reserved, and other non-public addresses;
- validate every resolved address and protect against DNS rebinding;
- not follow a redirect to an unvalidated destination;
- bound connection, read, response-body, and header resources; and
- not forward ambient credentials, cookies, proxy credentials, or secrets.
Explicitly trusted private callback networks are outside public Internet Tier 1 conformance.
14.3 Data minimization¶
Responses MUST NOT expose local paths, database identifiers, internal network addresses, credentials, tokens, stack traces, or private participant data.
15. State, consistency, and lifecycle¶
Every request MUST use one internally consistent catalogue snapshot. The Provider MUST validate identifier uniqueness and shared publisher identity before emitting a catalogue or resolving a process.
Metadata MAY change between independent catalogue requests; pages belonging to one snapshot MUST follow Section 7.5. Negotiation and transfer operations MUST resolve the publication against the current snapshot. A removed dataset MUST not silently resolve to another dataset.
Providers MAY persist negotiation and transfer-process state across restart;
durable storage does not require a higher tier. Tier 1 does not require such
persistence. After state loss, an unknown prior process returns 404; the
Consumer MAY begin again. Retained processes MUST preserve their identifiers,
acknowledged states, and idempotency behavior. Transitions MUST be
concurrency-safe and stale callbacks MUST NOT overwrite newer acknowledged
state, whether storage is in memory or durable.
16. Extensibility¶
DSP messages MAY contain extension properties permitted by upstream schemas, provided they do not redefine protected terms or alter Tier 1 semantics.
Additional publication metadata MAY use DCAT, DCTERMS, FOAF, SPDX, or another vocabulary. Such use does not by itself create a DCAT conformance claim. It MUST preserve the Section 9.5 Common catalogue value when an alternate representation is supplied. Extension metadata MUST NOT:
- require authentication;
- make the unconditional offer conditional;
- replace the direct public download with a landing page;
- introduce push behavior under a Tier 1 format value;
- weaken checksum or media-type semantics; or
- contradict the DSP resource carrying it.
17. Conformance checklist¶
17.1 Discovery and transport¶
- All endpoints use HTTPS.
-
<root>/.well-known/dspace-versionis unversioned and unauthenticated. - The response advertises version
2025-1, bindingHTTPS, a valid path, and the DSP service ID, with noauth. - Consumers can derive
<base>without assuming its path. - DSP bodies use
application/json, the official context, and schemas. - No
GET <base>/catalogendpoint is required for conformance. - The complete catalogue output, when expanded for conformance checking,
passes pinned DCAT-AP mandatory, range, and
controlled-vocabulary validation except only for literal-valued
dcat:endpointURL.
17.2 Catalogue and publication¶
-
POST <base>/catalog/requestreturns the complete catalogue or its first page with DSPLinknavigation. - Non-empty filters return
400 CatalogError. - At least one dataset is present; pagination support is optional.
- If paginated,
next/previouslinks accept the specified POST request, all pages form one consistent snapshot, and traversal returns every dataset exactly once. Invalidated page references return404 CatalogError. - Dataset, offer, distribution, and service IDs are stable and unique.
- All datasets share one publisher.
- The catalogue carries the Tier 0 and DCAT-AP 3.0.1 conformance IRIs as
typed
dct:Standardobjects. - Each dataset has one unconditional offer and one or more public distributions, with distinct DSP format values within the dataset.
- Every distribution states a licence.
- Format, media type, licence, access URL, and direct download URL are present with the required RDF classes and ranges.
- Every format is explicitly typed
dct:MediaTypeOrExtent. - Every media type is explicitly typed
dct:MediaType. - Known byte sizes are explicitly typed
xsd:nonNegativeInteger, and checksums use the required SPDX and XML Schema types. - The root DSP access service identifies every served dataset and the standards to which it conforms.
- Individual dataset retrieval returns the same metadata or
404. - The DSP response makes no DCAT or DCAT-AP conformance claim.
17.3 Optional DCAT-AP companion¶
- If no companion is offered, DSP Tier 1 remains fully conformant.
- If offered, root
servicecontains the exact companion profile and DCAT-AP 3.0.1 IRIs. - The advertised endpoint is absolute HTTPS and path-independent.
- Served dataset identifiers refer to the current DSP snapshot.
- The endpoint also satisfies Materials Commons DCAT-AP Tier 0 well-known discovery and conformance requirements.
- If negotiated DCAT-AP is supported, the DSP access service contains the
exact feature and DCAT-AP profile IRIs while retaining
<base>as itsendpointURL. - Exact
Accept: application/ld+jsonreturns the profiled JSON-LD media type andVary: Accept. - The DSP, negotiated, and companion responses have structurally identical Common catalogue values for the same complete snapshot after assembling any pages. Negotiated page payloads match their DSP counterparts.
- Context substitution changes only literal
dcat:endpointURLvalues into IRIs, and the substituted graph passes full DCAT-AP validation.
17.4 Negotiation and transfer¶
- Only the exact advertised unconditional offer is accepted.
- Agreement and finalization callbacks are supported.
- Agreements have unique ID, target, parties, UTC time, and permission.
- Transfers require a finalized agreement for a current dataset.
- Requested format exactly matches one distribution of the target dataset, and Start supplies that distribution's public URL.
- Consumer data addresses are rejected.
- Start supplies the public HTTPS DataAddress.
- Requests are idempotent by
consumerPid. - Invalid transitions are rejected without state change.
- Outbound states commit only after
2xxcallback acknowledgement. - Optional persistence and callback retries preserve identifiers, acknowledged states, and idempotency behavior.
17.5 Independent consumer interoperability (non-normative)¶
Before relying on an interoperability claim, exercise the complete flow with an independently implemented Consumer: version discovery, catalogue retrieval (including pagination when enabled), offer selection, negotiation through finalization, transfer start, data download, and completion. Include a dataset with two formats when multiple distributions are supported and check that each format selects the correct public URL.
Record the Consumer implementation and version, any configuration or adapter needed for the Section 8.5 format-to-transport mapping, and the observed results. Schema validation and a Provider's own test client alone do not demonstrate independent interoperability. This is verification guidance, not a requirement to implement consumer endpoints in a Tier 1 Provider.
Appendix A. Minimal examples (non-normative)¶
A.1 Catalogue request¶
POST /dsp/2025-1/catalog/request HTTP/1.1
Host: provider.example
Content-Type: application/json
Accept: application/json
{
"@context": ["https://w3id.org/dspace/2025/1/context.jsonld"],
"@type": "CatalogRequestMessage",
"filter": []
}
A.2 Dataset with DCAT-AP-aligned metadata¶
{
"@id": "https://provider.example/datasets/example",
"@type": "Dataset",
"dct:title": "Example materials dataset",
"dct:description": "A public example dataset.",
"dct:publisher": {
"@id": "https://provider.example/participants/provider",
"@type": "http://xmlns.com/foaf/0.1/Agent",
"http://xmlns.com/foaf/0.1/name": "Example Provider"
},
"hasPolicy": [{
"@id": "https://provider.example/datasets/example#offer",
"@type": "Offer",
"permission": [{"action": "use"}]
}],
"distribution": [{
"@id": "https://provider.example/datasets/example#distribution",
"@type": "Distribution",
"format": "http://publications.europa.eu/resource/authority/file-type/CSV",
"dct:format": {
"@id": "http://publications.europa.eu/resource/authority/file-type/CSV",
"@type": "dct:MediaTypeOrExtent"
},
"dcat:mediaType": {
"@id": "https://www.iana.org/assignments/media-types/text/csv",
"@type": "dct:MediaType"
},
"dcat:accessURL": {"@id": "https://provider.example/files/example.csv"},
"dcat:downloadURL": {"@id": "https://provider.example/files/example.csv"},
"dct:license": {
"@id": "http://creativecommons.org/licenses/by/4.0/",
"@type": "dct:LicenseDocument"
},
"dcat:byteSize": {
"@value": "12345",
"@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
},
"accessService": {
"@id": "https://provider.example/services/dsp",
"@type": "DataService",
"dct:title": "Public DSP service",
"endpointURL": "https://provider.example/dsp/2025-1",
"dct:conformsTo": [
{
"@id": "tag:materialscommons.eu,2026:dsp/prototype-tier-1",
"@type": "dct:Standard"
},
{
"@id": "https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/2025-1-err1/",
"@type": "dct:Standard"
}
],
"dcat:servesDataset": [
{"@id": "https://provider.example/datasets/example"}
]
}
}]
}
A.3 Negotiation request¶
{
"@context": ["https://w3id.org/dspace/2025/1/context.jsonld"],
"@type": "ContractRequestMessage",
"consumerPid": "urn:uuid:11111111-1111-4111-8111-111111111111",
"callbackAddress": "https://consumer.example/dsp-callback",
"offer": {
"@id": "https://provider.example/datasets/example#offer",
"@type": "Offer",
"target": "https://provider.example/datasets/example",
"permission": [{"action": "use"}]
}
}
A.4 Transfer request and start¶
{
"@context": ["https://w3id.org/dspace/2025/1/context.jsonld"],
"@type": "TransferRequestMessage",
"consumerPid": "urn:uuid:22222222-2222-4222-8222-222222222222",
"agreementId": "urn:uuid:33333333-3333-4333-8333-333333333333",
"format": "http://publications.europa.eu/resource/authority/file-type/CSV",
"callbackAddress": "https://consumer.example/dsp-callback"
}
{
"@context": ["https://w3id.org/dspace/2025/1/context.jsonld"],
"@type": "TransferStartMessage",
"providerPid": "urn:uuid:44444444-4444-4444-8444-444444444444",
"consumerPid": "urn:uuid:22222222-2222-4222-8222-222222222222",
"dataAddress": {
"@type": "DataAddress",
"endpointType": "https://w3id.org/idsa/v4.1/HTTP",
"endpoint": "https://provider.example/files/example.csv"
}
}
Appendix B. Normative references¶
- DSP 2025-1-err1 — Dataspace Protocol 2025-1, errata revision 1.
- DCAT 3 — Data Catalog Vocabulary (DCAT), Version 3.
- DCAT-AP 3.0.1 — DCAT Application Profile for data portals in Europe, Version 3.0.1.
- JSON-LD 1.1 — JSON-LD 1.1.
- ODRL — ODRL Information Model 2.2.
- SHACL — Shapes Constraint Language.
- RFC 2119 — Key words for use in RFCs to Indicate Requirement Levels.
- RFC 8174 — Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words.
- RFC 8615 — Well-Known Uniform Resource Identifiers.
- RFC 9110 — HTTP Semantics.
Appendix C. Informative references¶
- Materials Commons DCAT-AP GET Protocol Tier 0 — Companion protocol.