MENU navbar-image

Introduction

The API documentation for Bookshelves to use endpoints with another app.

This documentation aims to provide all the information you need to work with our API.

Base URL

https://bookshelves.ink

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting your dashboard and clicking Generate API token.

Laravel Sanctum

TODO
https://bookshelves.ink/sanctum/csrf-cookie

Application

GET Enums.

Route name: api.enums

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/enums" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/enums"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/enums',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4999
vary: Origin
 

{
    "data": {
        "authorRoles": {
            "aut": "Author"
        },
        "bookFormats": {
            "pdf": "PDF",
            "cbr": "cbr",
            "cbz": "CBZ",
            "epub": "EPUB"
        },
        "bookTypes": {
            "audio": "Audio",
            "comic": "Comic",
            "essay": "Essay",
            "handbook": "Handbook",
            "novel": "Novel"
        },
        "countSizes": {
            "xl": "xl",
            "lg": "lg",
            "md": "md",
            "sm": "sm",
            "xs": "xs"
        },
        "entities": {
            "book": "book",
            "author": "author",
            "serie": "serie",
            "entity": "entity",
            "feed": "feed"
        },
        "genders": {
            "unknown": "Unknown",
            "woman": "Woman",
            "nonbinary": "Non binary",
            "genderfluid": "Genderfluid",
            "agender": "Agender",
            "man": "Man"
        },
        "postStatus": {
            "draft": "Draft",
            "scheduled": "Scheduled",
            "published": "Published"
        },
        "roles": {
            "super_admin": "Super admin",
            "admin": "Admin",
            "publisher": "publisher",
            "user": "User"
        },
        "submissionsReasons": {
            "idea": "Idea",
            "issue": "Issue",
            "book_problem": "Book: problem",
            "book_adding": "Book: to add",
            "other": "Other"
        },
        "tagTypes": {
            "tag": "Tag",
            "genre": "Genre"
        },
        "models": {
            "author": "Author",
            "book": "Book",
            "language": "Language",
            "publisher": "Publisher",
            "serie": "Serie",
            "tagextended": "TagExtended"
        }
    }
}
 

Request      

GET api/enums

GET Count.

Get count of entities for a selected collection. Available for Book, Serie and Author.

Route name: api.count

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/count?entities=author%2Cbook%2Cserie&languages=fr%2Cen" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/count"
);

const params = {
    "entities": "author,book,serie",
    "languages": "fr,en",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/count',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'entities'=> 'author,book,serie',
            'languages'=> 'fr,en',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4998
vary: Origin
 

{
    "data": {
        "entities": {
            "author": 26,
            "book": 198,
            "serie": 21
        },
        "languages": {
            "fr": 187,
            "en": 11
        }
    }
}
 

Request      

GET api/count

Query Parameters

entities  string  

key of enums.models' list.

languages  string  

slug of languages' list meta.slug.

GET Application.

Useful for CMS at front-end init with enums, languages and application.

Route name: api.application

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/application" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/application"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/application',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4997
vary: Origin
 

{
    "data": {
        "enums": {
            "authorRoles": {
                "aut": "Author"
            },
            "bookFormats": {
                "pdf": "PDF",
                "cbr": "cbr",
                "cbz": "CBZ",
                "epub": "EPUB"
            },
            "bookTypes": {
                "audio": "Audio",
                "comic": "Comic",
                "essay": "Essay",
                "handbook": "Handbook",
                "novel": "Novel"
            },
            "countSizes": {
                "xl": "xl",
                "lg": "lg",
                "md": "md",
                "sm": "sm",
                "xs": "xs"
            },
            "entities": {
                "book": "book",
                "author": "author",
                "serie": "serie",
                "entity": "entity",
                "feed": "feed"
            },
            "genders": {
                "unknown": "Unknown",
                "woman": "Woman",
                "nonbinary": "Non binary",
                "genderfluid": "Genderfluid",
                "agender": "Agender",
                "man": "Man"
            },
            "postStatus": {
                "draft": "Draft",
                "scheduled": "Scheduled",
                "published": "Published"
            },
            "roles": {
                "super_admin": "Super admin",
                "admin": "Admin",
                "publisher": "publisher",
                "user": "User"
            },
            "submissionsReasons": {
                "idea": "Idea",
                "issue": "Issue",
                "book_problem": "Book: problem",
                "book_adding": "Book: to add",
                "other": "Other"
            },
            "tagTypes": {
                "tag": "Tag",
                "genre": "Genre"
            },
            "models": {
                "author": "Author",
                "book": "Book",
                "language": "Language",
                "publisher": "Publisher",
                "serie": "Serie",
                "tagextended": "TagExtended"
            }
        },
        "languages": [
            {
                "name": "French",
                "meta": {
                    "slug": "fr",
                    "show": "https://bookshelves.ink/api/languages/fr"
                },
                "firstChar": "F",
                "count": null
            },
            {
                "name": "English",
                "meta": {
                    "slug": "en",
                    "show": "https://bookshelves.ink/api/languages/en"
                },
                "firstChar": "E",
                "count": null
            }
        ],
        "application": {
            "name": "Bookshelves",
            "title_template": "%s · Bookshelves",
            "slug": "bookshelves",
            "favicon": "https://bookshelves.ink/storage/media/cms/1/bookshelves-favicon.svg",
            "icon": "https://bookshelves.ink/storage/media/cms/2/bookshelves-icon.svg",
            "logo": "https://bookshelves.ink/storage/media/cms/3/bookshelves-logo.png",
            "og": "https://bookshelves.ink/storage/media/cms/4/bookshelves-og.jpg",
            "meta_title": "Bookshelves, reading in complete tranquility...",
            "meta_description": "For people with eReaders, download books and reading in complete tranquility, your digital library that goes everywhere with you.",
            "meta_author": "Bookshelves Team",
            "meta_twitter_creator": "@ewilanriviere",
            "meta_twitter_site": "@bookshelves_ink"
        }
    }
}
 

Request      

GET api/application

GET api/navigation

Route name: api.navigation

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/navigation" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/navigation"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/navigation',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4996
vary: Origin
 

{
    "data": {
        "navbar": [
            {
                "title": "Books",
                "route": "/books",
                "category": "navbar"
            },
            {
                "title": "Series",
                "route": "/series",
                "category": "navbar"
            },
            {
                "title": "Authors",
                "route": "/authors",
                "category": "navbar"
            },
            {
                "title": "Tags & genres",
                "route": "/tags",
                "category": "navbar"
            }
        ],
        "footer": []
    }
}
 

Request      

GET api/navigation

CMS

GET Home page.

Route name: api.cms.home-page

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/cms/home-page" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/cms/home-page"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/cms/home-page',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4990
vary: Origin
 

{
    "data": {
        "hero": {
            "title": "reading in complete tranquility...",
            "text": "If you have an eReader and are looking for plenty of books to take everywhere with you, you've come to the right place, hours of reading in perspective.",
            "picture": "https://bookshelves.ink/storage/media/cms/5/cms_hero.svg"
        },
        "statistics": {
            "eyebrow": "A quick tour of books count",
            "title": "Lots of books for ever more insatiable readers",
            "text": "More and more books for more and more reading, each day brings its own novelties (or almost). Don't hesitate to come back from time to time to discover the new books.",
            "list": [
                {
                    "label": "Books available",
                    "link": "",
                    "count": 198
                },
                {
                    "label": "Authors",
                    "link": "",
                    "count": 26
                },
                {
                    "label": "Series",
                    "link": "",
                    "count": 21
                },
                {
                    "label": "Books available in french",
                    "link": "",
                    "count": 187
                },
                {
                    "label": "Books available in english",
                    "link": "",
                    "count": 11
                }
            ]
        },
        "logos": {
            "title": "Special thanks to these softwares or websites because they help our work.",
            "list": [
                {
                    "label": "Calibre",
                    "slug": "calibre",
                    "link": "https://calibre-ebook.com",
                    "picture": "https://bookshelves.ink/storage/media/cms/6/calibre.webp"
                },
                {
                    "label": "Pandoc",
                    "slug": "pandoc",
                    "link": "https://pandoc.org",
                    "picture": "https://bookshelves.ink/storage/media/cms/7/pandoc.webp"
                },
                {
                    "label": "Team AlexandriZ",
                    "slug": "team-alexandriz",
                    "link": "https://twitter.com/teamalexandriz",
                    "picture": "https://bookshelves.ink/storage/media/cms/8/team-alexandriz.webp"
                },
                {
                    "label": "Lulu",
                    "slug": "lulu",
                    "link": "https://www.lulu.com",
                    "picture": "https://bookshelves.ink/storage/media/cms/9/lulu.webp"
                },
                {
                    "label": "OPDS",
                    "slug": "opds",
                    "link": "https://opds.io",
                    "picture": "https://bookshelves.ink/storage/media/cms/10/opds.webp"
                }
            ]
        },
        "features": {
            "title": "How to use Bookshelves",
            "text": "Let Bookshelves guide you through hundreds of books and let yourself be tempted by vast universes directly accessible by your eReader.",
            "list": [
                {
                    "title": "Open formats",
                    "text": "The available files are in open format, you can share and modify them.",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/11/epub.svg"
                },
                {
                    "title": "Regardless of eReader",
                    "text": "Kobo, Bookeen, Vivlio or even Kindle (with Calibre), you can use books in EPUB format on many eReaders (for eBooks).",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/12/ereader.svg"
                },
                {
                    "title": "Download & read",
                    "text": "Download a book and/or a serie of books add them to your eReader and start reading!",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/13/download.svg"
                },
                {
                    "title": "Metadata",
                    "text": "All these informations that allows you to sort and find your books by author or series are integrated into each book.",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/14/metadata.svg"
                },
                {
                    "title": "Multi languages",
                    "text": "Books in several languages according to your preferences in order to reach a maximum number of readers.",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/15/languages.svg"
                },
                {
                    "title": "OPDS, Catalog & Webreader",
                    "text": "With OPDS feed, you can access content from any source, on any device and with Catalog you can download books from your eReader or read an eBook in your browser with Webreader.",
                    "link": "",
                    "picture": "https://bookshelves.ink/storage/media/cms/16/feed.svg"
                }
            ]
        },
        "highlights": [
            {
                "title": "Find the book that fits you!",
                "text": "A selection of more than a hundred works, find the one that will strike a chord with your soul. And come back for ten more. Search by title, author or series then download all the books of an author or series if you wish!",
                "ctaText": "Discover all books",
                "ctaLink": {
                    "name": "books"
                },
                "quoteText": "Maybe it's not quite legal but it's cool!",
                "quoteAuthor": "An enthusiastic reader",
                "icon": "https://bookshelves.ink/storage/media/cms/17/books.svg",
                "picture": "https://bookshelves.ink/storage/media/cms/18/books.svg"
            },
            {
                "title": "Want to know your eReader?",
                "text": "Detailed guides are there to explain how to best manage your eReader but also to get to know the books better in order to modify them if you wish.",
                "ctaText": "Discover guides",
                "ctaLink": {
                    "name": "guides"
                },
                "quoteText": "The world of eReaders is so vast!",
                "quoteAuthor": "A novice user",
                "icon": "https://bookshelves.ink/storage/media/cms/19/guides.svg",
                "picture": "https://bookshelves.ink/storage/media/cms/20/guides.svg"
            },
            {
                "title": "Features, read as you wish",
                "text": "Features offer a lot of extra options to find and read books. You can download directly books from your eReader with Catalog or you can use OPDS (Open Publication Distribution System) feed to get all books on your favorite application. And if you want to read eBook directly in your browser with Webreader.",
                "ctaText": "Discover Features",
                "ctaLink": {
                    "name": "slug",
                    "params": {
                        "slug": "features"
                    }
                },
                "quoteText": "I am only interested in OPDS feeds adapted to my eReader with Koreader OS.",
                "quoteAuthor": "A very experimented reader",
                "icon": "https://bookshelves.ink/storage/media/cms/21/features.svg",
                "picture": "https://bookshelves.ink/storage/media/cms/22/features.svg"
            }
        ],
        "displayLatest": true,
        "displaySelection": true
    }
}
 

Request      

GET api/cms/home-page

CMS: Page

Endpoint to get Pages data.

GET Page[].

Route name: api.pages.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/pages" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/pages"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/pages',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IlQvaURkMy9ubHliZUdOR1hGbnJYTlE9PSIsInZhbHVlIjoibVM2UUFJSkVSdWEzNDVjM3I4MHQ5OEprSGYxQmpLZ1JsY3p3Kzg2V29zOUZzWHVUbElqbEJQam9DemNqOGVsR2NnVlh4cUM4VElBaG9DT2NrNERvUXBVTTZhdzVxbDlTZEVZV1RKN1lhRGZSQ2laK045aDBsZG50Y2d1ZGxkSHkiLCJtYWMiOiIxOTBkZjkyNGRkYjdmNDcyNmQxNTcyZmQ5OWJlNWFjZWI4NWQ1Mzc0NTBlYWIyNDIwNjY2NGFjNGZjM2U1YzAwIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6IlVWUG9Qai9GeXZOM2NBdzlML3oxNUE9PSIsInZhbHVlIjoiZ3Rhb1B4YXNMNU01dC9ERUIxcm95RFNFUDlZaUw0TG9FM1Fkak0rK3I5cVd5ZWQ1RkJNSjhYdFJ4Y2ZSZ2JhT0FSVkEzczc4REd2c0tVSkJUNC9qRmhNNHVEc2cxdTFrK2NubGpLdXlaWXVHS2R2U0QxQndtVWdVTWNFMlh1T1oiLCJtYWMiOiIxYTUxOGE1YmZhNzU3ZmZlOTY3ZTc1N2YwNGYzZDQwMTc0MTdiNjQ4NTM5NjI3YjNiYTFjZGZmOTc5MjhjOTQ0IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": [
        {
            "title": "About",
            "meta": {
                "slug": "about",
                "title": "About",
                "description": "About this project",
                "show": "https://bookshelves.ink/api/pages/about"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/562/about.webp",
            "summary": "About this project",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        },
        {
            "title": "FAQ",
            "meta": {
                "slug": "faq",
                "title": "FAQ",
                "description": "Frequently Asked Questions",
                "show": "https://bookshelves.ink/api/pages/faq"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/564/faq.webp",
            "summary": "Frequently Asked Questions",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        },
        {
            "title": "Features: OPDS, Catalog & more",
            "meta": {
                "slug": "features",
                "title": "Features: OPDS, Catalog & more",
                "description": "On other ways",
                "show": "https://bookshelves.ink/api/pages/features"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/565/features.webp",
            "summary": "On other ways",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        },
        {
            "title": "Legal",
            "meta": {
                "slug": "legal",
                "title": "Legal",
                "description": "About legal",
                "show": "https://bookshelves.ink/api/pages/legal"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/566/legal.webp",
            "summary": "About legal",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        },
        {
            "title": "More eBooks",
            "meta": {
                "slug": "more-ebooks",
                "title": "More eBooks",
                "description": "About more eBooks projects",
                "show": "https://bookshelves.ink/api/pages/more-ebooks"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/567/more-ebooks.webp",
            "summary": "About more eBooks projects",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        },
        {
            "title": "Privacy",
            "meta": {
                "slug": "privacy",
                "title": "Privacy",
                "description": "Your privacy & your data",
                "show": "https://bookshelves.ink/api/pages/privacy"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/568/privacy.webp",
            "summary": "Your privacy & your data",
            "publishedAt": "2022-04-24T06:25:01.000000Z",
            "updatedAt": "2022-04-24T06:25:01.000000Z"
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/pages?page=1",
        "last": "https://bookshelves.ink/api/pages?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/pages?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/pages",
        "per_page": 32,
        "to": 6,
        "total": 6
    }
}
 

Request      

GET api/pages

GET Page.

Route name: api.pages.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/pages/about" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/pages/about"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/pages/about',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6Imp5MHlIeXVIQ2dGTEpXK2Fvb20xeWc9PSIsInZhbHVlIjoiV01YUFpTZFBnNW9HTWF5OVc3WEgzVHU0Wk9WaWg3SGk1a1M1NktQVDNhcG5aRjlITTQrZFJpNmc4OUVLeG11Y0h4MzFGMWp3R0MzbnFVN2RhdkVYMEJEejZIbG5heXR2eDEwL1dQQWl6MGszbkVPdXkvZTBiT3h4emRsWXpXd04iLCJtYWMiOiIyYjMxYTljNjQ1Y2UzYjZiYjI5ZjJhZmFkNTExODAxNzc1N2JkOWQ3ZjQ4NjI3MTlmMjRhYjJiZWQwY2Q5ZTQwIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6InNzdXh2OHpBcXlodWFrZURHalVMamc9PSIsInZhbHVlIjoiUDJPK0ZMSElKTXV3K1FYQmltc0tqdWtBM0JVTDdhTG1WeFYwdHMzWFNPS2tyWHRtYTlzUVlkL3Q4NzF2Y2dEcWVxZVBHckZCcWxrOTV4bGR3V1pOMDljVk1hRWEwQ25iUFN3RUxRVDRUNlBKQ0FTOEdCWlZyTmg0WVQyREJIaXciLCJtYWMiOiI3ZDVlZWI3ZjdlMzkxNmRhMTY3NTBiOTNlNzAyNjA1OTMyYWZjYTdiMjMwODk2NjQ2MzZhZDE3YTU0NWQxYjExIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": {
        "title": "About",
        "meta": {
            "slug": "about",
            "title": "About",
            "description": "About this project",
            "show": "https://bookshelves.ink/api/pages/about"
        },
        "cover": "https://bookshelves.ink/storage/media/cms/562/about.webp",
        "summary": "About this project",
        "publishedAt": "2022-04-24T06:25:01.000000Z",
        "updatedAt": "2022-04-24T06:25:01.000000Z",
        "body": "<p>The Bookshelves team has set itself the goal of creating a structure accessible from any platform to read and download eBooks. The principle is to remain open-source while offering a totally free and quality content.</p>\n<p>Thus the present website is made with Nuxt.js and Tailwind CSS and the API was created with Laravel, for developers API can be used by other applications, you can find <a href=\"https://bookshelves.ink/docs\" target=\"_blank\" rel=\"noopener noreferrer\">documentation here</a>.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/563/about-reader-against-drm.webp.webp\" alt=\"reader-against-drm\" loading=\"lazy\">\n<p>This project opposes the implementation of DRM on eBooks that prevent readers from sharing their books.</p>\n"
    }
}
 

Request      

GET api/pages/{page_slug}

URL Parameters

page_slug  string  

slug of page in meta.slug pages' list, example: about

CMS: Post

Endpoint to get Posts data.

GET Post[].

Route name: api.posts.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/posts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/posts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/posts',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6ImxDem1KVTQveTJQaXVrOFBZZlpjbWc9PSIsInZhbHVlIjoidnFJZlZENUhOWjhVQWVsaXo2R1JzVTVEcTEzNUN6dkJURFlhQjFjdkNOSEswalhKSitOTXFYcHYySitZOHhwRTZoRmpxZ3oxQXNzdWp3bGhxeXJzTkJFVjVSZEptN2F5cHUvZG5Ea3Qvb2Z5RXVFUXVvK3Baak9MbW9hTDlOT2ciLCJtYWMiOiIyNWUzMGM5ZWEwOGJlNGEyOGNmOTM2NDA2N2RkNjk3OWIzZGZhY2VhOWNjOTg0NjhhNWMxODBhM2ViMGUwMTAxIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6IlExOGY3TU1UWGk4YUpsY2tiUEhOQ0E9PSIsInZhbHVlIjoibGQ1bGxIQUJMRU8wN1BicU9DN3RCU0FicCtqZXByNE1BajkyQytPdVAvOW1CL0hYcTdPYXFlMG83K2MvZHNMSjNIcUJtTHhNRGl4VThpR05Gd2pCSm5zTWNmdmRkb2xmYVdPaXMzdW4rdWlPaXBrN0IxOXcwaHBnSHgvMDV5RjQiLCJtYWMiOiJjZjlmYjVhZmIyYTE2OTBjYjZlN2Y5ZjMyODRmMjVkYTI2ZDQ2MGM4ZDc3MDc3YjVhYWU3ZjQ2NTM0YmVlMzFmIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": [
        {
            "title": "Presentation",
            "meta": {
                "slug": "presentation",
                "title": "Presentation",
                "description": "What is Calibre and why it's a very cool software",
                "show": "https://bookshelves.ink/api/posts/presentation"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/544/presentation.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "What is Calibre and why it's a very cool software",
            "publishedAt": "2022-04-24T06:24:54.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": false
        },
        {
            "title": "Download eBook from eReader",
            "meta": {
                "slug": "download-ebook-from-ereader",
                "title": "Download eBook from eReader",
                "description": "How to download an eBook directly from your eReader?",
                "show": "https://bookshelves.ink/api/posts/download-ebook-from-ereader"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/546/download-ebook-from-ereader.webp",
            "category": "eReader",
            "user": "Super Admin",
            "summary": "How to download an eBook directly from your eReader?",
            "publishedAt": "2021-05-12T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": false
        },
        {
            "title": "Remove DRM",
            "meta": {
                "slug": "remove-drm",
                "title": "Remove DRM",
                "description": "Shut down DRM now!",
                "show": "https://bookshelves.ink/api/posts/remove-drm"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/545/remove-drm.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "Shut down DRM now!",
            "publishedAt": "2021-04-23T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": false
        },
        {
            "title": "Tips",
            "meta": {
                "slug": "tips",
                "title": "Tips",
                "description": "Do you know really your Kobo?",
                "show": "https://bookshelves.ink/api/posts/tips"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/559/tips.webp",
            "category": "eReader",
            "user": "Super Admin",
            "summary": "Do you know really your Kobo?",
            "publishedAt": "2021-04-06T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": false
        },
        {
            "title": "Manage comics or mangas",
            "meta": {
                "slug": "manage-comics-or-mangas",
                "title": "Manage comics or mangas",
                "description": "How to manage comics/mangas with CBZ format on Calibre",
                "show": "https://bookshelves.ink/api/posts/manage-comics-or-mangas"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/531/manage-comics-or-mangas.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "How to manage comics/mangas with CBZ format on Calibre",
            "publishedAt": "2021-02-03T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:53.000000Z",
            "pin": false
        },
        {
            "title": "Set metadata",
            "meta": {
                "slug": "set-metadata",
                "title": "Set metadata",
                "description": "How to update EPUB metadata with Calibre",
                "show": "https://bookshelves.ink/api/posts/set-metadata"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/532/set-metadata.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "How to update EPUB metadata with Calibre",
            "publishedAt": "2021-02-03T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": true
        },
        {
            "title": "Get series",
            "meta": {
                "slug": "get-series",
                "title": "Get series",
                "description": "Series can not work on the fly with your eReader, this guide explain to force your eReader to display it",
                "show": "https://bookshelves.ink/api/posts/get-series"
            },
            "cover": "https://bookshelves.ink/storage/media/cms/553/get-series.webp",
            "category": "eReader",
            "user": "Super Admin",
            "summary": "Series can not work on the fly with your eReader, this guide explain to force your eReader to display it",
            "publishedAt": "2021-02-03T00:00:00.000000Z",
            "updatedAt": "2022-04-24T06:24:54.000000Z",
            "pin": false
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/posts?page=1",
        "last": "https://bookshelves.ink/api/posts?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/posts?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/posts",
        "per_page": 32,
        "to": 7,
        "total": 7
    }
}
 

Request      

GET api/posts

GET Post.

Route name: api.posts.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/posts/get-series" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/posts/get-series"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/posts/get-series',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6Ijl6SlgrOGJjeDVaN0EzQVhiZEtUZkE9PSIsInZhbHVlIjoieVN4Rm81dTEwSTA3V0I5aTRNZCtiMHZCbVlaTTdsS1VnODgzay8rRVljYVNsbEJSd1pqRThCR2QwbFI4ajZaOTRvcmE3eDllRXYzQ2hIZUVhZkVBcFp2L1QxSVlaQmxkanJ0aVNkR1BHbFplMEpoNzdrQk16cE9ZZFY5aDNEV3YiLCJtYWMiOiI3MTRlMzBiMzdlMDIwYzE5ZTc5NTViN2IwYmYyYzZjNzQzM2JkZjFlOTUyNDNmNGM4MmUzODYxNGU0MWJmMDE4IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6InVWNEY2QnE1MUdudzFkeXVHbkptWmc9PSIsInZhbHVlIjoiRmZpSlNuanc3TVV2SU9UZytDMkc2R0dFMzBjNktudlg1MWxDUDZlN2JKcVNyYlltWmZSbnJXTzM1OWIxK3FpSGx2Y3J3bnI5WHlxN1Rrc053QitUdnhVVHFnc3Q1bHJZTEh4enpQQ2krSjNNRTd4U2pMdUIybXdCRkd6aHlzWnIiLCJtYWMiOiIwNzE1MDE5ODdjOWU1YWMyMWE3NDdmZGFiOTNhYTQ3OTE4NGM4MjI1MTJiOTUxYWRlN2E4ZjAzYzE0YjA4NWMxIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": {
        "title": "Get series",
        "meta": {
            "slug": "get-series",
            "title": "Get series",
            "description": "Series can not work on the fly with your eReader, this guide explain to force your eReader to display it",
            "show": "https://bookshelves.ink/api/posts/get-series"
        },
        "cover": "https://bookshelves.ink/storage/media/cms/553/get-series.webp",
        "category": "eReader",
        "user": "Super Admin",
        "summary": "Series can not work on the fly with your eReader, this guide explain to force your eReader to display it",
        "publishedAt": "2021-02-03T00:00:00.000000Z",
        "updatedAt": "2022-04-24T06:24:54.000000Z",
        "pin": false,
        "body": "<p>This article was written using a Kobo as eReader.</p>\n<p><strong>Required</strong></p>\n<ul>\n<li>\n<a href=\"https://calibre-ebook.com\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Calibre</strong></a>: to manage your comics and mangas</li>\n</ul>\n<h2 id=\"review\">Review</h2>\n<p>For a series of eBooks, you can have a <strong>series</strong> feature, if the series is set your eReader could not display it. If you want short guide, check this, otherwise you can read all article.</p>\n<ul>\n<li>Connect your eReader to your computer 🔌</li>\n<li>Add EPUB files to your eReader (with Calibre or manually) 📁</li>\n<li>Disconnect and wait importation by your eReader ⏏️</li>\n<li>Check if books are present 📚</li>\n<li>Connect <strong>again</strong> your eReader to your computer 🔌</li>\n<li>Open Calibre 📚</li>\n<li>Click on <strong>Device</strong> in Calibre and execute <em>Update cached metadata on device</em> 👩‍💻</li>\n<li>Disconnect your eReader after seconds ⏏️</li>\n<li>Check in <strong>My books</strong>, in <em>Series</em> tab if series appear 📖</li>\n</ul>\n<hr>\n<h2 id=\"about-series\">About series</h2>\n<p>On Bookshelves, many EPUB files have <strong>series</strong> <em>metadata</em> to display book series and series number. If you transfer directly EPUB files from Bookshelves on your eReader or if you use Calibre (or other software to format EPUB files) to set series, you can have some problem to display your eBooks by series on your eReader.</p>\n<ul>\n<li>With a eReader you can transfer manually EPUB files to your eReader with USB cable from your computer, if you transfer EPUB files like this, you can find your eBooks on your eReader but series won't work because <em>metadata</em> of eReader have to be refreshed.</li>\n<li>With eBooks from eReader shop you can download eBooks with <strong>sync</strong> and series will work because sync update <em>metadata</em> for eBooks from eReader shop.</li>\n</ul>\n<p>If you want to refresh <em>metadata</em> for eBooks manually transfered, you will need to use Calibre software (you can transfer manually EPUB files but you will have to execute an option on Calibre), so if you haven't, <a href=\"https://calibre-ebook.com\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>download and install Calibre</strong></a>.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/554/ereader-series-calibre-serie.webp.webp\" alt=\"An example of EPUB file with series and number on Calibre\" loading=\"lazy\">\n<h3 id=\"refresh-metadata\">Refresh <em>metadata</em></h3>\n<p>Now you can transfer manually any eBooks which have a series, transfer all the series on your eReader with USB cable.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/555/ereader-series-books-list.webp.webp\" alt=\"Here an example with L'Autre, a books series of Pierre Bottero transfered to my eReader\" loading=\"lazy\">\n<p>When EPUB are on your eReader, you can <strong>safely</strong> disconnect it. Wait seconds to let eReader to import new content and when it's done and you can see new books, you will see in <strong>My books</strong>, on tab <em>Series</em>, you will <strong>not see</strong> the series. It's because eReader haven't refresh <em>metadata</em>, to refresh this, you need to connect again your eReader to your computer and open Calibre.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/556/ereader-series-calibre.webp.webp\" alt=\"Click on Device from toolbar\" loading=\"lazy\">\n<p>And you will see <strong>Device</strong> entry on Calibre, and you can execute <strong>Update cached metadata on device</strong>, this option will refresh <em>metadata</em> and now you can safely disconnect your eReader from your computer and you will see the series in <em>Series</em> tab in <strong>My books</strong>.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/557/ereader-series-calibre-options.webp.webp\" alt=\"Select Update cached metadata on device\" loading=\"lazy\">\n<p>You will have to do this <strong>each time</strong> you add a new series to your eReader.</p>\n<img src=\"https://bookshelves.ink/storage/media/cms/558/ereader-series-kobo-series.webp.webp\" alt=\"An example of series on Kobo\" loading=\"lazy\">\n<hr>\n<h2 id=\"why-series-have-this-problem\">Why series have this problem?</h2>\n<p>EPUB files use metadata to display informations about their content: title, authors, cover, description, publisher, language... But these metadata respect a guide wrote by W3C, here you can find <a href=\"https://www.w3.org/publishing/epub3/epub-packages.html\" target=\"_blank\" rel=\"noopener noreferrer\">EPUB 3 Metadata guide</a> but many eBooks use EPUB 2 system today*¹. In this guide, you can see <code>series</code> not exist (except for <code>collection</code> but not like a real have to be with title and volume number). Calibre found a solution: create new custom metadata out of W3C guide, so Calibre can read it to display eBooks by series but not eReaders.</p>\n<p>To display correctly series on your eReader, Calibre have to list all ebooks which use custom series metadata and update database of your eReader to add series data to allow eReader to display these informations. For example, if you have a eReader eReader and you buy an eBook on store with a series information, when eBook will be downloaded on your eReader, store will update your eReader database too to display series.</p>\n<p>Today, there is not magic solution about this problem but Calibre offer a simple solution. If you want to know more about EPUB metadata, you can check <a href=\"https://www.dublincore.org/specifications/dublin-core/dcmi-terms\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Dublin Core Metadata initiative</strong></a>.</p>\n<p>*¹: today most eReader can't read EPUB 3, so EPUB 2 is the common format for lot of EPUB, to know what differences exists, you can check <a href=\"https://www.w3.org/AudioVideo/ebook\" target=\"_blank\" rel=\"noopener noreferrer\">W3C guide</a></p>\n"
    }
}
 

Request      

GET api/posts/{post_slug}

URL Parameters

post_slug  string  

slug of post in meta.slug posts' list, example: get-series

Entities

Endpoint about data from main entities.

Search full-text into authors, books & series.

Route name: api.search

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/search?q=hawthorne" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/search"
);

const params = {
    "q": "hawthorne",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/search',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'q'=> 'hawthorne',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4995
vary: Origin
 

{
    "data": {
        "count": 2,
        "type": "meilisearch",
        "relevant": {
            "authors": [
                {
                    "meta": {
                        "entity": "author",
                        "author": null,
                        "slug": "hawthorne-nathaniel",
                        "show": "https://bookshelves.ink/api/authors/hawthorne-nathaniel"
                    },
                    "title": "Hawthorne Nathaniel",
                    "type": null,
                    "authors": null,
                    "serie": null,
                    "language": null,
                    "volume": null,
                    "count": null,
                    "cover": {
                        "thumbnail": "https://bookshelves.ink/storage/media/covers/486/conversions/hawthorne-nathaniel-thumbnail.webp",
                        "original": "https://bookshelves.ink/storage/media/covers/486/hawthorne-nathaniel.webp",
                        "simple": "https://bookshelves.ink/storage/media/covers/486/conversions/hawthorne-nathaniel-simple.jpg",
                        "color": "#3a2416"
                    },
                    "first_char": "h"
                }
            ],
            "series": [],
            "books": [
                {
                    "meta": {
                        "entity": "book",
                        "author": "hawthorne-nathaniel",
                        "slug": "la-lettre-ecarlate-novel-fr",
                        "show": "https://bookshelves.ink/api/books/hawthorne-nathaniel/la-lettre-ecarlate-novel-fr"
                    },
                    "title": "La Lettre écarlate",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Hawthorne Nathaniel",
                            "meta": {
                                "entity": "author",
                                "slug": "hawthorne-nathaniel",
                                "show": "https://bookshelves.ink/api/authors/hawthorne-nathaniel"
                            }
                        }
                    ],
                    "serie": null,
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": null,
                    "count": null,
                    "cover": {
                        "thumbnail": "https://bookshelves.ink/storage/media/covers/203/conversions/la-lettre-ecarlate-novel-fr-thumbnail.webp",
                        "original": "https://bookshelves.ink/storage/media/covers/203/la-lettre-ecarlate-novel-fr.webp",
                        "simple": "https://bookshelves.ink/storage/media/covers/203/conversions/la-lettre-ecarlate-novel-fr-simple.jpg",
                        "color": "#949193"
                    },
                    "first_char": null
                }
            ]
        },
        "other": {
            "authors": [],
            "series": [],
            "books": []
        }
    }
}
 

GET Entity[] latest entries.

Get all Books ordered by date updated_at, limited to 10 results (no pagination).

Route name: api.entities.latest

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/entities/latest" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/entities/latest"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/entities/latest',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4994
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "entity": "book",
                "author": "vian-boris",
                "slug": "les-morts-ont-tous-la-meme-peau-novel-fr",
                "show": "https://bookshelves.ink/api/books/vian-boris/les-morts-ont-tous-la-meme-peau-novel-fr"
            },
            "title": "Les Morts ont tous la même peau",
            "type": "Novel",
            "authors": [
                {
                    "name": "Vian Boris",
                    "meta": {
                        "entity": "author",
                        "slug": "vian-boris",
                        "show": "https://bookshelves.ink/api/authors/vian-boris"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/392/conversions/les-morts-ont-tous-la-meme-peau-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/392/les-morts-ont-tous-la-meme-peau-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/392/conversions/les-morts-ont-tous-la-meme-peau-novel-fr-simple.jpg",
                "color": "#d3a09a"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "voltaire",
                "slug": "zadig-ou-la-destinee-orientale-novel-fr",
                "show": "https://bookshelves.ink/api/books/voltaire/zadig-ou-la-destinee-orientale-novel-fr"
            },
            "title": "Zadig ou La Destinée Orientale",
            "type": "Novel",
            "authors": [
                {
                    "name": "Voltaire ",
                    "meta": {
                        "entity": "author",
                        "slug": "voltaire",
                        "show": "https://bookshelves.ink/api/authors/voltaire"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/402/conversions/zadig-ou-la-destinee-orientale-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/402/zadig-ou-la-destinee-orientale-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/402/conversions/zadig-ou-la-destinee-orientale-novel-fr-simple.jpg",
                "color": "#88736c"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "au-bonheur-des-dames-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/au-bonheur-des-dames-novel-fr"
            },
            "title": "Au bonheur des dames",
            "type": "Novel",
            "authors": [
                {
                    "name": "Zola Émile",
                    "meta": {
                        "entity": "author",
                        "slug": "zola-emile",
                        "show": "https://bookshelves.ink/api/authors/zola-emile"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/408/conversions/au-bonheur-des-dames-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/408/au-bonheur-des-dames-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/408/conversions/au-bonheur-des-dames-novel-fr-simple.jpg",
                "color": "#837453"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "la-terre-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/la-terre-novel-fr"
            },
            "title": "La Terre",
            "type": "Novel",
            "authors": [
                {
                    "name": "Zola Émile",
                    "meta": {
                        "entity": "author",
                        "slug": "zola-emile",
                        "show": "https://bookshelves.ink/api/authors/zola-emile"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/436/conversions/la-terre-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/436/la-terre-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/436/conversions/la-terre-novel-fr-simple.jpg",
                "color": "#bba898"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "le-capitaine-burle-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/le-capitaine-burle-novel-fr"
            },
            "title": "Le Capitaine Burle",
            "type": "Novel",
            "authors": [
                {
                    "name": "Zola Émile",
                    "meta": {
                        "entity": "author",
                        "slug": "zola-emile",
                        "show": "https://bookshelves.ink/api/authors/zola-emile"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/438/conversions/le-capitaine-burle-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/438/le-capitaine-burle-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/438/conversions/le-capitaine-burle-novel-fr-simple.jpg",
                "color": "#a57245"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "nana-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/nana-novel-fr"
            },
            "title": "Nana",
            "type": "Novel",
            "authors": [
                {
                    "name": "Zola Émile",
                    "meta": {
                        "entity": "author",
                        "slug": "zola-emile",
                        "show": "https://bookshelves.ink/api/authors/zola-emile"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/448/conversions/nana-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/448/nana-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/448/conversions/nana-novel-fr-simple.jpg",
                "color": "#8c8a77"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "pot-bouille-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/pot-bouille-novel-fr"
            },
            "title": "Pot-Bouille",
            "type": "Novel",
            "authors": [
                {
                    "name": "Zola Émile",
                    "meta": {
                        "entity": "author",
                        "slug": "zola-emile",
                        "show": "https://bookshelves.ink/api/authors/zola-emile"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/450/conversions/pot-bouille-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/450/pot-bouille-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/450/conversions/pot-bouille-novel-fr-simple.jpg",
                "color": "#bababa"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "bourses-de-voyage-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/bourses-de-voyage-novel-fr"
            },
            "title": "Bourses de voyage",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/274/conversions/bourses-de-voyage-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/274/bourses-de-voyage-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/274/conversions/bourses-de-voyage-novel-fr-simple.jpg",
                "color": "#a29977"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "cinq-semaines-en-ballon-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/cinq-semaines-en-ballon-novel-fr"
            },
            "title": "Cinq semaines en ballon",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/276/conversions/cinq-semaines-en-ballon-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/276/cinq-semaines-en-ballon-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/276/conversions/cinq-semaines-en-ballon-novel-fr-simple.jpg",
                "color": "#ab6c5f"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "de-la-terre-a-la-lune-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/de-la-terre-a-la-lune-novel-fr"
            },
            "title": "De la Terre à la Lune",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/280/conversions/de-la-terre-a-la-lune-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/280/de-la-terre-a-la-lune-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/280/conversions/de-la-terre-a-la-lune-novel-fr-simple.jpg",
                "color": "#666561"
            },
            "first_char": null
        }
    ]
}
 

Request      

GET api/entities/latest

GET Entity[] from Selectionable.

Get all entities selected, limited to 10 results (no pagination).

Route name: api.entities.selection

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/entities/selection" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/entities/selection"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/entities/selection',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4993
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "entity": "book",
                "author": "dickens-charles",
                "slug": "aventures-de-monsieur-pickwick-novel-en",
                "show": "https://bookshelves.ink/api/books/dickens-charles/aventures-de-monsieur-pickwick-novel-en"
            },
            "title": "Aventures de Monsieur Pickwick",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "English",
                "meta": {
                    "slug": "en"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/77/conversions/aventures-de-monsieur-pickwick-novel-en-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/77/aventures-de-monsieur-pickwick-novel-en.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/77/conversions/aventures-de-monsieur-pickwick-novel-en-simple.jpg",
                "color": "#b19a81"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "la-journee-dun-journaliste-americain-en-2890-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr"
            },
            "title": "La journée d'un journaliste américain en 2890",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/314/conversions/la-journee-dun-journaliste-americain-en-2890-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/314/la-journee-dun-journaliste-americain-en-2890-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/314/conversions/la-journee-dun-journaliste-americain-en-2890-novel-fr-simple.jpg",
                "color": "#949494"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "dumas-alexandre",
                "slug": "le-vicomte-de-bragelonne-tome-i-novel-fr",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-vicomte-de-bragelonne-tome-i-novel-fr"
            },
            "title": "Le Vicomte de Bragelonne, tome I",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": "Le Vicomte de Bragelonne",
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": 1,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/181/conversions/le-vicomte-de-bragelonne-tome-i-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/181/le-vicomte-de-bragelonne-tome-i-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/181/conversions/le-vicomte-de-bragelonne-tome-i-novel-fr-simple.jpg",
                "color": "#5a5215"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "famille-sans-nom-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/famille-sans-nom-novel-fr"
            },
            "title": "Famille-sans-nom",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/288/conversions/famille-sans-nom-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/288/famille-sans-nom-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/288/conversions/famille-sans-nom-novel-fr-simple.jpg",
                "color": "#94797d"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "la-maison-a-vapeur-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/la-maison-a-vapeur-novel-fr"
            },
            "title": "La Maison à vapeur",
            "type": "Novel",
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/316/conversions/la-maison-a-vapeur-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/316/la-maison-a-vapeur-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/316/conversions/la-maison-a-vapeur-novel-fr-simple.jpg",
                "color": "#c37ab2"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "joseph-balsamo-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/joseph-balsamo-novel-fr"
            },
            "title": "Joseph Balsamo",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 4,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/467/conversions/joseph-balsamo-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/467/joseph-balsamo-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/467/conversions/joseph-balsamo-novel-fr-simple.jpg",
                "color": "#a59b91"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dickens-charles",
                "slug": "lami-commun-novel-fr",
                "show": "https://bookshelves.ink/api/series/dickens-charles/lami-commun-novel-fr"
            },
            "title": "L'Ami commun",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 2,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/462/lami-commun-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-simple.jpg",
                "color": "#655360"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "le-vicomte-de-bragelonne-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-vicomte-de-bragelonne-novel-fr"
            },
            "title": "Le Vicomte de Bragelonne",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 4,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/474/conversions/le-vicomte-de-bragelonne-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/474/le-vicomte-de-bragelonne-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/474/conversions/le-vicomte-de-bragelonne-novel-fr-simple.jpg",
                "color": "#5a5215"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dickens-charles",
                "slug": "dombey-et-fils-novel-fr",
                "show": "https://bookshelves.ink/api/series/dickens-charles/dombey-et-fils-novel-fr"
            },
            "title": "Dombey Et Fils",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 3,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/461/dombey-et-fils-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-simple.jpg",
                "color": "#29382d"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "les-trois-mousquetaires-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-trois-mousquetaires-novel-fr"
            },
            "title": "Les Trois Mousquetaires",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 2,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/477/conversions/les-trois-mousquetaires-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/477/les-trois-mousquetaires-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/477/conversions/les-trois-mousquetaires-novel-fr-simple.jpg",
                "color": "#dfd6d2"
            },
            "first_char": null
        }
    ]
}
 

Request      

GET api/entities/selection

WITH PAGINATION

Get all Series/Books related to selected Book from Tag.

Route name: api.entities.related

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/entities/related/dumas-alexandre/la-comtesse-de-charny-tome-iii-novel-fr?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/entities/related/dumas-alexandre/la-comtesse-de-charny-tome-iii-novel-fr"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/entities/related/dumas-alexandre/la-comtesse-de-charny-tome-iii-novel-fr',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4992
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "ange-pitou-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr"
            },
            "title": "Ange Pitou",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 2,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/466/conversions/ange-pitou-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/466/ange-pitou-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/466/conversions/ange-pitou-novel-fr-simple.jpg",
                "color": "#9f8886"
            },
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "le-collier-de-la-reine-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-collier-de-la-reine-novel-fr"
            },
            "title": "Le Collier de la Reine",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 2,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/472/conversions/le-collier-de-la-reine-novel-fr-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/472/le-collier-de-la-reine-novel-fr.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/472/conversions/le-collier-de-la-reine-novel-fr-simple.jpg",
                "color": "#c4bfb9"
            },
            "first_char": null
        }
    ],
    "links": {
        "first": "/?page=1",
        "last": "/?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "/?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "/",
        "per_page": 15,
        "to": 2,
        "total": 2
    }
}
 

GET Entity Review[].

Route name: api.entities.reviews

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/entities/reviews/{entity}/{entity_id}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/entities/reviews/{entity}/{entity_id}"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/entities/reviews/{entity}/{entity_id}',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4991
vary: Origin
 

{
    "message": "App\\Http\\Controllers\\Api\\EntityController::reviews(): Argument #3 ($id) must be of type int, string given, called in /home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Controller.php on line 54",
    "exception": "TypeError",
    "file": "/home/ewilan/www/bookshelves-back/app/Http/Controllers/Api/EntityController.php",
    "line": 84,
    "trace": [
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
            "line": 54,
            "function": "reviews",
            "class": "App\\Http\\Controllers\\Api\\EntityController",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
            "line": 45,
            "function": "callAction",
            "class": "Illuminate\\Routing\\Controller",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
            "line": 261,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\ControllerDispatcher",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
            "line": 204,
            "function": "runController",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 725,
            "function": "run",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php",
            "line": 50,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Routing\\Middleware\\SubstituteBindings",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 126,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 102,
            "function": "handleRequest",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 54,
            "function": "handleRequestUsingNamedLimiter",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 33,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Laravel\\Sanctum\\Http\\Middleware\\{closure}",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 34,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 726,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 703,
            "function": "runRouteWithinStack",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 667,
            "function": "runRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 656,
            "function": "dispatchToRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 167,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Illuminate\\Foundation\\Http\\{closure}",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/livewire/livewire/src/DisableBrowserCache.php",
            "line": 19,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Livewire\\DisableBrowserCache",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
            "line": 31,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
            "line": 40,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
            "line": 27,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
            "line": 86,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/fruitcake/laravel-cors/src/HandleCors.php",
            "line": 52,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Fruitcake\\Cors\\HandleCors",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
            "line": 39,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\TrustProxies",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 142,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 111,
            "function": "sendRequestThroughRouter",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 299,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 287,
            "function": "callLaravelOrLumenRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 89,
            "function": "makeApiCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 45,
            "function": "makeResponseCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 35,
            "function": "makeResponseCallIfConditionsPass",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 222,
            "function": "__invoke",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 179,
            "function": "iterateThroughStrategies",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 116,
            "function": "fetchResponses",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 123,
            "function": "processRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 80,
            "function": "extractEndpointsInfoFromLaravelApp",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 56,
            "function": "extractEndpointsInfoAndWriteToDisk",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php",
            "line": 55,
            "function": "get",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 36,
            "function": "handle",
            "class": "Knuckles\\Scribe\\Commands\\GenerateDocumentation",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Util.php",
            "line": 41,
            "function": "Illuminate\\Container\\{closure}",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 93,
            "function": "unwrapIfClosure",
            "class": "Illuminate\\Container\\Util",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 37,
            "function": "callBoundMethod",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 651,
            "function": "call",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 136,
            "function": "call",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Command/Command.php",
            "line": 308,
            "function": "execute",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 121,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Command\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 998,
            "function": "run",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 299,
            "function": "doRunCommand",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 171,
            "function": "doRun",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Application.php",
            "line": 102,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php",
            "line": 129,
            "function": "run",
            "class": "Illuminate\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/artisan",
            "line": 37,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Console\\Kernel",
            "type": "->"
        }
    ]
}
 

Request      

GET api/entities/reviews/{entity}/{entity_id}

Entities: download

Endpoint to download entities.

GET Book.

Content-Type application/epub+zip

Download Book format like epub or cbz.

Route name: api.download.book

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/download/book/dumas-alexandre/la-fille-du-marquis-tome-i-novel-fr" \
    --header "Content-Type: application/epub+zip" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/download/book/dumas-alexandre/la-fille-du-marquis-tome-i-novel-fr"
);

const headers = {
    "Content-Type": "application/epub+zip",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/download/book/dumas-alexandre/la-fille-du-marquis-tome-i-novel-fr',
    [
        'headers' => [
            'Content-Type' => 'application/epub+zip',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: public
content-disposition: inline; filename=dumas-alexandre-fille-du-marquis-01-fille-du-marquis-tome-i-fr.epub
content-type: application/epub+zip
accept-ranges: bytes
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6ImFjM0JRSE5uaXZPVmRibGJzTExsUFE9PSIsInZhbHVlIjoiL2FQSGFua09TQkhkRmxlTVI0REtaRG9yVHhwNlZiSHpheWRKN3pDV0luVSt3UlQrK1FLUnpjZDZpYTM4a2graFpLWTZIMWJPOVBNeHJDdWgyS3UzeUJudG1uMGpuTTloUURKbWlCZWEwSU9mRzVxVW8wRXpaOExmUVg2MnEzRWYiLCJtYWMiOiJkYTA5NGJkZDQ0ZGUxMTNlYWRiZmQxZWM0Zjg2NjFhN2JiOTU2MTI0NThlOGI1MTJjMDU1YTg4YzQ1MGNhZTE5IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6IjgveG1hZFFxcTMzNVFWM045Z1ZCeFE9PSIsInZhbHVlIjoiOVZLekZnVno3YTBqalZvZllHRmU5WGhMQWc1OGErSVhDUi9OOWsyMTlNSVh6bmsxR0JOYU9tT2dzTEV2L2VJVUtKWVFrdGZqVkU4L3VkQmIxR08wSFlBTlZKSFFTUWlMSlYycVJzZWdGQUJWS1AxRXRNYmpveSsxODMxdUtRWnYiLCJtYWMiOiJiNWZjM2FjNjg0NjNjMzkzNDk4YjgwOTVlOTI2YWEzMDcxMjFmMzY1YWU3ZWVmY2Q4Y2MzYjI2NmM1YThlN2E1IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 


 

Request      

GET api/download/book/{author_slug}/{book_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: dumas-alexandre

book_slug  string  

slug of book in meta.slug books' list, example: la-fille-du-marquis-tome-i-novel-fr

format  string optional  

Format for Book or Book[], if null get first format available if format not exist return 404, to have a format list, check api.entities.enums.

GET Book[] belongs to Author.

Content-Type application/octet-stream

Download Author ZIP.

Route name: api.download.author

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/download/author/shelley-mary/epub" \
    --header "Content-Type: application/octet-stream" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/download/author/shelley-mary/epub"
);

const headers = {
    "Content-Type": "application/octet-stream",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/download/author/shelley-mary/epub',
    [
        'headers' => [
            'Content-Type' => 'application/octet-stream',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
content-disposition: attachment; filename="shelley-mary-fflxtxka.zip"
content-type: application/octet-stream
cache-control: no-cache, private
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IlM5aGpITkRBbmtQNnI1aGpKMjNXU1E9PSIsInZhbHVlIjoidndQWTdnTTJxVm5IWWFjMitnbkxjT3RyanpFMUpVUVdiOWFNK1JGdGtSWCtFTjNoQVVTcUF6OXpyQ2RBQU9naVVLaEJwaHY0elloSDZpYmhqMUkxTjF2dHBWMHpkaDN6VkFYTGpGMEpXbWJuczl4NWkyMVdyMG54VjJpaUtSQWEiLCJtYWMiOiI5ODFhMTFhZWFmNmM1MTZmZWM2ZDgzOGY1OTE3Mzg3NzY2ZTlmMjcwY2M4ZjU2MDkwNmZhYzZmN2RhMzRmOTI3IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6InBuK0RsRktwNm95cVdvcThmQSttR0E9PSIsInZhbHVlIjoiemttR3NOSStEM1FmbVFiM3pWWE1uL1ZXOXZGWlFmN1BHRU9YdThQQkFWRmxEOU4zWk5qakx2NStGc0pMRDhzd1BRTjBoa2lOOXJLWjhzb0pBdDdUL3lsdFRiRURaOENzazF6d2h0Wk9iMzFvQzlLSDMvb1VBaERTM09Qek5LZk0iLCJtYWMiOiI0OWQ2NWI0ZjllYTRmNzhjOTI1M2IyYzY2OTYwM2NjM2UzN2JhZmJlZDk0YjY0YjU0YWZhODRkMTA1OTY2NjRkIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 


 

Request      

GET api/download/author/{author_slug}/{format?}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: shelley-mary

format  string optional  

Format for Book or Book[], if null get first format available if format not exist return 404, to have a format list, check api.entities.enums.

GET Book[] belongs to Serie.

Content-Type application/octet-stream

Download Serie ZIP.

Route name: api.download.serie

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/download/serie/dickens-charles/le-magasin-dantiquites-novel-fr/epub" \
    --header "Content-Type: application/octet-stream" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/download/serie/dickens-charles/le-magasin-dantiquites-novel-fr/epub"
);

const headers = {
    "Content-Type": "application/octet-stream",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/download/serie/dickens-charles/le-magasin-dantiquites-novel-fr/epub',
    [
        'headers' => [
            'Content-Type' => 'application/octet-stream',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
content-disposition: attachment; filename="dickens-charles-le-magasin-dantiquites-novel-fr-wsswcmfv.zip"
content-type: application/octet-stream
cache-control: no-cache, private
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6ImZBZzZVR3NFTzFKVnJxem5lb01OeWc9PSIsInZhbHVlIjoiR2FUN0JaYjQzYVhXbUxjVTZ4UFROVWNCK1JrNGZRR0szREpWblByRDlmQTJmN3FKS08zaVFaK3BvbmZOQ2lBUEZZWVQyVDhuL3F1Q0FnK3ZKbndlZ2FNQ2JBK2NDb093SmtLWTVrczdMUFNYYmxYL08vRjJ1VU9IKzlKQVVMOVMiLCJtYWMiOiIzYjk3N2FmNzdlOTdmYzkxYTFhNzRiYjBiMWVmYTdhNTEwMTYzODc4ZmUzZmU3ZjkxM2FmMWZlZDQ1NGJlZTQ4IiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6Ii95T3NBVmJnYXNmL2dmbzZKTHl3Q2c9PSIsInZhbHVlIjoiVVBpOTZHbW40OWVDV2NIbTJoK1ZQRXRwckdOTzltZWRGVUwraU9wdXJjNnpLcWdhRXBzZ3hXVHViWktaSklpNk1nS25VTFR6aFRsZ3Yrb1hGRkRhdlh0bUp6WTQ0Ym5iZ0g5STBvalB6RW92cUtmNEhWTEJmWUxFRkNtOXlyMXkiLCJtYWMiOiJkYmFjYWI2NjFiNWRjNGRkYzg2Zjc1MmExZmNkMDk4NTY5ZTgwYTg0NWM3MTJkOTdjY2NiNTZkMzNjNTk2MzRkIiwidGFnIjoiIn0%3D; expires=Sat, 02 Jul 2022 10:18:02 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 


 

Request      

GET api/download/serie/{author_slug}/{serie_slug}/{format?}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: dickens-charles

serie_slug  string  

slug of serie in meta.slug series' list, example: le-magasin-dantiquites-novel-fr

format  string optional  

Format for Book or Book[], if null get first format available if format not exist return 404, to have a format list, check api.entities.enums.

Entity: Author

Endpoint to get Authors data.

GET Author[].

WITH PAGINATION

Get all authors ordered by title & serie_title.

Route name: api.authors.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/authors?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/authors',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4989
vary: Origin
 

{
    "data": [
        {
            "name": "Andersen Hans Christian",
            "meta": {
                "entity": "author",
                "slug": "andersen-hans-christian",
                "show": "https://bookshelves.ink/api/authors/andersen-hans-christian"
            },
            "lastname": "Andersen",
            "firstname": "Hans Christian",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-thumbnail.webp",
                "og": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-og.jpg",
                "simple": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-simple.jpg",
                "color": "#a18667"
            },
            "count": {
                "books": 1,
                "series": 0
            }
        },
        {
            "name": "Apollinaire Guillaume",
            "meta": {
                "entity": "author",
                "slug": "apollinaire-guillaume",
                "show": "https://bookshelves.ink/api/authors/apollinaire-guillaume"
            },
            "lastname": "Apollinaire",
            "firstname": "Guillaume",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/480/conversions/apollinaire-guillaume-thumbnail.webp",
                "og": "https://bookshelves.ink/storage/media/covers/480/conversions/apollinaire-guillaume-og.jpg",
                "simple": "https://bookshelves.ink/storage/media/covers/480/conversions/apollinaire-guillaume-simple.jpg",
                "color": "#a7a7a7"
            },
            "count": {
                "books": 1,
                "series": 0
            }
        },
        {
            "name": "Austen Jane",
            "meta": {
                "entity": "author",
                "slug": "austen-jane",
                "show": "https://bookshelves.ink/api/authors/austen-jane"
            },
            "lastname": "Austen",
            "firstname": "Jane",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/481/conversions/austen-jane-thumbnail.webp",
                "og": "https://bookshelves.ink/storage/media/covers/481/conversions/austen-jane-og.jpg",
                "simple": "https://bookshelves.ink/storage/media/covers/481/conversions/austen-jane-simple.jpg",
                "color": "#dbd2cc"
            },
            "count": {
                "books": 1,
                "series": 0
            }
        },
        {
            "name": "Carroll Lewis",
            "meta": {
                "entity": "author",
                "slug": "carroll-lewis",
                "show": "https://bookshelves.ink/api/authors/carroll-lewis"
            },
            "lastname": "Carroll",
            "firstname": "Lewis",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/482/conversions/carroll-lewis-thumbnail.webp",
                "og": "https://bookshelves.ink/storage/media/covers/482/conversions/carroll-lewis-og.jpg",
                "simple": "https://bookshelves.ink/storage/media/covers/482/conversions/carroll-lewis-simple.jpg",
                "color": "#58493e"
            },
            "count": {
                "books": 1,
                "series": 0
            }
        },
        {
            "name": "Darwin Charles",
            "meta": {
                "entity": "author",
                "slug": "darwin-charles",
                "show": "https://bookshelves.ink/api/authors/darwin-charles"
            },
            "lastname": "Darwin",
            "firstname": "Charles",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/483/conversions/darwin-charles-thumbnail.webp",
                "og": "https://bookshelves.ink/storage/media/covers/483/conversions/darwin-charles-og.jpg",
                "simple": "https://bookshelves.ink/storage/media/covers/483/conversions/darwin-charles-simple.jpg",
                "color": "#5c5c5c"
            },
            "count": {
                "books": 1,
                "series": 0
            }
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/authors?page=1",
        "last": "https://bookshelves.ink/api/authors?page=6",
        "prev": null,
        "next": "https://bookshelves.ink/api/authors?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 6,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=6",
                "label": "6",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/authors",
        "per_page": 5,
        "to": 5,
        "total": 26
    }
}
 

Request      

GET api/authors

Query Parameters

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

Response

Response Fields

data  object[]  

List of authors.

links  object  

Links to get other pages.

meta  object  

Metadata about pagination.

GET Author.

Details for one Author, find by slug.

Route name: api.authors.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/authors/prevost-antoine-francois" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/prevost-antoine-francois"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/authors/prevost-antoine-francois',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4988
vary: Origin
 

{
    "data": {
        "name": "Prévost Antoine François",
        "meta": {
            "entity": "author",
            "slug": "prevost-antoine-francois",
            "show": "https://bookshelves.ink/api/authors/prevost-antoine-francois",
            "books": "https://bookshelves.ink/api/authors/books/prevost-antoine-francois",
            "series": "https://bookshelves.ink/api/authors/series/prevost-antoine-francois",
            "reviews": "https://bookshelves.ink/api/entities/reviews/author/15"
        },
        "lastname": "Prévost",
        "firstname": "Antoine François",
        "cover": {
            "thumbnail": "https://bookshelves.ink/storage/media/covers/493/conversions/prevost-antoine-francois-thumbnail.webp",
            "og": "https://bookshelves.ink/storage/media/covers/493/conversions/prevost-antoine-francois-og.jpg",
            "simple": "https://bookshelves.ink/storage/media/covers/493/conversions/prevost-antoine-francois-simple.jpg",
            "color": "#999692"
        },
        "count": {
            "books": 1,
            "series": 0
        },
        "description": "L’abbé Antoine François Prévost d'Exiles [pʁevo], dit l'abbé Prévost, né le 1er avril 1697 à Hesdin (France) et décédé le 25 novembre 1763 à Courteuil (France), est un romancier, historien, journaliste, traducteur et homme d'Église français. Biographie\nJeunesse et années de formation\nFils de Liévin Prevost (1666-1739), avocat au parlement, conseiller et procureur du roi au bailliage d’Hesdin, lui-même fils d’un maître brasseur, Prévost fait des études au collège d’Hesdin où il est remarqué par les jésuites qui l’envoient, avec son frère Liévin-Norbert, au noviciat du collège d'Harcourt à Paris, peut-être dès 1712 ou 1713. Cependant les Pères, l’ayant surpris à travailler à un ouvrage profane, l’auraient congédié en 1714. Sur le chemin de Rome pour demander au pape de le réintégrer dans l’Ordre, il aurait rencontré un officier qui l’aurait persuadé de s’engager. Bientôt déserteur, il s’enfuit en Hollande où il tient un café. Il aurait profité de l’amnistie générale proclamée par le duc...",
        "link": "https://fr.wikipedia.org/wiki/Antoine_Fran%C3%A7ois_Pr%C3%A9vost",
        "download": {
            "name": "prevost-antoine-francois",
            "size": "3.60 Mo",
            "url": "https://bookshelves.ink/api/download/author/prevost-antoine-francois/epub",
            "reader": null,
            "format": "epub",
            "count": 1,
            "isZip": true
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "prevost-antoine-francois",
                "size": "3.60 Mo",
                "url": "https://bookshelves.ink/api/download/author/prevost-antoine-francois/epub",
                "reader": null,
                "format": "epub",
                "count": 1,
                "isZip": true
            }
        },
        "isFavorite": false,
        "reviews": []
    }
}
 

Request      

GET api/authors/{author_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: prevost-antoine-francois

GET Book[] belongs to Author.

Books list from an author, find by slug.

Route name: api.authors.show.books

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/authors/books/dumas-alexandre?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/books/dumas-alexandre"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/authors/books/dumas-alexandre',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4987
vary: Origin
 

{
    "data": [
        {
            "title": "Ange Pitou, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "ange-pitou-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/ange-pitou-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1851-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/137/conversions/ange-pitou-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/137/conversions/ange-pitou-tome-i-novel-fr-simple.jpg",
                "color": "#9f8886"
            },
            "volume": 1,
            "serie": {
                "title": "Ange Pitou",
                "meta": {
                    "entity": "serie",
                    "slug": "ange-pitou-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr"
                }
            }
        },
        {
            "title": "Ange Pitou, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "ange-pitou-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/ange-pitou-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1851-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/139/conversions/ange-pitou-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/139/conversions/ange-pitou-tome-ii-novel-fr-simple.jpg",
                "color": "#847582"
            },
            "volume": 2,
            "serie": {
                "title": "Ange Pitou",
                "meta": {
                    "entity": "serie",
                    "slug": "ange-pitou-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr"
                }
            }
        },
        {
            "title": "Les Blancs et les Bleus, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-blancs-et-les-bleus-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-blancs-et-les-bleus-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-13T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/189/conversions/les-blancs-et-les-bleus-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/189/conversions/les-blancs-et-les-bleus-tome-i-novel-fr-simple.jpg",
                "color": "#98887d"
            },
            "volume": 1,
            "serie": {
                "title": "Les Blancs et les Bleus",
                "meta": {
                    "entity": "serie",
                    "slug": "les-blancs-et-les-bleus-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-blancs-et-les-bleus-novel-fr"
                }
            }
        },
        {
            "title": "Les Blancs et les Bleus, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-blancs-et-les-bleus-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-blancs-et-les-bleus-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-13T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/191/conversions/les-blancs-et-les-bleus-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/191/conversions/les-blancs-et-les-bleus-tome-ii-novel-fr-simple.jpg",
                "color": "#65535f"
            },
            "volume": 2,
            "serie": {
                "title": "Les Blancs et les Bleus",
                "meta": {
                    "entity": "serie",
                    "slug": "les-blancs-et-les-bleus-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-blancs-et-les-bleus-novel-fr"
                }
            }
        },
        {
            "title": "Le chevalier de Maison-Rouge",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "le-chevalier-de-maison-rouge-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-chevalier-de-maison-rouge-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-13T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/131/conversions/le-chevalier-de-maison-rouge-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/131/conversions/le-chevalier-de-maison-rouge-novel-fr-simple.jpg",
                "color": "#a0a57c"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "Le Collier de la Reine, tome 1",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "le-collier-de-la-reine-tome-1-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-collier-de-la-reine-tome-1-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1850-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/173/conversions/le-collier-de-la-reine-tome-1-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/173/conversions/le-collier-de-la-reine-tome-1-novel-fr-simple.jpg",
                "color": "#c4bfb9"
            },
            "volume": 1,
            "serie": {
                "title": "Le Collier de la Reine",
                "meta": {
                    "entity": "serie",
                    "slug": "le-collier-de-la-reine-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-collier-de-la-reine-novel-fr"
                }
            }
        },
        {
            "title": "Le Collier de la Reine, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "le-collier-de-la-reine-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-collier-de-la-reine-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1850-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/175/conversions/le-collier-de-la-reine-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/175/conversions/le-collier-de-la-reine-tome-ii-novel-fr-simple.jpg",
                "color": "#1f3c52"
            },
            "volume": 2,
            "serie": {
                "title": "Le Collier de la Reine",
                "meta": {
                    "entity": "serie",
                    "slug": "le-collier-de-la-reine-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-collier-de-la-reine-novel-fr"
                }
            }
        },
        {
            "title": "Les Compagnons de Jéhu",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-compagnons-de-jehu-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-compagnons-de-jehu-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2012-03-26T20:17:37.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/135/conversions/les-compagnons-de-jehu-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/135/conversions/les-compagnons-de-jehu-novel-fr-simple.jpg",
                "color": "#87827e"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "La Comtesse de Charny, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-comtesse-de-charny-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-comtesse-de-charny-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1855-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/149/conversions/la-comtesse-de-charny-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/149/conversions/la-comtesse-de-charny-tome-i-novel-fr-simple.jpg",
                "color": "#be6b70"
            },
            "volume": 1,
            "serie": {
                "title": "La Comtesse de Charny",
                "meta": {
                    "entity": "serie",
                    "slug": "la-comtesse-de-charny-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
                }
            }
        },
        {
            "title": "La Comtesse de Charny, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-comtesse-de-charny-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-comtesse-de-charny-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1855-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/151/conversions/la-comtesse-de-charny-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/151/conversions/la-comtesse-de-charny-tome-ii-novel-fr-simple.jpg",
                "color": "#a2919a"
            },
            "volume": 2,
            "serie": {
                "title": "La Comtesse de Charny",
                "meta": {
                    "entity": "serie",
                    "slug": "la-comtesse-de-charny-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
                }
            }
        },
        {
            "title": "La Comtesse de Charny, tome III",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-comtesse-de-charny-tome-iii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-comtesse-de-charny-tome-iii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1855-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/153/conversions/la-comtesse-de-charny-tome-iii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/153/conversions/la-comtesse-de-charny-tome-iii-novel-fr-simple.jpg",
                "color": "#9f918b"
            },
            "volume": 3,
            "serie": {
                "title": "La Comtesse de Charny",
                "meta": {
                    "entity": "serie",
                    "slug": "la-comtesse-de-charny-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
                }
            }
        },
        {
            "title": "La Comtesse de Charny, tome IV",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-comtesse-de-charny-tome-iv-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-comtesse-de-charny-tome-iv-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1855-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/155/conversions/la-comtesse-de-charny-tome-iv-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/155/conversions/la-comtesse-de-charny-tome-iv-novel-fr-simple.jpg",
                "color": "#b5af92"
            },
            "volume": 4,
            "serie": {
                "title": "La Comtesse de Charny",
                "meta": {
                    "entity": "serie",
                    "slug": "la-comtesse-de-charny-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
                }
            }
        },
        {
            "title": "La Comtesse de Charny, tome V",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-comtesse-de-charny-tome-v-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-comtesse-de-charny-tome-v-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1855-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/157/conversions/la-comtesse-de-charny-tome-v-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/157/conversions/la-comtesse-de-charny-tome-v-novel-fr-simple.jpg",
                "color": "#ada4a9"
            },
            "volume": 5,
            "serie": {
                "title": "La Comtesse de Charny",
                "meta": {
                    "entity": "serie",
                    "slug": "la-comtesse-de-charny-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
                }
            }
        },
        {
            "title": "La dame aux camélias",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-dame-aux-camelias-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-dame-aux-camelias-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1852-04-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/129/conversions/la-dame-aux-camelias-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/129/conversions/la-dame-aux-camelias-novel-fr-simple.jpg",
                "color": "#635c57"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "La Dame de Monsoreau, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-dame-de-monsoreau-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-dame-de-monsoreau-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-13T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/159/conversions/la-dame-de-monsoreau-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/159/conversions/la-dame-de-monsoreau-tome-i-novel-fr-simple.jpg",
                "color": "#ceaea4"
            },
            "volume": 1,
            "serie": {
                "title": "La Dame de Monsoreau",
                "meta": {
                    "entity": "serie",
                    "slug": "la-dame-de-monsoreau-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-dame-de-monsoreau-novel-fr"
                }
            }
        },
        {
            "title": "La dame de Monsoreau, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-dame-de-monsoreau-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-dame-de-monsoreau-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2020-09-21T07:03:23.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/161/conversions/la-dame-de-monsoreau-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/161/conversions/la-dame-de-monsoreau-tome-ii-novel-fr-simple.jpg",
                "color": "#b74974"
            },
            "volume": 2,
            "serie": {
                "title": "La Dame de Monsoreau",
                "meta": {
                    "entity": "serie",
                    "slug": "la-dame-de-monsoreau-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-dame-de-monsoreau-novel-fr"
                }
            }
        },
        {
            "title": "La Dame De Monsoreau, tome III",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-dame-de-monsoreau-tome-iii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-dame-de-monsoreau-tome-iii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-13T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/163/conversions/la-dame-de-monsoreau-tome-iii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/163/conversions/la-dame-de-monsoreau-tome-iii-novel-fr-simple.jpg",
                "color": "#504640"
            },
            "volume": 3,
            "serie": {
                "title": "La Dame de Monsoreau",
                "meta": {
                    "entity": "serie",
                    "slug": "la-dame-de-monsoreau-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-dame-de-monsoreau-novel-fr"
                }
            }
        },
        {
            "title": "Dieu dispose",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "dieu-dispose-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/dieu-dispose-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2013-04-25T15:19:40.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/127/conversions/dieu-dispose-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/127/conversions/dieu-dispose-novel-fr-simple.jpg",
                "color": "#e9e9e8"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "Le docteur mystérieux, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "le-docteur-mysterieux-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-docteur-mysterieux-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2013-04-25T15:20:05.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/177/conversions/le-docteur-mysterieux-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/177/conversions/le-docteur-mysterieux-tome-i-novel-fr-simple.jpg",
                "color": "#cac6bc"
            },
            "volume": 1,
            "serie": {
                "title": "Le docteur mystérieux",
                "meta": {
                    "entity": "serie",
                    "slug": "le-docteur-mysterieux-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-docteur-mysterieux-novel-fr"
                }
            }
        },
        {
            "title": "Le docteur mystérieux, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "le-docteur-mysterieux-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-docteur-mysterieux-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2013-04-25T15:20:14.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/179/conversions/le-docteur-mysterieux-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/179/conversions/le-docteur-mysterieux-tome-ii-novel-fr-simple.jpg",
                "color": "#c6c6c6"
            },
            "volume": 2,
            "serie": {
                "title": "Le docteur mystérieux",
                "meta": {
                    "entity": "serie",
                    "slug": "le-docteur-mysterieux-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-docteur-mysterieux-novel-fr"
                }
            }
        },
        {
            "title": "La Fille du Marquis, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-fille-du-marquis-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-fille-du-marquis-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2013-04-25T15:24:05.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/165/conversions/la-fille-du-marquis-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/165/conversions/la-fille-du-marquis-tome-i-novel-fr-simple.jpg",
                "color": "#d3c8c3"
            },
            "volume": 1,
            "serie": {
                "title": "La fille du marquis",
                "meta": {
                    "entity": "serie",
                    "slug": "la-fille-du-marquis-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-fille-du-marquis-novel-fr"
                }
            }
        },
        {
            "title": "La fille du marquis, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-fille-du-marquis-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-fille-du-marquis-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2013-04-25T15:24:14.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/167/conversions/la-fille-du-marquis-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/167/conversions/la-fille-du-marquis-tome-ii-novel-fr-simple.jpg",
                "color": "#d8cec3"
            },
            "volume": 2,
            "serie": {
                "title": "La fille du marquis",
                "meta": {
                    "entity": "serie",
                    "slug": "la-fille-du-marquis-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-fille-du-marquis-novel-fr"
                }
            }
        },
        {
            "title": "Joseph Balsamo, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "joseph-balsamo-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/joseph-balsamo-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2014-08-05T14:34:20.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/141/conversions/joseph-balsamo-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/141/conversions/joseph-balsamo-tome-i-novel-fr-simple.jpg",
                "color": "#a59b91"
            },
            "volume": 1,
            "serie": {
                "title": "Joseph Balsamo",
                "meta": {
                    "entity": "serie",
                    "slug": "joseph-balsamo-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/joseph-balsamo-novel-fr"
                }
            }
        },
        {
            "title": "Joseph Balsamo, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "joseph-balsamo-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/joseph-balsamo-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2014-08-05T14:34:52.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/143/conversions/joseph-balsamo-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/143/conversions/joseph-balsamo-tome-ii-novel-fr-simple.jpg",
                "color": "#625d45"
            },
            "volume": 2,
            "serie": {
                "title": "Joseph Balsamo",
                "meta": {
                    "entity": "serie",
                    "slug": "joseph-balsamo-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/joseph-balsamo-novel-fr"
                }
            }
        },
        {
            "title": "Joseph Balsamo, tome III",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "joseph-balsamo-tome-iii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/joseph-balsamo-tome-iii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2014-08-05T14:35:22.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/145/conversions/joseph-balsamo-tome-iii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/145/conversions/joseph-balsamo-tome-iii-novel-fr-simple.jpg",
                "color": "#1b1713"
            },
            "volume": 3,
            "serie": {
                "title": "Joseph Balsamo",
                "meta": {
                    "entity": "serie",
                    "slug": "joseph-balsamo-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/joseph-balsamo-novel-fr"
                }
            }
        },
        {
            "title": "Joseph Balsamo, tome IV",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "joseph-balsamo-tome-iv-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/joseph-balsamo-tome-iv-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2014-08-05T14:35:47.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/147/conversions/joseph-balsamo-tome-iv-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/147/conversions/joseph-balsamo-tome-iv-novel-fr-simple.jpg",
                "color": "#a59b91"
            },
            "volume": 4,
            "serie": {
                "title": "Joseph Balsamo",
                "meta": {
                    "entity": "serie",
                    "slug": "joseph-balsamo-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/joseph-balsamo-novel-fr"
                }
            }
        },
        {
            "title": "Les Quarante-Cinq, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-quarante-cinq-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-quarante-cinq-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/193/conversions/les-quarante-cinq-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/193/conversions/les-quarante-cinq-tome-i-novel-fr-simple.jpg",
                "color": "#c29db3"
            },
            "volume": 1,
            "serie": {
                "title": "Les Quarante-Cinq",
                "meta": {
                    "entity": "serie",
                    "slug": "les-quarante-cinq-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-quarante-cinq-novel-fr"
                }
            }
        },
        {
            "title": "Les Quarante-Cinq, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-quarante-cinq-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-quarante-cinq-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2021-02-08T07:08:31.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/195/conversions/les-quarante-cinq-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/195/conversions/les-quarante-cinq-tome-ii-novel-fr-simple.jpg",
                "color": "#9b9193"
            },
            "volume": 2,
            "serie": {
                "title": "Les Quarante-Cinq",
                "meta": {
                    "entity": "serie",
                    "slug": "les-quarante-cinq-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-quarante-cinq-novel-fr"
                }
            }
        },
        {
            "title": "Les Quarante-Cinq, tome III",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-quarante-cinq-tome-iii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-quarante-cinq-tome-iii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/197/conversions/les-quarante-cinq-tome-iii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/197/conversions/les-quarante-cinq-tome-iii-novel-fr-simple.jpg",
                "color": "#c29db3"
            },
            "volume": 3,
            "serie": {
                "title": "Les Quarante-Cinq",
                "meta": {
                    "entity": "serie",
                    "slug": "les-quarante-cinq-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-quarante-cinq-novel-fr"
                }
            }
        },
        {
            "title": "La Reine Margot, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-reine-margot-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-reine-margot-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/169/conversions/la-reine-margot-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/169/conversions/la-reine-margot-tome-i-novel-fr-simple.jpg",
                "color": "#5a3f20"
            },
            "volume": 1,
            "serie": {
                "title": "La Reine Margot",
                "meta": {
                    "entity": "serie",
                    "slug": "la-reine-margot-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-reine-margot-novel-fr"
                }
            }
        },
        {
            "title": "La Reine Margot, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "la-reine-margot-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/la-reine-margot-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/171/conversions/la-reine-margot-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/171/conversions/la-reine-margot-tome-ii-novel-fr-simple.jpg",
                "color": "#5a3f20"
            },
            "volume": 2,
            "serie": {
                "title": "La Reine Margot",
                "meta": {
                    "entity": "serie",
                    "slug": "la-reine-margot-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-reine-margot-novel-fr"
                }
            }
        },
        {
            "title": "Les Trois Mousquetaires",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "les-trois-mousquetaires-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/les-trois-mousquetaires-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2011-01-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/199/conversions/les-trois-mousquetaires-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/199/conversions/les-trois-mousquetaires-novel-fr-simple.jpg",
                "color": "#dfd6d2"
            },
            "volume": 1,
            "serie": {
                "title": "Les Trois Mousquetaires",
                "meta": {
                    "entity": "serie",
                    "slug": "les-trois-mousquetaires-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-trois-mousquetaires-novel-fr"
                }
            }
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=1",
        "last": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=2",
        "prev": null,
        "next": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors/books/dumas-alexandre?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/authors/books/dumas-alexandre",
        "per_page": 32,
        "to": 32,
        "total": 38
    }
}
 

Request      

GET api/authors/books/{author_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: dumas-alexandre

Query Parameters

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

GET Serie[] belongs to Author.

Series list from an author, find by slug.

Route name: api.authors.show.series

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/authors/series/andersen-hans-christian?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/series/andersen-hans-christian"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/authors/series/andersen-hans-christian',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4986
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://bookshelves.ink/api/authors/series/andersen-hans-christian?page=1",
        "last": "https://bookshelves.ink/api/authors/series/andersen-hans-christian?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/authors/series/andersen-hans-christian?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/authors/series/andersen-hans-christian",
        "per_page": 32,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/authors/series/{author_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: andersen-hans-christian

Query Parameters

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

Entity: Book

GET Book[].

WITH PAGINATION

Get all Books ordered by title & serie_title.

Route name: api.books.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/books?filter[languages]=en%2Cfr&sort=slug_sort&size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/books"
);

const params = {
    "filter[languages]": "en,fr",
    "sort": "slug_sort",
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/books',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'filter[languages]'=> 'en,fr',
            'sort'=> 'slug_sort',
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4985
vary: Origin
 

{
    "data": [
        {
            "title": "20000 lieues sous les mers",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "20000-lieues-sous-les-mers-novel-fr",
                "author": "verne-jules",
                "show": "https://bookshelves.ink/api/books/verne-jules/20000-lieues-sous-les-mers-novel-fr"
            },
            "authors": [
                {
                    "name": "Verne Jules",
                    "meta": {
                        "entity": "author",
                        "slug": "verne-jules",
                        "show": "https://bookshelves.ink/api/authors/verne-jules"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1871-04-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/268/conversions/20000-lieues-sous-les-mers-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/268/conversions/20000-lieues-sous-les-mers-novel-fr-simple.jpg",
                "color": "#9e9c9d"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "À la recherche du temps perdu",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "a-la-recherche-du-temps-perdu-novel-en",
                "author": "proust-marcel",
                "show": "https://bookshelves.ink/api/books/proust-marcel/a-la-recherche-du-temps-perdu-novel-en"
            },
            "authors": [
                {
                    "name": "Proust Marcel",
                    "meta": {
                        "entity": "author",
                        "slug": "proust-marcel",
                        "show": "https://bookshelves.ink/api/authors/proust-marcel"
                    }
                }
            ],
            "language": {
                "name": "English",
                "meta": {
                    "slug": "en"
                }
            },
            "releasedOn": "1921-04-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/258/conversions/a-la-recherche-du-temps-perdu-novel-en-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/258/conversions/a-la-recherche-du-temps-perdu-novel-en-simple.jpg",
                "color": "#b7a084"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "À l'ombre des jeunes filles en fleurs",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "a-lombre-des-jeunes-filles-en-fleurs-novel-fr",
                "author": "proust-marcel",
                "show": "https://bookshelves.ink/api/books/proust-marcel/a-lombre-des-jeunes-filles-en-fleurs-novel-fr"
            },
            "authors": [
                {
                    "name": "Proust Marcel",
                    "meta": {
                        "entity": "author",
                        "slug": "proust-marcel",
                        "show": "https://bookshelves.ink/api/authors/proust-marcel"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "2016-12-29T00:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/256/conversions/a-lombre-des-jeunes-filles-en-fleurs-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/256/conversions/a-lombre-des-jeunes-filles-en-fleurs-novel-fr-simple.jpg",
                "color": "#b09574"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "Adventures of Huckleberry Finn",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "adventures-of-huckleberry-finn-novel-en",
                "author": "twain-mark",
                "show": "https://bookshelves.ink/api/books/twain-mark/adventures-of-huckleberry-finn-novel-en"
            },
            "authors": [
                {
                    "name": "Twain Mark",
                    "meta": {
                        "entity": "author",
                        "slug": "twain-mark",
                        "show": "https://bookshelves.ink/api/authors/twain-mark"
                    }
                }
            ],
            "language": {
                "name": "English",
                "meta": {
                    "slug": "en"
                }
            },
            "releasedOn": "2012-08-02T10:51:55.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/266/conversions/adventures-of-huckleberry-finn-novel-en-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/266/conversions/adventures-of-huckleberry-finn-novel-en-simple.jpg",
                "color": "#94b4ae"
            },
            "volume": null,
            "serie": null
        },
        {
            "title": "L'Affaire Charles Dexter Ward",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "laffaire-charles-dexter-ward-novel-fr",
                "author": "lovecraft-howard-phillips",
                "show": "https://bookshelves.ink/api/books/lovecraft-howard-phillips/laffaire-charles-dexter-ward-novel-fr"
            },
            "authors": [
                {
                    "name": "Lovecraft Howard Phillips",
                    "meta": {
                        "entity": "author",
                        "slug": "lovecraft-howard-phillips",
                        "show": "https://bookshelves.ink/api/authors/lovecraft-howard-phillips"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1928-04-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/238/conversions/laffaire-charles-dexter-ward-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/238/conversions/laffaire-charles-dexter-ward-novel-fr-simple.jpg",
                "color": "#2d1912"
            },
            "volume": null,
            "serie": null
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/books?page=1",
        "last": "https://bookshelves.ink/api/books?page=40",
        "prev": null,
        "next": "https://bookshelves.ink/api/books?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 40,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/books?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=6",
                "label": "6",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=7",
                "label": "7",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=8",
                "label": "8",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=9",
                "label": "9",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=10",
                "label": "10",
                "active": false
            },
            {
                "url": null,
                "label": "...",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=39",
                "label": "39",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=40",
                "label": "40",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/books?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/books",
        "per_page": 5,
        "to": 5,
        "total": 198
    }
}
 

Request      

GET api/books

Query Parameters

filter[languages]  string optional  

Filter by language, meta.slug from languages' list, null by default.

sort  string optional  

Sorting slug_sort by default, available: title, slug_sort, date, created_at, you can use - before parameter to reverse like -slug_sort.

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

Response

Response Fields

data  object[]  

List of books.

links  object  

Links to get other pages.

meta  object  

Metadata about pagination.

GET Book.

Route name: api.books.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/books/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/books/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/books/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4984
vary: Origin
 

{
    "data": {
        "title": "La journée d'un journaliste américain en 2890",
        "type": "Novel",
        "meta": {
            "entity": "book",
            "slug": "la-journee-dun-journaliste-americain-en-2890-novel-fr",
            "author": "verne-jules",
            "show": "https://bookshelves.ink/api/books/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr",
            "related": "https://bookshelves.ink/api/entities/related/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr",
            "reviews": "https://bookshelves.ink/api/entities/reviews/book/127"
        },
        "authors": [
            {
                "name": "Verne Jules",
                "meta": {
                    "entity": "author",
                    "slug": "verne-jules",
                    "show": "https://bookshelves.ink/api/authors/verne-jules"
                }
            }
        ],
        "language": {
            "name": "French",
            "meta": {
                "slug": "fr"
            }
        },
        "releasedOn": "2010-06-18T22:00:00.000000Z",
        "cover": {
            "thumbnail": "https://bookshelves.ink/storage/media/covers/314/conversions/la-journee-dun-journaliste-americain-en-2890-novel-fr-thumbnail.webp",
            "og": "https://bookshelves.ink/storage/media/covers/314/conversions/la-journee-dun-journaliste-americain-en-2890-novel-fr-og.jpg",
            "simple": "https://bookshelves.ink/storage/media/covers/314/conversions/la-journee-dun-journaliste-americain-en-2890-novel-fr-simple.jpg",
            "original": "https://bookshelves.ink/storage/media/covers/314/la-journee-dun-journaliste-americain-en-2890-novel-fr.webp",
            "color": "#949494"
        },
        "volume": null,
        "serie": null,
        "description": null,
        "identifier": {
            "isbn": "9782910233976",
            "isbn10": null,
            "isbn13": "9782910233976"
        },
        "pageCount": 0,
        "maturityRating": null,
        "publisher": {
            "name": "Ebooks libre set gratuits",
            "count": null,
            "firstChar": "E",
            "meta": {
                "slug": "ebooks-libre-set-gratuits",
                "books": "https://bookshelves.ink/api/publishers/books/ebooks-libre-set-gratuits",
                "show": "https://bookshelves.ink/api/publishers/ebooks-libre-set-gratuits"
            }
        },
        "tags": [
            {
                "name": "Fantastique   science fiction",
                "type": "tag",
                "count": null,
                "firstChar": null,
                "meta": {
                    "slug": "fantastique-science-fiction",
                    "books": null,
                    "show": null
                }
            }
        ],
        "genres": [],
        "download": {
            "name": "verne-jules-journee-dun-journaliste-americain-en-2890-fr.epub",
            "size": "279.61 Ko",
            "url": "https://bookshelves.ink/api/download/book/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr?format=epub",
            "reader": "https://bookshelves.ink/webreader/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr?format=epub",
            "format": "epub",
            "count": null,
            "isZip": null
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "verne-jules-journee-dun-journaliste-americain-en-2890-fr.epub",
                "size": "279.61 Ko",
                "url": "https://bookshelves.ink/api/download/book/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr?format=epub",
                "reader": "https://bookshelves.ink/webreader/verne-jules/la-journee-dun-journaliste-americain-en-2890-novel-fr?format=epub",
                "format": "epub",
                "count": null,
                "isZip": null
            }
        },
        "googleBook": {
            "preview_link": null,
            "buy_link": null,
            "created_at": "2022-04-17T08:35:04.000000Z"
        },
        "isFavorite": false,
        "reviewsCount": 0
    }
}
 

Request      

GET api/books/{author_slug}/{book_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: verne-jules

book_slug  string  

slug of book in meta.slug books' list, example: la-journee-dun-journaliste-americain-en-2890-novel-fr

Entity: Serie

Endpoint to get Series data.

GET Serie[].

WITH PAGINATION

Get all series ordered by title & serie_title.

Route name: api.series.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/series?filter[languages]=en%2Cfr&size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/series"
);

const params = {
    "filter[languages]": "en,fr",
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/series',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'filter[languages]'=> 'en,fr',
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4983
vary: Origin
 

{
    "data": [
        {
            "title": "L'Ami commun",
            "type": "Novel",
            "meta": {
                "entity": "serie",
                "slug": "lami-commun-novel-fr",
                "author": "dickens-charles",
                "show": "https://bookshelves.ink/api/series/dickens-charles/lami-commun-novel-fr",
                "books": "https://bookshelves.ink/api/series/books/dickens-charles/lami-commun-novel-fr"
            },
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-simple.jpg",
                "color": "#655360"
            },
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "count": 2
        },
        {
            "title": "Ange Pitou",
            "type": "Novel",
            "meta": {
                "entity": "serie",
                "slug": "ange-pitou-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr",
                "books": "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr"
            },
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/466/conversions/ange-pitou-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/466/conversions/ange-pitou-novel-fr-simple.jpg",
                "color": "#9f8886"
            },
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "count": 2
        },
        {
            "title": "Aventures De Monsieur Pickwick",
            "type": "Novel",
            "meta": {
                "entity": "serie",
                "slug": "aventures-de-monsieur-pickwick-novel-fr",
                "author": "dickens-charles",
                "show": "https://bookshelves.ink/api/series/dickens-charles/aventures-de-monsieur-pickwick-novel-fr",
                "books": "https://bookshelves.ink/api/series/books/dickens-charles/aventures-de-monsieur-pickwick-novel-fr"
            },
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/458/conversions/aventures-de-monsieur-pickwick-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/458/conversions/aventures-de-monsieur-pickwick-novel-fr-simple.jpg",
                "color": "#573d1d"
            },
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "count": 1
        },
        {
            "title": "Barnabé Rudge",
            "type": "Novel",
            "meta": {
                "entity": "serie",
                "slug": "barnabe-rudge-novel-fr",
                "author": "dickens-charles",
                "show": "https://bookshelves.ink/api/series/dickens-charles/barnabe-rudge-novel-fr",
                "books": "https://bookshelves.ink/api/series/books/dickens-charles/barnabe-rudge-novel-fr"
            },
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/459/conversions/barnabe-rudge-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/459/conversions/barnabe-rudge-novel-fr-simple.jpg",
                "color": "#f7f1e2"
            },
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "count": 2
        },
        {
            "title": "Les Blancs et les Bleus",
            "type": "Novel",
            "meta": {
                "entity": "serie",
                "slug": "les-blancs-et-les-bleus-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/les-blancs-et-les-bleus-novel-fr",
                "books": "https://bookshelves.ink/api/series/books/dumas-alexandre/les-blancs-et-les-bleus-novel-fr"
            },
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/475/conversions/les-blancs-et-les-bleus-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/475/conversions/les-blancs-et-les-bleus-novel-fr-simple.jpg",
                "color": "#98887d"
            },
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "count": 2
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/series?page=1",
        "last": "https://bookshelves.ink/api/series?page=5",
        "prev": null,
        "next": "https://bookshelves.ink/api/series?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 5,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/series?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/series",
        "per_page": 5,
        "to": 5,
        "total": 21
    }
}
 

Request      

GET api/series

Query Parameters

filter[languages]  string optional  

To select specific lang, null by default.

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

Response

Response Fields

data  object[]  

List of series.

links  object  

Links to get other pages.

meta  object  

Metadata about pagination.

GET Serie.

Get details of Serie model, find by slug of serie and slug of author.

Route name: api.series.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/series/dickens-charles/dombey-et-fils-novel-fr" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/series/dickens-charles/dombey-et-fils-novel-fr"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/series/dickens-charles/dombey-et-fils-novel-fr',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4982
vary: Origin
 

{
    "data": {
        "title": "Dombey Et Fils",
        "type": "Novel",
        "meta": {
            "entity": "serie",
            "slug": "dombey-et-fils-novel-fr",
            "author": "dickens-charles",
            "show": "https://bookshelves.ink/api/series/dickens-charles/dombey-et-fils-novel-fr",
            "books": "https://bookshelves.ink/api/series/books/dickens-charles/dombey-et-fils-novel-fr",
            "reviews": "https://bookshelves.ink/api/entities/reviews/serie/4"
        },
        "cover": {
            "thumbnail": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-thumbnail.webp",
            "og": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-og.jpg",
            "simple": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-simple.jpg",
            "color": "#29382d"
        },
        "language": {
            "name": "French",
            "meta": {
                "slug": "fr"
            }
        },
        "authors": [
            {
                "name": "Dickens Charles",
                "meta": {
                    "entity": "author",
                    "slug": "dickens-charles",
                    "show": "https://bookshelves.ink/api/authors/dickens-charles"
                }
            }
        ],
        "count": 3,
        "description": "Dombey et Fils (en anglais : Dombey and Son) est un roman de Charles Dickens, publié à Londres en dix-neuf feuilletons d'octobre 1846 à avril 1848 par The Graphic Magazine, puis en un volume chez Bradbury and Evans en 1848. Le roman a d'abord paru sous son titre complet, Dealings with the Firm of Dombey and Son: Wholesale, Retail and for Exportation (traduit dans la Bibliothèque de la Pléiade par : Dossier de la maison Dombey et Fils), puis abrégé en Dombey and Son. Il a été illustré, selon des indications très précises de Dickens, par le dessinateur Hablot Knight Browne.\nAvec ce septième roman, Dickens couronne une première phase de son œuvre créatrice, parvenue, selon la critique, à sa maturité. À ce titre, il représente une charnière (« watershed novel ») annonçant « les œuvres plus mûres et artistiquement plus satisfaisantes », avec, en effet, une parfaite adéquation entre, d'une part, sa perception des tensions sociales de l'époque et sa signification morale et, de l'autre, la coh...",
        "link": "https://fr.wikipedia.org/wiki/Dombey_et_Fils",
        "tags": [
            {
                "name": "Romans",
                "type": "tag",
                "count": null,
                "firstChar": null,
                "meta": {
                    "slug": "romans",
                    "books": null,
                    "show": null
                }
            }
        ],
        "genres": [],
        "download": {
            "name": "dombey-et-fils-novel-fr",
            "size": "1.02 Mo",
            "url": "https://bookshelves.ink/api/download/serie/dickens-charles/dombey-et-fils-novel-fr/epub",
            "reader": null,
            "format": "epub",
            "count": 3,
            "isZip": true
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "dombey-et-fils-novel-fr",
                "size": "1.02 Mo",
                "url": "https://bookshelves.ink/api/download/serie/dickens-charles/dombey-et-fils-novel-fr/epub",
                "reader": null,
                "format": "epub",
                "count": 3,
                "isZip": true
            }
        },
        "isFavorite": false,
        "reviews": [
            {
                "meta": {
                    "type": "review",
                    "for": "serie",
                    "author": "dickens-charles",
                    "slug": "dombey-et-fils-novel-fr"
                },
                "id": 186,
                "text": "<p><strong>Eveniet</strong> animi totam nihil quia. Nihil sit reprehenderit <em>et</em> <strong>ut</strong> veritatis nemo. Autem nisi assumenda qui reprehenderit. Distinctio <strong>ea</strong> odit dolores aliquid dolorum ad. <em>Ut</em> rem distinctio deleniti.</p>\n<p>Velit et ut laboriosam cum <em>quibusdam</em> et. Autem eos <strong>eos</strong> et explicabo ea <em>omnis</em> soluta. Officiis non nulla <strong>vitae</strong> voluptatem pariatur. <em>In</em> officiis asperiores suscipit sed officia explicabo.</p>\n",
                "rating": 1,
                "user": {
                    "id": 21,
                    "name": "Alfred Wintheiser",
                    "slug": "alfred-wintheiser-6171",
                    "avatar": "https://eu.ui-avatars.com/api/?name=Alfred Wintheiser&color=7F9CF5&background=EBF4FF",
                    "color": "#"
                },
                "title": "Dombey Et Fils",
                "cover": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-thumbnail.webp",
                "color": "#29382d",
                "createdAt": "2022-04-17T08:36:28.000000Z",
                "updatedAt": "2022-04-17T08:36:28.000000Z"
            },
            {
                "meta": {
                    "type": "review",
                    "for": "serie",
                    "author": "dickens-charles",
                    "slug": "dombey-et-fils-novel-fr"
                },
                "id": 188,
                "text": "<p><strong>Ex</strong> et atque vel et saepe. Excepturi eius <em>minus</em> <strong>libero</strong> nulla et. Voluptatem impedit et optio <em>eum</em> dicta perferendis. Enim id et dolor dolor <em>modi</em> expedita quo. <strong>Voluptate</strong> provident ea repellendus libero. <em>Rerum</em> ducimus corrupti sed <strong>et</strong> at cumque veritatis. <em>Quam</em> ratione optio dolorem ipsum <strong>laborum</strong> eveniet et. <em>Tenetur</em> nulla voluptatem quaerat et aut <strong>odio</strong> id.</p>\n<p>Atque <em>perferendis</em> qui excepturi dolorum quo suscipit. Quidem <strong>aut</strong> <em>quibusdam</em> nihil impedit odio. Vel non laudantium ut <strong>quia</strong> maxime fuga. Dignissimos exercitationem dolores et corporis. <em>Sed</em> <strong>suscipit</strong> aut dolores et. Quis et ea <em>rerum</em> mollitia.</p>\n",
                "rating": 1,
                "user": {
                    "id": 18,
                    "name": "Kali Hirthe",
                    "slug": "kali-hirthe-9673",
                    "avatar": "https://eu.ui-avatars.com/api/?name=Kali Hirthe&color=7F9CF5&background=EBF4FF",
                    "color": "#"
                },
                "title": "Dombey Et Fils",
                "cover": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-thumbnail.webp",
                "color": "#29382d",
                "createdAt": "2022-04-17T08:36:28.000000Z",
                "updatedAt": "2022-04-12T00:52:45.000000Z"
            },
            {
                "meta": {
                    "type": "review",
                    "for": "serie",
                    "author": "dickens-charles",
                    "slug": "dombey-et-fils-novel-fr"
                },
                "id": 187,
                "text": "<p><strong>Id</strong> quos maiores est incidunt eum ut molestiae. <em>Laboriosam</em> <strong>eveniet</strong> nesciunt totam eos aliquid quia et. <em>Ut</em> voluptatibus <strong>quas</strong> aut quia est pariatur.</p>\n<p>Officiis vel <em>recusandae</em> maxime minima labore. Velit culpa autem eius <em>molestias</em> aliquam dolor aut sit. Est sit est <em>et</em> repellat non et qui. <strong>Non</strong> quia sequi <em>ab</em> quae. Quod laudantium consequuntur et corporis. Qui <em>et</em> voluptas et facere. Repudiandae optio ipsam <strong>nobis</strong> saepe. Hic ipsum vitae totam vero qui omnis quidem. Ullam aut qui ut sint.</p>\n",
                "rating": 2,
                "user": {
                    "id": 15,
                    "name": "Molly Legros",
                    "slug": "molly-legros-4505",
                    "avatar": "https://bookshelves.ink/storage/media/users/523/molly-legros-4505.webp",
                    "color": "#3b331e"
                },
                "title": "Dombey Et Fils",
                "cover": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-thumbnail.webp",
                "color": "#29382d",
                "createdAt": "2017-01-24T23:34:44.000000Z",
                "updatedAt": "2022-04-11T14:53:09.000000Z"
            }
        ]
    }
}
 

Request      

GET api/series/{author_slug}/{serie_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: dickens-charles

serie_slug  string  

slug of serie in meta.slug series' list, example: dombey-et-fils-novel-fr

GET Book[] belongs to Serie.

Books list from one Serie, find by slug.

Route name: api.series.show.books

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4981
vary: Origin
 

{
    "data": [
        {
            "title": "Ange Pitou, tome I",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "ange-pitou-tome-i-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/ange-pitou-tome-i-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1851-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/137/conversions/ange-pitou-tome-i-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/137/conversions/ange-pitou-tome-i-novel-fr-simple.jpg",
                "color": "#9f8886"
            },
            "volume": 1,
            "serie": {
                "title": "Ange Pitou",
                "meta": {
                    "entity": "serie",
                    "slug": "ange-pitou-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr"
                }
            }
        },
        {
            "title": "Ange Pitou, tome II",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "ange-pitou-tome-ii-novel-fr",
                "author": "dumas-alexandre",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/ange-pitou-tome-ii-novel-fr"
            },
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1851-08-14T23:00:00.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/139/conversions/ange-pitou-tome-ii-novel-fr-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/139/conversions/ange-pitou-tome-ii-novel-fr-simple.jpg",
                "color": "#847582"
            },
            "volume": 2,
            "serie": {
                "title": "Ange Pitou",
                "meta": {
                    "entity": "serie",
                    "slug": "ange-pitou-novel-fr",
                    "author": "dumas-alexandre",
                    "show": "https://bookshelves.ink/api/series/dumas-alexandre/ange-pitou-novel-fr"
                }
            }
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr?page=1",
        "last": "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/series/books/dumas-alexandre/ange-pitou-novel-fr",
        "per_page": 5,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/series/books/{author_slug}/{serie_slug}

URL Parameters

author_slug  string  

slug of author in meta.author books' list, in case of multiple authors, default author is selected so you need to refer to books' list and not authors' list, example: dumas-alexandre

serie_slug  string  

slug of serie in meta.slug series' list, example: ange-pitou-novel-fr

Query Parameters

next  integer optional  

Volume to select next Book[] after.

first  boolean optional  

To select only first Book with next.

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

Relation: Language

Endpoint to get Languages data.

GET Language[].

Route name: api.languages.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/languages" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/languages"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/languages',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4973
vary: Origin
 

{
    "data": [
        {
            "name": "French",
            "meta": {
                "slug": "fr",
                "show": "https://bookshelves.ink/api/languages/fr"
            },
            "firstChar": "F",
            "count": 187
        },
        {
            "name": "English",
            "meta": {
                "slug": "en",
                "show": "https://bookshelves.ink/api/languages/en"
            },
            "firstChar": "E",
            "count": 11
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/languages?page=1",
        "last": "https://bookshelves.ink/api/languages?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/languages?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/languages",
        "per_page": 32,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/languages

GET Language.

Route name: api.languages.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/languages/fr" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/languages/fr"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/languages/fr',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4972
vary: Origin
 

{
    "data": {
        "name": "French",
        "meta": {
            "slug": "fr",
            "show": "https://bookshelves.ink/api/languages/fr"
        },
        "firstChar": "F",
        "count": null
    }
}
 

Request      

GET api/languages/{language_slug}

URL Parameters

language_slug  string  

slug of serie in meta.slug languages' list, example: fr

Relation: Publisher

Endpoint to get Publishers data.

GET Publisher[].

WITH PAGINATION

Get all Publishers ordered by 'name'.

Route name: api.publishers.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/publishers" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/publishers"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/publishers',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4976
vary: Origin
 

{
    "data": [
        {
            "name": "Arvensa editions",
            "count": 4,
            "firstChar": "A",
            "meta": {
                "slug": "arvensa-editions",
                "books": "https://bookshelves.ink/api/publishers/books/arvensa-editions",
                "show": "https://bookshelves.ink/api/publishers/arvensa-editions"
            }
        },
        {
            "name": "BoD - Books on Demand",
            "count": 7,
            "firstChar": "B",
            "meta": {
                "slug": "bod-books-on-demand",
                "books": "https://bookshelves.ink/api/publishers/books/bod-books-on-demand",
                "show": "https://bookshelves.ink/api/publishers/bod-books-on-demand"
            }
        },
        {
            "name": "Ebooks libres et gratuits",
            "count": 75,
            "firstChar": "E",
            "meta": {
                "slug": "ebooks-libres-et-gratuits",
                "books": "https://bookshelves.ink/api/publishers/books/ebooks-libres-et-gratuits",
                "show": "https://bookshelves.ink/api/publishers/ebooks-libres-et-gratuits"
            }
        },
        {
            "name": "Feedbooks",
            "count": 20,
            "firstChar": "F",
            "meta": {
                "slug": "feedbooks",
                "books": "https://bookshelves.ink/api/publishers/books/feedbooks",
                "show": "https://bookshelves.ink/api/publishers/feedbooks"
            }
        },
        {
            "name": "Independently Published",
            "count": 7,
            "firstChar": "I",
            "meta": {
                "slug": "independently-published",
                "books": "https://bookshelves.ink/api/publishers/books/independently-published",
                "show": "https://bookshelves.ink/api/publishers/independently-published"
            }
        },
        {
            "name": "J'ai lu",
            "count": 3,
            "firstChar": "J",
            "meta": {
                "slug": "jai-lu",
                "books": "https://bookshelves.ink/api/publishers/books/jai-lu",
                "show": "https://bookshelves.ink/api/publishers/jai-lu"
            }
        },
        {
            "name": "La Gibecière à Mots",
            "count": 4,
            "firstChar": "L",
            "meta": {
                "slug": "la-gibeciere-a-mots",
                "books": "https://bookshelves.ink/api/publishers/books/la-gibeciere-a-mots",
                "show": "https://bookshelves.ink/api/publishers/la-gibeciere-a-mots"
            }
        },
        {
            "name": "Le Livre de Poche",
            "count": 12,
            "firstChar": "L",
            "meta": {
                "slug": "le-livre-de-poche",
                "books": "https://bookshelves.ink/api/publishers/books/le-livre-de-poche",
                "show": "https://bookshelves.ink/api/publishers/le-livre-de-poche"
            }
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/publishers?page=1",
        "last": "https://bookshelves.ink/api/publishers?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/publishers?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/publishers",
        "per_page": 32,
        "to": 8,
        "total": 8
    }
}
 

Request      

GET api/publishers

Query Parameters

size  integer optional  

Entities per page, '32' by default.

full  boolean optional  

Disable pagination.

page  integer optional  

The page number, '1' by default.

GET Publisher.

Details for one Publisher, find by slug.

Route name: api.publishers.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/publishers/tredition" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/publishers/tredition"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/publishers/tredition',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4975
vary: Origin
 

{
    "data": {
        "name": "tredition",
        "count": 1,
        "firstChar": "T",
        "meta": {
            "slug": "tredition",
            "books": "https://bookshelves.ink/api/publishers/books/tredition",
            "show": "https://bookshelves.ink/api/publishers/tredition"
        }
    }
}
 

Request      

GET api/publishers/{publisher_slug}

URL Parameters

publisher_slug  string  

slug of serie in meta.slug publishers' list, example: tredition

GET Book[] belongs to Publisher.

WITH PAGINATION

Get all Books of selected Publisher ordered by Books' 'title'.

Route name: api.publishers.show.books

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/publishers/books/university-of-adelaide-library',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4974
vary: Origin
 

{
    "data": [
        {
            "title": "A Modest Proposal",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "a-modest-proposal-novel-en",
                "author": "swift-jonathan",
                "show": "https://bookshelves.ink/api/books/swift-jonathan/a-modest-proposal-novel-en"
            },
            "authors": [
                {
                    "name": "Swift Jonathan",
                    "meta": {
                        "entity": "author",
                        "slug": "swift-jonathan",
                        "show": "https://bookshelves.ink/api/authors/swift-jonathan"
                    }
                }
            ],
            "language": {
                "name": "English",
                "meta": {
                    "slug": "en"
                }
            },
            "releasedOn": "2008-02-15T16:05:32.000000Z",
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/264/conversions/a-modest-proposal-novel-en-thumbnail.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/264/conversions/a-modest-proposal-novel-en-simple.jpg",
                "color": "#8c7f7e"
            },
            "volume": null,
            "serie": null
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library?page=1",
        "last": "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/publishers/books/university-of-adelaide-library",
        "per_page": 32,
        "to": 1,
        "total": 1
    }
}
 

Request      

GET api/publishers/books/{publisher_slug}

URL Parameters

publisher_slug  string  

slug of serie in meta.slug publishers' list, example: university-of-adelaide-library

Query Parameters

size  integer optional  

Entities per page, '32' by default.

page  integer optional  

The page number, '1' by default.

Relation: Tag

GET Tag[].

Get all Tags ordered by 'name'.

Route name: api.tags.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/tags" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/tags"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/tags',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4979
vary: Origin
 

{
    "data": [
        {
            "name": "1789 1799    fiction",
            "type": "tag",
            "count": 1,
            "firstChar": "1",
            "meta": {
                "slug": "1789-1799-fiction",
                "books": "https://bookshelves.ink/api/tags/books/1789-1799-fiction",
                "show": "https://bookshelves.ink/api/tags/1789-1799-fiction"
            }
        },
        {
            "name": "1799 avant 1945",
            "type": "tag",
            "count": 1,
            "firstChar": "1",
            "meta": {
                "slug": "1799-avant-1945",
                "books": "https://bookshelves.ink/api/tags/books/1799-avant-1945",
                "show": "https://bookshelves.ink/api/tags/1799-avant-1945"
            }
        },
        {
            "name": "Action & adventures",
            "type": "genre",
            "count": 15,
            "firstChar": "A",
            "meta": {
                "slug": "action-adventures",
                "books": "https://bookshelves.ink/api/tags/books/action-adventures",
                "show": "https://bookshelves.ink/api/tags/action-adventures"
            }
        },
        {
            "name": "Action & aventure",
            "type": "tag",
            "count": 17,
            "firstChar": "A",
            "meta": {
                "slug": "action-aventure",
                "books": "https://bookshelves.ink/api/tags/books/action-aventure",
                "show": "https://bookshelves.ink/api/tags/action-aventure"
            }
        },
        {
            "name": "Adventure stories",
            "type": "tag",
            "count": 2,
            "firstChar": "A",
            "meta": {
                "slug": "adventure-stories",
                "books": "https://bookshelves.ink/api/tags/books/adventure-stories",
                "show": "https://bookshelves.ink/api/tags/adventure-stories"
            }
        },
        {
            "name": "Ahab",
            "type": "tag",
            "count": 1,
            "firstChar": "A",
            "meta": {
                "slug": "ahab",
                "books": "https://bookshelves.ink/api/tags/books/ahab",
                "show": "https://bookshelves.ink/api/tags/ahab"
            }
        },
        {
            "name": "American literature",
            "type": "tag",
            "count": 0,
            "firstChar": "A",
            "meta": {
                "slug": "american-literature",
                "books": "https://bookshelves.ink/api/tags/books/american-literature",
                "show": "https://bookshelves.ink/api/tags/american-literature"
            }
        },
        {
            "name": "Ancient & classical",
            "type": "tag",
            "count": 1,
            "firstChar": "A",
            "meta": {
                "slug": "ancient-classical",
                "books": "https://bookshelves.ink/api/tags/books/ancient-classical",
                "show": "https://bookshelves.ink/api/tags/ancient-classical"
            }
        },
        {
            "name": "Aventures",
            "type": "tag",
            "count": 35,
            "firstChar": "A",
            "meta": {
                "slug": "aventures",
                "books": "https://bookshelves.ink/api/tags/books/aventures",
                "show": "https://bookshelves.ink/api/tags/aventures"
            }
        },
        {
            "name": "Bildungsromans",
            "type": "tag",
            "count": 1,
            "firstChar": "B",
            "meta": {
                "slug": "bildungsromans",
                "books": "https://bookshelves.ink/api/tags/books/bildungsromans",
                "show": "https://bookshelves.ink/api/tags/bildungsromans"
            }
        },
        {
            "name": "Boys    fiction",
            "type": "tag",
            "count": 1,
            "firstChar": "B",
            "meta": {
                "slug": "boys-fiction",
                "books": "https://bookshelves.ink/api/tags/books/boys-fiction",
                "show": "https://bookshelves.ink/api/tags/boys-fiction"
            }
        },
        {
            "name": "Children's stories",
            "type": "tag",
            "count": 1,
            "firstChar": "C",
            "meta": {
                "slug": "childrens-stories",
                "books": "https://bookshelves.ink/api/tags/books/childrens-stories",
                "show": "https://bookshelves.ink/api/tags/childrens-stories"
            }
        },
        {
            "name": "Classics",
            "type": "tag",
            "count": 63,
            "firstChar": "C",
            "meta": {
                "slug": "classics",
                "books": "https://bookshelves.ink/api/tags/books/classics",
                "show": "https://bookshelves.ink/api/tags/classics"
            }
        },
        {
            "name": "Collections générales",
            "type": "tag",
            "count": 3,
            "firstChar": "C",
            "meta": {
                "slug": "collections-generales",
                "books": "https://bookshelves.ink/api/tags/books/collections-generales",
                "show": "https://bookshelves.ink/api/tags/collections-generales"
            }
        },
        {
            "name": "Comedies",
            "type": "tag",
            "count": 1,
            "firstChar": "C",
            "meta": {
                "slug": "comedies",
                "books": "https://bookshelves.ink/api/tags/books/comedies",
                "show": "https://bookshelves.ink/api/tags/comedies"
            }
        },
        {
            "name": "Comics & graphic novels",
            "type": "tag",
            "count": 5,
            "firstChar": "C",
            "meta": {
                "slug": "comics-graphic-novels",
                "books": "https://bookshelves.ink/api/tags/books/comics-graphic-novels",
                "show": "https://bookshelves.ink/api/tags/comics-graphic-novels"
            }
        },
        {
            "name": "Conte",
            "type": "tag",
            "count": 2,
            "firstChar": "C",
            "meta": {
                "slug": "conte",
                "books": "https://bookshelves.ink/api/tags/books/conte",
                "show": "https://bookshelves.ink/api/tags/conte"
            }
        },
        {
            "name": "Contes",
            "type": "tag",
            "count": 1,
            "firstChar": "C",
            "meta": {
                "slug": "contes",
                "books": "https://bookshelves.ink/api/tags/books/contes",
                "show": "https://bookshelves.ink/api/tags/contes"
            }
        },
        {
            "name": "Courtship    fiction",
            "type": "tag",
            "count": 1,
            "firstChar": "C",
            "meta": {
                "slug": "courtship-fiction",
                "books": "https://bookshelves.ink/api/tags/books/courtship-fiction",
                "show": "https://bookshelves.ink/api/tags/courtship-fiction"
            }
        },
        {
            "name": "Crime & mystery",
            "type": "genre",
            "count": 0,
            "firstChar": "C",
            "meta": {
                "slug": "crime-mystery",
                "books": "https://bookshelves.ink/api/tags/books/crime-mystery",
                "show": "https://bookshelves.ink/api/tags/crime-mystery"
            }
        },
        {
            "name": "Documents   essais",
            "type": "tag",
            "count": 1,
            "firstChar": "D",
            "meta": {
                "slug": "documents-essais",
                "books": "https://bookshelves.ink/api/tags/books/documents-essais",
                "show": "https://bookshelves.ink/api/tags/documents-essais"
            }
        },
        {
            "name": "Domestic fiction",
            "type": "tag",
            "count": 1,
            "firstChar": "D",
            "meta": {
                "slug": "domestic-fiction",
                "books": "https://bookshelves.ink/api/tags/books/domestic-fiction",
                "show": "https://bookshelves.ink/api/tags/domestic-fiction"
            }
        },
        {
            "name": "England    drama",
            "type": "tag",
            "count": 1,
            "firstChar": "E",
            "meta": {
                "slug": "england-drama",
                "books": "https://bookshelves.ink/api/tags/books/england-drama",
                "show": "https://bookshelves.ink/api/tags/england-drama"
            }
        },
        {
            "name": "England    fiction",
            "type": "tag",
            "count": 1,
            "firstChar": "E",
            "meta": {
                "slug": "england-fiction",
                "books": "https://bookshelves.ink/api/tags/books/england-fiction",
                "show": "https://bookshelves.ink/api/tags/england-fiction"
            }
        },
        {
            "name": "English",
            "type": "tag",
            "count": 1,
            "firstChar": "E",
            "meta": {
                "slug": "english",
                "books": "https://bookshelves.ink/api/tags/books/english",
                "show": "https://bookshelves.ink/api/tags/english"
            }
        },
        {
            "name": "Epic",
            "type": "tag",
            "count": 1,
            "firstChar": "E",
            "meta": {
                "slug": "epic",
                "books": "https://bookshelves.ink/api/tags/books/epic",
                "show": "https://bookshelves.ink/api/tags/epic"
            }
        },
        {
            "name": "Espionage",
            "type": "tag",
            "count": 1,
            "firstChar": "E",
            "meta": {
                "slug": "espionage",
                "books": "https://bookshelves.ink/api/tags/books/espionage",
                "show": "https://bookshelves.ink/api/tags/espionage"
            }
        },
        {
            "name": "European",
            "type": "tag",
            "count": 3,
            "firstChar": "E",
            "meta": {
                "slug": "european",
                "books": "https://bookshelves.ink/api/tags/books/european",
                "show": "https://bookshelves.ink/api/tags/european"
            }
        },
        {
            "name": "Fairy tales & folklore",
            "type": "tag",
            "count": 1,
            "firstChar": "F",
            "meta": {
                "slug": "fairy-tales-folklore",
                "books": "https://bookshelves.ink/api/tags/books/fairy-tales-folklore",
                "show": "https://bookshelves.ink/api/tags/fairy-tales-folklore"
            }
        },
        {
            "name": "Family life",
            "type": "tag",
            "count": 1,
            "firstChar": "F",
            "meta": {
                "slug": "family-life",
                "books": "https://bookshelves.ink/api/tags/books/family-life",
                "show": "https://bookshelves.ink/api/tags/family-life"
            }
        },
        {
            "name": "Fantastique",
            "type": "tag",
            "count": 6,
            "firstChar": "F",
            "meta": {
                "slug": "fantastique",
                "books": "https://bookshelves.ink/api/tags/books/fantastique",
                "show": "https://bookshelves.ink/api/tags/fantastique"
            }
        },
        {
            "name": "Fantastique   science fiction",
            "type": "tag",
            "count": 3,
            "firstChar": "F",
            "meta": {
                "slug": "fantastique-science-fiction",
                "books": "https://bookshelves.ink/api/tags/books/fantastique-science-fiction",
                "show": "https://bookshelves.ink/api/tags/fantastique-science-fiction"
            }
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/tags?page=1",
        "last": "https://bookshelves.ink/api/tags?page=4",
        "prev": null,
        "next": "https://bookshelves.ink/api/tags?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 4,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/tags?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/tags?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/tags?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/tags?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/tags?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/tags",
        "per_page": 32,
        "to": 32,
        "total": 117
    }
}
 

Request      

GET api/tags

Query Parameters

filters[type]  string optional  

Filter by type like tag or genre.

full  boolean optional  

Disable pagination.

alpha  boolean optional  

Chunk by first character.

Response

Response Fields

name  string  

Tag's name.

GET Tag.

Get Tag details.

Route name: api.tags.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/tags/psychology" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/tags/psychology"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/tags/psychology',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4978
vary: Origin
 

{
    "data": {
        "name": "Psychology",
        "type": "tag",
        "count": null,
        "firstChar": null,
        "meta": {
            "slug": "psychology",
            "books": null,
            "show": null
        }
    }
}
 

Request      

GET api/tags/{tag_slug}

URL Parameters

tag_slug  string  

slug of serie in meta.slug tags' list, example: psychology

Query Parameters

filters[type]  string optional  

Filter by type like tag or genre.

GET Entity[] belongs to Tag.

Get all Books and Series of selected Tag.

Route name: api.tags.show.books

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/tags/books/england-drama" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/tags/books/england-drama"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/tags/books/england-drama',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4977
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "entity": "book",
                "author": "wilde-oscar",
                "slug": "the-importance-of-being-earnest-novel-en",
                "show": "https://bookshelves.ink/api/books/wilde-oscar/the-importance-of-being-earnest-novel-en"
            },
            "title": "The Importance of Being Earnest",
            "type": "Novel",
            "authors": [
                {
                    "name": "Wilde Oscar",
                    "meta": {
                        "entity": "author",
                        "slug": "wilde-oscar",
                        "show": "https://bookshelves.ink/api/authors/wilde-oscar"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "English",
                "meta": {
                    "slug": "en"
                }
            },
            "volume": null,
            "count": null,
            "cover": {
                "thumbnail": "https://bookshelves.ink/storage/media/covers/406/conversions/the-importance-of-being-earnest-novel-en-thumbnail.webp",
                "original": "https://bookshelves.ink/storage/media/covers/406/the-importance-of-being-earnest-novel-en.webp",
                "simple": "https://bookshelves.ink/storage/media/covers/406/conversions/the-importance-of-being-earnest-novel-en-simple.jpg",
                "color": "#833b32"
            },
            "first_char": null
        }
    ],
    "links": {
        "first": "/?page=1",
        "last": "/?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "/?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "/",
        "per_page": 32,
        "to": 1,
        "total": 1
    }
}
 

Request      

GET api/tags/books/{tag_slug}

URL Parameters

tag_slug  string  

slug of serie in meta.slug tags' list, example: england-drama

Submission

POST Send submission.

If honeypot is true, submission will be not sended.

Route name: api.submissions.send

Example request:
curl --request POST \
    "https://bookshelves.ink/api/submission/send" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Name\",
    \"email\": \"user@email.com\",
    \"honeypot\": true,
    \"message\": \"Hello! This is a message for you!\"
}"
const url = new URL(
    "https://bookshelves.ink/api/submission/send"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Name",
    "email": "user@email.com",
    "honeypot": true,
    "message": "Hello! This is a message for you!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/submission/send',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Name',
            'email' => 'user@email.com',
            'honeypot' => true,
            'message' => 'Hello! This is a message for you!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/submission/send

Body Parameters

name  string  

User's name.

email  string  

User's email. Must be a valid email address.

honeypot  boolean  

Honeypot: must be false to send notification.

message  string  

User's message. Must be at least 15 characters.

User: Account

Endpoint to get Authors data.

GET Favorites by user.

requires authentication

Route name: api.favorites.user

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/favorites/{user_id}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/favorites/{user_id}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/favorites/{user_id}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/favorites/{user_id}

POST Store new favorite.

requires authentication

Route name: api.favorites.toggle

Example request:
curl --request POST \
    "https://bookshelves.ink/api/favorites/toggle/{model}/{slug}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/favorites/toggle/{model}/{slug}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/favorites/toggle/{model}/{slug}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/favorites/toggle/{model}/{slug}

GET Current user.

requires authentication

Route name: api.profile

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/profile',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/profile

POST Update current user.

requires authentication

Route name: api.profile.update

Example request:
curl --request POST \
    "https://bookshelves.ink/api/profile/update" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=username" \
    --form "email=user@mail.com" \
    --form "about=Nostrud consequat occaecat dolore id ipsum culpa duis reprehenderit incididunt aute enim sint cillum Lorem. Non qui irure veniam eiusmod dolore mollit elit labore cupidatat eiusmod quis reprehenderit velit ut. Laborum culpa eiusmod laborum nostrud enim dolore incididunt. Consectetur cillum Lorem quis magna magna aliqua duis ut." \
    --form "use_gravatar=" \
    --form "display_favorites=" \
    --form "display_reviews=" \
    --form "display_gender=" \
    --form "gender=unknown" \
    --form "avatar=@/tmp/phpNNtBTe" \
    --form "banner=@/tmp/phprKpIwb" 
const url = new URL(
    "https://bookshelves.ink/api/profile/update"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'username');
body.append('email', 'user@mail.com');
body.append('about', 'Nostrud consequat occaecat dolore id ipsum culpa duis reprehenderit incididunt aute enim sint cillum Lorem. Non qui irure veniam eiusmod dolore mollit elit labore cupidatat eiusmod quis reprehenderit velit ut. Laborum culpa eiusmod laborum nostrud enim dolore incididunt. Consectetur cillum Lorem quis magna magna aliqua duis ut.');
body.append('use_gravatar', '');
body.append('display_favorites', '');
body.append('display_reviews', '');
body.append('display_gender', '');
body.append('gender', 'unknown');
body.append('avatar', document.querySelector('input[name="avatar"]').files[0]);
body.append('banner', document.querySelector('input[name="banner"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/profile/update',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'name',
                'contents' => 'username'
            ],
            [
                'name' => 'email',
                'contents' => 'user@mail.com'
            ],
            [
                'name' => 'about',
                'contents' => 'Nostrud consequat occaecat dolore id ipsum culpa duis reprehenderit incididunt aute enim sint cillum Lorem. Non qui irure veniam eiusmod dolore mollit elit labore cupidatat eiusmod quis reprehenderit velit ut. Laborum culpa eiusmod laborum nostrud enim dolore incididunt. Consectetur cillum Lorem quis magna magna aliqua duis ut.'
            ],
            [
                'name' => 'use_gravatar',
                'contents' => ''
            ],
            [
                'name' => 'display_favorites',
                'contents' => ''
            ],
            [
                'name' => 'display_reviews',
                'contents' => ''
            ],
            [
                'name' => 'display_gender',
                'contents' => ''
            ],
            [
                'name' => 'gender',
                'contents' => 'unknown'
            ],
            [
                'name' => 'avatar',
                'contents' => fopen('/tmp/phpNNtBTe', 'r')
            ],
            [
                'name' => 'banner',
                'contents' => fopen('/tmp/phprKpIwb', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/profile/update

Body Parameters

name  string  

Must not be greater than 256 characters.

email  string  

Must be a valid email address.

about  string optional  

Must not be greater than 2048 characters.

avatar  file optional  

Must be a file. Must not be greater than 2048 kilobytes.

banner  file optional  

Must be a file. Must not be greater than 2048 kilobytes.

use_gravatar  boolean  

display_favorites  boolean  

display_reviews  boolean  

display_gender  boolean  

gender  string optional  

POST Delete current user.

requires authentication

Route name: api.profile.delete

Example request:
curl --request POST \
    "https://bookshelves.ink/api/profile/delete" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_password\": \"et-aliquip\",
    \"confirm\": false
}"
const url = new URL(
    "https://bookshelves.ink/api/profile/delete"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_password": "et-aliquip",
    "confirm": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/profile/delete',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'current_password' => 'et-aliquip',
            'confirm' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/profile/delete

Body Parameters

current_password  string  

Must not be greater than 256 characters.

confirm  boolean  

GET Delete avatar for current user.

requires authentication

Route name: api.profile.delete.avatar

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/profile/delete/avatar" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/profile/delete/avatar"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/profile/delete/avatar',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/profile/delete/avatar

User: Authentication

GET api/user

Route name: api.user

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/user" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/user"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/user',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Auth guard [user] is not defined.",
    "exception": "InvalidArgumentException",
    "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php",
    "line": 82,
    "trace": [
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php",
            "line": 66,
            "function": "resolve",
            "class": "Illuminate\\Auth\\AuthManager",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php",
            "line": 63,
            "function": "guard",
            "class": "Illuminate\\Auth\\AuthManager",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php",
            "line": 42,
            "function": "authenticate",
            "class": "Illuminate\\Auth\\Middleware\\Authenticate",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Auth\\Middleware\\Authenticate",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 33,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Laravel\\Sanctum\\Http\\Middleware\\{closure}",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 34,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 726,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 703,
            "function": "runRouteWithinStack",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 667,
            "function": "runRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 656,
            "function": "dispatchToRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 167,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Illuminate\\Foundation\\Http\\{closure}",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/livewire/livewire/src/DisableBrowserCache.php",
            "line": 19,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Livewire\\DisableBrowserCache",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
            "line": 31,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
            "line": 40,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
            "line": 27,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
            "line": 86,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/fruitcake/laravel-cors/src/HandleCors.php",
            "line": 52,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Fruitcake\\Cors\\HandleCors",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
            "line": 39,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\TrustProxies",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 142,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 111,
            "function": "sendRequestThroughRouter",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 299,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 287,
            "function": "callLaravelOrLumenRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 89,
            "function": "makeApiCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 45,
            "function": "makeResponseCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 35,
            "function": "makeResponseCallIfConditionsPass",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 222,
            "function": "__invoke",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 179,
            "function": "iterateThroughStrategies",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 116,
            "function": "fetchResponses",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 123,
            "function": "processRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 80,
            "function": "extractEndpointsInfoFromLaravelApp",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 56,
            "function": "extractEndpointsInfoAndWriteToDisk",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php",
            "line": 55,
            "function": "get",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 36,
            "function": "handle",
            "class": "Knuckles\\Scribe\\Commands\\GenerateDocumentation",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Util.php",
            "line": 41,
            "function": "Illuminate\\Container\\{closure}",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 93,
            "function": "unwrapIfClosure",
            "class": "Illuminate\\Container\\Util",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 37,
            "function": "callBoundMethod",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 651,
            "function": "call",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 136,
            "function": "call",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Command/Command.php",
            "line": 308,
            "function": "execute",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 121,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Command\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 998,
            "function": "run",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 299,
            "function": "doRunCommand",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 171,
            "function": "doRun",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Application.php",
            "line": 102,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php",
            "line": 129,
            "function": "run",
            "class": "Illuminate\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/artisan",
            "line": 37,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Console\\Kernel",
            "type": "->"
        }
    ]
}
 

Request      

GET api/user

POST Password update.

requires authentication

Route name: api.password.update

Example request:
curl --request POST \
    "https://bookshelves.ink/api/password/update" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_password\": \"sunt-commodo-ipsum-aliqua\",
    \"password\": \"ea-occaecat-culpa-ut-pariatur\"
}"
const url = new URL(
    "https://bookshelves.ink/api/password/update"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_password": "sunt-commodo-ipsum-aliqua",
    "password": "ea-occaecat-culpa-ut-pariatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/password/update',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'current_password' => 'sunt-commodo-ipsum-aliqua',
            'password' => 'ea-occaecat-culpa-ut-pariatur',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/password/update

Body Parameters

current_password  string  

Must not be greater than 256 characters.

password  string  

Must not be greater than 256 characters.

POST Login.

Route name: api.login

Example request:
curl --request POST \
    "https://bookshelves.ink/api/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"jermaine39@example.com\",
    \"password\": \"quisquam\",
    \"remember\": true
}"
const url = new URL(
    "https://bookshelves.ink/api/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "jermaine39@example.com",
    "password": "quisquam",
    "remember": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/login',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'jermaine39@example.com',
            'password' => 'quisquam',
            'remember' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/login

Body Parameters

email  string  

Must be a valid email address.

password  string  

remember  boolean optional  

POST Logout.

requires authentication

Route name: api.logout

Example request:
curl --request POST \
    "https://bookshelves.ink/api/logout" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/logout',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/logout

POST Login.

Route name: api.login.token

Example request:
curl --request POST \
    "https://bookshelves.ink/api/login/token" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"hcollier@example.org\",
    \"password\": \"autem\",
    \"remember\": true,
    \"device_name\": \"voluptatibus\"
}"
const url = new URL(
    "https://bookshelves.ink/api/login/token"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "hcollier@example.org",
    "password": "autem",
    "remember": true,
    "device_name": "voluptatibus"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/login/token',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'hcollier@example.org',
            'password' => 'autem',
            'remember' => true,
            'device_name' => 'voluptatibus',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/login/token

Body Parameters

email  string  

Must be a valid email address.

password  string  

remember  boolean optional  

device_name  string  

POST Logout.

requires authentication

Route name: api.logout.token

Example request:
curl --request POST \
    "https://bookshelves.ink/api/logout/token" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/logout/token"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/logout/token',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/logout/token

POST Register.

Route name: api.register

Example request:
curl --request POST \
    "https://bookshelves.ink/api/register" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/register"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/register',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/register

User: Profile

GET User[].

Route name: api.users.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/users" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/users"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/users',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4971
vary: Origin
 

{
    "data": [
        {
            "id": 2,
            "meta": {
                "slug": "admin-6794",
                "show": "https://bookshelves.ink/api/users/admin-6794"
            },
            "name": "Admin",
            "slug": "admin-6794",
            "email": "admin@example.com",
            "role": "admin",
            "about": "Eligendi porro voluptas dolorem. Deserunt perspiciatis ad sunt. Pariatur recusandae tenetur quisquam qui.",
            "gender": "Unknown",
            "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 12,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 9,
            "meta": {
                "slug": "alfred-bode-9938",
                "show": "https://bookshelves.ink/api/users/alfred-bode-9938"
            },
            "name": "Alfred Bode",
            "slug": "alfred-bode-9938",
            "email": "lewis.towne@example.org",
            "role": "user",
            "about": "Nulla consequatur optio possimus officia necessitatibus eos ipsam. Eos reiciendis non omnis impedit ex quia distinctio nulla. In voluptatem sapiente architecto aperiam aut deleniti cumque.",
            "gender": "Unknown",
            "avatar": "https://bookshelves.ink/storage/media/users/513/alfred-bode-9938.webp",
            "color": "#726d6f",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 4,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 21,
            "meta": {
                "slug": "alfred-wintheiser-6171",
                "show": "https://bookshelves.ink/api/users/alfred-wintheiser-6171"
            },
            "name": "Alfred Wintheiser",
            "slug": "alfred-wintheiser-6171",
            "email": "nitzsche.muhammad@example.net",
            "role": "user",
            "about": "Eligendi nihil rem autem odio. Dolore repudiandae deserunt soluta minus quod dolores. Doloremque ullam pariatur commodi mollitia. Blanditiis sunt deleniti amet itaque.",
            "gender": "Man",
            "avatar": "https://eu.ui-avatars.com/api/?name=Alfred Wintheiser&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 9,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 17,
            "meta": {
                "slug": "angeline-nitzsche-4596",
                "show": "https://bookshelves.ink/api/users/angeline-nitzsche-4596"
            },
            "name": "Angeline Nitzsche",
            "slug": "angeline-nitzsche-4596",
            "email": "steuber.meta@example.org",
            "role": "user",
            "about": "Cum magnam sed voluptatem et vero ipsa dignissimos. Suscipit sit iure illum necessitatibus et rem non sed. Quia dolorem culpa necessitatibus vel. Ullam itaque similique eligendi hic dolorem.",
            "gender": "Unknown",
            "avatar": "https://bookshelves.ink/storage/media/users/524/angeline-nitzsche-4596.webp",
            "color": "#726d6f",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 11,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 16,
            "meta": {
                "slug": "betty-bauch-3673",
                "show": "https://bookshelves.ink/api/users/betty-bauch-3673"
            },
            "name": "Betty Bauch",
            "slug": "betty-bauch-3673",
            "email": "mortimer.grimes@example.org",
            "role": "user",
            "about": "Qui sed et dicta reprehenderit dolorum enim neque tenetur. Provident eaque aut facere incidunt. Ab quo porro consequatur eum enim. Qui esse incidunt aut voluptatem officia et.",
            "gender": "Genderfluid",
            "avatar": "https://eu.ui-avatars.com/api/?name=Betty Bauch&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 22,
            "meta": {
                "slug": "burnice-collier-4036",
                "show": "https://bookshelves.ink/api/users/burnice-collier-4036"
            },
            "name": "Burnice Collier",
            "slug": "burnice-collier-4036",
            "email": "asia.wehner@example.net",
            "role": "user",
            "about": "Quasi dolore ut nihil consequatur accusantium. Perferendis minima quo repudiandae et. Voluptas qui quia aut fugiat et quod.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/529/burnice-collier-4036.webp",
            "color": "#414b74",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 14,
            "meta": {
                "slug": "candido-rice-8701",
                "show": "https://bookshelves.ink/api/users/candido-rice-8701"
            },
            "name": "Candido Rice",
            "slug": "candido-rice-8701",
            "email": "ondricka.elroy@example.net",
            "role": "user",
            "about": "In repellat error cupiditate laborum dolor adipisci. Temporibus animi quibusdam ad sit suscipit dolore. Harum repellat ex possimus aliquid. Est doloremque assumenda quisquam sunt officia.",
            "gender": "Genderfluid",
            "avatar": "https://bookshelves.ink/storage/media/users/521/candido-rice-8701.webp",
            "color": "#c5bfbb",
            "use_gravatar": 0,
            "reviews_count": 9,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 4,
            "meta": {
                "slug": "delphia-satterfield-4030",
                "show": "https://bookshelves.ink/api/users/delphia-satterfield-4030"
            },
            "name": "Delphia Satterfield",
            "slug": "delphia-satterfield-4030",
            "email": "tavares15@example.org",
            "role": "user",
            "about": "Quia suscipit at repellendus sed aut dicta sit minima. Ut voluptates blanditiis recusandae rerum vel ut ipsa non. Neque molestiae tempore iure a. Hic ut aut vero voluptatem perferendis.",
            "gender": "Unknown",
            "avatar": "https://bookshelves.ink/storage/media/users/507/delphia-satterfield-4030.webp",
            "color": "#a98f79",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 4,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 10,
            "meta": {
                "slug": "elenora-kulas-3343",
                "show": "https://bookshelves.ink/api/users/elenora-kulas-3343"
            },
            "name": "Elenora Kulas",
            "slug": "elenora-kulas-3343",
            "email": "adaline.runolfsson@example.net",
            "role": "user",
            "about": "Possimus nam sint enim ipsa quae occaecati est. Odit rem velit qui voluptas labore ad. Consequuntur suscipit et iure officiis repellendus.",
            "gender": "Agender",
            "avatar": "https://bookshelves.ink/storage/media/users/515/elenora-kulas-3343.webp",
            "color": "#414b74",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 13,
            "meta": {
                "slug": "fiona-bahringer-7052",
                "show": "https://bookshelves.ink/api/users/fiona-bahringer-7052"
            },
            "name": "Fiona Bahringer",
            "slug": "fiona-bahringer-7052",
            "email": "chase66@example.com",
            "role": "user",
            "about": "Laborum ratione deserunt odio sint tempore odio et. Deserunt suscipit quae aut nihil itaque. Ipsa dicta amet quidem dolores alias natus. Dolorem quia saepe deserunt adipisci.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/520/fiona-bahringer-7052.webp",
            "color": "#574c34",
            "use_gravatar": 0,
            "reviews_count": 9,
            "favorites_count": 8,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 11,
            "meta": {
                "slug": "isabelle-gottlieb-5037",
                "show": "https://bookshelves.ink/api/users/isabelle-gottlieb-5037"
            },
            "name": "Isabelle Gottlieb",
            "slug": "isabelle-gottlieb-5037",
            "email": "beier.lorenzo@example.net",
            "role": "user",
            "about": "Vero dolorem et aliquam quasi aut dicta aut. Perspiciatis sit voluptate et fugiat. Quisquam non fugit et.",
            "gender": "Man",
            "avatar": "https://bookshelves.ink/storage/media/users/517/isabelle-gottlieb-5037.webp",
            "color": "#574642",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 9,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 5,
            "meta": {
                "slug": "jeromy-mclaughlin-1714",
                "show": "https://bookshelves.ink/api/users/jeromy-mclaughlin-1714"
            },
            "name": "Jeromy McLaughlin",
            "slug": "jeromy-mclaughlin-1714",
            "email": "jamil.mills@example.org",
            "role": "user",
            "about": "Id sit itaque quam minima sit. Quo debitis praesentium quo unde.",
            "gender": "Genderfluid",
            "avatar": "https://bookshelves.ink/storage/media/users/509/jeromy-mclaughlin-1714.webp",
            "color": "#a98f79",
            "use_gravatar": 0,
            "reviews_count": 12,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 20,
            "meta": {
                "slug": "joanie-greenholt-8531",
                "show": "https://bookshelves.ink/api/users/joanie-greenholt-8531"
            },
            "name": "Joanie Greenholt",
            "slug": "joanie-greenholt-8531",
            "email": "nmitchell@example.com",
            "role": "user",
            "about": "Minus non non a voluptas voluptatem accusantium veniam ea. Eius rem cupiditate similique vel ut reprehenderit quia. Modi voluptates sequi minima doloribus ipsum id blanditiis.",
            "gender": "Man",
            "avatar": "https://bookshelves.ink/storage/media/users/527/joanie-greenholt-8531.webp",
            "color": "#425d40",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 12,
            "meta": {
                "slug": "julien-bartoletti-7861",
                "show": "https://bookshelves.ink/api/users/julien-bartoletti-7861"
            },
            "name": "Julien Bartoletti",
            "slug": "julien-bartoletti-7861",
            "email": "kveum@example.net",
            "role": "user",
            "about": "Eveniet eveniet neque minus nostrum officia molestiae quae. Inventore placeat quae id aut modi eaque.",
            "gender": "Unknown",
            "avatar": "https://bookshelves.ink/storage/media/users/518/julien-bartoletti-7861.webp",
            "color": "#858585",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 18,
            "meta": {
                "slug": "kali-hirthe-9673",
                "show": "https://bookshelves.ink/api/users/kali-hirthe-9673"
            },
            "name": "Kali Hirthe",
            "slug": "kali-hirthe-9673",
            "email": "ohoeger@example.org",
            "role": "user",
            "about": "Occaecati eum aliquid iure odit et. Quos nesciunt sed officiis corrupti consequatur delectus corrupti. Qui sit ad velit commodi velit. Vel tenetur inventore numquam inventore.",
            "gender": "Man",
            "avatar": "https://eu.ui-avatars.com/api/?name=Kali Hirthe&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 4,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 3,
            "meta": {
                "slug": "lucius-bechtelar-5161",
                "show": "https://bookshelves.ink/api/users/lucius-bechtelar-5161"
            },
            "name": "Lucius Bechtelar",
            "slug": "lucius-bechtelar-5161",
            "email": "wmedhurst@example.com",
            "role": "user",
            "about": "Sit minus illo inventore omnis dolor eligendi. Tempora soluta tempora voluptatem. Quas itaque laborum minima. Nihil qui rem dolor inventore qui est. Atque quam libero est.",
            "gender": "Genderfluid",
            "avatar": "https://bookshelves.ink/storage/media/users/505/lucius-bechtelar-5161.webp",
            "color": "#5e4239",
            "use_gravatar": 0,
            "reviews_count": 6,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 15,
            "meta": {
                "slug": "molly-legros-4505",
                "show": "https://bookshelves.ink/api/users/molly-legros-4505"
            },
            "name": "Molly Legros",
            "slug": "molly-legros-4505",
            "email": "rolfson.kristina@example.net",
            "role": "user",
            "about": "Ipsam labore et illo itaque. Est nam debitis repellat impedit. Voluptatem minus ea facere praesentium nostrum illum ad et. Facilis consequatur quia qui non error.",
            "gender": "Agender",
            "avatar": "https://bookshelves.ink/storage/media/users/523/molly-legros-4505.webp",
            "color": "#3b331e",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 1,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 6,
            "meta": {
                "slug": "palma-friesen-3358",
                "show": "https://bookshelves.ink/api/users/palma-friesen-3358"
            },
            "name": "Palma Friesen",
            "slug": "palma-friesen-3358",
            "email": "maximilian.stamm@example.org",
            "role": "user",
            "about": "Explicabo et pariatur qui aspernatur quia. Commodi eaque error quo ad laudantium.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/510/palma-friesen-3358.webp",
            "color": "#a98f79",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 7,
            "meta": {
                "slug": "roma-altenwerth-9103",
                "show": "https://bookshelves.ink/api/users/roma-altenwerth-9103"
            },
            "name": "Roma Altenwerth",
            "slug": "roma-altenwerth-9103",
            "email": "macey11@example.org",
            "role": "user",
            "about": "Fugit impedit eos vitae et ut occaecati. Voluptate ea voluptatem ipsa. Et sed ut iure enim dolores.",
            "gender": "Non binary",
            "avatar": "https://bookshelves.ink/storage/media/users/511/roma-altenwerth-9103.webp",
            "color": "#312823",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 11,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 1,
            "meta": {
                "slug": "super-admin-2443",
                "show": "https://bookshelves.ink/api/users/super-admin-2443"
            },
            "name": "Super Admin",
            "slug": "super-admin-2443",
            "email": "superadmin@example.com",
            "role": "super_admin",
            "about": "Quae commodi ut fugit. Similique ut nobis ea a laboriosam amet beatae cupiditate. Et doloremque iusto aut temporibus temporibus voluptatibus. Voluptatum id aut laborum aut earum.",
            "gender": "Man",
            "avatar": "https://eu.ui-avatars.com/api/?name=Super Admin&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 14,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 19,
            "meta": {
                "slug": "tia-turner-4853",
                "show": "https://bookshelves.ink/api/users/tia-turner-4853"
            },
            "name": "Tia Turner",
            "slug": "tia-turner-4853",
            "email": "art.lehner@example.net",
            "role": "user",
            "about": "Est illo aliquam recusandae ut et molestias nihil. Quas quod voluptatem impedit maiores qui.",
            "gender": "Agender",
            "avatar": "https://bookshelves.ink/storage/media/users/525/tia-turner-4853.webp",
            "color": "#574642",
            "use_gravatar": 0,
            "reviews_count": 4,
            "favorites_count": 1,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 8,
            "meta": {
                "slug": "zakary-dickinson-4158",
                "show": "https://bookshelves.ink/api/users/zakary-dickinson-4158"
            },
            "name": "Zakary Dickinson",
            "slug": "zakary-dickinson-4158",
            "email": "ellsworth.schumm@example.org",
            "role": "user",
            "about": "Qui animi nemo corrupti ut repellendus qui. Suscipit qui expedita quae dolorem. Sed ex consequatur est aut quod numquam mollitia minima. Accusantium aut qui vero rem.",
            "gender": "Woman",
            "avatar": "https://eu.ui-avatars.com/api/?name=Zakary Dickinson&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 4,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        }
    ]
}
 

Request      

GET api/users

GET User.

Route name: api.users.show

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/users/alfred-wintheiser-6171" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/users/alfred-wintheiser-6171"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/users/alfred-wintheiser-6171',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4970
vary: Origin
 

{
    "data": {
        "id": 21,
        "meta": {
            "slug": "alfred-wintheiser-6171",
            "show": "https://bookshelves.ink/api/users/alfred-wintheiser-6171",
            "banner": "",
            "show_reviews": "https://bookshelves.ink/api/users/reviews/alfred-wintheiser-6171",
            "show_favorites": "https://bookshelves.ink/api/users/favorites/alfred-wintheiser-6171"
        },
        "name": "Alfred Wintheiser",
        "slug": "alfred-wintheiser-6171",
        "email": "nitzsche.muhammad@example.net",
        "role": "user",
        "about": "Eligendi nihil rem autem odio. Dolore repudiandae deserunt soluta minus quod dolores. Doloremque ullam pariatur commodi mollitia. Blanditiis sunt deleniti amet itaque.",
        "gender": "Man",
        "avatar": "https://eu.ui-avatars.com/api/?name=Alfred Wintheiser&color=7F9CF5&background=EBF4FF",
        "color": "#",
        "use_gravatar": 0,
        "reviews_count": 9,
        "favorites_count": 5,
        "is_admin": false,
        "display_reviews": 0,
        "display_favorites": 0,
        "display_gender": 0
    }
}
 

Request      

GET api/users/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: alfred-wintheiser-6171

GET Review[] belongs to User.

Route name: api.users.reviews

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/users/reviews/admin-6794?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/users/reviews/admin-6794"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/users/reviews/admin-6794',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4969
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "lovecraft-howard-phillips",
                "slug": "laffaire-charles-dexter-ward-novel-fr"
            },
            "id": 75,
            "text": "<p><strong>Aperiam</strong> hic quia maxime eum. Excepturi omnis beatae <em>non</em> <strong>nulla</strong> sed provident est. Dolorum error labore <em>impedit</em> laborum.</p>\n<p>Illo <strong>ratione</strong> sint omnis minus ut. Modi <em>nulla</em> est sequi <strong>ipsa</strong> id esse harum qui. <em>Ut</em> laborum autem ut <strong>ipsa</strong> repellendus. Nemo eius <em>illo</em> itaque quae totam velit accusantium. Hic voluptatem <em>unde</em> ipsam iste nesciunt. Laudantium praesentium <strong>eos</strong> dignissimos <em>illo</em> ut. Molestiae qui error et tenetur. <strong>Consequatur</strong> <em>odit</em> vel magni explicabo. Perspiciatis a et qui <strong>autem</strong> voluptatem id iure omnis. Consequuntur cum voluptates <em>quam</em> eum.</p>\n",
            "rating": 5,
            "user": {
                "id": 2,
                "name": "Admin",
                "slug": "admin-6794",
                "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
                "color": "#"
            },
            "title": "L'Affaire Charles Dexter Ward",
            "cover": "https://bookshelves.ink/storage/media/covers/238/conversions/laffaire-charles-dexter-ward-novel-fr-thumbnail.webp",
            "color": "#2d1912",
            "createdAt": "2022-04-17T08:36:23.000000Z",
            "updatedAt": "2022-04-10T18:32:40.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "lovecraft-howard-phillips",
                "slug": "dans-labime-du-temps-novel-fr"
            },
            "id": 47,
            "text": "<p><strong>Quam</strong> laboriosam qui qui vero voluptates. Beatae accusamus <em>id</em> <strong>repudiandae</strong> omnis rerum et. Cumque ut voluptatem <em>qui</em> illo. <strong>Non</strong> neque maxime veritatis beatae enim. <em>Voluptatibus</em> excepturi quidem <strong>commodi</strong> incidunt ducimus. Eum deleniti <em>asperiores</em> ut asperiores.</p>\n<p>Omnis nostrum <strong>corrupti</strong> adipisci expedita et <em>totam</em> nihil. Doloremque voluptate consequuntur <strong>ab</strong> dolore voluptatum <em>velit</em> quo enim. Ipsum earum in <strong>quia</strong> velit <em>corrupti</em> ad non consequuntur. Labore eos nihil quia. <em>Hic</em> sed sit corrupti et aliquid. Magnam facilis <strong>velit</strong> et ut tempora tempore. Vel fuga non qui. <strong>Facilis</strong> autem ullam recusandae unde cum sapiente.</p>\n",
            "rating": 0,
            "user": {
                "id": 2,
                "name": "Admin",
                "slug": "admin-6794",
                "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
                "color": "#"
            },
            "title": "Dans l'Abîme du Temps",
            "cover": "https://bookshelves.ink/storage/media/covers/234/conversions/dans-labime-du-temps-novel-fr-thumbnail.webp",
            "color": "#7f7367",
            "createdAt": "2022-04-17T08:36:22.000000Z",
            "updatedAt": "2022-04-11T16:38:16.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "zola-emile",
                "slug": "la-debacle-novel-fr"
            },
            "id": 139,
            "text": "<p><strong>Qui</strong> eum exercitationem sed illo quae odio. Quia <em>harum</em> <strong>culpa</strong> excepturi sit eos. Magnam aut id <em>fuga</em> qui. <strong>Voluptate</strong> est minima possimus ea laboriosam iure.</p>\n<p>Quia autem quis <strong>incidunt</strong> dolore ad culpa. Temporibus <em>autem</em> id corrupti omnis <strong>alias</strong> dolorem magnam. Aliquam <em>modi</em> sed temporibus laborum. Impedit <strong>tempora</strong> modi odio dolorum.</p>\n",
            "rating": 2,
            "user": {
                "id": 2,
                "name": "Admin",
                "slug": "admin-6794",
                "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
                "color": "#"
            },
            "title": "La Débâcle",
            "cover": "https://bookshelves.ink/storage/media/covers/426/conversions/la-debacle-novel-fr-thumbnail.webp",
            "color": "#c5b79a",
            "createdAt": "2022-04-13T02:56:26.000000Z",
            "updatedAt": "2022-04-13T02:56:26.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "author",
                "author": null,
                "slug": "melville-herman"
            },
            "id": 225,
            "text": "<p><strong>Cupiditate</strong> dolor ea repellat eius. Ex magnam sed <em>accusantium</em> ab. Iusto ullam vel quia consequatur maiores <em>ea</em> aut. <strong>Sed</strong> perferendis non reprehenderit natus sequi <em>error</em> rerum. Dolores <strong>temporibus</strong> quidem vitae est temporibus ut.</p>\n<p>Sit magnam nihil atque qui. Possimus qui eligendi <em>eos</em> in accusantium facere. Vero <strong>est</strong> sunt reprehenderit <em>qui</em> recusandae qui praesentium. Ratione error <strong>occaecati</strong> est <em>voluptatum</em> placeat qui perspiciatis mollitia. Harum recusandae <strong>repudiandae</strong> <em>at</em> delectus.</p>\n",
            "rating": 2,
            "user": {
                "id": 2,
                "name": "Admin",
                "slug": "admin-6794",
                "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
                "color": "#"
            },
            "title": "Melville Herman",
            "cover": "https://bookshelves.ink/storage/media/covers/492/conversions/melville-herman-thumbnail.webp",
            "color": "#352e2a",
            "createdAt": "2022-03-07T21:43:58.000000Z",
            "updatedAt": "2022-03-07T21:43:58.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "verne-jules",
                "slug": "sans-dessus-dessous-novel-fr"
            },
            "id": 82,
            "text": "<p><strong>Est</strong> sint cumque accusantium ratione illo consequatur inventore. <em>Sed</em> <strong>ducimus</strong> magnam laborum sequi explicabo veritatis architecto. <em>A</em> ratione <strong>rerum</strong> qui voluptates quaerat.</p>\n<p>Sunt ab debitis <em>eius</em> distinctio maxime. <strong>Hic</strong> fugiat ut ad aut <em>est</em> non. Aut quo <strong>facere</strong> magni quo dolores nam.</p>\n",
            "rating": 0,
            "user": {
                "id": 2,
                "name": "Admin",
                "slug": "admin-6794",
                "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
                "color": "#"
            },
            "title": "Sans dessus dessous",
            "cover": "https://bookshelves.ink/storage/media/covers/364/conversions/sans-dessus-dessous-novel-fr-thumbnail.webp",
            "color": "#948e5f",
            "createdAt": "2021-12-31T22:02:52.000000Z",
            "updatedAt": "2021-12-31T22:02:52.000000Z"
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/users/reviews/admin-6794?page=1",
        "last": "https://bookshelves.ink/api/users/reviews/admin-6794?page=3",
        "prev": null,
        "next": "https://bookshelves.ink/api/users/reviews/admin-6794?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 3,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/admin-6794?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/admin-6794?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/admin-6794?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/admin-6794?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/users/reviews/admin-6794",
        "per_page": 5,
        "to": 5,
        "total": 12
    }
}
 

Request      

GET api/users/reviews/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: admin-6794

Query Parameters

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

GET Favorite[] belongs to User.

Route name: api.users.favorites

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714"
);

const params = {
    "size": "5",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'size'=> '5',
            'page'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4968
vary: Origin
 

{
    "data": [
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "lovecraft-howard-phillips",
                "slug": "celui-qui-hantait-les-tenebres-novel-fr"
            },
            "title": "Celui qui hantait les ténèbres",
            "cover": "https://bookshelves.ink/storage/media/covers/232/conversions/celui-qui-hantait-les-tenebres-novel-fr-thumbnail.webp",
            "color": "#856f46",
            "createdAt": "2022-04-08T13:36:24.000000Z",
            "updatedAt": "2022-04-17T08:36:29.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "dumas-alexandre",
                "slug": "joseph-balsamo-tome-i-novel-fr"
            },
            "title": "Joseph Balsamo, tome I",
            "cover": "https://bookshelves.ink/storage/media/covers/141/conversions/joseph-balsamo-tome-i-novel-fr-thumbnail.webp",
            "color": "#a59b91",
            "createdAt": "2022-04-08T02:50:41.000000Z",
            "updatedAt": "2022-04-17T08:36:29.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "verne-jules",
                "slug": "deux-ans-de-vacances-novel-fr"
            },
            "title": "Deux ans de vacances",
            "cover": "https://bookshelves.ink/storage/media/covers/282/conversions/deux-ans-de-vacances-novel-fr-thumbnail.webp",
            "color": "#bc9577",
            "createdAt": "2022-03-30T23:44:59.000000Z",
            "updatedAt": "2022-04-17T08:36:29.000000Z"
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714?page=1",
        "last": "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/users/favorites/jeromy-mclaughlin-1714",
        "per_page": 5,
        "to": 3,
        "total": 3
    }
}
 

Request      

GET api/users/favorites/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: jeromy-mclaughlin-1714

Query Parameters

size  int optional  

Number of entities to return in a page.

page  int optional  

Page number to return, 1 by default

User: Review

GET Reviews for entity.

Route name: api.reviews.index

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/reviews/{model}/{slug}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/{model}/{slug}"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/reviews/{model}/{slug}',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 5000
x-ratelimit-remaining: 4980
vary: Origin
 

{
    "message": "Class \"App\\Models\\{model}\" not found",
    "exception": "Error",
    "file": "/home/ewilan/www/bookshelves-back/app/Http/Controllers/Api/ReviewController.php",
    "line": 24,
    "trace": [
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
            "line": 54,
            "function": "index",
            "class": "App\\Http\\Controllers\\Api\\ReviewController",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
            "line": 45,
            "function": "callAction",
            "class": "Illuminate\\Routing\\Controller",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
            "line": 261,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\ControllerDispatcher",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
            "line": 204,
            "function": "runController",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 725,
            "function": "run",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php",
            "line": 50,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Routing\\Middleware\\SubstituteBindings",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 126,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 102,
            "function": "handleRequest",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
            "line": 54,
            "function": "handleRequestUsingNamedLimiter",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 33,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Laravel\\Sanctum\\Http\\Middleware\\{closure}",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php",
            "line": 34,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 726,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 703,
            "function": "runRouteWithinStack",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 667,
            "function": "runRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 656,
            "function": "dispatchToRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 167,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 141,
            "function": "Illuminate\\Foundation\\Http\\{closure}",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/livewire/livewire/src/DisableBrowserCache.php",
            "line": 19,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Livewire\\DisableBrowserCache",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
            "line": 31,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
            "line": 40,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
            "line": 27,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
            "line": 86,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/fruitcake/laravel-cors/src/HandleCors.php",
            "line": 52,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Fruitcake\\Cors\\HandleCors",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
            "line": 39,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 180,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\TrustProxies",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 116,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 142,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 111,
            "function": "sendRequestThroughRouter",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 299,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 287,
            "function": "callLaravelOrLumenRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 89,
            "function": "makeApiCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 45,
            "function": "makeResponseCall",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Strategies/Responses/ResponseCalls.php",
            "line": 35,
            "function": "makeResponseCallIfConditionsPass",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 222,
            "function": "__invoke",
            "class": "Knuckles\\Scribe\\Extracting\\Strategies\\Responses\\ResponseCalls",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 179,
            "function": "iterateThroughStrategies",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Extracting/Extractor.php",
            "line": 116,
            "function": "fetchResponses",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 123,
            "function": "processRoute",
            "class": "Knuckles\\Scribe\\Extracting\\Extractor",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 80,
            "function": "extractEndpointsInfoFromLaravelApp",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/GroupedEndpoints/GroupedEndpointsFromApp.php",
            "line": 56,
            "function": "extractEndpointsInfoAndWriteToDisk",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php",
            "line": 55,
            "function": "get",
            "class": "Knuckles\\Scribe\\GroupedEndpoints\\GroupedEndpointsFromApp",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 36,
            "function": "handle",
            "class": "Knuckles\\Scribe\\Commands\\GenerateDocumentation",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Util.php",
            "line": 41,
            "function": "Illuminate\\Container\\{closure}",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 93,
            "function": "unwrapIfClosure",
            "class": "Illuminate\\Container\\Util",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 37,
            "function": "callBoundMethod",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 651,
            "function": "call",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 136,
            "function": "call",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Command/Command.php",
            "line": 308,
            "function": "execute",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Command.php",
            "line": 121,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Command\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 998,
            "function": "run",
            "class": "Illuminate\\Console\\Command",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 299,
            "function": "doRunCommand",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/symfony/console/Application.php",
            "line": 171,
            "function": "doRun",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Console/Application.php",
            "line": 102,
            "function": "run",
            "class": "Symfony\\Component\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php",
            "line": 129,
            "function": "run",
            "class": "Illuminate\\Console\\Application",
            "type": "->"
        },
        {
            "file": "/home/ewilan/www/bookshelves-back/artisan",
            "line": 37,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Console\\Kernel",
            "type": "->"
        }
    ]
}
 

Request      

GET api/reviews/{model}/{slug}

GET Reviews by user.

requires authentication

Route name: api.reviews.user

Example request:
curl --request GET \
    --get "https://bookshelves.ink/api/reviews/{user_id}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/{user_id}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://bookshelves.ink/api/reviews/{user_id}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/reviews/{user_id}

POST Store new review.

requires authentication

Route name: api.reviews.store

Example request:
curl --request POST \
    "https://bookshelves.ink/api/reviews/store/{model}/{slug}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/store/{model}/{slug}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/reviews/store/{model}/{slug}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/reviews/store/{model}/{slug}

POST Edit review.

requires authentication

Route name: api.reviews.edit

Example request:
curl --request POST \
    "https://bookshelves.ink/api/reviews/edit/{book_slug}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/edit/{book_slug}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/reviews/edit/{book_slug}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/reviews/edit/{book_slug}

POST Update review.

requires authentication

Route name: api.reviews.update

Example request:
curl --request POST \
    "https://bookshelves.ink/api/reviews/update/{book_slug}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/update/{book_slug}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/reviews/update/{book_slug}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/reviews/update/{book_slug}

POST Destroy review.

requires authentication

Route name: api.reviews.destroy

Example request:
curl --request POST \
    "https://bookshelves.ink/api/reviews/destroy/{book_slug}" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/reviews/destroy/{book_slug}"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://bookshelves.ink/api/reviews/destroy/{book_slug}',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/reviews/destroy/{book_slug}