Product Copyright Statements v4
Sub-resource of products holding the rights a product asserts — who holds a right in the work, and from which year. Each entry is one line of the form "© 2002 Zeilenquarz Verlagsgruppe GmbH": a right, a year and the party holding it.
A product carries one entry per right it needs to assert. Text or image copyright is the © line and is present on almost every product. A sound recording additionally carries the neighbouring right, the ℗ line, because the recording is protected independently of the text being read. Compilations such as reference works and bibliographies may also assert the sui generis database right.
An entry is a record in its own right. It is neither derived from nor kept in step with the product's imprint, so the two may name different legal entities.
Endpoints
GET /resource/v4/products/{productId}/copyright_statements
List product copyright statements
Description
Returns every copyright statement of the given product, paginated. Most products have
exactly one entry (type: copyright); audiobooks typically have two.
This endpoint neither filters nor sorts. Any query parameter other than the
pagination ones is accepted and then silently ignored — ?type=phonogram_right returns
the product's copyright statement just the same, with no error to signal that the
filter did nothing. ?sort= is ignored as well, and no ordering is imposed on the
result, so the sequence of items cannot be relied on. With so few entries per product,
the whole list can be read and selected client-side on type.
Pagination itself works as described in Resource Queries: display
(or page_size) and page, with _pagination reporting page, page_size and
total.
Input parameters
Path parameters
| Parameter | Type | Default | Nullable | Description |
|---|---|---|---|---|
productId |
string | No | UUID of the product. The product's v3 integer id is also accepted. A product in another realm returns 403. |
Responses
{
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements?page_size=100",
"first": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements?page=1&page_size=100",
"last": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements?page=1&page_size=100",
"next": null,
"prev": null
},
"_pagination": {
"page": 1,
"page_size": 100,
"total": 2
},
"items": [
{
"_id": "b39aa2e2-eff9-11f0-8321-00505699575c",
"_legacy_id": 15058,
"_version": "4.0",
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c"
},
"type": "copyright",
"year": "2002",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
},
{
"_id": "b3649789-eff9-11f0-8321-00505699575c",
"_legacy_id": 6140,
"_version": "4.0",
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements/b3649789-eff9-11f0-8321-00505699575c"
},
"type": "phonogram_right",
"year": "2024",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
]
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"properties": {
"_links": {
"type": "object"
},
"_pagination": {
"type": "object"
},
"items": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
}
},
"required": [
"_links",
"_pagination",
"items"
]
}
POST /resource/v4/products/{productId}/copyright_statements
Create a new copyright statement
Description
Adds one copyright statement to the product. Send type, year and owner.
Omitted fields fall back to their defaults rather than being rejected up front: type
defaults to copyright, while year and owner default to empty and are then refused
by validation, since year must be exactly four digits in the range 1700–2099 and
owner must be a non-empty string of at most 255 characters. Both checks are enforced on
this path, so a bad value comes back as an error rather than being accepted.
Nothing checks for duplicates. Posting the same statement twice gives the product two
identical entries, and posting two copyright statements with different years gives it
two contradictory © lines, both of which it then asserts. Fetching the list first and
using PUT where a statement of that type already exists avoids both.
The example creates the ℗ line for the audiobook edition of a novel whose text copyright, added separately, dates from 2002.
Input parameters
Path parameters
| Parameter | Type | Default | Nullable | Description |
|---|---|---|---|---|
productId |
string | No | UUID of the product. The product's v3 integer id is also accepted. |
Request body
{
"type": "phonogram_right",
"year": "2024",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
Schema of the request body
{
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
Responses
{
"_id": "b3649789-eff9-11f0-8321-00505699575c",
"_legacy_id": 6140,
"_version": "4.0",
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements/b3649789-eff9-11f0-8321-00505699575c"
},
"type": "phonogram_right",
"year": "2024",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
{
"errors": [
{
"_id": "string",
"stack_trace": [
"string"
],
"message": "string",
"vars": {}
}
]
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"description": "List of errors occurred",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"_id",
"message",
"stack_trace",
"vars"
],
"properties": {
"_id": {
"type": "string",
"description": "The identifier of the error"
},
"stack_trace": {
"type": "array",
"description": "A stacktrace of the error occurred. Only for testing systems.",
"items": {
"type": "string"
}
},
"message": {
"type": "string",
"description": "A translated message of the error"
},
"vars": {
"type": "object",
"description": "A dict containing additional values of the context of the error."
}
}
}
}
}
}
GET /resource/v4/products/{productId}/copyright_statements/{copyright_statementId}
Get details of a single copyright statement
Description
Returns one copyright statement. Both the statement's UUID and its _legacy_id work in
the path.
The statement must belong to the product named in the path. Asking for a statement that exists but hangs off a different product returns 403, not 404 — a 404 means no statement with that id exists at all.
Input parameters
Path parameters
| Parameter | Type | Default | Nullable | Description |
|---|---|---|---|---|
copyright_statementId |
string | No | UUID of the copyright statement, or its `_legacy_id` integer. | |
productId |
string | No | UUID of the product. The product's v3 integer id is also accepted. |
Responses
{
"_id": "b39aa2e2-eff9-11f0-8321-00505699575c",
"_legacy_id": 15058,
"_version": "4.0",
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c"
},
"type": "copyright",
"year": "2002",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
{
"errors": [
{
"_id": "string",
"stack_trace": [
"string"
],
"message": "string",
"vars": {}
}
]
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"description": "List of errors occurred",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"_id",
"message",
"stack_trace",
"vars"
],
"properties": {
"_id": {
"type": "string",
"description": "The identifier of the error"
},
"stack_trace": {
"type": "array",
"description": "A stacktrace of the error occurred. Only for testing systems.",
"items": {
"type": "string"
}
},
"message": {
"type": "string",
"description": "A translated message of the error"
},
"vars": {
"type": "object",
"description": "A dict containing additional values of the context of the error."
}
}
}
}
}
}
PUT /resource/v4/products/{productId}/copyright_statements/{copyright_statementId}
Update a single copyright statement
Description
Updates one copyright statement. Despite being a PUT, this is a partial update:
only the fields present in the body are applied and every omitted field keeps its
current value. Sending {} therefore changes nothing, and a field cannot be cleared by
leaving it out — nor can it be cleared at all, since an empty year or owner fails
validation.
Validation is the same as on create: year must be four digits in 1700–2099, owner
must be a non-empty string of at most 255 characters, and type must be one of the three
Codelist 219 slugs.
The example corrects only the owner, after the publishing house was renamed. type and
year are not sent and stay as they are; the response returns the complete merged
record.
Input parameters
Path parameters
| Parameter | Type | Default | Nullable | Description |
|---|---|---|---|---|
copyright_statementId |
string | No | UUID of the copyright statement, or its `_legacy_id` integer. | |
productId |
string | No | UUID of the product. The product's v3 integer id is also accepted. |
Request body
{
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
Schema of the request body
{
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
Responses
{
"_id": "b39aa2e2-eff9-11f0-8321-00505699575c",
"_legacy_id": 15058,
"_version": "4.0",
"_links": {
"self": "https://api.openpublishing.com/resource/v4/products/a6fc09af-e616-11ee-a221-00505699575c/copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c"
},
"type": "copyright",
"year": "2002",
"owner": "Zeilenquarz Verlagsgruppe GmbH"
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"description": "One right a product asserts — which right (`type`), from which year (`year`), and by whom (`owner`).",
"properties": {
"_links": {
"type": "object",
"description": "Contains a single `self` key with the canonical URL of this statement, under its parent\nproduct.\n"
},
"_id": {
"type": "string",
"example": "b39aa2e2-eff9-11f0-8321-00505699575c",
"nullable": true,
"description": "UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to\nkeep on the client side; v3 returned the integer id here and the UUID in `_uuid`.\n"
},
"_legacy_id": {
"type": "integer",
"description": "Legacy integer identifier of this resource, kept so existing integrations can correlate\ntheir own records. This is the value the v3 endpoint returns as `_id`. Both forms are\naccepted in the URL path, so `.../copyright_statements/15058` and\n`.../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c` address the same record.\n",
"example": 15058
},
"_version": {
"type": "string",
"description": "API Version",
"example": "4.0"
},
"owner": {
"type": "string",
"description": "Name of the rights holder, exactly as it should be printed in the © line. Accepts and\nreturns free text of 1–255 characters; an empty value is rejected.\n\nThe field is deliberately unstructured: one owner per statement, written as a single\nstring, with no separate parts for a personal and a corporate name and no identifier or\nrole alongside it. A natural person and a legal entity are both written here the same\nway.\n\nThere is no link to an imprint, a publisher record or a business partner, so nothing\nkeeps `owner` in step with the product's `imprint`. The two are usually the same legal\nentity, but each has to be maintained separately.\n",
"example": "Zeilenquarz Verlagsgruppe GmbH"
},
"year": {
"type": "string",
"description": "The year from which the right runs, as a four-digit string — `\"2002\"`, not `2002` and not\n`\"02\"`. Values outside 1700–2099 and anything that is not exactly four digits are\nrejected.\n\nOlder records may still be returned with an empty string, so a reader should allow for\nthat even though an empty value can no longer be written.\n",
"example": "2002"
},
"type": {
"type": "string",
"example": "copyright",
"description": "Which right this statement asserts. Maps one-to-one onto ONIX\n[Codelist 219](https://ns.editeur.org/onix/en/219) (*Rights type*), using lowercase\nslugs instead of the ONIX single-letter codes:\n\n- `copyright` → ONIX `C` — text or image copyright, the © line. This is the default\n when `type` is omitted on create.\n- `phonogram_right` → ONIX `P` — phonogram right (the neighbouring right in a sound\n recording), the ℗ line. Relevant for audiobooks, where the recording is protected\n separately from the text it is read from.\n- `database_right` → ONIX `D` — sui generis database right.\n\nThese three are the whole of Codelist 219, so nothing is left out; any other value is\nrejected. Input is matched case-insensitively (`Copyright` is accepted), but the API\nalways returns the lowercase slug.\n\nNothing enforces uniqueness: a product may hold two statements of the same `type`, for\ninstance with different years. Only one is meaningful per right.\n",
"x-enum-descriptions": {
"copyright": "Text or image copyright — the © line. ONIX Codelist 219 code `C`, and the default when `type` is omitted.",
"phonogram_right": "Phonogram right, i.e. the neighbouring right in a sound recording — the ℗ line. ONIX Codelist 219 code `P`. Used for audiobooks alongside a `copyright` statement for the underlying text.",
"database_right": "Sui generis database right. ONIX Codelist 219 code `D`."
}
}
},
"required": [
"type",
"year",
"owner"
]
}
{
"errors": [
{
"_id": "string",
"stack_trace": [
"string"
],
"message": "string",
"vars": {}
}
]
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"description": "List of errors occurred",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"_id",
"message",
"stack_trace",
"vars"
],
"properties": {
"_id": {
"type": "string",
"description": "The identifier of the error"
},
"stack_trace": {
"type": "array",
"description": "A stacktrace of the error occurred. Only for testing systems.",
"items": {
"type": "string"
}
},
"message": {
"type": "string",
"description": "A translated message of the error"
},
"vars": {
"type": "object",
"description": "A dict containing additional values of the context of the error."
}
}
}
}
}
}
DELETE /resource/v4/products/{productId}/copyright_statements/{copyright_statementId}
Delete a copyright statement
Description
Removes the statement. There is no default to fall back on: a product whose
copyright statement has been deleted asserts no © line at all. Deletion is therefore
the way to correct a wrong right type, not a way to blank out an uncertain © line — and
it is permanent, since year and owner cannot be set to empty by any other means.
Input parameters
Path parameters
| Parameter | Type | Default | Nullable | Description |
|---|---|---|---|---|
copyright_statementId |
string | No | UUID of the copyright statement, or its `_legacy_id` integer. | |
productId |
string | No | UUID of the product. The product's v3 integer id is also accepted. |
Responses
{
"errors": [
{
"_id": "string",
"stack_trace": [
"string"
],
"message": "string",
"vars": {}
}
]
}
Schema of the response body
{
"type": "object",
"additionalProperties": false,
"required": [
"errors"
],
"properties": {
"errors": {
"type": "array",
"description": "List of errors occurred",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"_id",
"message",
"stack_trace",
"vars"
],
"properties": {
"_id": {
"type": "string",
"description": "The identifier of the error"
},
"stack_trace": {
"type": "array",
"description": "A stacktrace of the error occurred. Only for testing systems.",
"items": {
"type": "string"
}
},
"message": {
"type": "string",
"description": "A translated message of the error"
},
"vars": {
"type": "object",
"description": "A dict containing additional values of the context of the error."
}
}
}
}
}
}
Schemas
Product Copyright Statement
| Name | Type | Description | Example |
|---|---|---|---|
_id |
string| null |
UUID of the copyright statement. In v4 this is the identifier used in URLs and the one to
keep on the client side; v3 returned the integer id here and the UUID in |
b39aa2e2-eff9-11f0-8321-00505699575c |
_legacy_id |
integer |
Legacy integer identifier of this resource, kept so existing integrations can correlate
their own records. This is the value the v3 endpoint returns as |
15058 |
_links |
object |
Contains a single |
|
_version |
string |
API Version |
4.0 |
owner |
string |
Name of the rights holder, exactly as it should be printed in the © line. Accepts and returns free text of 1–255 characters; an empty value is rejected. The field is deliberately unstructured: one owner per statement, written as a single string, with no separate parts for a personal and a corporate name and no identifier or role alongside it. A natural person and a legal entity are both written here the same way. There is no link to an imprint, a publisher record or a business partner, so nothing
keeps |
Zeilenquarz Verlagsgruppe GmbH |
type |
string |
Which right this statement asserts. Maps one-to-one onto ONIX Codelist 219 (Rights type), using lowercase slugs instead of the ONIX single-letter codes:
These three are the whole of Codelist 219, so nothing is left out; any other value is
rejected. Input is matched case-insensitively ( Nothing enforces uniqueness: a product may hold two statements of the same |
copyright |
year |
string |
The year from which the right runs, as a four-digit string — Older records may still be returned with an empty string, so a reader should allow for that even though an empty value can no longer be written. |
2002 |