Resources

Structured catalogue query (counts + listings)

POST/catalogue/query

Answers literal catalogue questions — counts and metadata listings — without a chat. This is the direct-REST door for the AI chat's catalog_query tool and reuses it verbatim, so results carry EXACT server-side totals (totalRecords, and distinctTitles for unique titles counted once across formats/editions).

Use it for who/where/when and how-many questions: "how many books by Agatha Christie", "list our Avon titles", "what did we publish in 2023". For topic/theme intent ("books about vampires") use POST /resources/search with mode: vector instead.

The primary interface is filters — a list of {field, op, value} conditions, ANDed together. A bare query string is a convenience: with no filters it maps to a single title contains condition. Call GET /resources/fields to discover the fields available on this tenant.

All results are filtered by the linked user's usergroup — the same access walls the in-app search applies.

X-Api-Key<token>

Issued to you when your integration is provisioned. Determines which catalogue resources are visible and which AI tools are available.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

A structured catalogue query. Provide filters (preferred) or a bare query; at least one is required.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/catalogue/query" \  -H "Content-Type: application/json" \  -d '{    "filters": [      {        "field": "authors",        "op": "~",        "value": "Agatha Christie"      }    ]  }'
{  "data": {    "totalRecords": 0,    "distinctTitles": 0,    "books": [      {        "resourceId": 0,        "title": "string",        "author": "string",        "imprint": "string",        "publisher": "string",        "isbn": "string",        "date": "string",        "snippet": "string"      }    ],    "filters": [      {        "field": "string",        "op": "~",        "value": null      }    ]  }}
{  "success": false,  "status": "fail",  "message": "string",  "error": {    "message": "API key is required",    "code": "NO_API_KEY"  }}

{  "success": false,  "status": "fail",  "message": "API key is required",  "error": {    "code": "NO_API_KEY",    "message": "API key is required"  }}

{  "success": false,  "status": "fail",  "message": "Hourly rate limit exceeded.",  "error": {    "code": "RATE_LIMITED",    "message": "Hourly rate limit exceeded."  }}