Skip to content

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": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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

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 _uuid.

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 _id. Both forms are accepted in the URL path, so .../copyright_statements/15058 and .../copyright_statements/b39aa2e2-eff9-11f0-8321-00505699575c address the same record.

15058
_links object

Contains a single self key with the canonical URL of this statement, under its parent product.

_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 owner in step with the product's imprint. The two are usually the same legal entity, but each has to be maintained separately.

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:

  • copyright → ONIX C — text or image copyright, the © line. This is the default when type is omitted on create.
  • phonogram_right → ONIX P — phonogram right (the neighbouring right in a sound recording), the ℗ line. Relevant for audiobooks, where the recording is protected separately from the text it is read from.
  • database_right → ONIX D — sui generis database right.

These three are the whole of Codelist 219, so nothing is left out; any other value is rejected. Input is matched case-insensitively (Copyright is accepted), but the API always returns the lowercase slug.

Nothing enforces uniqueness: a product may hold two statements of the same type, for instance with different years. Only one is meaningful per right.

copyright
year string

The year from which the right runs, as a four-digit string — "2002", not 2002 and not "02". Values outside 1700–2099 and anything that is not exactly four digits are rejected.

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