---
title: "Validate ISBN & Book Listing Data API"
slug: validate-isbn-book-listing-data
url: https://apyhub.com/freedailypro/service/validate-isbn-book-listing-data
provider: FreeDailyPro
tags: [isbn, isbn-validator, onix, book-metadata, book-listing, description-formatter, listing-validation, identifier-validation, publishing, self-publishing]
auth: api_key
version: 1.0.0
service_type: sync
endpoints: 4
atoms: 10
mcp: true
---

# Validate ISBN & Book Listing Data API

Check and convert ISBNs, build ONIX 3.0 book records, clean book descriptions for retailers, and validate online shop listing titles and tags.

## Endpoints

| Method | URL | Description | Atoms |
| --- | --- | --- | --- |
| POST | `https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/isbn` | What it does Validates an ISBN sent in the request body and returns a success response. The detaile… | 10 |
| POST | `https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/onix` | What it does Generates ONIX book-listing data from the submitted book metadata. The request body mu… | 10 |
| POST | `https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/kdp-description` | What it does Formats book description content for KDP by taking an input body with either HTML or p… | 10 |
| POST | `https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/etsy-listing-check` | What it does Checks Etsy listing data by sending a listing title and optional tags to the endpoint.… | 10 |

## Endpoint reference

### ISBN checker and converter

`POST https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/isbn` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `isbn` | body | string | yes |  |

#### Quickstart

Validate an ISBN by sending it in a simple JSON body.

```bash
curl -X POST "https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/isbn" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"isbn":"9780306406157"}'
```

#### What you'll get back

Returns a JSON object with no declared top-level fields in the output schema.

```json
{
  "result": {
    "input": "9780306406157",
    "clean": "9780306406157",
    "kind": "isbn13",
    "wellFormed": true,
    "valid": true,
    "convertedFromCorrected": false,
    "rangesVersion": "2026-10-30",
    "givenCheck": "7",
    "expectedCheck": "7",
    "isbn10": "0306406152",
    "isbn13": "9780306406157",
    "isbn10Hyphenated": "0-306-40615-2",
    "isbn13Hyphenated": "978-0-306-40615-7",
    "groupName": "English language",
    "rangeStatus": "ok",
    "barcodeDigits": "9780306406157"
  }
}
```

### ONIX generator

`POST https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/onix` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `isbn` | body | string | yes |  |
| `title` | body | string | yes |  |
| `prices` | body | array of object | no |  |
| `prices[].type` | body | string | no |  |
| `prices[].amount` | body | string | yes |  |
| `prices[].currency` | body | string | yes |  |
| `pubDate` | body | string | yes | YYYYMMDD, YYYY-MM-DD or YYYY-MM |
| `audience` | body | string | no |  |
| `language` | body | string | no |  |
| `subjects` | body | array of object | no |  |
| `subjects[].code` | body | string | yes |  |
| `subjects[].scheme` | body | string | yes | One of: bisac, thema. |
| `subtitle` | body | string | no |  |
| `pageCount` | body | string | no |  |
| `publisher` | body | string | yes |  |
| `territory` | body | string | no |  |
| `description` | body | string | no |  |
| `productForm` | body | string | no | ONIX form code, for example BC paperback, BB hardback |
| `availability` | body | string | no |  |
| `contributors` | body | array of object | yes |  |
| `contributors[].name` | body | string | yes |  |
| `contributors[].role` | body | string | no | ONIX role code, default A01 (author) |
| `contributors[].inverted` | body | string | no |  |
| `shortDescription` | body | string | no |  |

#### Quickstart

Validate a book listing by sending the required ONIX fields as JSON.

```bash
curl -X POST "https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/onix" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "The Pragmatic Programmer",
    "contributors": [
      {
        "name": "Andrew Hunt"
      }
    ],
    "isbn": "9780135957059",
    "publisher": "Addison-Wesley Professional",
    "pubDate": "1999-10-30"
  }'
```

#### What you'll get back

Returns a JSON object. The response schema does not declare any top-level fields.

```json
{
  "result": {
    "issues": [
      {
        "field": "pageCount",
        "message": "Print editions usually need a page count.",
        "level": "warning"
      },
      {
        "field": "subjects",
        "message": "No subject code. Most retailers and distributors ask for at least one BISAC or Thema code.",
        "level": "warning"
      },
      {
        "field": "description",
        "message": "No description. Retailers normally show it on the product page.",
        "level": "warning"
      }
    ],
    "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ONIXMessage release=\"3.0\" xmlns=\"http://ns.editeur.org/onix/3.0/reference\">\n  <Header>\n    <Sender>\n      <SenderName>Test Press</SenderName>\n    </Sender>\n    <SentDateTime>20261112T072538Z</SentDateTime>\n  </Header>\n  <Product>\n    <RecordReference>9780306406157</RecordReference>\n    <NotificationType>03</NotificationType>\n    <ProductIdentifier>\n      <ProductIDType>15</ProductIDType>\n      <IDValue>9780306406157</IDValue>\n    </ProductIdentifier>\n    <ProductIdentifier>\n      <ProductIDType>03</ProductIDType>\n      <IDValue>9780306406157</IDValue>\n    </ProductIdentifier>\n    <DescriptiveDetail>\n      <ProductComposition>00</ProductComposition>\n      <ProductForm>BC</ProductForm>\n      <TitleDetail>\n        <TitleType>01</TitleType>\n        <TitleElement>\n          <TitleElementLevel>01</TitleElementLevel>\n          <TitleText>Test Book</TitleText>\n        </TitleElement>\n      </TitleDetail>\n      <Contributor>\n        <SequenceNumber>1</SequenceNumber>\n        <ContributorRole>A01</ContributorRole>\n        <PersonName>Jane Doe</PersonName>\n      </Contributor>\n      <Language>\n        <LanguageRole>01</LanguageRole>\n        <LanguageCode>eng</LanguageCode>\n      </Language>\n    </DescriptiveDetail>\n    <PublishingDetail>\n      <Publisher>\n        <PublishingRole>01</PublishingRole>\n        <PublisherName>Test Press</PublisherName>\n      </Publisher>\n      <PublishingStatus>04</PublishingStatus>\n      <PublishingDate>\n        <PublishingDateRole>01</PublishingDateRole>\n        <Date dateformat=\"00\">20260115</Date>\n      </PublishingDate>\n    </PublishingDetail>\n    <ProductSupply>\n      <Market>\n        <Territory>\n          <RegionsIncluded>WORLD</RegionsIncluded>\n        </Territory>\n      </Market>\n      <SupplyDetail>\n        <Supplier>\n          <SupplierRole>01</SupplierRole>\n          <SupplierName>Test Press</SupplierName>\n        </Supplier>\n        <ProductAvailability>20</ProductAvailability>\n        <Price>\n          <PriceType>01</PriceType>\n          <PriceAmount>9.99</PriceAmount>\n          <CurrencyCode>USD</CurrencyCode>\n        </Price>\n      </SupplyDetail>\n    </ProductSupply>\n  </Product>\n</ONIXMessage>\n"
  }
}
```

### Book description HTML formatter

`POST https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/kdp-description` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `html` | body | string | no | HTML to clean to the tags KDP allows |
| `text` | body | string | no | Plain text; blank lines make paragraphs |
| `heading` | body | string | no | One of: h4, h5, h6. |

#### Quickstart

Send your HTML or plain text book description for KDP-friendly cleanup.

```bash
curl -X POST "https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/kdp-description" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"html": "<h1>Big</h1><p>A gripping <b>debut</b> novel.</p><script>alert(1)</script>"}'
```

#### What you'll get back

Returns a JSON object.

```json
{
  "result": {
    "html": "<h4>Big</h4><p>A gripping <b>debut</b> novel.</p>",
    "removed": {
      "script": 1
    },
    "changed": {
      "h1": 1
    },
    "stats": {
      "htmlLength": 49,
      "visible": 26,
      "words": 5,
      "overBy": 0
    },
    "notes": []
  }
}
```

### Etsy listing checker

`POST https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/etsy-listing-check` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `tags` | body | string | no | Tags separated by commas or new lines |
| `title` | body | string | yes |  |

#### Quickstart

Check whether an Etsy listing title and optional tags are valid for an ISBN book listing.

```bash
curl -X POST "https://api.eu.apyhub.com/freedailypro/validate-isbn-book-listing-data/etsy-listing-check" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Salt & Pepper & Spice Set", "tags": "kitchen, spice rack, gift"}'
```

#### What you'll get back

Returns a JSON object. The output schema doesn’t declare any top-level fields, so the response shape is intentionally unspecified here.

```json
{
  "result": {
    "title": {
      "length": 25,
      "front": "Salt & Pepper & Spice Set",
      "findings": [
        {
          "severity": "ok",
          "text": "25 of 140 characters used."
        },
        {
          "severity": "error",
          "text": "The title uses \"&\" 2 times. Etsy allows each of % : & only once in a title."
        },
        {
          "severity": "advice",
          "text": "A very short title leaves search phrases unused. Add what it is, who it is for and one or two details such as material or size."
        }
      ],
      "errors": 1
    },
    "tags": {
      "tags": [
        {
          "tag": "kitchen",
          "length": 7,
          "problems": [],
          "inTitle": false
        },
        {
          "tag": "spice rack",
          "length": 10,
          "problems": [],
          "inTitle": false
        },
        {
          "tag": "gift",
          "length": 4,
          "problems": [],
          "inTitle": false
        }
      ],
      "findings": [
        {
          "severity": "advice",
          "text": "3 of 13 tags used. Each unused tag is a search phrase left on the table."
        }
      ],
      "errors": 0,
      "titleWordsNotInTags": [
        "salt",
        "pepper",
        "set"
      ],
      "cleaned": [
        "kitchen",
        "spice rack",
        "gift"
      ]
    }
  }
}
```

## About

## What it does

Validate ISBN & Book Listing Data helps you check and prepare the identifiers and listing text for a book before it goes on sale. Send an ISBN, a book record, a description or a listing title, and get back a structured result you can use in your own forms, imports and publishing tools.

Use the ISBN endpoint to check whether an ISBN-10 or ISBN-13 is valid. It converts between the two forms and returns the hyphenated versions, the registration group and the barcode digits. Use the ONIX endpoint to turn one book record into an ONIX 3.0 product message, the metadata format distributors and retailers use. It returns the XML and a list of warnings and errors, so you can see what is missing before you send it.

Use the description endpoint to clean a book blurb into the limited HTML that retailers accept. It tells you which tags were removed or converted and whether the text fits the length limit. Use the listing endpoint to check an online shop listing title and tags against the marketplace's rules: title length, repeated symbols, banned characters, tag count and tag length. It returns plain-language findings you can show to a seller before they save.

It fits catalog imports, publishing tools, listing editors and any backend that needs consistent book identifiers and listing data.

## Usage

Base URL: `https://api.eu.apyhub.com` (default region — see
`GET https://apyhub.com/api/public/regions` for the rest).

Authenticate with an ApyHub API key in the `apy-token` header.
Full docs and a live playground: https://apyhub.com/freedailypro/service/validate-isbn-book-listing-data
