?
u
m
/
p
1-9
0
`
The document at https://tc54.org/ecmaXXX/ is the most accurate and up-to-date Package-URL specification.
This document is available as a single page and as multiple pages.
This specification is developed on GitHub with the help of the Package-URL community. There are a number of ways to contribute to the development of this specification:
Refer to the
Software ecosystems have evolved into highly interconnected networks of components, packages, and dependencies. Managing this complexity demands a robust, uniform mechanism to identify and track software packages across diverse ecosystems and tools. Package-URL (PURL) was developed to address this challenge by providing a simple, consistent, and flexible approach to identifying software packages with precision and clarity.
PURL introduces a standardized URL-based syntax that uniquely identifies software packages, independent of their ecosystem or distribution channel. Unlike traditional identification methods, PURL embeds critical metadata directly into its structure, enabling efficient, accurate package identification at scale. This standardization ensures interoperability between tools and ecosystems, fostering greater collaboration and reducing ambiguity in software supply chain management.
Challenges addressed by PURL:
As software supply chain security becomes a global priority, formalizing PURL as an international standard ensures its adoption and consistent implementation. Standardization under Ecma International Technical Committee 54 (TC54) positions PURL as a foundational building block for secure, transparent, and efficient software ecosystems worldwide.
By enabling a universally recognized and implementable specification, PURL aligns with global efforts to improve the security, reliability, and accountability of software supply chains. Its adoption ensures that organizations and developers can rely on a common language to manage software packages across the diverse and rapidly evolving software landscape.
This Ecma Standard was developed by Technical Committee 54 and was adopted by the General Assembly of December 2025.
This Standard defines the Package-URL specification.
In this standard, the words that are used to define the significance of each requirement are detailed below. These words are used in accordance with their definitions in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt), and their respective meanings are reproduced below:
The words "must not", "shall not", "should not", and "not recommended", are the negative forms of "must", "shall", "should", and "recommended", respectively. There is no negative form of "may".
A conforming implementation of Package-URL (PURL) must fully implement and support all elements defined within this specification, including the syntax, components, and semantic requirements for constructing and interpreting valid PURLs.
A conforming implementation of PURL must adhere to the syntax defined in this specification, ensuring that all PURLs are parsed, constructed, and validated according to the prescribed rules. The implementation must provide full support for ecosystem-agnostic behaviour, enabling PURLs to function consistently and reliably across diverse environments.
All required components of a PURL, such as the scheme, type, and name, must be present and validated according to the rules defined in this specification. Additionally, optional components, including qualifiers and subpaths, must be handled appropriately if provided, in full compliance with their specified behaviours.
Implementations must ensure that equivalent PURLs are consistently resolved to the same canonical representation. This includes strict adherence to normalisation and equivalence rules. Furthermore, implementations must process URI encoding and decoding for PURL components according to the standards outlined in RFC 3986.
Invalid PURLs that fail to conform to the specification must be identified and rejected by any conforming implementation. This guarantees the integrity and reliability of PURLs in all supported contexts.
A conforming implementation of PURL may extend its functionality by providing ecosystem-specific validation, processing, or metadata handling, as long as these extensions do not violate the core specification. Additionally, implementations may offer auxiliary tools or features, such as utilities for constructing or validating PURLs, provided they align with the standard's requirements.
A conforming implementation must not redefine or alter the core syntax, components, or semantics defined by this specification. Any prohibited extensions explicitly identified in the specification must not be implemented. Furthermore, behaviours that compromise the interoperability of PURLs across tools, platforms, or ecosystems are strictly disallowed.
A conforming implementation of Package-URL may choose to implement or not implement Normative Optional subclauses. If any Normative Optional behaviour is implemented, all of the behaviour in the containing Normative Optional clause must be implemented. A Normative Optional clause is denoted in this specification with the words "Normative Optional" in a coloured box, as shown below.
The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.
ECMA-404, The JSON Data Interchange Format
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
INCITS 4-1986 [R2022], Information Systems - Coded Character Sets - 7-Bit Standard Code for Information Interchange (7-Bit ASCII)
https://webstore.ansi.org/standards/incits/incits1986r2022
RFC 3986, Uniform Resource Identifier (URI): Generic Syntax
https://datatracker.ietf.org/doc/html/rfc3986
The Unicode Standard
https://www.unicode.org/versions/latest/
IETF Draft, March 2018, JSON Schema Validation: A Vocabulary for Structural Validation of JSON (Draft-07)
https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01
This section contains a non-normative overview of the Package-URL specification.
The Package-URL (PURL) specification defines a lightweight, universal syntax for identifying software packages. By leveraging a URL-based format, PURL provides a consistent and interoperable mechanism for referencing software packages across a wide range of ecosystems and tools. Its design addresses the challenges of ambiguity, inconsistency, and fragmentation in software package identification, enabling better interoperability and traceability in modern software supply chains.
This specification focuses on the core aspects of PURL, including its syntax, required components, optional attributes, and conformance requirements. It does not cover ecosystem-specific types or extensions such as PURL Version Ranges (VERS). However, the flexibility of PURL allows it to be extended to meet the needs of diverse package ecosystems without compromising its universal applicability.
The primary audience for this specification includes developers, tool implementers, and organisations involved in software composition analysis, dependency management, and supply chain security. PURL is foundational to a variety of use cases, from software bill of materials (SBOM) generation and license compliance to vulnerability tracking and software artefact exchange.
While this document serves as the authoritative reference for implementing PURL, it is complemented by various ecosystem-specific guidance documents, examples, and related standards. These resources provide additional context and practical insights for leveraging PURL effectively.
This overview is non-normative and serves to provide context for the specification’s intent, purpose, and audience. For detailed requirements and conformance criteria, refer to the normative sections of this specification.
PURL stands for package URL.
A PURL is a URL composed of seven components:
scheme:type/namespace/name@version?qualifiers#subpath
Components are separated by a specific character for unambiguous parsing.
Component | Requirement | Description |
---|---|---|
scheme | Required | The URL scheme with the constant value of "pkg". One of the primary reasons for this single scheme is to facilitate the future official registration of the "pkg" scheme for package URLs. |
type | Required | The package "type" or package "protocol" such as maven, npm, nuget, gem, pypi, etc. |
namespace | Optional | A name prefix such as a Maven groupid, a Docker image owner, a GitHub user or organization. Namespace is type-specific. |
name | Required | The name of the package. |
version | Optional | The version of the package. |
qualifiers | Optional | Qualifier data for a package such as OS, architecture, repository, etc. Qualifiers are type-specific. |
subpath | Optional | Subpath within a package, relative to the package root. |
Components are designed such that they form a hierarchy from the most significant on the left to the least significant components on the right.
A PURL must not contain a URL Authority, i.e. there is no support for username
, password
, host
and port
components. A namespace
segment may sometimes look like a host
, but its interpretation is specific to a type
.
pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?packaging=sources
pkg:npm/foobar@12.3.1
scheme
: this is a URL scheme
with a constant value: pkg
type
, namespace
, name
and version
components: these are collectively mapped to a URL path
qualifiers
: this maps to a URL query
subpath
: this is a URL fragment
username
, password
, host
and port
components).file://
, https://
, http://
and ftp://
are not valid PURL types. They are valid URL or URI schemes but they are not PURL. They may be used to reference URLs in separate attributes outside of a PURL or in a PURL qualifier.git://
, svn://
, hg://
or as defined in Python pip or SPDX download locations are not valid PURL types. They are valid URL or URI schemes but they are not PURL. They are a closely related, compact and uniform way to reference VCS URLs. They may be used as references in separate attributes outside of a PURL or in a PURL qualifier.A canonical PURL is composed of these permitted ASCII characters:
A to Z
, a to z
, 0 to 9
,.-_~
(period '.', dash '-', underscore '_' and tilde '~'),%
(percent sign '%'), and:/@?=&#
(colon ':', slash '/', at sign '@', question mark '?', equal sign '=', ampersand '&' and hash sign '#').This is how each of the Separator Characters are used:
scheme
and type
type
, namespace
and name
subpath
segmentsname
and version
qualifiers
key
and a value
of a qualifier
qualifiers
(each being a key=value
pair)subpath
References to "lowercase" in this specification refer to the culture-invariant full case mapping defined in Section 3.13.2 of the Unicode Standard.
When applied to the ASCII character set, this operation converts uppercase Latin letters (A to Z
) to their corresponding lowercase forms (a to z
). All other ASCII characters remain unchanged.
A PURL string is an ASCII URL string composed of seven components. Except as expressly stated otherwise in this section, each component:
The "lowercase" rules are defined in the
The rules for each component are:
scheme
is a constant with the value "pkg".scheme
must be followed by an unencoded colon ':'.scheme
and colon ':' are followed by one or more slash '/' characters, such as 'pkg://', and must ignore and remove all such '/' characters.type
must be composed only of ASCII letters and numbers, period '.', and dash '-'.type
must start with an ASCII letter.type
must not be percent-encoded.type
is case insensitive. The canonical form is lowercase.namespace
is optional, unless required by the package's type
definition.namespace
may contain one or more segments, separated by a single unencoded slash '/' character.namespace
.namespace
segment must be a percent-encoded string.type
definition provides otherwise.namespace
. Use instead a repository_url
qualifier. Note however, that for some types, the namespace
may look like a host.name
is prefixed by a single slash '/' separator when the namespace
is not empty.name
.name
must be a percent-encoded string.name
may contain any Unicode character unless the package's type
definition provides otherwise.version
is prefixed by a '@' separator when not empty.version
.version
must be a percent-encoded string.version
may contain any Unicode character unless the package's type
definition provides otherwise.version
is a plain and opaque string.qualifiers
component must be prefixed by an unencoded question mark '?' separator when not empty. This '?' separator is not part of the qualifiers
component.qualifiers
component is composed of one or more key=value
pairs. Multiple key=value
pairs must be separated by an unencoded ampersand '&'. This '&' separator is not part of an individual qualifier
.key
and value
must be separated by the unencoded equal sign '=' character. This '=' separator is not part of the key
or value
.value
must not be an empty string: a key=value
pair with an empty value
is the same as if no key=value
pair exists for this key
.key=value
pair:
key
must be composed only of lowercase ASCII letters and numbers, period '.', dash '-' and underscore '_'.key
must start with an ASCII letter.key
must not be percent-encoded.key
must be unique among all the keys of the qualifiers
component.value
may contain any Unicode character and all characters must be encoded as described in the subpath
string is prefixed by a '#' separator when not emptysubpath
subpath
contains zero or more segments, separated by slash '/'subpath
segment must be a percent-encoded stringtype
definition provides otherwise.subpath
must be interpreted as relative to the root of the packageThe PURL Type Definition JSON Schema is the reference data model that is used to define PURL types in a structured way. Each PURL type is specified in a JSON document that matches this schema. These JSON documents are then used to generate PURL type documentation and to support PURL libraries and tools so that they can more easily parse, build, and validate PURLs by type in a consistent and standardized manner across programing languages and technology stacks.
Schema to specify a Package-URL (PURL) type as a structured definition.
Property | Type | Requirement | Description |
---|---|---|---|
type | String | Required | The type string for this Package-URL type. |
type_name | String | Required | The name for this PURL type. |
description | String | Required | The description of this PURL type. |
repository | Object | Required | The package repository usage for this PURL type. |
namespace_definition | Array | Required | Definition of the namespace component for this PURL type. The PURL namespace component must be required, optional or prohibited for a specific PURL type definition. |
name_definition | Array | Required | Definition of the name component for this PURL type. The PURL name component is required for all PURL type definitions. |
version_definition | Array | Optional | Definition of the version component for this PURL type. The PURL version component is optional for a specific PURL type definition. |
qualifiers_definition | Array | Optional | Definition of the qualifiers specific to this PURL type. The PURL qualifiers component is optional for a specific PURL type, but a qualifiers key or keys may be required for a specific PURL type. |
subpath_definition | Array | Optional | The definition for the subpath for this PURL type. The PURL subpath component is optional for a specific PURL type definition. |
examples | Array | Required | Example of valid, canonical PURLs for this package type. |
note | String | Optional | Note about this PURL type. |
reference_urls | Array | Optional | Optional list of informational reference URLs about this PURL type. |
^[a-z][a-z0-9-\.]+$
The type string for this Package-URL type.
The name for this PURL type.
The description of this PURL type.
The package repository usage for this PURL type.
Property | Type | Requirement | Description |
---|---|---|---|
use_repository | Boolean | Required | true if this PURL type uses a public package repository. |
default_repository_url | String | Optional | The default public repository URL for this PURL type. |
note | String | Optional | Extra note text. |
true if this PURL type uses a public package repository.
The default public repository URL for this PURL type.
Extra note text.
Definition of the namespace component for this PURL type. The PURL namespace component must be required, optional or prohibited for a specific PURL type definition.
Property | Type | Requirement | Description |
---|---|---|---|
requirement | Array | Required | States that the PURL namespace component is optional, required or prohibited for a PURL type. |
permitted_characters | String | Optional | A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification. |
case_sensitive | Boolean | Optional | true if this PURL component is case sensitive. If false, the canonical form must be lowercased. |
normalization_rules | Array | Optional | List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. |
native_name | String | Optional | The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type. |
note | String | Optional | Extra note text. |
States that the PURL namespace component is optional, required or prohibited for a PURL type.
States that this PURL component is optional for a PURL type.
States that this PURL component is required for a PURL type.
States that this PURL component is prohibited for a PURL type.
A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification.
true if this PURL component is case sensitive. If false, the canonical form must be lowercased.
List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. Each item of this array must be a string.
The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type.
Extra note text.
Definition of the name component for this PURL type. The PURL name component is required for all PURL type definitions.
Property | Type | Requirement | Description |
---|---|---|---|
requirement | Array | Required | States that the PURL name component is always required. |
permitted_characters | String | Optional | A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification. |
case_sensitive | Boolean | Optional | true if this PURL component is case sensitive. If false, the canonical form must be lowercased. |
normalization_rules | Array | Optional | List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. |
native_name | String | Optional | The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type. |
note | String | Optional | Extra note text. |
States that the PURL name component is always required.
States that this PURL component is required for a PURL type.
A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification.
true if this PURL component is case sensitive. If false, the canonical form must be lowercased.
List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. Each item of this array must be a string.
The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type.
Extra note text.
Definition of the version component for this PURL type. The PURL version component is optional for a specific PURL type definition.
Property | Type | Requirement | Description |
---|---|---|---|
requirement | Array | Required | States that the PURL version is optional. |
permitted_characters | String | Optional | A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification. |
case_sensitive | Boolean | Optional | true if this PURL component is case sensitive. If false, the canonical form must be lowercased. |
normalization_rules | Array | Optional | List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. |
native_name | String | Optional | The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type. |
note | String | Optional | Extra note text. |
States that the PURL version is optional.
States that this PURL component is optional for a PURL type.
A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification.
true if this PURL component is case sensitive. If false, the canonical form must be lowercased.
List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. Each item of this array must be a string.
The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type.
Extra note text.
Definition of the qualifiers specific to this PURL type. The PURL qualifiers component is optional for a specific PURL type, but a qualifiers key or keys may be required for a specific PURL type. Each item of this array must be a Qualifiers definition object.
The definition of a qualifier specific to this PURL type.
Property | Type | Requirement | Description |
---|---|---|---|
key | String | Required | The key for the qualifier. |
requirement | Array | Optional | States that a PURL qualifier key is optional or required for a PURL type. |
description | String | Required | The description of this qualifier. |
default_value | String | Optional | The optional default value of this qualifier if not provided. |
native_name | String | Optional | The equivalent native name for this qualifier key. |
The key for the qualifier.
States that a PURL qualifier key is optional or required for a PURL type.
States that this PURL component is optional for a PURL type.
States that this PURL component is required for a PURL type.
The description of this qualifier.
The optional default value of this qualifier if not provided.
The equivalent native name for this qualifier key.
The definition for the subpath for this PURL type. The PURL subpath component is optional for a specific PURL type definition.
Property | Type | Requirement | Description |
---|---|---|---|
requirement | Array | Required | States that the PURL subpath is optional. |
permitted_characters | String | Optional | A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification. |
case_sensitive | Boolean | Optional | true if this PURL component is case sensitive. If false, the canonical form must be lowercased. |
normalization_rules | Array | Optional | List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. |
native_name | String | Optional | The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type. |
note | String | Optional | Extra note text. |
States that the PURL subpath is optional.
States that this PURL component is optional for a PURL type.
A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification.
true if this PURL component is case sensitive. If false, the canonical form must be lowercased.
List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically. Each item of this array must be a string.
The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type.
Extra note text.
^pkg:[a-z][a-z0-9-\.]+/.*$
Example of valid, canonical PURLs for this package type. Each item of this array must be a string.
Note about this PURL type.
Optional list of informational reference URLs about this PURL type. Each item of this array must be a string.
This annex provides a copy of the current Package-URL Type Definition Schema. The format is JSON Schema version draft-07.
The schema shown below is available in electronic form at: https://github.com/package-url/purl-spec/blob/main/schemas/purl-type-definition.schema.json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://packageurl.org/schemas/purl-type-definition.schema-1.0.json",
"title": "Package-URL Type Definition",
"description": "Schema to specify a Package-URL (PURL) type as a structured definition.",
"type": "object",
"additionalProperties": false,
"definitions": {
"optional_requirement": {
"title": "Component optional requirement",
"description": "States that this PURL component is optional for a PURL type.",
"type": "string",
"const": "optional"
},
"required_requirement": {
"title": "Component required requirement",
"description": "States that this PURL component is required for a PURL type.",
"type": "string",
"const": "required"
},
"prohibited_requirement": {
"title": "Component prohibited requirement",
"description": "States that this PURL component is prohibited for a PURL type.",
"type": "string",
"const": "prohibited"
},
"purl_component_definition": {
"title": "PURL component definition",
"description": "PURL component definition properties that apply to most PURL components",
"type": "object",
"properties": {
"permitted_characters": {
"title": "Permitted characters in this PURL component",
"description": "A regular expression (ECMA-262 dialect) defining the 'Permitted characters' for this component of this Package-URL type. If provided, this must be a subset of the 'Permitted characters' defined in the PURL specification.",
"type": "string",
"format": "regex"
},
"case_sensitive": {
"title": "Case sensitive",
"description": "true if this PURL component is case sensitive. If false, the canonical form must be lowercased.",
"type": "boolean",
"default": true
},
"normalization_rules": {
"title": "Normalization rules",
"description": "List of rules to normalize this component for this PURL type. These are plain text, unstructured rules as some require programming and cannot be enforced only with a schema. Tools are expected to apply these rules programmatically.",
"type": "array",
"uniqueItems": true,
"items": {
"type": "string"
}
},
"native_name": {
"title": "Native name",
"description": "The native name of this PURL component in the package ecosystem. For instance, the 'namespace' for the 'maven' type is 'groupId', and 'scope' for the 'npm' PURL type.",
"type": "string"
},
"note": {
"title": "Note",
"description": "Extra note text.",
"type": "string"
}
}
}
},
"required": [
"$id",
"type",
"type_name",
"description",
"repository",
"namespace_definition",
"name_definition",
"examples"
],
"properties": {
"$schema": {
"title": "JSON schema",
"description": "Contains the URL of the JSON schema for Package-URL type definition.",
"const": "https://packageurl.org/schemas/purl-type-definition.schema-1.0.json",
"format": "uri"
},
"$id": {
"title": "PURL type definition id",
"description": "The unique identifier URI for this PURL type definition.",
"type": "string",
"pattern": "^https:\\/\\/packageurl\\.org/types/[a-z0-9-]+-definition\\.json$"
},
"type": {
"title": "PURL type",
"description": "The type string for this Package-URL type.",
"type": "string",
"pattern": "^[a-z][a-z0-9-\\.]+$",
"examples": [
"maven",
"npm",
"pypi"
]
},
"type_name": {
"title": "Type name",
"description": "The name for this PURL type.",
"type": "string",
"examples": [
"Apache Maven",
"Python Package"
]
},
"description": {
"title": "Description",
"description": "The description of this PURL type.",
"type": "string"
},
"repository": {
"title": "Repository",
"description": "The package repository usage for this PURL type.",
"type": "object",
"additionalProperties": false,
"required": [
"use_repository"
],
"properties": {
"use_repository": {
"title": "Use repository",
"description": "true if this PURL type uses a public package repository.",
"type": "boolean",
"default": false
},
"default_repository_url": {
"title": "Default repository URL",
"description": "The default public repository URL for this PURL type",
"type": "string",
"format": "uri"
},
"note": {
"title": "Note",
"description": "Extra note text.",
"type": "string"
}
}
},
"namespace_definition": {
"title": "Namespace definition",
"description": "Definition of the namespace component for this PURL type. The PURL namespace component must be required, optional or prohibited for a specific PURL type definition.",
"type": "object",
"required": [
"requirement"
],
"properties": {
"requirement": {
"title": "Namespace requirement",
"description": "States that the PURL namespace component is optional, required or prohibited for a PURL type.",
"type": "string",
"oneOf": [
{
"$ref": "#/definitions/optional_requirement"
},
{
"$ref": "#/definitions/required_requirement"
},
{
"$ref": "#/definitions/prohibited_requirement"
}
]
}
},
"allOf": [
{
"$ref": "#/definitions/purl_component_definition"
}
]
},
"name_definition": {
"title": "Name definition",
"description": "Definition of the name component for this PURL type. The PURL name component is required for all PURL type definitions.",
"type": "object",
"required": [
"requirement"
],
"properties": {
"requirement": {
"title": "Name component requirement",
"description": "States that the PURL name component is always required.",
"type": "string",
"oneOf": [
{
"$ref": "#/definitions/required_requirement"
}
]
}
},
"allOf": [
{
"$ref": "#/definitions/purl_component_definition"
}
]
},
"version_definition": {
"title": "Version definition",
"description": "Definition of the version component for this PURL type. The PURL version component is optional for a specific PURL type definition.",
"type": "object",
"required": [
"requirement"
],
"properties": {
"requirement": {
"title": "Version requirement",
"description": "States that the PURL version is optional.",
"type": "string",
"oneOf": [
{
"$ref": "#/definitions/optional_requirement"
}
]
}
},
"allOf": [
{
"$ref": "#/definitions/purl_component_definition"
}
]
},
"qualifiers_definition": {
"title": "Qualifiers definition",
"description": "Definition of the qualifiers specific to this PURL type. The PURL qualifiers component is optional for a specific PURL type, but a qualifiers key or keys may be required for a specific PURL type.",
"type": "array",
"additionalItems": false,
"uniqueItems": true,
"items": {
"title": "Qualifiers definition",
"description": "The definition of a qualifier specific to this PURL type.",
"type": "object",
"additionalProperties": false,
"required": [
"key",
"description"
],
"properties": {
"key": {
"title": "Qualifier key",
"description": "The key for the qualifier.",
"type": "string"
},
"requirement": {
"title": "Qualifier key requirement",
"description": "States that a PURL qualifier key is optional or required for a PURL type.",
"type": "string",
"oneOf": [
{
"$ref": "#/definitions/optional_requirement"
},
{
"$ref": "#/definitions/required_requirement"
}
]
},
"description": {
"title": "Description",
"description": "The description of this qualifier.",
"type": "string"
},
"default_value": {
"title": "Default value",
"description": "The optional default value of this qualifier if not provided.",
"type": "string"
},
"native_name": {
"title": "Native name",
"description": "The equivalent native name for this qualifier key.",
"type": "string"
}
}
}
},
"subpath_definition": {
"title": "Subpath definition",
"description": "The definition for the subpath for this PURL type. The PURL subpath component is optional for a specific PURL type definition.",
"type": "object",
"required": [
"requirement"
],
"properties": {
"requirement": {
"title": "Subpath requirement",
"description": "States that the PURL subpath is optional.",
"type": "string",
"oneOf": [
{
"$ref": "#/definitions/optional_requirement"
}
]
}
},
"allOf": [
{
"$ref": "#/definitions/purl_component_definition"
}
]
},
"examples": {
"title": "PURL examples",
"description": "Example of valid, canonical PURLs for this package type.",
"type": "array",
"uniqueItems": true,
"minItems": 1,
"items": {
"type": "string",
"pattern": "^pkg:[a-z][a-z0-9-\\.]+/.*$"
}
},
"note": {
"title": "Note",
"description": "Note about this PURL type.",
"type": "string"
},
"reference_urls": {
"title": "Reference URLs",
"description": "Optional list of informational reference URLs about this PURL type.",
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"format": "uri"
}
}
}
}
This specification is authored on GitHub in a plaintext source format called Ecmarkup. Ecmarkup is an HTML and Markdown dialect that provides a framework and toolset for authoring ECMA specifications in plaintext and processing the specification into a full-featured HTML rendering that follows the editorial conventions for this document. Ecmarkup builds on and integrates a number of other formats and technologies including Grammarkdown for defining syntax and Ecmarkdown for authoring algorithm steps. PDF renderings of this specification are produced using a print stylesheet which takes advantage of the CSS Paged Media specification and is converted using PrinceXML.
We extend our gratitude to TC39 for their exceptional work in developing Ecmarkup, which has greatly facilitated TC54's successful adoption of this tool for the preparation and maintenance of our technical specifications.
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
COPYRIGHT NOTICE
© 2025 Ecma International
By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
This document may be copied, published and distributed to others, and certain derivative works of it may be prepared, copied, published, and distributed, in whole or in part, provided that the above copyright notice and this Copyright License and Disclaimer are included on all such copies and derivative works. The only derivative works that are permissible under this Copyright License and Disclaimer are:
(i) works which incorporate all or portion of this document for the purpose of providing commentary or explanation (such as an annotated version of the document),
(ii) works which incorporate all or portion of this document for the purpose of incorporating features that provide accessibility,
(iii) translations of this document into languages other than English and into different formats and
(iv) works by making use of this specification in standard conformant products by implementing (e.g. by copy and paste wholly or partly) the functionality therein.
However, the content of this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as required to translate it into languages other than English or into a different format.
The official version of an Ecma International document is the English language version on the Ecma International website. In the event of discrepancies between a translated version and the official version, the official version shall govern.
The limited permissions granted above are perpetual and will not be revoked by Ecma International or its successors or assigns.
This document and the information contained herein is provided on an “AS IS” basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.