FOSS Wiki StationFOSS Wiki Station
SBOM & Tooling

SPDX

The Linux Foundation SBOM standard — governance, the multi-domain graph model, profiles, License List and security/VEX.

SPDX Wiki

System Package Data Exchange — a Linux Foundation open standard for describing the components, licences, and provenance of software and the systems built from it. Version 3.0 rebuilt it from the ground up as a multi-domain graph model.

Stable release3.0.1 · 2024-12-17
Next3.1-RC1 · 2026-01-24 (pre-release)
Standard statusISO/IEC 5962
License List3.29.0 · 2026-09-16

Overview

SPDX began around 2010 as an open-source license compliance exchange format — hence the original expansion, Software Package Data Exchange. Its most widely used artefact is still not an SBOM at all, but the SPDX License List: the short identifiers (MIT, Apache-2.0, GPL-2.0-or-later) that the entire industry uses to name licences.

In 2021 the SPDX workgroup merged with the OMG/CISQ Tool-to-Tool effort, and the combined group rebuilt the model. The result shipped as SPDX 3.0 in April 2024, with a deliberate rename to System Package Data Exchange: the scope moved beyond software to datasets, AI models, and build information in the same document.

Standardisation

  • ISO/IEC 5962:2021 — the international standard edition, which captures SPDX 2.2.1. This is the version procurement language usually cites.
  • ISO/IEC DIS 5962 — a draft international standard for the newer model is progressing through ISO; SPDX 3.0.1 was explicitly prepared to support the OMG and ISO submissions.
  • OMG has also published the SPDX 3.0 specification through its process, reflecting the Tool-to-Tool lineage.
  • Governance: the SPDX workgroup under the Linux Foundation, with an open specification repository and public mailing lists.

Version history

VersionReleasedNotes
2.2.12021-09-28Became ISO/IEC 5962:2021. Still cited in regulation and contracts.
2.32022-11-03Final 2.x. Back-ported concepts to prepare the ecosystem for 3.0; still the most commonly emitted SPDX flavour in tooling.
3.0-RC1 / RC22023-05 / 2024-02Public review cycles.
3.02024-04-15Breaking rewrite. Profile-based, RDF/OWL foundation, "Software" → "System".
3.0.12024-12-17Current stable. Documentation corrections and minor model fixes; supports OMG/ISO submission.
3.1-RC12026-01-24Release candidate. Adds hardware, service, safety, supply-chain and operations profiles.

Planning note: 2.x and 3.x are different standards that share a name. There is no lossless upgrade path from a 2.3 document to a 3.0 document. If your toolchain emits 2.3 and your customer asks for "SPDX", confirm which major version they actually validate against.

The 3.x data model

SPDX 3.0 dropped the flat document-in-a-tree design of 2.x in favour of a labelled graph. Almost everything you can talk about is an Element identified by an IRI, and the connections between elements are themselves elements.

ConceptWhat it means
ElementThe root class. Every named thing — a package, a person, a licence, a build, a vulnerability — is an Element with an identifier, creationInfo, optional comment, verifiedUsing (hashes), and externalRef.
IdentificationElements are addressed by IRI (spdxId), not array position. That makes cross-document references and third-party annotations natural, which 2.x could not do cleanly.
RelationshipA first-class Element linking a from element to one or more to elements with a typed predicate (DEPENDS_ON, CONTAINS, HAS_VULNERABILITY, DESCENDANT_OF…). Anyone can assert new relationships about someone else's element.
AgentWho or what produced the data: Person, Organization, SoftwareAgent, Tool. Attribution is explicit on every element via CreationInfo.createdBy / createdUsing / created.
ArtifactA concrete thing being described (superclass of SoftwareArtifact, Package, File, Snippet, Bom, AIPackage, DatasetPackage).
ElementCollection / BundleGrouping constructs for shipping a set of elements, or an SBOM, as one object.
SpdxDocumentThe serialisation wrapper: a root element plus rootElement pointers, dataLicense, and profileConformance declarations.
IntegrityMethod / HashTyped integrity evidence with a hash algorithm vocabulary, replacing the loose free-text checksum fields.
ExternalMap / ExternalIdentifierHow SPDX points outwards: purl, cpe23, swid, and arbitrary external identifier systems.

The practical payoff: an SPDX 3 document can carry a security researcher's VEX statement about a package shipped by someone else, in a separate document, referencing that package by IRI, without either party editing the other's file.

Profiles

SPDX 3 is modular. A producer declares which profiles it conforms to, so a simple licence-only SBOM does not have to implement the whole model.

ProfileCoversRepresentative classes
CoreFoundational concepts shared by every profileElement, Artifact, Relationship, Agent, Person, Organization, Tool, SoftwareAgent, CreationInfo, Bom, Bundle, Hash, Annotation, NamespaceMap, SpdxDocument
SoftwareThe classic SBOM payloadSoftwareArtifact, Package, File, Snippet, Sbom, ContentIdentifier
SecurityVulnerability and VEX dataVulnerability, VulnAssessmentRelationship, VexVulnAssessmentRelationship (Affected / Fixed / NotAffected / UnderInvestigation), CvssV2/V3/V4 assessment relationships, EpssVulnAssessmentRelationship, SsvcVulnAssessmentRelationship, ExploitCatalogVulnAssessmentRelationship
LicensingTwo conformance levels: SimpleLicensing (just an expression string) and ExpandedLicensing (structured objects)LicenseExpression, SimpleLicensingText, License, ListedLicense, ListedLicenseException, CustomLicense, CustomLicenseAddition, ConjunctiveLicenseSet, DisjunctiveLicenseSet, WithAdditionOperator, OrLaterOperator, LicenseAddition, AnyLicenseInfo
BuildHow an artifact was produced — inputs, parameters, environment, timingsBuild, plus buildId, buildType, buildStartTime/buildEndTime, configSourceUri, configSourceDigest, parameter, environment
AIAI/ML model transparency: model cards, energy use, safetyAIPackage, EnergyConsumption(+Description), with properties for hyperparameters, model explainability, data preprocessing, autonomy type, safety risk assessment, sensitive personal information, training/inference/fine-tuning energy
DatasetDatasets as first-class bill-of-materials citizensDatasetPackage
ExtensionDefined mechanism for third-party extension without forking the model(extension points)

SPDX 3.1-RC1 (January 2026) widens the model further with profiles for hardware, service, functional safety, supply chain, and operations. As a release candidate it is explicitly for testing and validation — features may change before GA.

Serialization formats

Because 3.x is defined as an OWL ontology, the canonical form is RDF. The spec publishes an OWL ontology, a JSON-LD context, and a JSON Schema; serialisation is a rendering choice.

  • JSON-LD — the canonical 3.x exchange form; the same bytes are valid JSON and valid RDF.
  • RDF / Turtle — the native form for graph stores and SPARQL queries.
  • SPDX JSON and XML — non-RDF renderings for consumers that just want JSON.
  • YAML — commonly seen in ecosystem tooling.
  • tag:value — the classic 2.x line-oriented format, still produced by many scanners; not part of the 3.x model.

Practical consequence: an SPDX 3 document is a serialisation of a graph, so element order is not meaningful and consumers should key off identifiers rather than list position. Many 2.x-era parsers assume otherwise, which is the main source of 3.x adoption friction.

SPDX License List

The License List is versioned independently of the specification — current release 3.29.0 (2026-09-16). It provides a short identifier, full name, canonical text, and flags for OSI approval and FSF freedom, plus a separate list of exceptions and a list of deprecated identifiers you should no longer emit.

License expressions combine identifiers with operators:

// two licences, choose either
"MIT OR Apache-2.0"

// both apply
"GPL-2.0-only AND BSD-3-Clause"

// with an exception, and "or later"
"GPL-3.0-or-later WITH Bison-exception-2.2"

These strings are the interoperability layer everyone agrees on: CycloneDX also accepts SPDX license IDs and expressions, which is why switching BOM formats rarely means rewriting your licensing data.

Security & VEX

The Security profile carries vulnerability information in the same graph as the components. Rather than a single "severity number", each assessment is its own relationship object, so multiple scoring systems can coexist on one vulnerability:

  • Vulnerability — the vulnerability itself (for example a CVE), with ExternalIdentifier links.
  • VulnAssessmentRelationship — the base assessment, subclassed into CVSS v2/v3/v4, EPSS, SSVC, and exploit-catalog (for example KEV) assessments.
  • VexVulnAssessmentRelationship — the VEX judgement, further subclassed as Affected, Fixed, NotAffected, or UnderInvestigation.

Example SPDX 3 document

{
  "@context": "https://spdx.org/rdf/3.0.1/spdx-context.jsonld",
  "@type": "SpdxDocument",
  "spdxId": "https://example.com/docs/app-1.2.0.spdx.json",
  "name": "acme-portal 1.2.0",
  "creationInfo": {
    "created": "2026-09-16T09:12:00Z",
    "createdBy": [{ "@type": "Organization", "name": "Acme Corp" }],
    "createdUsing": [{ "@type": "Tool", "name": "build-pipeline" }]
  },
  "dataLicense": "CC0-1.0",
  "profileConformance": ["core", "software", "security", "licensing"],
  "rootElement": [
    { "@type": "Package", "spdxId": "https://example.com/pkg/acme-portal@1.2.0" }
  ],
  "element": [
    {
      "@type": "Package",
      "spdxId": "https://example.com/pkg/acme-portal@1.2.0",
      "name": "acme-portal",
      "packageVersion": "1.2.0",
      "packageUrl": "pkg:generic/acme-portal@1.2.0",
      "suppliedBy": [{ "@type": "Organization", "name": "Acme Corp" }]
    },
    {
      "@type": "Relationship",
      "relationshipType": "DEPENDS_ON",
      "from": "https://example.com/pkg/acme-portal@1.2.0",
      "to": [{ "https://example.com/pkg/express@4.21.1" }]
    }
  ]
}

Strengths and trade-offs

Strengths

  • The universal licence vocabulary — SPDX IDs are the industry default, even inside CycloneDX documents.
  • Genuinely multi-domain: software, AI, datasets, and build in one coherent model.
  • Formal ontology with JSON-LD/RDF support enables graph queries and cross-document linking.
  • International standard status via ISO/IEC 5962.
  • Relationships are first-class, so third-party VEX and annotations attach cleanly.

Trade-offs

  • The 2.x → 3.x break is real; tooling and validator support for 3.x is still maturing.
  • Graph semantics plus IRIs are a steeper learning curve than a nested JSON document.
  • Out-of-the-box "operational" features (services, hardware, attestations, crypto inventory) are thinner than CycloneDX's.
  • Multiple serialisations mean "valid SPDX" still needs a version + format qualifier to be unambiguous.

Where to go next

Compare with CycloneDX → · Generators and converters → · Regulatory drivers →


Sources: spdx.dev, the SPDX 3.0.1 specification site, spdx.org/licenses, and the spdx-spec release history (retrieved September 2026).

On this page