Skip to content

Product Titles v4

Sub-resource of products holding the additional titles of a product. A product's main title and subtitle live on the product resource itself (title, subtitle); this sub-resource covers everything beyond them — the abbreviated title, the title in the original language of a translation, a former title, a title one distribution channel needs in a different form.

Each record is one element of one title variant. type names the variant and is mapped onto ONIX Codelist 15 in the read-only type_onix; element_type names the part of that variant the record holds — title, subtitle, sorting prefix — mirroring the children of the ONIX 3 <TitleElement> composite. A variant that has a subtitle is therefore held as two records sharing the same type.


Endpoints


GET /resource/v4/products/{product_id}/titles

Retrieve titles for a product

Description

Returns all title records for the given product, paginated. Every product has at least the platform-maintained storefront-product-title record.

type is the only field this endpoint can filter on; any other query field is rejected with 400 Bad Request. It combines with the operators described in Resource Queries — for example ?type=abbreviated-title, or ?type__ne=storefront-product-title to omit the platform-managed record.

Input parameters

Path parameters

Parameter Type Default Nullable Description
product_id string No UUID of the product.

Query parameters

Parameter Type Default Nullable Description
type string No Filter by title variant, e.g. `abbreviated-title`, `title-in-other-language`, `storefront-product-title`. The only filterable field on this sub-resource.

Responses

{
    "_links": {},
    "_pagination": {},
    "items": [
        {
            "_id": "0befd1b9-cdea-447e-8306-3df8af0419f2",
            "_version": "4.0",
            "_legacy_id": 13442,
            "_links": {},
            "title": "Handelsnetze und Zunftordnungen in den Hansestädten des ...",
            "channels": [],
            "element_type": "title",
            "language": "ger",
            "type": "storefront-product-title",
            "type_onix": null
        }
    ]
}
⚠️ 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,
    "properties": {
        "_links": {
            "type": "object"
        },
        "_pagination": {
            "type": "object"
        },
        "items": {
            "type": "array",
            "items": {
                "type": "object",
                "additionalProperties": false,
                "description": "One title element of one additional title variant of a product.",
                "properties": {
                    "_id": {
                        "type": "string",
                        "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
                        "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
                    },
                    "_version": {
                        "type": "string",
                        "description": "API version that produced this representation.",
                        "example": "4.0"
                    },
                    "_legacy_id": {
                        "type": "integer",
                        "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
                        "example": 13442
                    },
                    "_links": {
                        "type": "object",
                        "description": "Contains `self`, the canonical URL of this title record."
                    },
                    "title": {
                        "type": "string",
                        "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
                        "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
                    },
                    "channels": {
                        "type": "array",
                        "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
                        "items": {
                            "type": "string"
                        },
                        "example": []
                    },
                    "element_type": {
                        "type": "string",
                        "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
                        "example": "title",
                        "x-enum-descriptions": {
                            "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                            "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                            "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                            "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
                        }
                    },
                    "language": {
                        "type": "string",
                        "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
                        "nullable": true,
                        "example": "ger"
                    },
                    "type": {
                        "type": "string",
                        "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
                        "example": "storefront-product-title",
                        "x-enum-descriptions": {
                            "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                            "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                            "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                            "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                            "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                            "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                            "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                            "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                            "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                            "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                            "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                            "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                            "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                            "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
                        }
                    },
                    "type_onix": {
                        "type": "string",
                        "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
                        "nullable": true,
                        "example": null
                    }
                },
                "required": []
            }
        }
    },
    "required": [
        "_links",
        "_pagination",
        "items"
    ]
}

POST /resource/v4/products/{product_id}/titles

Create a new product title

Description

Creates one title element. A title variant that has a subtitle needs two requests with the same type, one with element_type of title and one of subtitle.

Omitted fields take their defaults: type becomes distinctive-title, element_type becomes title, language stays null and channels stays empty. type_onix is ignored if sent — it is always recomputed from type.

Input parameters

Path parameters

Parameter Type Default Nullable Description
product_id string No UUID of the product.

Request body

{
    "type": "abbreviated-title",
    "element_type": "title",
    "title": "Quantum Mosaic",
    "language": "eng",
    "channels": []
}
Schema of the request body
{
    "type": "object",
    "additionalProperties": false,
    "description": "One title element of one additional title variant of a product.",
    "properties": {
        "_id": {
            "type": "string",
            "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
            "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
        },
        "_version": {
            "type": "string",
            "description": "API version that produced this representation.",
            "example": "4.0"
        },
        "_legacy_id": {
            "type": "integer",
            "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
            "example": 13442
        },
        "_links": {
            "type": "object",
            "description": "Contains `self`, the canonical URL of this title record."
        },
        "title": {
            "type": "string",
            "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
            "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
        },
        "channels": {
            "type": "array",
            "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
            "items": {
                "type": "string"
            },
            "example": []
        },
        "element_type": {
            "type": "string",
            "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
            "example": "title",
            "x-enum-descriptions": {
                "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
            }
        },
        "language": {
            "type": "string",
            "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
            "nullable": true,
            "example": "ger"
        },
        "type": {
            "type": "string",
            "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
            "example": "storefront-product-title",
            "x-enum-descriptions": {
                "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
            }
        },
        "type_onix": {
            "type": "string",
            "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
            "nullable": true,
            "example": null
        }
    },
    "required": []
}

Responses

{
    "_id": "4c17e0d6-1f5a-4a83-9e42-b7c0d51a8e39",
    "_legacy_id": 13443,
    "_version": "4.0",
    "_links": {
        "self": "https://api.openpublishing.com/resource/v4/products/3f8c1a52-9b7d-4e16-8a0c-2d5f7e91b4c3/titles/4c17e0d6-1f5a-4a83-9e42-b7c0d51a8e39"
    },
    "type": "abbreviated-title",
    "type_onix": "05",
    "element_type": "title",
    "title": "Quantum Mosaic",
    "language": "eng",
    "channels": []
}
Schema of the response body
{
    "type": "object",
    "additionalProperties": false,
    "description": "One title element of one additional title variant of a product.",
    "properties": {
        "_id": {
            "type": "string",
            "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
            "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
        },
        "_version": {
            "type": "string",
            "description": "API version that produced this representation.",
            "example": "4.0"
        },
        "_legacy_id": {
            "type": "integer",
            "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
            "example": 13442
        },
        "_links": {
            "type": "object",
            "description": "Contains `self`, the canonical URL of this title record."
        },
        "title": {
            "type": "string",
            "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
            "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
        },
        "channels": {
            "type": "array",
            "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
            "items": {
                "type": "string"
            },
            "example": []
        },
        "element_type": {
            "type": "string",
            "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
            "example": "title",
            "x-enum-descriptions": {
                "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
            }
        },
        "language": {
            "type": "string",
            "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
            "nullable": true,
            "example": "ger"
        },
        "type": {
            "type": "string",
            "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
            "example": "storefront-product-title",
            "x-enum-descriptions": {
                "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
            }
        },
        "type_onix": {
            "type": "string",
            "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
            "nullable": true,
            "example": null
        }
    },
    "required": []
}

{
    "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/{product_id}/titles/{id}

Retrieve a single product title

Description

Returns one title record by id. The example is the platform-maintained storefront-product-title record that every product carries: the product title truncated at a word boundary to at most 59 characters including a trailing .... type_onix is null because storefront-product-title has no Codelist 15 equivalent.

Input parameters

Path parameters

Parameter Type Default Nullable Description
id string No UUID of the title record, as returned in `_id`.
product_id string No UUID of the product.

Responses

{
    "_id": "0befd1b9-cdea-447e-8306-3df8af0419f2",
    "_legacy_id": 13442,
    "_version": "4.0",
    "_links": {
        "self": "https://api.openpublishing.com/resource/v4/products/3f8c1a52-9b7d-4e16-8a0c-2d5f7e91b4c3/titles/0befd1b9-cdea-447e-8306-3df8af0419f2"
    },
    "title": "Handelsnetze und Zunftordnungen in den Hansestädten des ...",
    "type": "storefront-product-title",
    "type_onix": null,
    "element_type": "title",
    "language": null,
    "channels": []
}
Schema of the response body
{
    "type": "object",
    "additionalProperties": false,
    "description": "One title element of one additional title variant of a product.",
    "properties": {
        "_id": {
            "type": "string",
            "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
            "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
        },
        "_version": {
            "type": "string",
            "description": "API version that produced this representation.",
            "example": "4.0"
        },
        "_legacy_id": {
            "type": "integer",
            "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
            "example": 13442
        },
        "_links": {
            "type": "object",
            "description": "Contains `self`, the canonical URL of this title record."
        },
        "title": {
            "type": "string",
            "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
            "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
        },
        "channels": {
            "type": "array",
            "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
            "items": {
                "type": "string"
            },
            "example": []
        },
        "element_type": {
            "type": "string",
            "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
            "example": "title",
            "x-enum-descriptions": {
                "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
            }
        },
        "language": {
            "type": "string",
            "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
            "nullable": true,
            "example": "ger"
        },
        "type": {
            "type": "string",
            "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
            "example": "storefront-product-title",
            "x-enum-descriptions": {
                "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
            }
        },
        "type_onix": {
            "type": "string",
            "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
            "nullable": true,
            "example": null
        }
    },
    "required": []
}

{
    "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/{product_id}/titles/{id}

Update product title

Description

Only the fields present in the request body are changed; omitted fields keep their current values. type_onix cannot be set — it is recomputed from type on every write, so changing type is what changes the ONIX code.

Updating the platform-maintained storefront-product-title record has no lasting effect; the next save of the product regenerates it from the product title.

The example corrects the text of the abbreviated title created above, sending title alone. The response returns the complete merged record.

Input parameters

Path parameters

Parameter Type Default Nullable Description
id string No UUID of the title record, as returned in `_id`.
product_id string No UUID of the product.

Request body

{
    "title": "Quantum Mosaic (abridged)"
}
Schema of the request body
{
    "type": "object",
    "additionalProperties": false,
    "description": "One title element of one additional title variant of a product.",
    "properties": {
        "_id": {
            "type": "string",
            "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
            "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
        },
        "_version": {
            "type": "string",
            "description": "API version that produced this representation.",
            "example": "4.0"
        },
        "_legacy_id": {
            "type": "integer",
            "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
            "example": 13442
        },
        "_links": {
            "type": "object",
            "description": "Contains `self`, the canonical URL of this title record."
        },
        "title": {
            "type": "string",
            "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
            "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
        },
        "channels": {
            "type": "array",
            "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
            "items": {
                "type": "string"
            },
            "example": []
        },
        "element_type": {
            "type": "string",
            "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
            "example": "title",
            "x-enum-descriptions": {
                "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
            }
        },
        "language": {
            "type": "string",
            "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
            "nullable": true,
            "example": "ger"
        },
        "type": {
            "type": "string",
            "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
            "example": "storefront-product-title",
            "x-enum-descriptions": {
                "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
            }
        },
        "type_onix": {
            "type": "string",
            "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
            "nullable": true,
            "example": null
        }
    },
    "required": []
}

Responses

{
    "_id": "4c17e0d6-1f5a-4a83-9e42-b7c0d51a8e39",
    "_legacy_id": 13443,
    "_version": "4.0",
    "_links": {
        "self": "https://api.openpublishing.com/resource/v4/products/3f8c1a52-9b7d-4e16-8a0c-2d5f7e91b4c3/titles/4c17e0d6-1f5a-4a83-9e42-b7c0d51a8e39"
    },
    "type": "abbreviated-title",
    "type_onix": "05",
    "element_type": "title",
    "title": "Quantum Mosaic (abridged)",
    "language": "eng",
    "channels": []
}
Schema of the response body
{
    "type": "object",
    "additionalProperties": false,
    "description": "One title element of one additional title variant of a product.",
    "properties": {
        "_id": {
            "type": "string",
            "description": "UUID of this title record. Used in the sub-resource path to read, update or delete the record.",
            "example": "0befd1b9-cdea-447e-8306-3df8af0419f2"
        },
        "_version": {
            "type": "string",
            "description": "API version that produced this representation.",
            "example": "4.0"
        },
        "_legacy_id": {
            "type": "integer",
            "description": "Legacy integer identifier of this resource — the `_id` the v3 API returns for the same record. Kept so existing integrations can correlate their own records.",
            "example": 13442
        },
        "_links": {
            "type": "object",
            "description": "Contains `self`, the canonical URL of this title record."
        },
        "title": {
            "type": "string",
            "description": "The text of this title element. What it contains depends on `element_type`: the whole\ntitle, just the subtitle, just the leading article, or the title with the leading\narticle removed.\n\nNot validated on write — an empty string is accepted, and no length limit is enforced.\nA string is required: an explicit `null` is rejected with `400 Bad Request`.\n",
            "example": "Handelsnetze und Zunftordnungen in den Hansestädten des ..."
        },
        "channels": {
            "type": "array",
            "description": "Distribution channels this title is meant for, as channel identifiers. An empty list —\nthe normal case — means the title is not channel-specific. A populated list scopes the\nrecord to the channels named, which is what one retailer needing the title in a\ndifferent form from everybody else requires.\n\nValues are the platform's distribution-channel slugs, for example:\n\n- `google`\n- `amazon`\n- `libri`\n- `kobo`\n- `spotify`\n- `divibib`\n- `overdrive`\n\nThey are not validated against that list — any string of lowercase letters and hyphens\nis accepted, so a typo is taken silently. Each entry must consist of lowercase letters\nand hyphens only; anything else is rejected with `400 Bad Request`. That is stricter\nthan the platform's own channel list, so slugs containing digits or underscores\n(`24symbols`, `manual_sale`, `zeitfracht_sa02e`) cannot be used here.\n\nThe list is lower-cased, de-duplicated and sorted alphabetically on write, so the order\nin a response need not match the order sent. On update it is replaced wholesale, never\nmerged.\n",
            "items": {
                "type": "string"
            },
            "example": []
        },
        "element_type": {
            "type": "string",
            "description": "Which part of the title variant this record holds. Anything other than these four\nvalues is rejected with `400 Bad Request`; they correspond one-to-one to the children\nof the ONIX 3 `<TitleElement>` composite:\n\n- `title` — the title text itself (ONIX `<TitleText>`, b203). The default.\n- `subtitle` — the subtitle belonging to the same title variant (ONIX `<Subtitle>`,\n  b029), held as a second record with the same `type`.\n- `title-prefix` — the leading article or other prefix that should be ignored when\n  sorting (ONIX `<TitlePrefix>`, b030).\n- `title-without-prefix` — the title with that sorting prefix removed (ONIX\n  `<TitleWithoutPrefix>`, b031).\n\nA title variant with a subtitle is therefore two records sharing one `type`, differing\nonly in this field:\n\n- `type: \"abbreviated-title\"`, `element_type: \"title\"`, `title: \"Quantum Mosaic\"`\n- `type: \"abbreviated-title\"`, `element_type: \"subtitle\"`,\n  `title: \"Unraveling the Universe's Smallest Mysteries\"`\n\n`title-prefix` and `title-without-prefix` exist so that a title files and sorts\ncorrectly: *\"The Frankfurt Manuscript\"* files under **F**, not **T**. A variant either\ncarries the whole title in a single `title` record, or the split pair. The two parts are\nmeant to be joined without a separator, so by convention the prefix carries its own\ntrailing space (`\"The \"`, not `\"The\"`); this is a convention, not something the API\nenforces.\n\nThe value is lower-cased before validation, so `\"Title\"` is accepted and comes back as\n`title`. ONIX's title element level\n([Codelist 149](https://ns.editeur.org/onix/en/149)) has no counterpart in this\nsub-resource: these records are always product-level, Codelist 149 code `01`.\n",
            "example": "title",
            "x-enum-descriptions": {
                "title": "The title text itself (ONIX `<TitleText>`, b203). The default.",
                "subtitle": "The subtitle belonging to the same title variant (ONIX `<Subtitle>`, b029). Held as a second record with the same `type`.",
                "title-prefix": "The leading article or other prefix that should be ignored when sorting (ONIX `<TitlePrefix>`, b030), e.g. `\"The \"`, including the trailing space.",
                "title-without-prefix": "The title with the sorting prefix removed (ONIX `<TitleWithoutPrefix>`, b031), e.g. `\"Frankfurt Manuscript\"`."
            }
        },
        "language": {
            "type": "string",
            "description": "Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common\nvalues:\n\n- `ger` — German\n- `eng` — English\n- `fre` — French\n- `ita` — Italian\n- `dut` — Dutch\n\nNote the bibliographic forms: German is `ger`, not `deu`, and French is `fre`, not\n`fra`. Two-letter ISO 639-1 codes (`de`, `en`) are also accepted. The value is\nlower-cased before validation, so `\"GER\"` is accepted and comes back as `ger`; an\nunrecognised code is rejected with `400 Bad Request`, as is an explicit `null` in a\nrequest body.\n\n`null` in a response means the title is in the product's own language and needs no\nseparate declaration. It is set where the title genuinely differs — a\n`title-in-other-language` record, or the original-language title of a translated work.\n",
            "nullable": true,
            "example": "ger"
        },
        "type": {
            "type": "string",
            "description": "The title variant this record belongs to — which of the product's several possible\ntitles this is. Not a closed enumeration: any string of lowercase letters and hyphens\nis accepted, and anything else (digits, underscores, spaces, uppercase) is rejected\nwith `400 Bad Request`. Unlike `element_type` and `language`, this field is *not*\nlower-cased first. Defaults to `distinctive-title`.\n\nIts effect is that the value is mapped onto ONIX\n[Codelist 15](https://ns.editeur.org/onix/en/15) and the result returned in `type_onix`.\nA value outside the mapping is kept as given but leaves `type_onix` empty. Thirteen\nvalues are recognised:\n\n- `undefined` → `00`, Undefined.\n- `distinctive-ttile` → `01`, Distinctive title: the full title of the item, without\n  abbreviation or abridgement.\n- `titel-in-original-language` → `03`, Title in original language, where the record\n  describes a translated item.\n- `abbreviated-title` → `05`, an abbreviated form of the distinctive title.\n- `title-in-other-language` → `06`, a translation of the distinctive or original title,\n  sometimes termed a *parallel title*.\n- `former-title` → `08`, a title the item was previously published under.\n- `distributors-title` → `10`, the title as carried in a book distributor's title file;\n  frequently incomplete.\n- `alternative-title-on-civer` → `11`, an alternative title that appears on the cover.\n- `alternative-title-on-back` → `12`, an alternative title that appears on the back.\n- `expanded-title` → `13`, an expanded form of the title, e.g. a school text book title\n  with grade and subject added.\n- `alternative-title` → `14`, an alternative title the book is widely known by, whether\n  it appears on the book or not.\n- `alternative-title-on-spine` → `15`, an alternative title that appears on the spine.\n- `translated-from-title` → `16`, the title in the intermediate language a work was\n  translated via; distinct from code `03`.\n\nThree of these keys — `distinctive-ttile`, `titel-in-original-language`,\n`alternative-title-on-civer` — are misspelled, and are given here exactly as they must\nbe sent to obtain the corresponding code; the correctly spelled variants are accepted\nas `type` values but produce no `type_onix`. Note in particular that the default,\n`distinctive-title`, is *not* the key that maps to `01`.\nCodelist 15 codes `02`, `04` and `07` are serial-specific and have no mapping at all.\n\n`storefront-product-title` is reserved. Every product carries one such record whether\nor not anybody created it: saving a product creates or updates a record with\n`type: \"storefront-product-title\"` and `element_type: \"title\"`, holding the product\ntitle truncated at a word boundary to at most 59 characters including a trailing `...`.\nIt is maintained by the platform, so writing to it has no lasting effect and deleting\nit only lasts until the next product save. It has no Codelist 15 equivalent, so its\n`type_onix` is `null`.\n\nThe only filterable field of this sub-resource; any other query parameter is rejected\nwith `400 Bad Request`, and `product_id` is part of the path rather than a filter. See\n[Resource Queries](/resource_queries/) for the operator syntax.\n",
            "example": "storefront-product-title",
            "x-enum-descriptions": {
                "undefined": "Maps to Codelist 15 code 00 — Undefined.",
                "distinctive-ttile": "Maps to Codelist 15 code 01 — Distinctive title: the full title of the item, without abbreviation or abridgement. (Note the spelling: this key must be sent exactly as shown.)",
                "titel-in-original-language": "Maps to Codelist 15 code 03 — Title in original language, where the record describes a translated item. (Note the spelling: this key must be sent exactly as shown.)",
                "abbreviated-title": "Maps to Codelist 15 code 05 — An abbreviated form of the distinctive title.",
                "title-in-other-language": "Maps to Codelist 15 code 06 — A translation of the distinctive or original title, sometimes termed a 'parallel title'.",
                "former-title": "Maps to Codelist 15 code 08 — A title the item was previously published under.",
                "distributors-title": "Maps to Codelist 15 code 10 — The title as carried in a book distributor's title file; frequently incomplete.",
                "alternative-title-on-civer": "Maps to Codelist 15 code 11 — An alternative title that appears on the cover. (Note the spelling: this key must be sent exactly as shown.)",
                "alternative-title-on-back": "Maps to Codelist 15 code 12 — An alternative title that appears on the back.",
                "expanded-title": "Maps to Codelist 15 code 13 — An expanded form of the title, e.g. a school text book title with grade and subject added.",
                "alternative-title": "Maps to Codelist 15 code 14 — An alternative title the book is widely known by, whether it appears on the book or not.",
                "alternative-title-on-spine": "Maps to Codelist 15 code 15 — An alternative title that appears on the spine.",
                "translated-from-title": "Maps to Codelist 15 code 16 — The title of the intermediate language a work was translated via; distinct from code 03.",
                "storefront-product-title": "Platform-managed. Holds the product title truncated to at most 59 characters; regenerated on every product save. Has no Codelist 15 equivalent, so type_onix stays null."
            }
        },
        "type_onix": {
            "type": "string",
            "description": "The [ONIX Codelist 15](https://ns.editeur.org/onix/en/15) title type code corresponding\nto `type`.\n\n**Read-only in practice.** The field is accepted in a request body, but it is\nrecomputed from `type` on every write, so a submitted value is always discarded. `null`\nmeans `type` has no entry in the mapping — which is the case for the platform-managed\n`storefront-product-title` records, and for any custom type an integration invents.\n\nOnly the thirteen codes listed under `type` can occur. Codelist 15 also defines `02`,\n`04` and `07`, but no `type` value maps to them.\n",
            "nullable": true,
            "example": null
        }
    },
    "required": []
}

{
    "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."
                    }
                }
            }
        }
    }
}

{
    "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/{product_id}/titles/{id}

Delete product title

Description

Removes the title record. Deleting the platform-maintained storefront-product-title record succeeds, but the next save of the product recreates it.

Input parameters

Path parameters

Parameter Type Default Nullable Description
id string No UUID of the title record, as returned in `_id`.
product_id string No UUID of the product.

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."
                    }
                }
            }
        }
    }
}

{
    "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

Product Title

Name Type Description Example
_id string

UUID of this title record. Used in the sub-resource path to read, update or delete the record.

0befd1b9-cdea-447e-8306-3df8af0419f2
_legacy_id integer

Legacy integer identifier of this resource — the _id the v3 API returns for the same record. Kept so existing integrations can correlate their own records.

13442
_links object

Contains self, the canonical URL of this title record.

_version string

API version that produced this representation.

4.0
channels Array<string>

Distribution channels this title is meant for, as channel identifiers. An empty list — the normal case — means the title is not channel-specific. A populated list scopes the record to the channels named, which is what one retailer needing the title in a different form from everybody else requires.

Values are the platform's distribution-channel slugs, for example:

  • google
  • amazon
  • libri
  • kobo
  • spotify
  • divibib
  • overdrive

They are not validated against that list — any string of lowercase letters and hyphens is accepted, so a typo is taken silently. Each entry must consist of lowercase letters and hyphens only; anything else is rejected with 400 Bad Request. That is stricter than the platform's own channel list, so slugs containing digits or underscores (24symbols, manual_sale, zeitfracht_sa02e) cannot be used here.

The list is lower-cased, de-duplicated and sorted alphabetically on write, so the order in a response need not match the order sent. On update it is replaced wholesale, never merged.

[]
element_type string

Which part of the title variant this record holds. Anything other than these four values is rejected with 400 Bad Request; they correspond one-to-one to the children of the ONIX 3 <TitleElement> composite:

  • title — the title text itself (ONIX <TitleText>, b203). The default.
  • subtitle — the subtitle belonging to the same title variant (ONIX <Subtitle>, b029), held as a second record with the same type.
  • title-prefix — the leading article or other prefix that should be ignored when sorting (ONIX <TitlePrefix>, b030).
  • title-without-prefix — the title with that sorting prefix removed (ONIX <TitleWithoutPrefix>, b031).

A title variant with a subtitle is therefore two records sharing one type, differing only in this field:

  • type: "abbreviated-title", element_type: "title", title: "Quantum Mosaic"
  • type: "abbreviated-title", element_type: "subtitle", title: "Unraveling the Universe's Smallest Mysteries"

title-prefix and title-without-prefix exist so that a title files and sorts correctly: "The Frankfurt Manuscript" files under F, not T. A variant either carries the whole title in a single title record, or the split pair. The two parts are meant to be joined without a separator, so by convention the prefix carries its own trailing space ("The ", not "The"); this is a convention, not something the API enforces.

The value is lower-cased before validation, so "Title" is accepted and comes back as title. ONIX's title element level (Codelist 149) has no counterpart in this sub-resource: these records are always product-level, Codelist 149 code 01.

title
language string| null

Language of this title text, as a three-letter ISO 639-2/B (bibliographic) code. Common values:

  • ger — German
  • eng — English
  • fre — French
  • ita — Italian
  • dut — Dutch

Note the bibliographic forms: German is ger, not deu, and French is fre, not fra. Two-letter ISO 639-1 codes (de, en) are also accepted. The value is lower-cased before validation, so "GER" is accepted and comes back as ger; an unrecognised code is rejected with 400 Bad Request, as is an explicit null in a request body.

null in a response means the title is in the product's own language and needs no separate declaration. It is set where the title genuinely differs — a title-in-other-language record, or the original-language title of a translated work.

ger
title string

The text of this title element. What it contains depends on element_type: the whole title, just the subtitle, just the leading article, or the title with the leading article removed.

Not validated on write — an empty string is accepted, and no length limit is enforced. A string is required: an explicit null is rejected with 400 Bad Request.

Handelsnetze und Zunftordnungen in den Hansestädten des ...
type string

The title variant this record belongs to — which of the product's several possible titles this is. Not a closed enumeration: any string of lowercase letters and hyphens is accepted, and anything else (digits, underscores, spaces, uppercase) is rejected with 400 Bad Request. Unlike element_type and language, this field is not lower-cased first. Defaults to distinctive-title.

Its effect is that the value is mapped onto ONIX Codelist 15 and the result returned in type_onix. A value outside the mapping is kept as given but leaves type_onix empty. Thirteen values are recognised:

  • undefined00, Undefined.
  • distinctive-ttile01, Distinctive title: the full title of the item, without abbreviation or abridgement.
  • titel-in-original-language03, Title in original language, where the record describes a translated item.
  • abbreviated-title05, an abbreviated form of the distinctive title.
  • title-in-other-language06, a translation of the distinctive or original title, sometimes termed a parallel title.
  • former-title08, a title the item was previously published under.
  • distributors-title10, the title as carried in a book distributor's title file; frequently incomplete.
  • alternative-title-on-civer11, an alternative title that appears on the cover.
  • alternative-title-on-back12, an alternative title that appears on the back.
  • expanded-title13, an expanded form of the title, e.g. a school text book title with grade and subject added.
  • alternative-title14, an alternative title the book is widely known by, whether it appears on the book or not.
  • alternative-title-on-spine15, an alternative title that appears on the spine.
  • translated-from-title16, the title in the intermediate language a work was translated via; distinct from code 03.

Three of these keys — distinctive-ttile, titel-in-original-language, alternative-title-on-civer — are misspelled, and are given here exactly as they must be sent to obtain the corresponding code; the correctly spelled variants are accepted as type values but produce no type_onix. Note in particular that the default, distinctive-title, is not the key that maps to 01. Codelist 15 codes 02, 04 and 07 are serial-specific and have no mapping at all.

storefront-product-title is reserved. Every product carries one such record whether or not anybody created it: saving a product creates or updates a record with type: "storefront-product-title" and element_type: "title", holding the product title truncated at a word boundary to at most 59 characters including a trailing .... It is maintained by the platform, so writing to it has no lasting effect and deleting it only lasts until the next product save. It has no Codelist 15 equivalent, so its type_onix is null.

The only filterable field of this sub-resource; any other query parameter is rejected with 400 Bad Request, and product_id is part of the path rather than a filter. See Resource Queries for the operator syntax.

storefront-product-title
type_onix string| null

The ONIX Codelist 15 title type code corresponding to type.

Read-only in practice. The field is accepted in a request body, but it is recomputed from type on every write, so a submitted value is always discarded. null means type has no entry in the mapping — which is the case for the platform-managed storefront-product-title records, and for any custom type an integration invents.

Only the thirteen codes listed under type can occur. Codelist 15 also defines 02, 04 and 07, but no type value maps to them.