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: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6ImxaRDlsWk1MRUpQYm5vSWhvNEFRS3c9PSIsInZhbHVlIjoibjRJVGd2S2lQTXVhRnJVMkVqVldOVTRSMnREOEg4eEhBcmNWalJKTEd5cUgxaEZUNUUyWWxxVDJvZVBOTWNMY1NxWEQ2RU5SaVFZb2p3MUhXQ1FZcXJHUksyc01EN2VBQXBXOXpRZTVOUllrZE0yd2U5amZ2TkVrM0x5Y253S24iLCJtYWMiOiI5YzY0NWVlOTIzZmU2Mjc0NmQ2ZmE1ZDQxM2EwYzk5Zjg2MGE4OWNmZmRkMzBkNzIzMWJkY2JhMWRkMDhjNTNhIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6Inl4VGZ1enRlZXhYUmFHYjNZcUZGYWc9PSIsInZhbHVlIjoicHBITDRueUVWdWwvRml3d2RHMVZod3BWam90czR1b1ZYZkpXWWladnpURks3WFRBTE54Um16QkY5ckxiUXRPby9zVFNYNE1qRzM0YXRkNGptZVNsVUREOVdPWjN3Mk9SUTY0ZzZVdjFhcEFyMHc4SDhucytudmw1cWs3d1lZZmsiLCJtYWMiOiJlMDU5YmEzOGQ2MWE1M2Y2MzJhOWQ2OTEyM2ZiMzQ3YjNjNThkNTRlNDc1MDE5MThlMDM1NmEyOGVkZTM2MjMyIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 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/54/about.webp",
            "summary": "About this project",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/56/faq.webp",
            "summary": "Frequently Asked Questions",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/57/features.webp",
            "summary": "On other ways",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/58/legal.webp",
            "summary": "About legal",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/59/more-ebooks.webp",
            "summary": "About more eBooks projects",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/60/privacy.webp",
            "summary": "Your privacy & your data",
            "publishedAt": "2022-08-14T12:58:51.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/legal" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/pages/legal"
);

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/legal',
    [
        '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: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6ImFUZzIrNDVzdXEvQ2JUc1V4Z0E3R3c9PSIsInZhbHVlIjoiTU03TzhLMjFlRWI3RHl0MnNiVjNMTngxaG9SOU11QkZLRVZkQklqU1pKcG11ZjVZVmhWNXhwblJvOUE5dElnSXNoVTN5YTVkSmFhUjNhM0kzZlY1b0h5ODIzTnVaV1R6QkwvOEZBYmhBMzkvSUU1dkxIYmVMTFRYRDRaTXAzR0wiLCJtYWMiOiJhMmUzM2EwNWY2YjVlMzA5OGFkNzk3ZjRhNjY2YzU0YjM5NzA5MWRjODM5YWYzNDlhODk5Njg1MWYyZTBjNGU2IiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6Ikx1TGxlSjAxZWVwU0lOL1ZZUThpekE9PSIsInZhbHVlIjoiU1p1ZjZTZjJ2ZXBTbnBsSFIwa0VGSDIwZjRMU0kxekhlUmk0UTkyeEhrM29BMjlDaitka1BnTmI3bnZaRTQzaDM3elgwemN3cnZNZFlmYVBxWjhJNU9SYnFhM2dVSlphUjJZOVlQeFhPbWFtMHR2N2lnTFVxQVpVS0dBYXh0YXYiLCJtYWMiOiIzOTljNDM2NzlmMGU4YWZmYWM0MGJiNTQyMDdmYWY2MTM5MzgwYTRiODNhNmQ2ZDQ5OTUyZjA2ZDhmZDk1Mjk5IiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": {
        "title": "Legal",
        "meta": {
            "slug": "legal",
            "title": "Legal",
            "description": "About legal",
            "show": "https://bookshelves.ink/api/pages/legal"
        },
        "cover": "https://bookshelves.ink/storage/media/cms/58/legal.webp",
        "summary": "About legal",
        "publishedAt": "2022-08-14T12:58:51.000000Z",
        "updatedAt": "2022-08-14T12:58:51.000000Z",
        "body": "<p>Bookshelves is not responsible for what you do with the files offered for download, you only have the right to download them if they are in the public domain and/or if you already own a legal copy of the file.</p>\n<p>You cannot hold Bookshelves responsible for what you do with these files, and conversely, you own them. Of course, since Bookshelves is based on an open-source project, if pirated content is offered on this website, the developers of the original project cannot be held responsible.</p>\n"
    }
}
 

Request      

GET api/pages/{page_slug}

URL Parameters

page_slug  string  

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

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: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6InJna0ZaNWdjV2ZFUGZNZUhsN1ZaYUE9PSIsInZhbHVlIjoiUHJaWnptTTNjT0VDYTNFeWpZcjFYdDdQWTNXeklGQzV2RzlGVTAyRlFRdjg3YW9DbFgzUkhISXNpS21vVGY5Rjd5RXY3VmZsMVp4cXF3NWtaN0tqWmg2cVJkd21nbFppL3hKdWxIN3VHY2I4Yk9VRUtNR0FoNjRqUmVSMlNGQ2ciLCJtYWMiOiJlMmFmZTNmNzE5MTk2NTcxY2U2MGQ2MTk5Y2IxYThmNzBkZGRhNmMwN2M4YThkZDU0NDgzMWIwNDY2ZWQ4NjE1IiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6InkyUVJ1bzlGTjlScWVBVUd5YzdQSVE9PSIsInZhbHVlIjoiUHFLNzRxa1pwK2tiZHkxKy91ZzZFVU43cTdUck1Bb1ZMTWQyRS9FVFRYWXBiTGo5Nmh6bzNodk5zRTExKzhzS1VzV0h0S0NWNHdIWHU0STBoMTlsOStYZjJsYXdLWTcrUGxjeXVJZTRoZlZyWlFsUFJzYWdzWWNxYTlwcXZQQmwiLCJtYWMiOiI3NTEwZTM4ZmU4MDZlNDhjM2IwMzdlYTBlNmRiZTRkNjY0NGNhMGY5MDBiYjUwZGU0OTcwZjU2ZGNlNGYzYjYxIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 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/36/presentation.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "What is Calibre and why it's a very cool software",
            "publishedAt": "2022-08-14T12:58:50.000000Z",
            "updatedAt": "2022-08-14T12:58:50.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/38/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-08-14T12:58:51.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/37/remove-drm.webp",
            "category": "Calibre",
            "user": "Super Admin",
            "summary": "Shut down DRM now!",
            "publishedAt": "2021-04-23T00:00:00.000000Z",
            "updatedAt": "2022-08-14T12:58:50.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/51/tips.webp",
            "category": "eReader",
            "user": "Super Admin",
            "summary": "Do you know really your Kobo?",
            "publishedAt": "2021-04-06T00:00:00.000000Z",
            "updatedAt": "2022-08-14T12:58:51.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/23/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-08-14T12:58:49.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/24/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-08-14T12:58:50.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/45/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-08-14T12:58:51.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/remove-drm" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/posts/remove-drm"
);

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/remove-drm',
    [
        '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: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IjZHb2JIdjJMRkRNWGhKRm8vRWpyRnc9PSIsInZhbHVlIjoiYzBoUFNCMExSbFdQNlI5ZVQxY3IzRkV5ZVNzNVZZNmRyb3RGMHRSUEJuZHpyTHFaQkwzd01kMnlOVVltcEtqRVFDUXVibGFQdU1qTklORXkxVENwY3BmYWNBVWk0ZG54b1JLQkxUT1FDY2JxWVRBYktoL1NQNlB4RXFEd0ErTmMiLCJtYWMiOiI1NzU3NjRkYmRiOWEzNDkxYTIwNGE1ZGFjM2M1ZTJiM2Q0ZmE5YjJlMTY1MzNiMzUwMTVkM2I0NjAwZjJjMDEzIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6IkxXc3FTV1E4alRUa2tBV0V6T1JraHc9PSIsInZhbHVlIjoiczRNamZHZG1ia0xMcThveUNoY3NzVHJ4NzFvZlpEVkNBR2dqNjVhVkYrWjFjTVRSdk5RajdpOFY2U1Rac1Aybis2eWIwQlFWT2NZUzUwQTh1UHowdlZrZ1RhZWxCMk9mRStPaFVYVVVoa1kyajBxRit0VmJNS3lrWTVHVEdQSXQiLCJtYWMiOiJiNTQzMGZkYTk0NmI4M2E3Yzk2NTYwMmVmYjEzYjI5ZDUyODk3NmJkZThmMTRjNzgxNzhlOTgyODE2MzJjNGY4IiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; httponly; samesite=lax
 

{
    "data": {
        "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/37/remove-drm.webp",
        "category": "Calibre",
        "user": "Super Admin",
        "summary": "Shut down DRM now!",
        "publishedAt": "2021-04-23T00:00:00.000000Z",
        "updatedAt": "2022-08-14T12:58:50.000000Z",
        "pin": false,
        "body": "<p>When you buy an eBook it can have DRM protection, you could open and read it only with propriety software.</p>\n<p><strong>Required</strong></p>\n<p><a href=\"https://calibre-ebook.com\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Calibre</strong></a>: to manage your comics and mangas</p>\n<h2 id=\"adobe-drm\">Adobe DRM</h2>\n<p>When you buy an eBook it can have Adobe DRM protection: a small file with standard name <code>URLLink.acsm</code>. Basically, it's a file for Adobe Digital Editions software, it can be downloaded by this application and read only by this application. To erase it, you need to download <a href=\"https://www.adobe.com/solutions/ebook/digital-editions/download.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Adobe Digital Editions</strong></a> to download eBooks, install it and open <code>URLLink.acsm</code>, Adobe Digital Editions will download the eBook and when it's done, you can <strong>click right on the eBook</strong> to choose <strong>Display file in explorer</strong>, you will find an EPUB file under protection.</p>\n<h3 id=\"remove-drm\">Remove DRM</h3>\n<p>You need to have <a href=\"https://calibre-ebook.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Calibre</a> and <a href=\"https://github.com/apprenticeharper/DeDRM_tools/releases\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DeDRM plugin</strong></a> (download last version DeDRM_tools.zip), when Calibre it installed go to <strong>Preferences-&gt;Plug-ins</strong>, select <strong>Load plug-in from file</strong> and find <strong>DeDRM zip file</strong> that you downloaded. Install it and import EPUB file from Adobe file location, the DRM will be erased.</p>\n<p>Source: <a href=\"https://www.osxwiki.com/acsm-to-epub\" target=\"_blank\" rel=\"noopener noreferrer\">Remove Adobe DRM article</a></p>\n"
    }
}
 

Request      

GET api/posts/{post_slug}

URL Parameters

post_slug  string  

slug of post in meta.slug posts' list, example: remove-drm

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=dickens" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/search"
);

const params = {
    "q": "dickens",
};
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'=> 'dickens',
        ],
    ]
);
$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": 30,
        "type": "meilisearch",
        "query": "dickens",
        "results": {
            "authors": [
                {
                    "meta": {
                        "entity": "author",
                        "author": null,
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    },
                    "title": "Dickens Charles",
                    "type": null,
                    "authors": null,
                    "serie": null,
                    "language": null,
                    "volume": null,
                    "count": null,
                    "media": {
                        "name": "dickens-charles",
                        "url": "https://bookshelves.ink/storage/media/covers/484/dickens-charles.webp",
                        "color": "#8f7a69"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/484/conversions/dickens-charles-simple.jpg",
                    "first_char": "d"
                },
                {
                    "meta": {
                        "entity": "author",
                        "author": null,
                        "slug": "andersen-hans-christian",
                        "show": "https://bookshelves.ink/api/authors/andersen-hans-christian"
                    },
                    "title": "Andersen Hans Christian",
                    "type": null,
                    "authors": null,
                    "serie": null,
                    "language": null,
                    "volume": null,
                    "count": null,
                    "media": {
                        "name": "andersen-hans-christian",
                        "url": "https://bookshelves.ink/storage/media/covers/479/andersen-hans-christian.webp",
                        "color": "#a18668"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-simple.jpg",
                    "first_char": "a"
                }
            ],
            "series": [
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "aventures-de-monsieur-pickwick-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/aventures-de-monsieur-pickwick-novel-fr"
                    },
                    "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": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": null,
                    "count": 1,
                    "media": {
                        "name": "aventures-de-monsieur-pickwick-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/458/aventures-de-monsieur-pickwick-novel-fr.webp",
                        "color": "#573d1e"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/458/conversions/aventures-de-monsieur-pickwick-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "barnabe-rudge-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/barnabe-rudge-novel-fr"
                    },
                    "title": "Barnabé Rudge",
                    "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,
                    "media": {
                        "name": "barnabe-rudge-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/459/barnabe-rudge-novel-fr.webp",
                        "color": "#f7f1e2"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/459/conversions/barnabe-rudge-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "david-copperfield-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/david-copperfield-novel-fr"
                    },
                    "title": "David Copperfield",
                    "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,
                    "media": {
                        "name": "david-copperfield-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/460/david-copperfield-novel-fr.webp",
                        "color": "#a89c85"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/460/conversions/david-copperfield-novel-fr-simple.jpg",
                    "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,
                    "media": {
                        "name": "dombey-et-fils-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/461/dombey-et-fils-novel-fr.webp",
                        "color": "#29382d"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/461/conversions/dombey-et-fils-novel-fr-simple.jpg",
                    "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,
                    "media": {
                        "name": "lami-commun-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/462/lami-commun-novel-fr.webp",
                        "color": "#665460"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "le-magasin-dantiquites-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/le-magasin-dantiquites-novel-fr"
                    },
                    "title": "Le Magasin d'antiquités",
                    "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,
                    "media": {
                        "name": "le-magasin-dantiquites-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/463/le-magasin-dantiquites-novel-fr.webp",
                        "color": "#634a21"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/463/conversions/le-magasin-dantiquites-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "vie-et-aventures-de-martin-chuzzlewit-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/vie-et-aventures-de-martin-chuzzlewit-novel-fr"
                    },
                    "title": "Vie et aventures de Martin Chuzzlewit",
                    "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,
                    "media": {
                        "name": "vie-et-aventures-de-martin-chuzzlewit-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/464/vie-et-aventures-de-martin-chuzzlewit-novel-fr.webp",
                        "color": "#a9a59b"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/464/conversions/vie-et-aventures-de-martin-chuzzlewit-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "serie",
                        "author": "dickens-charles",
                        "slug": "vie-et-aventures-de-nicolas-nickleby-novel-fr",
                        "show": "https://bookshelves.ink/api/series/dickens-charles/vie-et-aventures-de-nicolas-nickleby-novel-fr"
                    },
                    "title": "Vie et aventures de Nicolas Nickleby",
                    "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,
                    "media": {
                        "name": "vie-et-aventures-de-nicolas-nickleby-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/465/vie-et-aventures-de-nicolas-nickleby-novel-fr.webp",
                        "color": "#f6efe1"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/465/conversions/vie-et-aventures-de-nicolas-nickleby-novel-fr-simple.jpg",
                    "first_char": null
                }
            ],
            "books": [
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "cantique-de-noel-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/cantique-de-noel-novel-fr"
                    },
                    "title": "Cantique de Noël",
                    "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": null,
                    "media": {
                        "name": "cantique-de-noel-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/79/cantique-de-noel-novel-fr.webp",
                        "color": "#b99d68"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/79/conversions/cantique-de-noel-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "la-terre-de-tom-tiddler-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/la-terre-de-tom-tiddler-novel-fr"
                    },
                    "title": "La Terre de Tom Tiddler",
                    "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": null,
                    "media": {
                        "name": "la-terre-de-tom-tiddler-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/81/la-terre-de-tom-tiddler-novel-fr.webp",
                        "color": "#e1b19f"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/81/conversions/la-terre-de-tom-tiddler-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "le-grillon-du-foyer-histoire-fantastique-dun-interieur-domestique-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/le-grillon-du-foyer-histoire-fantastique-dun-interieur-domestique-novel-fr"
                    },
                    "title": "Le Grillon Du Foyer: Histoire Fantastique D'Un Interieur Domestique",
                    "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": null,
                    "media": {
                        "name": "le-grillon-du-foyer-histoire-fantastique-dun-interieur-domestique-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/83/le-grillon-du-foyer-histoire-fantastique-dun-interieur-domestique-novel-fr.webp",
                        "color": "#a69380"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/83/conversions/le-grillon-du-foyer-histoire-fantastique-dun-interieur-domestique-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "le-marquis-de-saint-evremont-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/le-marquis-de-saint-evremont-novel-fr"
                    },
                    "title": "Le Marquis de Saint-Évremont",
                    "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": null,
                    "media": {
                        "name": "le-marquis-de-saint-evremont-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/85/le-marquis-de-saint-evremont-novel-fr.webp",
                        "color": "#9d816e"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/85/conversions/le-marquis-de-saint-evremont-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "le-signaleur-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/le-signaleur-novel-fr"
                    },
                    "title": "Le signaleur",
                    "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": null,
                    "media": {
                        "name": "le-signaleur-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/87/le-signaleur-novel-fr.webp",
                        "color": "#87797a"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/87/conversions/le-signaleur-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "les-conteurs-a-la-ronde-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/les-conteurs-a-la-ronde-novel-fr"
                    },
                    "title": "Les conteurs à la ronde",
                    "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": null,
                    "media": {
                        "name": "les-conteurs-a-la-ronde-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/89/les-conteurs-a-la-ronde-novel-fr.webp",
                        "color": "#bfc9ab"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/89/conversions/les-conteurs-a-la-ronde-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "les-grandes-esperances-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/les-grandes-esperances-novel-fr"
                    },
                    "title": "Les Grandes Espérances",
                    "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": null,
                    "media": {
                        "name": "les-grandes-esperances-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/91/les-grandes-esperances-novel-fr.webp",
                        "color": "#9e9f8a"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/91/conversions/les-grandes-esperances-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "les-temps-difficiles-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/les-temps-difficiles-novel-fr"
                    },
                    "title": "Les temps difficiles",
                    "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": null,
                    "media": {
                        "name": "les-temps-difficiles-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/93/les-temps-difficiles-novel-fr.webp",
                        "color": "#eeebc7"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/93/conversions/les-temps-difficiles-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "oliver-twist-les-voleurs-de-londres-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/oliver-twist-les-voleurs-de-londres-novel-fr"
                    },
                    "title": "Oliver Twist, les voleurs de Londres",
                    "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": null,
                    "media": {
                        "name": "oliver-twist-les-voleurs-de-londres-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/95/oliver-twist-les-voleurs-de-londres-novel-fr.webp",
                        "color": "#ae9079"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/95/conversions/oliver-twist-les-voleurs-de-londres-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "oliver-twist-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/oliver-twist-novel-fr"
                    },
                    "title": "Oliver Twist",
                    "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": null,
                    "media": {
                        "name": "oliver-twist-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/97/oliver-twist-novel-fr.webp",
                        "color": "#706753"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/97/conversions/oliver-twist-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "a-tale-of-two-cities-novel-en",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/a-tale-of-two-cities-novel-en"
                    },
                    "title": "A Tale of Two Cities",
                    "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,
                    "media": {
                        "name": "a-tale-of-two-cities-novel-en",
                        "url": "https://bookshelves.ink/storage/media/covers/99/a-tale-of-two-cities-novel-en.webp",
                        "color": "#648ab5"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/99/conversions/a-tale-of-two-cities-novel-en-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "david-copperfield-tome-i-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/david-copperfield-tome-i-novel-fr"
                    },
                    "title": "David Copperfield, tome I",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "David Copperfield",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 1,
                    "count": null,
                    "media": {
                        "name": "david-copperfield-tome-i-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/101/david-copperfield-tome-i-novel-fr.webp",
                        "color": "#a89c85"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/101/conversions/david-copperfield-tome-i-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "david-copperfield-tome-ii-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/david-copperfield-tome-ii-novel-fr"
                    },
                    "title": "David Copperfield, tome II",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "David Copperfield",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 2,
                    "count": null,
                    "media": {
                        "name": "david-copperfield-tome-ii-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/103/david-copperfield-tome-ii-novel-fr.webp",
                        "color": "#4a797f"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/103/conversions/david-copperfield-tome-ii-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "dombey-et-fils-tome-i-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/dombey-et-fils-tome-i-novel-fr"
                    },
                    "title": "Dombey Et Fils, tome I",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "Dombey Et Fils",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 1,
                    "count": null,
                    "media": {
                        "name": "dombey-et-fils-tome-i-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/105/dombey-et-fils-tome-i-novel-fr.webp",
                        "color": "#29382d"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/105/conversions/dombey-et-fils-tome-i-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "dombey-et-fils-tome-ii-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/dombey-et-fils-tome-ii-novel-fr"
                    },
                    "title": "Dombey Et Fils, tome II",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "Dombey Et Fils",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 2,
                    "count": null,
                    "media": {
                        "name": "dombey-et-fils-tome-ii-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/107/dombey-et-fils-tome-ii-novel-fr.webp",
                        "color": "#c44241"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/107/conversions/dombey-et-fils-tome-ii-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "dombey-et-fils-tome-iii-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/dombey-et-fils-tome-iii-novel-fr"
                    },
                    "title": "Dombey et Fils, tome III",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "Dombey Et Fils",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 3,
                    "count": null,
                    "media": {
                        "name": "dombey-et-fils-tome-iii-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/109/dombey-et-fils-tome-iii-novel-fr.webp",
                        "color": "#acac9d"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/109/conversions/dombey-et-fils-tome-iii-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "lami-commun-tome-i-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/lami-commun-tome-i-novel-fr"
                    },
                    "title": "L'Ami commun, tome I",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "L'Ami commun",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 1,
                    "count": null,
                    "media": {
                        "name": "lami-commun-tome-i-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/111/lami-commun-tome-i-novel-fr.webp",
                        "color": "#665460"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/111/conversions/lami-commun-tome-i-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "lami-commun-tome-ii-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/lami-commun-tome-ii-novel-fr"
                    },
                    "title": "L'Ami commun, tome II",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "L'Ami commun",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 2,
                    "count": null,
                    "media": {
                        "name": "lami-commun-tome-ii-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/113/lami-commun-tome-ii-novel-fr.webp",
                        "color": "#f7f1e2"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/113/conversions/lami-commun-tome-ii-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "le-magasin-dantiquites-tome-i-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/le-magasin-dantiquites-tome-i-novel-fr"
                    },
                    "title": "Le Magasin d'antiquités, tome I",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "Le Magasin d'antiquités",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 1,
                    "count": null,
                    "media": {
                        "name": "le-magasin-dantiquites-tome-i-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/115/le-magasin-dantiquites-tome-i-novel-fr.webp",
                        "color": "#634a21"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/115/conversions/le-magasin-dantiquites-tome-i-novel-fr-simple.jpg",
                    "first_char": null
                },
                {
                    "meta": {
                        "entity": "book",
                        "author": "dickens-charles",
                        "slug": "le-magasin-dantiquites-tome-ii-novel-fr",
                        "show": "https://bookshelves.ink/api/books/dickens-charles/le-magasin-dantiquites-tome-ii-novel-fr"
                    },
                    "title": "Le Magasin d'antiquités, tome II",
                    "type": "Novel",
                    "authors": [
                        {
                            "name": "Dickens Charles",
                            "meta": {
                                "entity": "author",
                                "slug": "dickens-charles",
                                "show": "https://bookshelves.ink/api/authors/dickens-charles"
                            }
                        }
                    ],
                    "serie": "Le Magasin d'antiquités",
                    "language": {
                        "name": "French",
                        "meta": {
                            "slug": "fr"
                        }
                    },
                    "volume": 2,
                    "count": null,
                    "media": {
                        "name": "le-magasin-dantiquites-tome-ii-novel-fr",
                        "url": "https://bookshelves.ink/storage/media/covers/117/le-magasin-dantiquites-tome-ii-novel-fr.webp",
                        "color": "#ae8d7c"
                    },
                    "media_social": "https://bookshelves.ink/storage/media/covers/117/conversions/le-magasin-dantiquites-tome-ii-novel-fr-simple.jpg",
                    "first_char": null
                }
            ]
        },
        "results_relevant": []
    }
}
 

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": "zola-emile",
                "slug": "germinal-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/germinal-novel-fr"
            },
            "title": "Germinal",
            "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,
            "media": {
                "name": "germinal-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/412/germinal-novel-fr.webp",
                "color": "#837d73"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/412/conversions/germinal-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "la-curee-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/la-curee-novel-fr"
            },
            "title": "La Curée",
            "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,
            "media": {
                "name": "la-curee-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/424/la-curee-novel-fr.webp",
                "color": "#bd9489"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/424/conversions/la-curee-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "la-joie-de-vivre-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/la-joie-de-vivre-novel-fr"
            },
            "title": "La Joie de vivre",
            "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,
            "media": {
                "name": "la-joie-de-vivre-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/432/la-joie-de-vivre-novel-fr.webp",
                "color": "#ba7670"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/432/conversions/la-joie-de-vivre-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "zola-emile",
                "slug": "la-mort-dolivier-becaille-novel-fr",
                "show": "https://bookshelves.ink/api/books/zola-emile/la-mort-dolivier-becaille-novel-fr"
            },
            "title": "La mort d'Olivier Bécaille",
            "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,
            "media": {
                "name": "la-mort-dolivier-becaille-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/434/la-mort-dolivier-becaille-novel-fr.webp",
                "color": "#8b8585"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/434/conversions/la-mort-dolivier-becaille-novel-fr-simple.jpg",
            "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,
            "media": {
                "name": "pot-bouille-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/450/pot-bouille-novel-fr.webp",
                "color": "#bbbbbb"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/450/conversions/pot-bouille-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "le-superbe-orenoque-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/le-superbe-orenoque-novel-fr"
            },
            "title": "Le Superbe Orénoque",
            "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,
            "media": {
                "name": "le-superbe-orenoque-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/336/le-superbe-orenoque-novel-fr.webp",
                "color": "#604c47"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/336/conversions/le-superbe-orenoque-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "le-tour-du-monde-en-quatre-vingts-jours-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/le-tour-du-monde-en-quatre-vingts-jours-novel-fr"
            },
            "title": "Le Tour du monde en quatre-vingts jours",
            "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,
            "media": {
                "name": "le-tour-du-monde-en-quatre-vingts-jours-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/340/le-tour-du-monde-en-quatre-vingts-jours-novel-fr.webp",
                "color": "#b0bec1"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/340/conversions/le-tour-du-monde-en-quatre-vingts-jours-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "le-village-aerien-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/le-village-aerien-novel-fr"
            },
            "title": "Le Village aérien",
            "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,
            "media": {
                "name": "le-village-aerien-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/342/le-village-aerien-novel-fr.webp",
                "color": "#a58666"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/342/conversions/le-village-aerien-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "les-forceurs-de-blocus-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/les-forceurs-de-blocus-novel-fr"
            },
            "title": "Les Forceurs de blocus",
            "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,
            "media": {
                "name": "les-forceurs-de-blocus-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/348/les-forceurs-de-blocus-novel-fr.webp",
                "color": "#fcfcfc"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/348/conversions/les-forceurs-de-blocus-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "voyage-au-centre-de-la-terre-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/voyage-au-centre-de-la-terre-novel-fr"
            },
            "title": "Voyage au centre de la Terre",
            "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,
            "media": {
                "name": "voyage-au-centre-de-la-terre-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/372/voyage-au-centre-de-la-terre-novel-fr.webp",
                "color": "#ac8d5e"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/372/conversions/voyage-au-centre-de-la-terre-novel-fr-simple.jpg",
            "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": "dumas-alexandre",
                "slug": "joseph-balsamo-tome-ii-novel-fr",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/joseph-balsamo-tome-ii-novel-fr"
            },
            "title": "Joseph Balsamo, tome II",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dumas Alexandre",
                    "meta": {
                        "entity": "author",
                        "slug": "dumas-alexandre",
                        "show": "https://bookshelves.ink/api/authors/dumas-alexandre"
                    }
                }
            ],
            "serie": "Joseph Balsamo",
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": 2,
            "count": null,
            "media": {
                "name": "joseph-balsamo-tome-ii-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/143/joseph-balsamo-tome-ii-novel-fr.webp",
                "color": "#625e46"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/143/conversions/joseph-balsamo-tome-ii-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "dumas-alexandre",
                "slug": "le-trou-de-lenfer-novel-fr",
                "show": "https://bookshelves.ink/api/books/dumas-alexandre/le-trou-de-lenfer-novel-fr"
            },
            "title": "Le Trou de l’Enfer",
            "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": null,
            "media": {
                "name": "le-trou-de-lenfer-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/133/le-trou-de-lenfer-novel-fr.webp",
                "color": "#bdbcbb"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/133/conversions/le-trou-de-lenfer-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "verne-jules",
                "slug": "20000-lieues-sous-les-mers-novel-fr",
                "show": "https://bookshelves.ink/api/books/verne-jules/20000-lieues-sous-les-mers-novel-fr"
            },
            "title": "20000 lieues sous les mers",
            "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,
            "media": {
                "name": "20000-lieues-sous-les-mers-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/268/20000-lieues-sous-les-mers-novel-fr.webp",
                "color": "#9f9d9d"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/268/conversions/20000-lieues-sous-les-mers-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "book",
                "author": "dickens-charles",
                "slug": "vie-et-aventures-de-nicolas-nickleby-tome-i-novel-fr",
                "show": "https://bookshelves.ink/api/books/dickens-charles/vie-et-aventures-de-nicolas-nickleby-tome-i-novel-fr"
            },
            "title": "Vie et aventures de Nicolas Nickleby, tome I",
            "type": "Novel",
            "authors": [
                {
                    "name": "Dickens Charles",
                    "meta": {
                        "entity": "author",
                        "slug": "dickens-charles",
                        "show": "https://bookshelves.ink/api/authors/dickens-charles"
                    }
                }
            ],
            "serie": "Vie et aventures de Nicolas Nickleby",
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": 1,
            "count": null,
            "media": {
                "name": "vie-et-aventures-de-nicolas-nickleby-tome-i-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/123/vie-et-aventures-de-nicolas-nickleby-tome-i-novel-fr.webp",
                "color": "#f6efe1"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/123/conversions/vie-et-aventures-de-nicolas-nickleby-tome-i-novel-fr-simple.jpg",
            "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,
            "media": {
                "name": "bourses-de-voyage-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/274/bourses-de-voyage-novel-fr.webp",
                "color": "#a29978"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/274/conversions/bourses-de-voyage-novel-fr-simple.jpg",
            "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,
            "media": {
                "name": "les-trois-mousquetaires-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/477/les-trois-mousquetaires-novel-fr.webp",
                "color": "#dfd6d3"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/477/conversions/les-trois-mousquetaires-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dickens-charles",
                "slug": "aventures-de-monsieur-pickwick-novel-fr",
                "show": "https://bookshelves.ink/api/series/dickens-charles/aventures-de-monsieur-pickwick-novel-fr"
            },
            "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": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": 1,
            "media": {
                "name": "aventures-de-monsieur-pickwick-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/458/aventures-de-monsieur-pickwick-novel-fr.webp",
                "color": "#573d1e"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/458/conversions/aventures-de-monsieur-pickwick-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "le-docteur-mysterieux-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/le-docteur-mysterieux-novel-fr"
            },
            "title": "Le docteur mystérieux",
            "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,
            "media": {
                "name": "le-docteur-mysterieux-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/473/le-docteur-mysterieux-novel-fr.webp",
                "color": "#cbc7bc"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/473/conversions/le-docteur-mysterieux-novel-fr-simple.jpg",
            "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,
            "media": {
                "name": "lami-commun-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/462/lami-commun-novel-fr.webp",
                "color": "#665460"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-simple.jpg",
            "first_char": null
        },
        {
            "meta": {
                "entity": "serie",
                "author": "dumas-alexandre",
                "slug": "la-comtesse-de-charny-novel-fr",
                "show": "https://bookshelves.ink/api/series/dumas-alexandre/la-comtesse-de-charny-novel-fr"
            },
            "title": "La Comtesse de Charny",
            "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": 5,
            "media": {
                "name": "la-comtesse-de-charny-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/468/la-comtesse-de-charny-novel-fr.webp",
                "color": "#bf6c70"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/468/conversions/la-comtesse-de-charny-novel-fr-simple.jpg",
            "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/vingt-ans-apres-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/vingt-ans-apres-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/vingt-ans-apres-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 (400):

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

"No tags or no books related"
 

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": 139,
            "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": 124,
            "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/dickens-charles/david-copperfield-tome-i-novel-fr" \
    --header "Content-Type: application/epub+zip" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/download/book/dickens-charles/david-copperfield-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/dickens-charles/david-copperfield-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=dickens-charles-david-copperfield-01-david-copperfield-tome-i-fr.epub
content-type: application/epub+zip
accept-ranges: bytes
vary: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IkVxcHYrR2RQeUtNWUluMmQrcDhYdnc9PSIsInZhbHVlIjoiUzZPdHNTV0VSczd1K0kxTHp4dk1DWDhmVm5ETWVyc05qVHlsbFF2VTJXaVpRTm1FL1RsZVk4YjQ1NDFEWXpEdHg2ditybUl5WUNRbG96LzJnTVhLd1NKTmwxSVFTNWVuZFhtcmVQd2M3dFFWQ0pUWmlwb00rVm9FL3ViRjdPQ2giLCJtYWMiOiIzMzQyNzdlZWM4MzIxMTFmZTAzYjhmZDIyNzgzN2MxNWUzYjBiM2ZhODAxMTIyNGY3NDgyNTJkOGJiMzRlMmRmIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6IkdGUEFoV0NMQytvR1dWclVOQk0zeFE9PSIsInZhbHVlIjoiT0lvQk1maVRHNTFENXJXdVpwK1IxcE5UbGU4NEhkcjFVTm4yL0RzVkZpSkpZVzU0UjRTMmIrYUFGREZWMEtic3JjTWQ3d240QVZ5VHN6RkxVYXRqcDdwa3RoVkdxeWNNdjgxa3B3cUNzd3RNcGV0VnlJRFZydXo4KzJHaEM2YSsiLCJtYWMiOiJiNmIyYjM2MTI4N2M5YzI4NzA4MzFhYjJmMzA4NDljMWRlY2M2M2ZkY2ZjZDY3NGRkM2ZiN2UwZDNkNjk5NDY0IiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 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: dickens-charles

book_slug  string  

slug of book in meta.slug books' list, example: david-copperfield-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/kafka-franz/epub" \
    --header "Content-Type: application/octet-stream" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/download/author/kafka-franz/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/kafka-franz/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="kafka-franz-aicrbccw.zip"
content-type: application/octet-stream
cache-control: no-cache, private
vary: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IkZGSEJsVXNkbFBmK2hxemtQbmJqRkE9PSIsInZhbHVlIjoiM2kwek4xV1NRUnFycEQ4SHUrUGJyZ29UZUVzSXE1bXRXNm1GclZjeXJybWtYUnNTdXF0L2VtOGlETllKcFdJcGNuMmx6dG14TmwySzRiU0JEL1EzN2F4d3ZmWlJqNmNpUEUydWxnYkUvR0E1SDNzTkxvY2xuajBMUklyaDRyVFgiLCJtYWMiOiJhMzhmZGM2NzZlMDEyZmFhNzk0NmZhM2JjMTBkODQzMTgyMjAwMGZkNThiNDdhZjJmYTM0YTEyODZhOThhMDkzIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6Imw1VGdySHlDd3dkOVBPZDRyZXhoRlE9PSIsInZhbHVlIjoidEJ2Qi83R2t0VXU5YWUvUkxWVG01akhFMy9LcXBsUTluMXlSS20ycG5TMTJiUzBjTzJvd3hmd29TRU1aRzl4QUNJd0I1VlVESkRkMFFQM0JiQjQrNk1nS1A0LzBwY0VRWk10Y2E3cFZKMEE3RkVTZnZ4QTlWeFFrSnd2MVNXSlYiLCJtYWMiOiIzOWFlOTk3YmFlOTU4NTM1MTlkNGNmNWJhZGFjODNiZTgyNjU3MDQ4YzVhY2M0NTRmOGYzYzIzMGUyZmNlYzUwIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 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: kafka-franz

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/david-copperfield-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/david-copperfield-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/david-copperfield-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-david-copperfield-novel-fr-lc44mfnw.zip"
content-type: application/octet-stream
cache-control: no-cache, private
vary: X-Inertia, Origin
set-cookie: XSRF-TOKEN=eyJpdiI6InlYSlVPT3g1aGF0bUo2QjF1YjA3VlE9PSIsInZhbHVlIjoiSTg4eERNWjZIU0IvTllDbXpLQndhS0ZjOXZ0QzJjaGdCeHBJVkIydXY1M1h0aWViSkVZVDhzZVBhS1hHTmZFTS9NL2RRM3I4R3I1KzFiYVRJUTZGNHQ1VWg5REZ1dHZjNmpuMlZzdytnVThEMkNML3ZCbENHQUJhVjNFUmFRVTEiLCJtYWMiOiIzZWE2NWE5ZWFmZDEwZTBmZTU5NTJmOTkxMGJmODg2NjY5NzRjNWU3YThjMTRjYmMzYzA2OTE4ZmRkODdjYTVkIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 GMT; Max-Age=86400; path=/; domain=.bookshelves.ink; samesite=lax; bookshelves_session=eyJpdiI6InloNS96ZHdmVUlILzhxTGZSRHErT2c9PSIsInZhbHVlIjoiT040M2pqQnlEOUlSRzZIWDBIaUxxc3J0ME5NY0Jib202R1psTCtPWjYyMHY1bzNTMEMrcUo0VU94UHBmUUt1cTVTNHhBcVpXZHV4RzZNZGNzYW8zN1E1UVl0aThCMDBoVTVQbU96bm9VdGo5QTlZc2pkVHZKLzJ2bDByZ2tENnUiLCJtYWMiOiJkZmQzNTY1MjM3Y2Y0N2IwZjE5NGU5YjY0NDg5NzFjZjA4ZjQ0YTc2NDNmZGNjMGYwYzAzZWJjOTQxMjNkMzVhIiwidGFnIjoiIn0%3D; expires=Mon, 15 Aug 2022 18:20:09 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: david-copperfield-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",
            "media": {
                "name": "andersen-hans-christian",
                "url": "https://bookshelves.ink/storage/media/covers/479/andersen-hans-christian.webp",
                "color": "#a18668"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-simple.jpg",
            "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",
            "media": {
                "name": "apollinaire-guillaume",
                "url": "https://bookshelves.ink/storage/media/covers/480/apollinaire-guillaume.webp",
                "color": "#a8a8a8"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/480/conversions/apollinaire-guillaume-simple.jpg",
            "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",
            "media": {
                "name": "austen-jane",
                "url": "https://bookshelves.ink/storage/media/covers/481/austen-jane.webp",
                "color": "#dbd2cc"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/481/conversions/austen-jane-simple.jpg",
            "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",
            "media": {
                "name": "carroll-lewis",
                "url": "https://bookshelves.ink/storage/media/covers/482/carroll-lewis.webp",
                "color": "#584a3e"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/482/conversions/carroll-lewis-simple.jpg",
            "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",
            "media": {
                "name": "darwin-charles",
                "url": "https://bookshelves.ink/storage/media/covers/483/darwin-charles.webp",
                "color": "#5c5c5c"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/483/conversions/darwin-charles-simple.jpg",
            "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/twain-mark" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/twain-mark"
);

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/twain-mark',
    [
        '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": "Twain Mark",
        "meta": {
            "entity": "author",
            "slug": "twain-mark",
            "show": "https://bookshelves.ink/api/authors/twain-mark",
            "books": "https://bookshelves.ink/api/authors/books/twain-mark",
            "series": "https://bookshelves.ink/api/authors/series/twain-mark",
            "reviews": "https://bookshelves.ink/api/entities/reviews/author/19"
        },
        "lastname": "Twain",
        "firstname": "Mark",
        "media": {
            "name": "twain-mark",
            "url": "https://bookshelves.ink/storage/media/covers/497/twain-mark.webp",
            "color": "#646464"
        },
        "media_social": "https://bookshelves.ink/storage/media/covers/497/conversions/twain-mark-simple.jpg",
        "count": {
            "books": 1,
            "series": 0
        },
        "description": "Samuel Langhorne Clemens (November 30, 1835 – April 21, 1910), known by his pen name Mark Twain, was an American writer, humorist, entrepreneur, publisher, and lecturer. He was lauded as the \"greatest humorist the United States has produced\", and William Faulkner called him \"the father of American literature\". His novels include The Adventures of Tom Sawyer (1876) and its sequel, Adventures of Huckleberry Finn (1884), the latter of which has often been called the \"Great American Novel\".\nTwain was raised in Hannibal, Missouri, which later provided the setting for Tom Sawyer and Huckleberry Finn. He served an apprenticeship with a printer and then worked as a typesetter, contributing articles to the newspaper of his older brother Orion Clemens. He later became a riverboat pilot on the Mississippi River before heading west to join Orion in Nevada. He referred humorously to his lack of success at mining, turning to journalism for the Virginia City Territorial Enterprise. His humorous story...",
        "link": "https://en.wikipedia.org/wiki/Mark_Twain",
        "download": {
            "name": "twain-mark",
            "size": "327.31 Ko",
            "url": "https://bookshelves.ink/api/download/author/twain-mark/epub",
            "reader": null,
            "format": "epub",
            "count": 1,
            "isZip": true
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "twain-mark",
                "size": "327.31 Ko",
                "url": "https://bookshelves.ink/api/download/author/twain-mark/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: twain-mark

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/prevost-antoine-francois?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/books/prevost-antoine-francois"
);

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/prevost-antoine-francois',
    [
        '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": "Histoire de Manon Lescaut et du Chevalier Des Grieux",
            "type": "Novel",
            "meta": {
                "entity": "book",
                "slug": "histoire-de-manon-lescaut-et-du-chevalier-des-grieux-novel-fr",
                "author": "prevost-antoine-francois",
                "show": "https://bookshelves.ink/api/books/prevost-antoine-francois/histoire-de-manon-lescaut-et-du-chevalier-des-grieux-novel-fr"
            },
            "authors": [
                {
                    "name": "Prévost Antoine François",
                    "meta": {
                        "entity": "author",
                        "slug": "prevost-antoine-francois",
                        "show": "https://bookshelves.ink/api/authors/prevost-antoine-francois"
                    }
                }
            ],
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "releasedOn": "1839-04-14T23:00:00.000000Z",
            "media": {
                "name": "histoire-de-manon-lescaut-et-du-chevalier-des-grieux-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/254/histoire-de-manon-lescaut-et-du-chevalier-des-grieux-novel-fr.webp",
                "color": "#beb09a"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/254/conversions/histoire-de-manon-lescaut-et-du-chevalier-des-grieux-novel-fr-simple.jpg",
            "volume": null,
            "serie": null
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/authors/books/prevost-antoine-francois?page=1",
        "last": "https://bookshelves.ink/api/authors/books/prevost-antoine-francois?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/authors/books/prevost-antoine-francois?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/authors/books/prevost-antoine-francois",
        "per_page": 32,
        "to": 1,
        "total": 1
    }
}
 

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: prevost-antoine-francois

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/hawthorne-nathaniel?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/authors/series/hawthorne-nathaniel"
);

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/hawthorne-nathaniel',
    [
        '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/hawthorne-nathaniel?page=1",
        "last": "https://bookshelves.ink/api/authors/series/hawthorne-nathaniel?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/hawthorne-nathaniel?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/authors/series/hawthorne-nathaniel",
        "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: hawthorne-nathaniel

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",
            "media": {
                "name": "20000-lieues-sous-les-mers-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/268/20000-lieues-sous-les-mers-novel-fr.webp",
                "color": "#9f9d9d"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/268/conversions/20000-lieues-sous-les-mers-novel-fr-simple.jpg",
            "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",
            "media": {
                "name": "a-la-recherche-du-temps-perdu-novel-en",
                "url": "https://bookshelves.ink/storage/media/covers/258/a-la-recherche-du-temps-perdu-novel-en.webp",
                "color": "#b7a085"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/258/conversions/a-la-recherche-du-temps-perdu-novel-en-simple.jpg",
            "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",
            "media": {
                "name": "a-lombre-des-jeunes-filles-en-fleurs-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/256/a-lombre-des-jeunes-filles-en-fleurs-novel-fr.webp",
                "color": "#b19674"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/256/conversions/a-lombre-des-jeunes-filles-en-fleurs-novel-fr-simple.jpg",
            "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",
            "media": {
                "name": "adventures-of-huckleberry-finn-novel-en",
                "url": "https://bookshelves.ink/storage/media/covers/266/adventures-of-huckleberry-finn-novel-en.webp",
                "color": "#94b4ae"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/266/conversions/adventures-of-huckleberry-finn-novel-en-simple.jpg",
            "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",
            "media": {
                "name": "laffaire-charles-dexter-ward-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/238/laffaire-charles-dexter-ward-novel-fr.webp",
                "color": "#2d1913"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/238/conversions/laffaire-charles-dexter-ward-novel-fr-simple.jpg",
            "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/un-drame-au-mexique-novel-fr" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/books/verne-jules/un-drame-au-mexique-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/un-drame-au-mexique-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": "Un drame au Mexique",
        "type": "Novel",
        "meta": {
            "entity": "book",
            "slug": "un-drame-au-mexique-novel-fr",
            "author": "verne-jules",
            "show": "https://bookshelves.ink/api/books/verne-jules/un-drame-au-mexique-novel-fr",
            "related": "https://bookshelves.ink/api/entities/related/verne-jules/un-drame-au-mexique-novel-fr",
            "reviews": "https://bookshelves.ink/api/entities/reviews/book/154"
        },
        "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",
        "media": {
            "name": "un-drame-au-mexique-novel-fr",
            "url": "https://bookshelves.ink/storage/media/covers/368/un-drame-au-mexique-novel-fr.webp",
            "color": "#7b7b7b"
        },
        "media_social": "https://bookshelves.ink/storage/media/covers/368/conversions/un-drame-au-mexique-novel-fr-simple.jpg",
        "volume": null,
        "serie": null,
        "description": "Le 18 octobre 1825, l'Asia, vaisseau espagnol de haut bord, et la Constanzia, brick de huit canons, relâchaient à l'île de Guajan, l'une des Mariannes. Depuis six mois que ces navires avaient quitté l'Espagne, leurs équipages, mal nourris, mal payés, harassés de fatigue, agitaient sourdement des projets de révolte. Des symptômes d'indiscipline s'étaient plus spécialement révélés à bord de la Constanzia, commandée par le capitaine don Orteva, homme de fer, que rien ne faisait plier...",
        "identifier": {
            "isbn": "9782322091386",
            "isbn10": null,
            "isbn13": "9782322091386"
        },
        "pageCount": 0,
        "maturityRating": null,
        "publisher": {
            "name": "Ebooks libres et gratuits",
            "count": null,
            "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"
            }
        },
        "tags": [
            {
                "name": "Aventures",
                "type": "tag",
                "count": null,
                "firstChar": null,
                "meta": {
                    "slug": "aventures",
                    "books": null,
                    "show": null
                }
            }
        ],
        "genres": [],
        "download": {
            "name": "verne-jules-un-drame-au-mexique-fr.epub",
            "size": "182.91 Ko",
            "url": "https://bookshelves.ink/api/download/book/verne-jules/un-drame-au-mexique-novel-fr?format=epub",
            "reader": "https://bookshelves.ink/webreader/verne-jules/un-drame-au-mexique-novel-fr?format=epub",
            "format": "epub",
            "count": null,
            "isZip": null
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "verne-jules-un-drame-au-mexique-fr.epub",
                "size": "182.91 Ko",
                "url": "https://bookshelves.ink/api/download/book/verne-jules/un-drame-au-mexique-novel-fr?format=epub",
                "reader": "https://bookshelves.ink/webreader/verne-jules/un-drame-au-mexique-novel-fr?format=epub",
                "format": "epub",
                "count": null,
                "isZip": null
            }
        },
        "googleBook": {
            "preview_link": null,
            "buy_link": null,
            "created_at": "2022-08-14T13:02:42.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: un-drame-au-mexique-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"
            },
            "media": {
                "name": "lami-commun-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/462/lami-commun-novel-fr.webp",
                "color": "#665460"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/462/conversions/lami-commun-novel-fr-simple.jpg",
            "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"
            },
            "media": {
                "name": "ange-pitou-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/466/ange-pitou-novel-fr.webp",
                "color": "#a08986"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/466/conversions/ange-pitou-novel-fr-simple.jpg",
            "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"
            },
            "media": {
                "name": "aventures-de-monsieur-pickwick-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/458/aventures-de-monsieur-pickwick-novel-fr.webp",
                "color": "#573d1e"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/458/conversions/aventures-de-monsieur-pickwick-novel-fr-simple.jpg",
            "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"
            },
            "media": {
                "name": "barnabe-rudge-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/459/barnabe-rudge-novel-fr.webp",
                "color": "#f7f1e2"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/459/conversions/barnabe-rudge-novel-fr-simple.jpg",
            "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"
            },
            "media": {
                "name": "les-blancs-et-les-bleus-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/475/les-blancs-et-les-bleus-novel-fr.webp",
                "color": "#99897d"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/475/conversions/les-blancs-et-les-bleus-novel-fr-simple.jpg",
            "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/dumas-alexandre/le-docteur-mysterieux-novel-fr" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/series/dumas-alexandre/le-docteur-mysterieux-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/dumas-alexandre/le-docteur-mysterieux-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": "Le docteur mystérieux",
        "type": "Novel",
        "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",
            "books": "https://bookshelves.ink/api/series/books/dumas-alexandre/le-docteur-mysterieux-novel-fr",
            "reviews": "https://bookshelves.ink/api/entities/reviews/serie/16"
        },
        "media": {
            "name": "le-docteur-mysterieux-novel-fr",
            "url": "https://bookshelves.ink/storage/media/covers/473/le-docteur-mysterieux-novel-fr.webp",
            "color": "#cbc7bc"
        },
        "media_social": "https://bookshelves.ink/storage/media/covers/473/conversions/le-docteur-mysterieux-novel-fr-simple.jpg",
        "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,
        "description": "Le Mystérieux Docteur Korvo (titre original : Whirlpool) est un film américain réalisé par Otto Preminger, sorti en 1949. Synopsis Ann Sutton est mariée au docteur William Sutton, psychanalyste en vue. Épouse modèle et comblée mais secrètement cleptomane, elle se fait attraper dans un grand magasin pour le vol d'une broche de forte valeur. Surgit alors M. Korvo qui la tire de ce mauvais pas et lui évite un scandale dont elle craignait qu'il entache la réputation de son mari et ruine la confiance qu'il place en elle. Se débrouillant pour la revoir, David Korvo qui se présente comme un docteur, se propose de la guérir de sa cleptomanie. Commencent alors des séances d'hypnose, en cachette de son mari, qui vont entraîner Ann dans une terrible machination. Fiche technique\nTitre original : Whirlpool\nTitre français : Le Mystérieux Docteur Korvo\nRéalisation : Otto Preminger\nScénario : Ben Hecht et Andrew Solt d'après le roman Methinks the Lady publié en 1946 par Guy Endore (en)\nPhotographie :...",
        "link": "https://fr.wikipedia.org/wiki/Le_Myst%C3%A9rieux_Docteur_Korvo",
        "tags": [],
        "genres": [],
        "download": {
            "name": "le-docteur-mysterieux-novel-fr",
            "size": "619.06 Ko",
            "url": "https://bookshelves.ink/api/download/serie/dumas-alexandre/le-docteur-mysterieux-novel-fr/epub",
            "reader": null,
            "format": "epub",
            "count": 2,
            "isZip": true
        },
        "files": {
            "pdf": null,
            "cbr": null,
            "cbz": null,
            "epub": {
                "name": "le-docteur-mysterieux-novel-fr",
                "size": "619.06 Ko",
                "url": "https://bookshelves.ink/api/download/serie/dumas-alexandre/le-docteur-mysterieux-novel-fr/epub",
                "reader": null,
                "format": "epub",
                "count": 2,
                "isZip": true
            }
        },
        "isFavorite": false,
        "reviews": []
    }
}
 

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: dumas-alexandre

serie_slug  string  

slug of serie in meta.slug series' list, example: le-docteur-mysterieux-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",
            "media": {
                "name": "ange-pitou-tome-i-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/137/ange-pitou-tome-i-novel-fr.webp",
                "color": "#a08986"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/137/conversions/ange-pitou-tome-i-novel-fr-simple.jpg",
            "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",
            "media": {
                "name": "ange-pitou-tome-ii-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/139/ange-pitou-tome-ii-novel-fr.webp",
                "color": "#847682"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/139/conversions/ange-pitou-tome-ii-novel-fr-simple.jpg",
            "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/en" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/languages/en"
);

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/en',
    [
        '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": "English",
        "meta": {
            "slug": "en",
            "show": "https://bookshelves.ink/api/languages/en"
        },
        "firstChar": "E",
        "count": null
    }
}
 

Request      

GET api/languages/{language_slug}

URL Parameters

language_slug  string  

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

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/ebooks-libres-et-gratuits" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/publishers/ebooks-libres-et-gratuits"
);

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/ebooks-libres-et-gratuits',
    [
        '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": "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"
        }
    }
}
 

Request      

GET api/publishers/{publisher_slug}

URL Parameters

publisher_slug  string  

slug of serie in meta.slug publishers' list, example: ebooks-libres-et-gratuits

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/librairie-gallimard" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/publishers/books/librairie-gallimard"
);

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/librairie-gallimard',
    [
        '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": "À 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",
            "media": {
                "name": "a-la-recherche-du-temps-perdu-novel-en",
                "url": "https://bookshelves.ink/storage/media/covers/258/a-la-recherche-du-temps-perdu-novel-en.webp",
                "color": "#b7a085"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/258/conversions/a-la-recherche-du-temps-perdu-novel-en-simple.jpg",
            "volume": null,
            "serie": null
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/publishers/books/librairie-gallimard?page=1",
        "last": "https://bookshelves.ink/api/publishers/books/librairie-gallimard?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/librairie-gallimard?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/publishers/books/librairie-gallimard",
        "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: librairie-gallimard

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/word-lists" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/tags/word-lists"
);

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/word-lists',
    [
        '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": "Word lists",
        "type": "tag",
        "count": null,
        "firstChar": null,
        "meta": {
            "slug": "word-lists",
            "books": null,
            "show": null
        }
    }
}
 

Request      

GET api/tags/{tag_slug}

URL Parameters

tag_slug  string  

slug of serie in meta.slug tags' list, example: word-lists

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/occult-supernatural" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/tags/books/occult-supernatural"
);

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/occult-supernatural',
    [
        '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": "lovecraft-howard-phillips",
                "slug": "le-cauchemar-dinnsmouth-novel-fr",
                "show": "https://bookshelves.ink/api/books/lovecraft-howard-phillips/le-cauchemar-dinnsmouth-novel-fr"
            },
            "title": "Le Cauchemar d'Innsmouth",
            "type": "Novel",
            "authors": [
                {
                    "name": "Lovecraft Howard Phillips",
                    "meta": {
                        "entity": "author",
                        "slug": "lovecraft-howard-phillips",
                        "show": "https://bookshelves.ink/api/authors/lovecraft-howard-phillips"
                    }
                }
            ],
            "serie": null,
            "language": {
                "name": "French",
                "meta": {
                    "slug": "fr"
                }
            },
            "volume": null,
            "count": null,
            "media": {
                "name": "le-cauchemar-dinnsmouth-novel-fr",
                "url": "https://bookshelves.ink/storage/media/covers/246/le-cauchemar-dinnsmouth-novel-fr.webp",
                "color": "#31597a"
            },
            "media_social": "https://bookshelves.ink/storage/media/covers/246/conversions/le-cauchemar-dinnsmouth-novel-fr-simple.jpg",
            "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: occult-supernatural

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/php6HPIFM" \
    --form "banner=@/tmp/phpA1qclM" 
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/php6HPIFM', 'r')
            ],
            [
                'name' => 'banner',
                'contents' => fopen('/tmp/phpA1qclM', '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": 139,
            "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": 124,
            "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\": \"yrussel@example.com\",
    \"password\": \"ratione\",
    \"remember\": false
}"
const url = new URL(
    "https://bookshelves.ink/api/login"
);

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

let body = {
    "email": "yrussel@example.com",
    "password": "ratione",
    "remember": 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/login',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'yrussel@example.com',
            'password' => 'ratione',
            'remember' => false,
        ],
    ]
);
$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\": \"dibbert.hubert@example.org\",
    \"password\": \"rerum\",
    \"remember\": true,
    \"device_name\": \"in\"
}"
const url = new URL(
    "https://bookshelves.ink/api/login/token"
);

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

let body = {
    "email": "dibbert.hubert@example.org",
    "password": "rerum",
    "remember": true,
    "device_name": "in"
};

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' => 'dibbert.hubert@example.org',
            'password' => 'rerum',
            'remember' => true,
            'device_name' => 'in',
        ],
    ]
);
$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": 9,
            "meta": {
                "slug": "abbey-little-3036",
                "show": "https://bookshelves.ink/api/users/abbey-little-3036"
            },
            "name": "Abbey Little",
            "slug": "abbey-little-3036",
            "email": "stark.larissa@example.net",
            "role": "user",
            "about": "Porro voluptas officiis rerum nostrum. Hic omnis doloribus voluptate sapiente natus. Ut neque molestias mollitia quae.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
            "color": "#5f4339",
            "use_gravatar": 0,
            "reviews_count": 7,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 16,
            "meta": {
                "slug": "adelle-treutel-5415",
                "show": "https://bookshelves.ink/api/users/adelle-treutel-5415"
            },
            "name": "Adelle Treutel",
            "slug": "adelle-treutel-5415",
            "email": "christian93@example.com",
            "role": "user",
            "about": "Nobis temporibus nostrum qui nulla beatae. Voluptatem sed consectetur sit labore qui. Minima non ipsa laboriosam voluptate nostrum maxime error occaecati.",
            "gender": "Non binary",
            "avatar": "https://bookshelves.ink/storage/media/users/522/adelle-treutel-5415.webp",
            "color": "#90847e",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 9,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 2,
            "meta": {
                "slug": "admin-1994",
                "show": "https://bookshelves.ink/api/users/admin-1994"
            },
            "name": "Admin",
            "slug": "admin-1994",
            "email": "admin@example.com",
            "role": "admin",
            "about": "Fugiat sed laudantium omnis impedit et illo. Id aut eum magni eligendi. Nulla dolorem quidem velit molestias non minus. Dolores dolorem laudantium est vel.",
            "gender": "Woman",
            "avatar": "https://eu.ui-avatars.com/api/?name=Admin&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 7,
            "meta": {
                "slug": "carleton-wisoky-5840",
                "show": "https://bookshelves.ink/api/users/carleton-wisoky-5840"
            },
            "name": "Carleton Wisoky",
            "slug": "carleton-wisoky-5840",
            "email": "huels.ethan@example.org",
            "role": "user",
            "about": "Explicabo ipsam rerum dolor odit at. Voluptatibus non sit vitae adipisci sint. Occaecati cum dolores deserunt sit quia repellat aspernatur. Est impedit in ullam. Labore facere nemo perspiciatis et.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/509/carleton-wisoky-5840.webp",
            "color": "#3c341f",
            "use_gravatar": 0,
            "reviews_count": 12,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 5,
            "meta": {
                "slug": "clyde-upton-6817",
                "show": "https://bookshelves.ink/api/users/clyde-upton-6817"
            },
            "name": "Clyde Upton",
            "slug": "clyde-upton-6817",
            "email": "nlehner@example.net",
            "role": "user",
            "about": "Nihil voluptate eum et natus voluptatem exercitationem ut. Sit dicta quis vel at nostrum commodi. Sunt sunt ea rerum harum.",
            "gender": "Unknown",
            "avatar": "https://eu.ui-avatars.com/api/?name=Clyde Upton&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 12,
            "meta": {
                "slug": "danny-miller-2156",
                "show": "https://bookshelves.ink/api/users/danny-miller-2156"
            },
            "name": "Danny Miller",
            "slug": "danny-miller-2156",
            "email": "domingo18@example.org",
            "role": "user",
            "about": "Amet facilis id architecto exercitationem. Nulla ipsum et eos odio et quis. Voluptas praesentium ipsam earum voluptates.",
            "gender": "Genderfluid",
            "avatar": "https://bookshelves.ink/storage/media/users/516/danny-miller-2156.webp",
            "color": "#584d35",
            "use_gravatar": 0,
            "reviews_count": 12,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 18,
            "meta": {
                "slug": "elroy-koss-5798",
                "show": "https://bookshelves.ink/api/users/elroy-koss-5798"
            },
            "name": "Elroy Koss",
            "slug": "elroy-koss-5798",
            "email": "dayton01@example.net",
            "role": "user",
            "about": "Ipsa rerum dolor temporibus. Eos laudantium quia facilis qui qui vel. Laudantium nisi eos possimus omnis.",
            "gender": "Non binary",
            "avatar": "https://bookshelves.ink/storage/media/users/525/elroy-koss-5798.webp",
            "color": "#90847e",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 20,
            "meta": {
                "slug": "herman-parker-7366",
                "show": "https://bookshelves.ink/api/users/herman-parker-7366"
            },
            "name": "Herman Parker",
            "slug": "herman-parker-7366",
            "email": "burnice73@example.net",
            "role": "user",
            "about": "Maiores ea sunt distinctio ullam aut nulla. Iure ea molestiae reiciendis qui. Ab ad cupiditate perspiciatis aut fugiat.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/528/herman-parker-7366.webp",
            "color": "#584d35",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 6,
            "meta": {
                "slug": "hermann-rodriguez-3585",
                "show": "https://bookshelves.ink/api/users/hermann-rodriguez-3585"
            },
            "name": "Hermann Rodriguez",
            "slug": "hermann-rodriguez-3585",
            "email": "meredith.pacocha@example.org",
            "role": "user",
            "about": "Repudiandae nihil rerum et sint. Eum quis est ullam recusandae tenetur. Voluptatem consequatur esse consequatur facilis. Quidem saepe dolor pariatur non tempore.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/507/hermann-rodriguez-3585.webp",
            "color": "#90847e",
            "use_gravatar": 0,
            "reviews_count": 8,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 21,
            "meta": {
                "slug": "hildegard-west-5091",
                "show": "https://bookshelves.ink/api/users/hildegard-west-5091"
            },
            "name": "Hildegard West",
            "slug": "hildegard-west-5091",
            "email": "tsteuber@example.org",
            "role": "user",
            "about": "Quas sapiente inventore autem maxime placeat. Officiis vel voluptatem ullam nisi. Assumenda accusamus inventore cumque vero.",
            "gender": "Man",
            "avatar": "https://eu.ui-avatars.com/api/?name=Hildegard West&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 8,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 17,
            "meta": {
                "slug": "isaiah-goyette-6831",
                "show": "https://bookshelves.ink/api/users/isaiah-goyette-6831"
            },
            "name": "Isaiah Goyette",
            "slug": "isaiah-goyette-6831",
            "email": "rbraun@example.org",
            "role": "user",
            "about": "Odio numquam libero aut quia. Hic ipsa sed ut ea dolores voluptas assumenda. Nesciunt provident ea officiis.",
            "gender": "Unknown",
            "avatar": "https://bookshelves.ink/storage/media/users/523/isaiah-goyette-6831.webp",
            "color": "#736e6f",
            "use_gravatar": 0,
            "reviews_count": 9,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 4,
            "meta": {
                "slug": "jedediah-terry-2629",
                "show": "https://bookshelves.ink/api/users/jedediah-terry-2629"
            },
            "name": "Jedediah Terry",
            "slug": "jedediah-terry-2629",
            "email": "auer.kaylah@example.net",
            "role": "user",
            "about": "Ut iusto culpa temporibus. Veniam voluptates quod fugiat incidunt. Natus voluptatibus dolor ratione delectus eos. Quis dolor officiis explicabo ut aliquid qui qui consequatur.",
            "gender": "Unknown",
            "avatar": "https://eu.ui-avatars.com/api/?name=Jedediah Terry&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 7,
            "favorites_count": 2,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 11,
            "meta": {
                "slug": "johnnie-thiel-1475",
                "show": "https://bookshelves.ink/api/users/johnnie-thiel-1475"
            },
            "name": "Johnnie Thiel",
            "slug": "johnnie-thiel-1475",
            "email": "kutch.brent@example.org",
            "role": "user",
            "about": "Esse fugiat nobis in maxime sed et qui. Nulla pariatur necessitatibus rerum placeat necessitatibus. Non est praesentium earum vero rem facilis. Rerum doloribus quas dolorum nam eius quo.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/514/johnnie-thiel-1475.webp",
            "color": "#574643",
            "use_gravatar": 0,
            "reviews_count": 11,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 22,
            "meta": {
                "slug": "kale-durgan-9737",
                "show": "https://bookshelves.ink/api/users/kale-durgan-9737"
            },
            "name": "Kale Durgan",
            "slug": "kale-durgan-9737",
            "email": "deontae.bogan@example.net",
            "role": "user",
            "about": "Provident eos quia nulla rem. Vel est similique dignissimos. Delectus amet ea quis qui consequatur.",
            "gender": "Non binary",
            "avatar": "https://bookshelves.ink/storage/media/users/530/kale-durgan-9737.webp",
            "color": "#545454",
            "use_gravatar": 0,
            "reviews_count": 14,
            "favorites_count": 3,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 10,
            "meta": {
                "slug": "khalid-cormier-9117",
                "show": "https://bookshelves.ink/api/users/khalid-cormier-9117"
            },
            "name": "Khalid Cormier",
            "slug": "khalid-cormier-9117",
            "email": "schamberger.jacey@example.com",
            "role": "user",
            "about": "Voluptatum minima magni ex eum aut saepe quo. Unde ut voluptates facilis magnam aspernatur voluptas. Modi sequi repellat repellendus.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/513/khalid-cormier-9117.webp",
            "color": "#95908d",
            "use_gravatar": 0,
            "reviews_count": 14,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 14,
            "meta": {
                "slug": "kyra-wunsch-9285",
                "show": "https://bookshelves.ink/api/users/kyra-wunsch-9285"
            },
            "name": "Kyra Wunsch",
            "slug": "kyra-wunsch-9285",
            "email": "destiny71@example.net",
            "role": "user",
            "about": "Consequatur sed cum modi et ratione. Et in facilis consequuntur corporis sunt quia.",
            "gender": "Non binary",
            "avatar": "https://eu.ui-avatars.com/api/?name=Kyra Wunsch&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 9,
            "favorites_count": 8,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 8,
            "meta": {
                "slug": "lewis-kozey-5421",
                "show": "https://bookshelves.ink/api/users/lewis-kozey-5421"
            },
            "name": "Lewis Kozey",
            "slug": "lewis-kozey-5421",
            "email": "wfay@example.net",
            "role": "user",
            "about": "Sunt aspernatur velit esse voluptatem. In qui accusantium maiores asperiores. Ut non vero quas inventore. Qui quam quos consequuntur exercitationem.",
            "gender": "Agender",
            "avatar": "https://bookshelves.ink/storage/media/users/511/lewis-kozey-5421.webp",
            "color": "#3c341f",
            "use_gravatar": 0,
            "reviews_count": 10,
            "favorites_count": 4,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 0
        },
        {
            "id": 15,
            "meta": {
                "slug": "malachi-davis-3144",
                "show": "https://bookshelves.ink/api/users/malachi-davis-3144"
            },
            "name": "Malachi Davis",
            "slug": "malachi-davis-3144",
            "email": "mayer.zula@example.com",
            "role": "user",
            "about": "Qui magni quae sed ullam et labore quos cumque. Alias perferendis id rerum quod. Cupiditate soluta voluptatem odio aspernatur asperiores. Quod facere enim aut at. Voluptates totam beatae minus autem.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/520/malachi-davis-3144.webp",
            "color": "#5f4339",
            "use_gravatar": 0,
            "reviews_count": 6,
            "favorites_count": 7,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 1,
            "display_gender": 1
        },
        {
            "id": 19,
            "meta": {
                "slug": "marjolaine-stehr-2648",
                "show": "https://bookshelves.ink/api/users/marjolaine-stehr-2648"
            },
            "name": "Marjolaine Stehr",
            "slug": "marjolaine-stehr-2648",
            "email": "lacy10@example.org",
            "role": "user",
            "about": "Rerum quibusdam harum est qui dolor consequatur earum ipsum. Harum aut corrupti fugit.",
            "gender": "Man",
            "avatar": "https://bookshelves.ink/storage/media/users/526/marjolaine-stehr-2648.webp",
            "color": "#95908d",
            "use_gravatar": 0,
            "reviews_count": 14,
            "favorites_count": 5,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 3,
            "meta": {
                "slug": "rosemarie-lubowitz-2257",
                "show": "https://bookshelves.ink/api/users/rosemarie-lubowitz-2257"
            },
            "name": "Rosemarie Lubowitz",
            "slug": "rosemarie-lubowitz-2257",
            "email": "joaquin89@example.org",
            "role": "user",
            "about": "Est quos quo nihil ut quae ut eius quisquam. Maiores quasi nihil quibusdam et vero ipsa placeat qui. Ut cumque iure quia. Molestiae pariatur illum dicta qui inventore dignissimos.",
            "gender": "Genderfluid",
            "avatar": "https://eu.ui-avatars.com/api/?name=Rosemarie Lubowitz&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 1,
            "display_favorites": 0,
            "display_gender": 0
        },
        {
            "id": 1,
            "meta": {
                "slug": "super-admin-8554",
                "show": "https://bookshelves.ink/api/users/super-admin-8554"
            },
            "name": "Super Admin",
            "slug": "super-admin-8554",
            "email": "superadmin@example.com",
            "role": "super_admin",
            "about": "Qui ea cumque amet nostrum. Et sit et possimus quaerat ipsum quod. Nesciunt qui quos officiis doloribus amet.",
            "gender": "Man",
            "avatar": "https://eu.ui-avatars.com/api/?name=Super Admin&color=7F9CF5&background=EBF4FF",
            "color": "#",
            "use_gravatar": 0,
            "reviews_count": 13,
            "favorites_count": 6,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 0,
            "display_gender": 1
        },
        {
            "id": 13,
            "meta": {
                "slug": "trevion-little-1351",
                "show": "https://bookshelves.ink/api/users/trevion-little-1351"
            },
            "name": "Trevion Little",
            "slug": "trevion-little-1351",
            "email": "kobe60@example.com",
            "role": "user",
            "about": "Quasi atque voluptate ut. Dolores repellendus dicta sed ut sint esse. Nostrum maxime sapiente enim sit. Enim animi maxime earum mollitia doloremque.",
            "gender": "Woman",
            "avatar": "https://bookshelves.ink/storage/media/users/518/trevion-little-1351.webp",
            "color": "#574643",
            "use_gravatar": 0,
            "reviews_count": 12,
            "favorites_count": 10,
            "is_admin": false,
            "display_reviews": 0,
            "display_favorites": 1,
            "display_gender": 1
        }
    ]
}
 

Request      

GET api/users

GET User.

Route name: api.users.show

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

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/trevion-little-1351',
    [
        '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": 13,
        "meta": {
            "slug": "trevion-little-1351",
            "show": "https://bookshelves.ink/api/users/trevion-little-1351",
            "banner": "https://bookshelves.ink/storage/media/users/519/trevion-little-1351-banner.webp",
            "show_reviews": "https://bookshelves.ink/api/users/reviews/trevion-little-1351",
            "show_favorites": "https://bookshelves.ink/api/users/favorites/trevion-little-1351"
        },
        "name": "Trevion Little",
        "slug": "trevion-little-1351",
        "email": "kobe60@example.com",
        "role": "user",
        "about": "Quasi atque voluptate ut. Dolores repellendus dicta sed ut sint esse. Nostrum maxime sapiente enim sit. Enim animi maxime earum mollitia doloremque.",
        "gender": "Woman",
        "avatar": "https://bookshelves.ink/storage/media/users/518/trevion-little-1351.webp",
        "color": "#574643",
        "use_gravatar": 0,
        "reviews_count": 12,
        "favorites_count": 10,
        "is_admin": false,
        "display_reviews": 0,
        "display_favorites": 1,
        "display_gender": 1
    }
}
 

Request      

GET api/users/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: trevion-little-1351

GET Review[] belongs to User.

Route name: api.users.reviews

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

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/abbey-little-3036',
    [
        '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": "serie",
                "author": "dickens-charles",
                "slug": "vie-et-aventures-de-nicolas-nickleby-novel-fr"
            },
            "id": 213,
            "text": "<p><strong>Dolor</strong> voluptates cumque enim totam. Molestiae dolor reiciendis <em>aut</em> doloribus. Cupiditate ut ipsam et. A sed <em>fuga</em> omnis <strong>quo</strong> et. Optio est velit deserunt <em>sit</em> possimus quidem. <strong>Autem</strong> aut accusantium aperiam voluptates ea.</p>\n<p>Aliquam harum et quia <strong>sed</strong> eaque. Sit voluptatibus <em>ratione</em> eum aut cumque tempore. <strong>Sed</strong> ad incidunt <em>non</em> architecto cum fuga. Voluptatem vel <strong>quas</strong> sint <em>et</em> magnam et a. Neque dolorem qui <strong>est</strong> <em>sint</em> et.</p>\n",
            "rating": 0,
            "user": {
                "id": 9,
                "name": "Abbey Little",
                "slug": "abbey-little-3036",
                "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
                "color": "#5f4339"
            },
            "title": "Vie et aventures de Nicolas Nickleby",
            "cover": "https://bookshelves.ink/storage/media/covers/465/conversions/vie-et-aventures-de-nicolas-nickleby-novel-fr-thumbnail.webp",
            "color": "#f6efe1",
            "createdAt": "2022-08-10T14:12:40.000000Z",
            "updatedAt": "2022-08-10T14:12:40.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "verne-jules",
                "slug": "face-au-drapeau-novel-fr"
            },
            "id": 67,
            "text": "<p><strong>Rerum</strong> explicabo ut est nesciunt ea error error libero. <strong>Aut</strong> sint delectus ipsum fugit aut voluptas nihil. Impedit <strong>voluptas</strong> et et recusandae odit fuga <em>quas</em> consectetur. Cupiditate <strong>totam</strong> id optio dolores. Qui <em>ea</em> aspernatur corrupti ut <strong>magni</strong> facilis sed. Quia <em>dolores</em> non dolor unde. Dolor <strong>ad</strong> mollitia alias <em>aliquam</em> ipsa fuga est repellat. Facere <strong>maiores</strong> ullam <em>quibusdam</em> id qui eveniet. Cumque voluptatem facere <strong>molestias</strong> <em>enim</em> a quidem et. Nihil perferendis totam sit <strong>aspernatur</strong> consectetur.</p>\n<p>Voluptatem voluptate laudantium eveniet voluptatem corporis ut <em>autem</em> quo. Et explicabo atque et aut vel. <em>Tenetur</em> doloremque <strong>recusandae</strong> eum quia tempore sint.</p>\n",
            "rating": 3,
            "user": {
                "id": 9,
                "name": "Abbey Little",
                "slug": "abbey-little-3036",
                "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
                "color": "#5f4339"
            },
            "title": "Face au drapeau",
            "cover": "https://bookshelves.ink/storage/media/covers/286/conversions/face-au-drapeau-novel-fr-thumbnail.webp",
            "color": "#969970",
            "createdAt": "2022-08-09T18:32:26.000000Z",
            "updatedAt": "2022-08-09T18:32:26.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "zola-emile",
                "slug": "au-bonheur-des-dames-novel-fr"
            },
            "id": 152,
            "text": "<p><strong>Explicabo</strong> in nesciunt eius totam. Numquam nemo accusantium <em>rerum</em> <strong>cupiditate</strong> sint ea. Corrupti incidunt possimus ex <em>blanditiis</em> ad <strong>enim</strong> alias. Aut quod temporibus tempora. <em>Ut</em> rerum vitae <strong>magnam</strong> temporibus commodi et. Laboriosam <em>amet</em> explicabo eum est <strong>laborum</strong> laborum fugiat. Omnis <em>molestiae</em> provident repudiandae illum eveniet. <strong>Qui</strong> eligendi fugiat <em>libero</em> placeat quasi sit voluptatibus. Dolorem <strong>illo</strong> eius <em>magni</em> enim non quaerat.</p>\n<p>Corrupti sed perferendis nam <strong>expedita</strong> <em>repellendus</em> error qui. Similique debitis et dolore. Provident <strong>natus</strong> exercitationem repellat ipsa. Voluptatem consectetur aut similique. <em>Qui</em> <strong>sint</strong> placeat ipsam. Inventore cum iste error <em>est</em> architecto.</p>\n",
            "rating": 1,
            "user": {
                "id": 9,
                "name": "Abbey Little",
                "slug": "abbey-little-3036",
                "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
                "color": "#5f4339"
            },
            "title": "Au bonheur des dames",
            "cover": "https://bookshelves.ink/storage/media/covers/408/conversions/au-bonheur-des-dames-novel-fr-thumbnail.webp",
            "color": "#847454",
            "createdAt": "2022-08-06T01:28:20.000000Z",
            "updatedAt": "2022-08-08T16:00:22.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "author",
                "author": null,
                "slug": "andersen-hans-christian"
            },
            "id": 235,
            "text": "<p><strong>Tenetur</strong> cumque deserunt facere nobis dolores labore. At <em>sit</em> <strong>adipisci</strong> dicta fugiat numquam. Doloremque laudantium sapiente <em>explicabo</em> voluptatem <strong>quae</strong> cupiditate. Laborum omnis debitis temporibus <em>architecto</em> quo et dolores. Aut fugit reiciendis enim <em>nemo</em> qui provident enim. <strong>Enim</strong> eveniet voluptas iste.</p>\n<p>Et <em>ipsum</em> hic esse dolor id. <strong>Non</strong> corrupti quidem <em>voluptatem</em> soluta non consequatur. Qui minus <strong>nobis</strong> suscipit <em>voluptates</em> ipsum optio. Saepe ducimus at et recusandae. <em>Omnis</em> facilis fuga quis nobis. Quas est optio <strong>cumque</strong> dolores qui. Voluptatibus doloribus laboriosam error esse sapiente.</p>\n",
            "rating": 4,
            "user": {
                "id": 9,
                "name": "Abbey Little",
                "slug": "abbey-little-3036",
                "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
                "color": "#5f4339"
            },
            "title": "Andersen Hans Christian",
            "cover": "https://bookshelves.ink/storage/media/covers/479/conversions/andersen-hans-christian-thumbnail.webp",
            "color": "#a18668",
            "createdAt": "2022-07-31T10:47:55.000000Z",
            "updatedAt": "2022-08-08T17:39:23.000000Z"
        },
        {
            "meta": {
                "type": "review",
                "for": "book",
                "author": "dumas-alexandre",
                "slug": "la-comtesse-de-charny-tome-iii-novel-fr"
            },
            "id": 155,
            "text": "<p><strong>Similique</strong> eligendi assumenda pariatur aut. Facere ex facilis <em>voluptatem</em> <strong>aut</strong> reprehenderit. Voluptas aut quia et repudiandae <em>quo</em> voluptatem in. Tempora id sit labore expedita <em>ut</em> sint. Sunt <strong>et</strong> nulla officiis eum iure <em>quam</em> dignissimos esse. Asperiores <strong>corporis</strong> voluptatem voluptatem ut <em>et</em> ipsa aut aliquid. Dolor <strong>et</strong> quibusdam consequuntur <em>ducimus</em> quia nisi. Et id doloremque <strong>voluptatem</strong> aut quia.</p>\n<p>Recusandae sint adipisci earum. Eius porro rerum <strong>nobis</strong> <em>qui</em> consequuntur a. Omnis recusandae rerum iure harum <strong>impedit</strong> a repellat. Iure et qui sint eius enim. <strong>Quia</strong> error natus sunt labore.</p>\n",
            "rating": 5,
            "user": {
                "id": 9,
                "name": "Abbey Little",
                "slug": "abbey-little-3036",
                "avatar": "https://bookshelves.ink/storage/media/users/512/abbey-little-3036.webp",
                "color": "#5f4339"
            },
            "title": "La Comtesse de Charny, tome III",
            "cover": "https://bookshelves.ink/storage/media/covers/153/conversions/la-comtesse-de-charny-tome-iii-novel-fr-thumbnail.webp",
            "color": "#a0928c",
            "createdAt": "2022-02-18T17:58:14.000000Z",
            "updatedAt": "2022-08-08T09:20:56.000000Z"
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=1",
        "last": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=2",
        "prev": null,
        "next": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://bookshelves.ink/api/users/reviews/abbey-little-3036?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/users/reviews/abbey-little-3036",
        "per_page": 5,
        "to": 5,
        "total": 7
    }
}
 

Request      

GET api/users/reviews/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: abbey-little-3036

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/marjolaine-stehr-2648?size=5&page=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://bookshelves.ink/api/users/favorites/marjolaine-stehr-2648"
);

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/marjolaine-stehr-2648',
    [
        '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": "dumas-alexandre",
                "slug": "la-comtesse-de-charny-tome-v-novel-fr"
            },
            "title": "La Comtesse de Charny, tome V",
            "cover": "https://bookshelves.ink/storage/media/covers/157/conversions/la-comtesse-de-charny-tome-v-novel-fr-thumbnail.webp",
            "color": "#ada5a9",
            "createdAt": "2022-08-05T13:06:33.000000Z",
            "updatedAt": "2022-08-14T13:04:17.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "proust-marcel",
                "slug": "a-la-recherche-du-temps-perdu-novel-en"
            },
            "title": "À la recherche du temps perdu",
            "cover": "https://bookshelves.ink/storage/media/covers/258/conversions/a-la-recherche-du-temps-perdu-novel-en-thumbnail.webp",
            "color": "#b7a085",
            "createdAt": "2022-08-03T06:28:44.000000Z",
            "updatedAt": "2022-08-14T13:04:17.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "dumas-alexandre",
                "slug": "le-vicomte-de-bragelonne-tome-iii-novel-fr"
            },
            "title": "Le Vicomte de Bragelonne, tome III",
            "cover": "https://bookshelves.ink/storage/media/covers/185/conversions/le-vicomte-de-bragelonne-tome-iii-novel-fr-thumbnail.webp",
            "color": "#9a7e73",
            "createdAt": "2022-08-02T10:26:52.000000Z",
            "updatedAt": "2022-08-14T13:04:17.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "book",
                "author": "zola-emile",
                "slug": "les-mysteres-de-marseille-novel-fr"
            },
            "title": "Les mystères de Marseille",
            "cover": "https://bookshelves.ink/storage/media/covers/446/conversions/les-mysteres-de-marseille-novel-fr-thumbnail.webp",
            "color": "#a89f84",
            "createdAt": "2022-08-01T18:11:44.000000Z",
            "updatedAt": "2022-08-14T13:04:17.000000Z"
        },
        {
            "meta": {
                "type": "favorite",
                "for": "author",
                "author": null,
                "slug": "hugo-victor"
            },
            "title": "Hugo Victor",
            "cover": "https://bookshelves.ink/storage/media/covers/487/conversions/hugo-victor-thumbnail.webp",
            "color": "#3b3a39",
            "createdAt": "2022-07-25T06:11:04.000000Z",
            "updatedAt": "2022-08-14T13:04:17.000000Z"
        }
    ],
    "links": {
        "first": "https://bookshelves.ink/api/users/favorites/marjolaine-stehr-2648?page=1",
        "last": "https://bookshelves.ink/api/users/favorites/marjolaine-stehr-2648?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/marjolaine-stehr-2648?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "https://bookshelves.ink/api/users/favorites/marjolaine-stehr-2648",
        "per_page": 5,
        "to": 5,
        "total": 5
    }
}
 

Request      

GET api/users/favorites/{user_slug}

URL Parameters

user_slug  string  

slug of user in meta.slug users' list, example: marjolaine-stehr-2648

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": 139,
            "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": 124,
            "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}