Listar o catálogo
GET
/partner/v1/catalog| Parâmetro | Descrição |
|---|---|
type"audiobook" | "ebook" | Filtra por formato. Sem o parâmetro, vêm os dois. |
limitinteiro, padrão 50 | Itens por página. |
cursorstring | O nextCursor da página anterior. Omita na primeira página. |
curl "https://api.astorya.com.br/partner/v1/catalog?type=audiobook&limit=2" \
-u "$ASTORYA_CLIENT_ID:$ASTORYA_CLIENT_SECRET"{
"items": [
{
"id": "66f0b1e2c4a9d8e7f6a5b4c3",
"type": "audiobook",
"title": "O Poder do Hábito",
"author": "Charles Duhigg",
"coverUrl": "https://cdn.exemplo.com/capas/66f0b1e2.jpg",
"durationSeconds": 38220
},
{
"id": "66f0b1e2c4a9d8e7f6a5b4c4",
"type": "ebook",
"title": "Corrida para Iniciantes",
"author": "Ana Ribeiro",
"coverUrl": "https://cdn.exemplo.com/capas/66f0b1e3.jpg",
"chapters": 12
}
],
"nextCursor": "eyJpZCI6IjY2ZjBiMWUyYzRhOWQ4ZTdmNmE1YjRjNCJ9"
}Campos de cada item
| Campo | Descrição |
|---|---|
id | Identificador do título na Astorya. Use em redirectPath para abrir o título direto (/player/{id} ou /leitor/{id}). |
type | audiobook ou ebook. |
title, author | Título e autor para exibição. |
coverUrl | Imagem da capa. A URL pode mudar: atualize sua cópia do catálogo periodicamente em vez de guardá-la para sempre. |
durationSeconds | Só em audiolivros: duração total em segundos. |
chapters | Só em e-books: número de capítulos. |
Paginação por cursor
Repita a chamada passando o nextCursor recebido até ele vir null. O cursor é opaco: não tente interpretar nem montar um à mão.
export async function fetchWholeCatalog(type) {
const items = [];
let cursor = null;
do {
const params = new URLSearchParams({ limit: '50' });
if (type) params.set('type', type);
if (cursor) params.set('cursor', cursor);
const res = await fetch(`https://api.astorya.com.br/partner/v1/catalog?${params}`, {
headers: { Authorization: `Basic ${basicAuth}` },
});
if (!res.ok) throw new Error(`Astorya respondeu ${res.status}`);
const page = await res.json();
items.push(...page.items);
cursor = page.nextCursor;
} while (cursor);
return items;
}def fetch_whole_catalog(item_type: str | None = None) -> list[dict]:
items: list[dict] = []
cursor = None
while True:
params = {"limit": 50}
if item_type:
params["type"] = item_type
if cursor:
params["cursor"] = cursor
response = requests.get(
f"{ASTORYA_API}/partner/v1/catalog", params=params, auth=AUTH, timeout=10
)
response.raise_for_status()
page = response.json()
items.extend(page["items"])
cursor = page["nextCursor"]
if not cursor:
return itemsO catálogo muda pouco. Sincronize uma vez por dia num job do servidor e sirva a sua cópia para o app — assim você fica longe do limite de requisições.