Migrating from DCAT-US v1.1 to v3.0
Overview
A step-by-step guide to updating your existing v1.1 data.json file to be valid against the DCAT-US v3.0 schema.
Source
Category
Keywords
Details
See an error on this page or have other feedback? Email us at DataGovHelp@gsa.gov
Overview
This guide covers the minimum changes needed to make your existing v1.1 data.json file valid against the v3.0 schema. Work through the steps in order — steps 1 through 4 address breaking changes that will cause validation failures. Steps 5 through 8 are structural changes required for correct v3.0 implementation.
After completing all steps, run your updated data.json against the v3.0 validation script: jsonschema/test_json_schema.py
Note: the generated reference documentation in jsonschema/docs/ currently shows all fields as Optional regardless of their actual requirement level. This is a known issue. Trust the requirement levels in the JSON schema files and on the reference pages, not the generated docs.
—
Breaking changes — fix these first
These are changes where your existing v1.1 values will fail v3.0 schema validation.
Step 1 — Fix modified
If you use repeating intervals like R/P1D or R/P1Y in modified, replace them with the actual date the data last changed. Move your update frequency to accrualPeriodicity using a plain-language code.
| v1.1 | v3.0 |
|---|---|
"modified": "R/P1Y" |
"modified": "2024-10-01" |
"modified": "R/P1D" |
"modified": "2024-10-15" |
Add accrualPeriodicity to express update frequency:
"accrualPeriodicity": "annually"
Accepted values include: daily, weekly, monthly, quarterly, annually, irregular. ISO 8601 repeating duration format (e.g., R/P1Y) is also still accepted.
—
Step 2 — Fix temporal
Replace the v1.1 ISO 8601 interval string with an array of PeriodOfTime objects. At least one of startDate or endDate is required per object. Open-ended periods are valid — omit endDate for ongoing datasets.
| v1.1 | v3.0 |
|---|---|
"temporal": "2000-01-15T00:00:00Z/2010-01-15T00:00:00Z" |
|
"temporal": "2020-01-01T00:00:00Z/P1Y" |
|
Step 3 — Fix spatial
Replace the v1.1 plain string or ad-hoc GeoJSON with an array of Location objects. No fields are required on Location — include prefLabel at minimum, and add bbox for geospatial precision.
| v1.1 | v3.0 |
|---|---|
"spatial": "United States" |
|
"spatial": "-125,24,-66,50" |
|
Step 4 — Fix language
Replace RFC 5646 language tags with two-letter ISO 639-1 codes. The v3.0 schema enforces a maximum length of two characters — values like en-US will fail validation.
| v1.1 | v3.0 |
|---|---|
"language": ["en-US"] |
"language": ["en"] |
"language": ["es-MX"] |
"language": ["es"] |
"language": ["fr-CA"] |
"language": ["fr"] |
This applies to language on Dataset, Distribution, DataService, and Catalog.
—
Structural changes — required for correct v3.0 implementation
These changes will not cause immediate validation failures but are required to correctly implement v3.0.
Step 5 — Update conformsTo on the Catalog
Change the plain string URI to a Standard object pointing to DCAT-US v3.0.
| v1.1 | v3.0 |
|---|---|
"conformsTo": "https://project-open-data.cio.gov/v1.1/schema" |
|
Step 6 — Remove @context and describedBy from the Catalog
Both fields have been removed at the catalog level in v3.0. Delete these lines from your catalog object.
// Remove these lines from your catalog: "@context": "https://project-open-data.cio.gov/v1.1/schema/catalog.jsonld", "describedBy": "https://project-open-data.cio.gov/v1.1/schema/catalog.json"
Step 7 — Replace accessLevel with accessRights
accessLevel is not in the v3.0 schema. Add accessRights as a free-text string alongside your existing accessLevel field. Until updated OMB guidance is issued, keep accessLevel in your records — the v3.0 schema will not reject it, and existing OMB policy still requires it.
v1.1 accessLevel |
v3.0 accessRights (add alongside) |
|---|---|
"public" |
"public" |
"restricted public" |
"Access restricted. Contact the publisher to request access." |
"non-public" |
"Not available for public release. Contact the publisher for more information." |
Step 8 — Add license to Distribution objects
In v3.0, license is defined at the Distribution level per W3C DCAT. The recommended approach is to add license to each Distribution object. You do not need to remove it from the Dataset level during the transition period — the v3.0 schema will not reject records that include it there.
| v1.1 (on Dataset) | v3.0 (add to each Distribution) |
|---|---|
|
|
If all your distributions share the same license you will need to add it to each one individually. —
You are done with the minimum migration
After completing steps 1 through 8 your records should validate against the v3.0 schema. Run your updated data.json against the validation script at jsonschema/test_json_schema.py to confirm.
—
Additional improvements
These changes are not required for validation but improve the quality and interoperability of your metadata. Work through them when you are ready.
| Improvement | What to do | More detail |
|---|---|---|
Upgrade landingPage |
Change from a plain URL string to a Document object with title and accessURL. |
Dataset fields |
Upgrade theme |
Change from plain strings to Concept objects with prefLabel. Example: [{"prefLabel": "Climate Science"}] |
Dataset fields |
Upgrade describedBy |
Change from a plain URL to a Distribution object with title, downloadURL or accessURL, and mediaType. Remove describedByType — it is now expressed as mediaType within the Distribution object. |
Dataset fields |
Upgrade conformsTo on Dataset and Distribution |
Change from a plain URI string to an array of Standard objects. Example: [{"@type": "Standard", "title": "ISO 19115", "identifier": "https://www.iso.org/standard/53798.html"}] |
Dataset fields |
Convert rights to an array |
Change from a single string (max 255 characters in v1.1) to an array of strings with no character limit. Example: ["This data is in the public domain."] |
Dataset fields |
Add accessRestriction, useRestriction, cuiRestriction to Distributions |
Replace free-text access restriction descriptions in rights with structured restriction objects. These are Recommended fields in v3.0 for federal agencies. |
Distribution fields |
| Register APIs as DataService objects | Move API documentation from Distribution records to DataService objects at the Catalog level. Each DataService requires title, endpointURL, contactPoint, and publisher. |
DataService fields |
Add purpose, scopeNote, liabilityStatement |
New optional fields that improve discoverability and help users assess fitness for use. Plain-language strings. | Dataset fields |
| Group recurring datasets into DatasetSeries | Create DatasetSeries records for annual surveys, recurring publications, and versioned reference data. Link each Dataset to its series using the inSeries field. |
DatasetSeries fields |