Parceiros

Relatórios para bibliotecas

API somente leitura que expõe, de forma programática, o que o painel de Relatórios da rede de bibliotecas mostra: KPIs agregados, engajamento diário por leitor, cadastro de leitores, acervo, estoque, empréstimos, reservas, acessos e sugestões de compra.

São cinco rotas, organizadas pelo grão do dado:

RotaGrãoEntrega
GET /libraries/v1/summaryagregado do períodotodos os KPIs numa chamada
GET /libraries/v1/engagementsdia × leitormétricas diárias por leitor
GET /libraries/v1/users1 linha por leitorcadastro, inclusive desativados e excluídos
GET /libraries/v1/datasets/{name}linha a linhalivros, estoque, empréstimos, reservas, logins, canais, sugestões
GET /libraries/v1/dimensionsvocabuláriovalores válidos de filtro

Acesso

ItemValor
Hosthttps://livros.arvore.com.br
Base path/api-arvore/libraries/v1 (o prefixo antigo /api-arvore/biblion/v1 continua respondendo por compatibilidade, mas não use em integração nova)
AutenticaçãoHeader X-Api-Key: <chave> (alternativa: Authorization: Bearer <chave>). Chave emitida pela Árvore, exclusiva desta API. Sem chave válida: 401
TenantFixo no servidor (escopo BibliON). A API não aceita identificador de tenant do cliente
FormatoJSON UTF-8, somente GET
Rate limit60 requisições por minuto, compartilhadas por toda a integração; excedente recebe 429 com header Retry-After. Toda resposta traz o saldo em x-ratelimit-remaining-public-default

Exemplo:

curl -s \
  -H 'X-Api-Key: <chave>' \
  'https://livros.arvore.com.br/api-arvore/libraries/v1/summary?startDate=2026-08-01&endDate=2026-08-31'

Convenções e tipos

TipoFormatoExemplo
intinteiro não-negativo42457
stringtexto UTF-8"Olhos d'água"
booltrue / falsetrue
dateYYYY-MM-DD, fuso de Brasília (UTC−3)"2026-08-26"
datetimeYYYY-MM-DD HH:mm:ss, fuso de Brasília"2026-08-26 14:03:11"
fracfração decimal onde 1 = 100% (18,5% = 0.185). Razões de consumo podem passar de 1; o campo diz quando0.185
percentpercentual de 0 a 100, com casas decimais99.32
moneystring decimal com ponto, em reais"62.90"
enumum valor do conjunto listado no campo"active"
  • Tempo lido ou ouvido é sempre em segundos inteiros.
  • Campos sem valor vêm como null, nunca omitidos.
  • Parâmetros de data usam YYYY-MM-DD; outro formato responde 400.
  • startDate e endDate são inclusivos. Quando opcionais e omitidos, valem os últimos 30 dias (de 30 dias atrás até hoje, em Brasília). Se startDate vier depois de endDate, o servidor inverte os dois.
  • Parâmetros booleanos (newUsers) recebem a string true ou false.
  • Ids de dimensão (libraryId, ageGroupId, publisherId, categoryId, subjectId) são inteiros. O /dimensions devolve esses ids como string; converta antes de enviar.
  • Histórico começa em 2026-07-21, data de entrada da BibliON na plataforma. Empréstimos, devoluções, renovações e reservas anteriores não existem na base.

Paginação

page começa em 1 (default 1). pageSize tem default 100 e o máximo depende da rota:

RotapageSize máximo
/engagements1000
/users1000
/summary (pagina só o breakdown)100
/datasets/loans, reservations, logins, suggestion-requests1000
/datasets/books, stock, suggestions100

pageSize acima do máximo responde 400. page vai até 100000. O total de linhas vem em meta.page.totalRows.

Janela máxima

/engagements, datasets/logins e datasets/channels aceitam no máximo 31 dias por chamada (400 acima disso). Ingestões maiores fatiam por mês.

Datas são YYYY-MM-DD e precisam existir no calendário: 2026-02-30 ou 2026-01-00 respondem 400.

Cliente HTTP

O host fica atrás de um WAF que barra requisições com o User-Agent padrão do urllib do Python (Python-urllib/3.x), respondendo 403 antes de a chamada chegar à API. Defina um User-Agent próprio na sua integração, por exemplo BibliON-Ingest/1.0. Clientes comuns (requests, axios, HttpClient do Java, Go) passam sem ajuste.

Atualização dos dados

Os dados vêm do lakehouse da Árvore, sincronizados ao longo do dia. Não são tempo real. As respostas são calculadas por hora cheia: meta.updatedAt traz essa hora (ex.: 2026-09-04 18:00:00), e a mesma consulta repetida devolve o mesmo resultado até a hora virar. Não há ganho em repetir a mesma chamada dentro da hora.

Envelope de resposta

Toda rota responde neste formato. data varia por rota; meta é sempre igual.

{
  "meta": {
    "updatedAt": "2026-08-27 09:59:12",
    "period": { "startDate": "2026-07-28", "endDate": "2026-08-27" },
    "page": { "page": 1, "pageSize": 100, "totalRows": 9317 }
  },
  "data": { }
}
CampoTipoDescrição
meta.updatedAtdatetime | nullÚltimo sync do lakehouse
meta.period.startDatedateInício efetivo do período consultado (após defaults)
meta.period.endDatedateFim efetivo do período
meta.page.*intpage, pageSize, totalRows
dataobjectConteúdo da rota; em listagens, data.rows é o array de linhas

meta.period aparece nas rotas que aceitam período (/summary, /engagements, /datasets/*). meta.page aparece nas respostas paginadas; no /summary só quando há groupBy. /dimensions traz apenas meta.updatedAt.

GET /libraries/v1/summary

Todos os agregados do painel numa chamada. Com groupBy, devolve também a quebra por dimensão.

Parâmetros

ParamTipoObrigatórioDescrição
startDate / endDatedatenãoPeríodo. Default: últimos 30 dias
groupByenumnãolibrary | state | city | ageGroup. Popula data.breakdown
libraryIdintnãoFiltra por biblioteca (id do /dimensions)
statestringnãoUF do leitor, ex. SP
citystringnãoCidade do leitor
ageGroupIdintnãoFaixa etária (id do /dimensions)
genderstringnãoGênero canônico (valores no /dimensions)
newUsersboolnãoSó leitores cadastrados dentro do período
page / pageSizeintnãoPaginam apenas o breakdown (máximo 100)

Escopo dos filtros: libraryId, state, city, ageGroupId, gender e newUsers recortam apenas os blocos general e breakdown. Os demais blocos (consumption, channels, formats, reservationsByStatus, stock, deletedUsers, catalogProfile, monthly) são sempre da base inteira no período.

data.general

CampoTipoDescrição
registeredUsersintTotal de cadastros na base (acumulado, não recortado pelo período)
loginsintDias com atividade, somados por leitor: um leitor ativo em 3 dias do período conta 3
usersWithLoginintLeitores distintos com atividade no período
loansintEmpréstimos no período
returnsintDevoluções no período (inclui expiração automática)
activeLoansintEmpréstimos menos devoluções no período
readings10intLeituras que atingiram 10% do livro
readings50intLeituras que atingiram 50% (livro concluído)
previewsintPrévias: visualizações sem empréstimo
distinctBooksintLivros distintos lidos
readingSecondsintTempo total lido, em segundos
renewalsintRenovações de empréstimo
reservationsintReservas feitas no período
activeReservationsintReservas ativas agora (foto do momento do sync)
convertedReservationsintReservas feitas no período que viraram empréstimo

data.consumption

CampoTipoDescrição
onlineSessionsintSessões de leitura on-line (streaming)
offlineSessionsintSessões off-line (download)
onlineSecondsintTempo lido on-line, em segundos
offlineSecondsintTempo lido off-line, em segundos

data.channels

Sessões por canal de acesso, medidas pela ferramenta de analytics (PostHog).

CampoTipoDescrição
availableboolSe o analytics respondeu; false zera os demais campos
appEstimatedboolO número do app é estimado (o webview não informa a oferta)
totalintSessões totais no período
webintSessões via navegador
appintSessões via aplicativo (estimado)
webMobile / webDesktop / webTabletintWeb por tipo de aparelho

data.formats

CampoTipoDescrição
catalog.ebookOnly / audiobookOnly / bothintTítulos do catálogo por formato
loans.ebookOnly / audiobookOnly / bothintEmpréstimos do período pela mesma quebra
listening.listenersintOuvintes distintos de audiobook no período
listening.secondsintTempo ouvido, em segundos

data.reservationsByStatus

CampoTipoDescrição
activeintAguardando na fila ou disponíveis para retirada
convertedintViraram empréstimo no período
cancelledintCanceladas pelo leitor no período
lostintExpiraram sem retirada no período

data.stock

CampoTipoDescrição
activeLoansintEmpréstimos ativos agora
readingsintLeituras confirmadas (10% do livro) de leitores com empréstimo desde 2026-07-21, somando compras e legado
possibleReadingsintLeituras possíveis: cópias × modelo em cada compra e em cada linha de legado. No legado Odilo cada cópia vale 1 leitura; nos demais vale max_uses do título, ou 26 quando o título não define
percentagefracConsumidas ÷ possíveis no acervo inteiro. Sempre entre 0 e 1
activeReservationsintReservas ativas agora
histogram[]arrayFaixas de consumo: { band: string, count: int }, ex. {"band":"1-10","count":216}

data.deletedUsers

Cadastros desativados ou excluídos desde 2026-07-21.

CampoTipoDescrição
totalintTotal acumulado (sem recorte de período)
last30DaysintDesativações nos últimos 30 dias
withLoansintDesativados com empréstimos preservados
daily[]arrayÚltimos 30 dias: { date: date, total: int }
monthly[]arrayPor mês: { month: "YYYY-MM", total: int }

data.catalogProfile

CampoTipoDescrição
categories[]arrayPor categoria: { name, catalogTitles: int, loans: int }
subjects[]arrayPor assunto, mesmo formato
origins[]arrayPor procedência do catálogo, mesmo formato
materials.ebook / audiobookobject{ catalogTitles: int, loans: int }
materials.videoobject | nullMesmo formato; null sem vídeo no acervo

data.monthly[]

CampoTipoDescrição
monthstringYYYY-MM
loans / readings10 / readings50 / renewalsintMétricas no mês
readingSecondsintTempo lido no mês, em segundos

data.breakdown[] (com groupBy)

CampoTipoDescrição
keystringId do grupo. Para library e ageGroup é o id do /dimensions; para state e city é o próprio nome
labelstringNome exibível do grupo
metricsobjectMesmos campos de data.general, recortados para o grupo

Grupos sem valor no cadastro do leitor aparecem com label Não informado.

GET /libraries/v1/engagements

Engajamento diário no grão dia × leitor, esparso: uma linha por leitor por dia, somente quando houve atividade. Leitor sem métrica no dia não gera linha. Ordenação fixa date ASC, userId ASC, estável para ingestão incremental.

Somando as linhas de um dia, logins, loans, returns, readings10, readings50, previews, readingSeconds, renewals e reservations batem com o data.general do /summary para o mesmo dia. distinctBooks não soma: é distinto por leitor, e no /summary é distinto na base inteira.

Parâmetros

ParamTipoObrigatórioDescrição
startDatedatesimInício da janela
endDatedatesimFim da janela. Máximo de 31 dias por chamada
userIdintnãoRestringe a um leitor
page / pageSizeintnãoPaginação (máximo 1000)

data.rows[]

CampoTipoDescrição
datedateDia de referência
userIdintLeitor. Detalhe no /users
loginsint1 se o leitor teve atividade no dia, 0 caso contrário
loansintEmpréstimos feitos no dia
returnsintDevoluções no dia
readings10intLeituras que cruzaram 10% no dia
readings50intLeituras que cruzaram 50% no dia
previewsintPrévias no dia
distinctBooksintLivros distintos lidos no dia
readingSecondsintTempo lido no dia, em segundos
renewalsintRenovações no dia
reservationsintReservas feitas no dia
reservationsConvertedintDas reservas feitas no dia, quantas vieram a virar empréstimo (a data é a da reserva, não a da conversão)

GET /libraries/v1/users

Cadastro dos leitores. É o único lugar da API com dado nominal; as demais rotas referenciam o leitor por userId. Inclui ativos, desativados e excluídos. Ordenação fixa userId ASC.

Parâmetros

ParamTipoObrigatórioDescrição
userIdintnãoUm leitor específico
statusenumnãoactive | deactivated | deleted. Default: todos
libraryIdintnãoFiltra por biblioteca
registeredFrom / registeredTodatenãoRecorte pela data de cadastro. É assim que se conta “leitores cadastrados” por período
updatedSincedatenãoSó cadastros alterados desde a data, inclusive desativação e exclusão (conferido: 100% das desativações tocam a data de alteração). Base do sync incremental
page / pageSizeintnãoPaginação (máximo 1000)

data.rows[]

CampoTipoDescrição
userIdintIdentificador do leitor, chave usada nas demais rotas
namestringNome
emailstringE-mail
librarystring | nullBiblioteca do cadastro
ageGroupstring | nullFaixa etária
citystring | nullCidade informada no cadastro
statestring | nullUF
genderstringFeminino | Masculino | Não-binário | Outro | Não informado
registeredAtdateData do cadastro
statusenumactive em uso · deactivated bloqueado pela biblioteca · deleted excluído pelo leitor
deletedAtdate | nullData da desativação ou exclusão; null para ativos
updatedAtdatetimeÚltima alteração do cadastro, ISO 8601 em UTC (2026-08-14T13:02:11Z). É o campo para decidir o que mudou dentro de um lote do updatedSince
confirmedAtdatetime | nullQuando o leitor confirmou o e-mail; null enquanto pendente
lastSignInAtdatetime | nullÚltimo acesso à plataforma; null para quem nunca entrou
totalLoansintEmpréstimos históricos (preservados mesmo após exclusão)

A tela de cadastros excluídos do painel (e o bloco deletedUsers do /summary) soma deactivated e deleted com deletedAt a partir de 2026-07-21. status=deleted sozinho devolve só quem se excluiu, que é uma fração pequena desse total.

Sincronizar leitores com um CRM

Receita para manter uma base externa (HubSpot, RD Station, planilha) espelhando o cadastro, sem varrer tudo a cada rodada:

  1. Carga inicial: percorra GET /libraries/v1/users?pageSize=1000&page=N em sequência, uma página por vez, até meta.page.totalRows. A rota passa pela fila de consultas pesadas, então páginas em paralelo podem responder 503; em sequência não. Ordem de referência: uma página de 1000 leva cerca de 2 segundos, e a base inteira (~636 mil leitores) sai em torno de 20 minutos. A ordenação é fixa por userId e cadastros excluídos continuam na lista (com status deleted), então paginar por page não perde nem repete linha enquanto a base cresce.
  2. Rodada diária: chame GET /libraries/v1/users?updatedSince=<ontem> e aplique linha a linha: status diz se o contato segue ativo, foi bloqueado pela biblioteca (deactivated) ou se excluiu (deleted); updatedAt desempata quando a mesma pessoa aparece em duas rodadas. updatedSince tem grão de dia, então repita o dia anterior inteiro e deixe o userId ser a chave de deduplicação.
  3. Chave do contato: use userId, nunca o e-mail. O e-mail pode mudar e, em cadastro excluído, é apagado na origem.
  4. Frequência: os dados atualizam a cada hora cheia (meta.updatedAt); chamar mais de uma vez por hora devolve o mesmo resultado. Uma rodada por dia costuma bastar.

Não há webhook, evento push nem ambiente de homologação. A API é somente leitura e não altera nada na plataforma, então o próprio ambiente de produção é onde se integra: use uma janela curta (pageSize pequeno, ou updatedSince de ontem) para conferir o formato antes de rodar a carga inteira. A única forma de saber que um cadastro mudou é a rodada com updatedSince. Também não há telefone, endereço ou documento no payload; a API entrega o mínimo necessário para identificar e segmentar o contato (library, ageGroup, city, state, gender). Cadastros de menores de idade estão na base e aparecem com ageGroup correspondente: quem sincroniza para um CRM responde pelo tratamento desse dado no destino.

GET /libraries/v1/datasets/{name}

Dados linha a linha, paginados (máximo por página na tabela de paginação acima), com o envelope padrão. Linhas referenciam o leitor por userId e o título por bookId. Dataset desconhecido responde 404.

DatasetGrãoResumo
books1 linha por títuloUso e acervo por livro no período
stock1 linha por título (+ compras)Consumo do estoque, preços e expiração
loans1 linha por empréstimoCada empréstimo, com leitura acumulada do leitor no título
reservations1 linha por reservaCiclo completo, com status e datas
logins1 linha por leitor × diaDias com atividade de cada leitor, com primeiro e último evento
channels1 linha por dia × aparelhoSessões por canal de acesso
suggestions1 linha por título sugeridoSugestões de compra agregadas por título
suggestion-requests1 linha por pedidoCada solicitação, com o leitor

Parâmetro do vocabulário desta rota que não se aplica ao dataset é ignorado (ex.: status em books). Nome de parâmetro fora do vocabulário responde 400 com property <nome> should not exist, e isso inclui o antigo method de logins, que não existe mais. orderBy fora da lista do dataset, status fora do conjunto do dataset ou collection fora do vocabulário do dataset respondem 400.

datasets/books

Parâmetros: startDate/endDate (janela das métricas de uso), search (título ou ISBN), author, publisherId, categoryId, subjectId, collection (all | platform | additional | odilo | manual), format (ebook | audiobook), bookId, publicationYear, orderBy (title | loans | returns | readings10 | readings50 | readingSeconds | renewals | reservations | activeReservations | convertedReservations, default loans), orderDir (asc | desc, default desc), page/pageSize. Desempate por título e bookId, então a ordem é total e a paginação não repete linha.

CampoTipoDescrição
bookIdintIdentificador do título
titlestringTítulo
isbnstring | nullISBN-13
authorstring | nullAutor(es)
publisherstring | nullEditora
collectionstring | nullOrigem do título no acervo. Um título pode ter mais de uma linha de acervo; sai a que debita primeiro na ordem de consumo
hasEbook / hasAudiobookboolFormatos disponíveis
modelint | nullEmpréstimos por cópia: max_uses do título, ou 26 quando o título não define. null quando o título só tem Acervo Árvore (ilimitado)
copiesint | nullEmpréstimos possíveis do título: soma de cópias × modelo nas linhas additional, odilo e manual (no Odilo cada cópia vale 1). Apesar do nome, é capacidade em empréstimos, não contagem de cópias. null quando o título só tem Acervo Árvore
consumedCopiesint | nullEmpréstimos confirmados (active) do título desde 2026-07-21
availableCopiesint | nullcopies − consumedCopies, nunca negativo
loans / returns / readings10 / readings50 / renewalsintMétricas do título no período
readingSecondsintTempo lido no título no período
reservations / convertedReservationsintReservas feitas/convertidas no período
activeReservationsintReservas ativas agora

datasets/stock

Sem período: é a foto atual do estoque. Parâmetros: purchasedFrom/purchasedTo (data da compra), consumptionBand (faixa do histograma, ex. 1-10), search, publisherId, categoryId, subjectId, collection (additional | odilo | manual; stock não aceita all nem platform, que não têm estoque próprio), bookId, publicationYear, orderBy (title | activeLoans | readings | possibleReadings | percentage | activeReservations, default percentage), orderDir (default desc), page/pageSize. Desempate por título e bookId.

CampoTipoDescrição
bookIdintIdentificador do título
titlestringTítulo
activeLoansintEmpréstimos ativos do título agora
readingsintLeituras confirmadas (10% do livro) de leitores com empréstimo do título desde 2026-07-21
possibleReadingsintSoma de purchases[].possibleReadings, compras e legado
percentagefracreadings ÷ possibleReadings. Passa de 1 com frequência e não é um teto de 100%: readings conta toda leitura confirmada do título, inclusive as servidas pelo Acervo Árvore (ilimitado), enquanto possibleReadings só soma o estoque próprio do título. Um título com 72 leituras e 1 leitura possível sai com 72
activeReservationsintReservas ativas do título agora
purchases[].purchaseIdstring"Compra N" para compra no Marketplace; "Legado N" para linha de acervo herdada (odilo ou manual) com cópias
purchases[].modalitystring | nullModalidade comercial, ex. "Medido"
purchases[].modelintLeituras por cópia: max_uses do título, ou 26 quando não define
purchases[].copiesint | nullCópias compradas; null nas linhas de legado
purchases[].possibleReadingsintCópias × modelo. No legado Odilo cada cópia vale 1 leitura
purchases[].consumedintLeituras alocadas a esta linha. O consumo do título é distribuído na ordem de purchasedAt: a linha mais antiga enche primeiro, e a seguinte só recebe o que sobrou
purchases[].percentagefracconsumed ÷ possibleReadings desta linha. Entre 0 e 1: o consumo alocado nunca passa do possível da linha
purchases[].purchasedAtdateData da compra. Legado anterior a 2026-07-21 sai como 2026-07-21
purchases[].unitPricemoneyPreço unitário da cópia; "0" no legado
purchases[].totalPricemoneyValor total da compra; "0" no legado
purchases[].expiresAtdate | nullExpiração da licença, quando houver. Legado com expiração anterior a 2026 sai null

datasets/loans

Parâmetros: startDate/endDate (sobre a data do empréstimo), userId, bookId, status (active | returned | expired), page/pageSize. Ordenação fixa: data do empréstimo e loanId, ascendentes.

CampoTipoDescrição
loanIdintIdentificador do empréstimo (idempotência na ingestão)
userIdintLeitor. Detalhe no /users
bookIdintTítulo emprestado
titlestringTítulo (desnormalizado)
isbnstring | nullISBN-13
authorstring | nullAutor(es)
borrowedAtdate | nullData da retirada
dueAtdate | nullData prevista de devolução
returnedAtdate | nullData efetiva da devolução ou expiração
statusenumactive em curso · returned devolvido · expired expirou no prazo. active cobre dois estados internos: o empréstimo recém-feito, ainda sem leitura iniciada, e o já confirmado pela abertura do livro
readingSecondsintTempo lido pelo leitor neste título, acumulado em todos os empréstimos dele
progresspercentMaior percentual do livro alcançado pelo leitor neste título, de 0 a 100 (99.32 = 99,32% do livro). Não é fração: não multiplique por 100

A fonte não registra leitura por empréstimo individual nem o formato (ebook ou audiobook) escolhido no empréstimo. readingSeconds e progress são do par leitor × título; quem emprestou o mesmo livro duas vezes vê o mesmo valor nas duas linhas.

datasets/reservations

Ciclo completo da reserva, não só a fila ativa. Parâmetros: startDate/endDate (sobre reservedAt), status, userId, bookId, page/pageSize. Ordenação fixa: reservedAt e reservationId, ascendentes.

CampoTipoDescrição
reservationIdintIdentificador da reserva
userIdintLeitor. Detalhe no /users
bookIdintTítulo reservado
titlestringTítulo (desnormalizado)
isbnstring | nullISBN-13
statusenumwaiting aguardando na fila · available exemplar liberado · converted virou empréstimo · cancelled cancelada · lost expirou sem retirada
positionint | nullPosição na fila. Só enquanto waiting ou available
titleQueueintTamanho atual da fila do título (foto do sync), na mesma régua do painel: leitores da BibliON, reservas a partir de 2026-07-21
reservedAtdateData da reserva
resolvedAtdate | nullData em que converteu, cancelou ou expirou. É a última alteração do registro, aproximação da data do evento

datasets/logins

Uma linha por leitor por dia em que ele teve qualquer atividade na plataforma (abrir a BibliON, navegar, ler, emprestar). É a mesma régua do logins do /summary e do /engagements: somando as linhas de um dia, bate com o data.general.logins desse dia. Parâmetros: startDate/endDate (default últimos 30 dias, máximo 31 dias), userId, page/pageSize. Ordenação fixa: date e userId, ascendentes. (date, userId) é chave única.

CampoTipoDescrição
userIdintLeitor. Detalhe no /users
datedateDia da atividade
firstSeenAtdatetimePrimeiro evento do leitor no dia
lastSeenAtdatetimeÚltimo evento do leitor no dia
eventsintQuantidade de eventos do leitor no dia

A plataforma não registra o login como evento próprio (a BibliON entra por link e SSO), por isso o grão é o dia com atividade e não a autenticação. A fonte também não registra o aparelho por leitor; a visão de aparelhos é a do dataset channels.

datasets/channels

Sessões por dia e aparelho, medidas pela ferramenta de analytics. Parâmetros: startDate/endDate (máximo 31 dias), channel. Não é paginado: vem a série inteira do período (page e pageSize são ignorados). Se o analytics não responder, a rota responde 503 e nada fica em cache; basta repetir a chamada depois.

CampoTipoDescrição
datedateDia de referência
channelenumweb-mobile | web-desktop | web-tablet | app
sessionsintSessões do canal no dia
estimatedbooltrue nas linhas de app: contagem estimada pela faixa de ids de cadastro da BibliON

datasets/suggestions

Sugestões de compra agregadas por título. Parâmetros: startDate/endDate, search, page/pageSize.

CampoTipoDescrição
titlestring | nullTítulo sugerido
authorstring | nullAutor
publisherstring | nullEditora
searchTermstring | nullTermo buscado pelo leitor quando não achou o título
requestsCountintTotal de solicitações no período
uniqueUsersintLeitores distintos que solicitaram
availabilityenumcatalog já no acervo · marketplace disponível para compra · none não encontrado
lastRequestedAtdateÚltima solicitação

datasets/suggestion-requests

Cada solicitação individual. Parâmetros: startDate/endDate, title e author (comparação exata, ignorando maiúsculas e espaços nas pontas), userId, page/pageSize. Ordenação fixa: data e hora do pedido ascendentes, com desempate pelo id interno do pedido, então a paginação é estável durante a ingestão.

CampoTipoDescrição
userIdintLeitor que pediu. Detalhe no /users
titlestring | nullTítulo pedido
authorstring | nullAutor
searchTermstring | nullTermo buscado, quando não indicou título
requestedAtdateData do pedido

GET /libraries/v1/dimensions

Vocabulários válidos para os filtros das demais rotas. Sem parâmetros.

CampoTipoDescrição
libraries[]array{ id: string, name: string }. Usar o id (como inteiro) em libraryId
ageGroups[]array{ id, name }. Usar em ageGroupId
publishers[]array{ id, name }. Usar em publisherId
categories[]array{ id, name }. Usar em categoryId
subjects[]array{ id, name }. Usar em subjectId
ras[]string[]Regiões administrativas presentes na base. Sem filtro correspondente na v1: serve para conferência, não para recorte
states[]string[]UFs presentes na base
cities[]string[]Cidades presentes na base
genders[]string[]Gêneros canônicos
publicationYears[]int[]Anos de publicação presentes no acervo

Erros

Corpo de erro padrão: { "statusCode": int, "error": string, "message": string | string[] }. Em erros de validação (400), message é uma lista com uma mensagem por parâmetro inválido.

HTTPQuando
400Parâmetro inválido: data mal formatada ou inexistente no calendário, janela acima de 31 dias, enum desconhecido, orderBy ou collection fora da lista, page ou pageSize acima do máximo, ou parâmetro que não existe na rota (property X should not exist)
503Fonte externa fora do ar (só datasets/channels). Repetir depois
401Chave de API ausente ou inválida
404Dataset desconhecido em /datasets/{name}
429Rate limit excedido. Reenviar após o intervalo em Retry-After
500Falha interna; nenhum dado parcial é devolvido

Ingestão incremental (sugestão)

  • Leitores: uma carga inicial paginada de /users e depois /users?updatedSince=<ontem> por dia. A alteração de status (desativação, exclusão) atualiza o registro e entra no recorte.
  • Engajamento: /engagements?startDate=<dia>&endDate=<dia> por dia, paginando até totalRows. A chave natural é (date, userId).
  • Empréstimos e reservas: datasets/loans e datasets/reservations pelo período de criação; a chave é loanId / reservationId. Como o status muda depois da criação, reprocessar os últimos 60 dias cobre devoluções, expirações e conversões.
  • Agregados: /summary uma vez por dia com o período desejado, para conferência dos totais.

Fora do escopo

A aba Radar do painel (detectores, mapa de demanda, ações) não é exposta pela API. Aparelho amarrado a login individual não faz parte da v1; a visão de aparelhos é agregada, via dataset channels.