GunSpec
Paginierung

Paginierung

Wie eine Liste durchlaufen wird, was jeder Tarif davon lesen darf und jede Operation, die paginiert. Gelesen aus der OpenAPI-Spezifikation und den Limits der API selbst, sodass die Zahlen hier die sind, die die API durchsetzt.

  • 30Operationen mit page + per_page
  • 6Begrenzte Listen mit limit
  • 100Max. per_page
  • 10,000Höchste Seitenzahl

Jede Liste nimmt dieselben zwei Query-Parameter, einmal in der Spezifikation deklariert und von jeder Operation geteilt. Alles außerhalb der Grenzen ist ein 400 mit INVALID_PARAMETER; ein unbekannter Parameter wird ignoriert, nicht abgelehnt.

pageinteger

Page number, from 1 to 10,000

Min
1
Max
10,000
Standard
1
per_pageinteger

Items per page (max 100)

Min
1
Max
100
Standard
20

per_page endet fast überall bei 100. Eine größere Obergrenze (1000) gilt für die Bulk-Listen: /v1/firearms/media.

6 Operationen sind Ranglisten statt Listen: sie nehmen ein einzelnes limit, liefern die obersten Zeilen und tragen kein pagination-Objekt: /v1/firearms/top, /v1/popular/firearms, /v1/stats/calibers/popular, /v1/stats/manufacturers/prolific, /v1/stats/feature-frequency, /v1/data/tasks.

Eine paginierte Antwort verpackt die Seite jedes Mal im selben Objekt. Das Beispiel unten ist aus den Beispielen des Schemas gebaut und kann daher nicht von dem abweichen, was die API sendet.

Paginierte Antwort
json
{  "success": true,  "data": [    /* one page of records */  ],  "pagination": {    "page": 1,    "per_page": 20,    "limit": 20,    "total": 42,    "totalPages": 3  }}
  • pagination.pageintegererforderlich

    The page this response is, 1-based.

  • pagination.per_pageintegererforderlich

    Page size. Same value as limit.

  • pagination.limitintegererforderlich

    Page size. Alias of per_page.

  • pagination.totalintegeroptional

    Total records matching the query across every page.

  • pagination.totalPagesintegeroptional

    How many pages the result set spans at the current per_page.

Page-size is reported under both per_page (matching the request parameter) and limit (retained for existing integrations). They always carry the same value. total and totalPages are omitted for Explorer and anonymous callers.

Die Schleife, die auf jedem Tarif funktioniert, steuert sich über die gerade empfangene Seite, nicht über totalPages. Vier Regeln und der Code in drei Sprachen.

  1. 1Aufhören, wenn eine Seite zu kurz zurückkommt. Weniger Zeilen als per_page bedeutet auf jedem Tarif: letzte Seite.
  2. 2total und totalPages als optionale Extras behandeln. Bei Explorer- und anonymen Aufrufen fehlen sie, sodass eine Schleife mit page < totalPages dort nach einer Seite stoppt.
  3. 3Die größte nutzbare Seite anfordern. per_page=100 bedeutet 100× weniger Anfragen gegen Minutenlimit und Tageskontingent und erreicht dieselben Zeilen.
  4. 4Einmal durchlaufen, dann anders aktuell bleiben. Jede Seite trägt ein ETag und antwortet mit 304, wenn unverändert, und Daten-Webhooks pushen Katalogänderungen, sodass ein Spiegel die Liste nie erneut durchläuft. Mehr als 10 aufeinanderfolgende Seiten innerhalb von 90 Sekunden werden abgelehnt.
Alle Gewehre lesen
cURL
# Page 1, then keep going while a page comes back fullcurl -H "X-API-Key: your_api_key" \  "https://api.gunspec.io/v1/firearms?category=rifle&per_page=100&page=1" curl -H "X-API-Key: your_api_key" \  "https://api.gunspec.io/v1/firearms?category=rifle&per_page=100&page=2"

Bei der Paginierung unterscheiden sich die Tarife am stärksten, und jede Regel unten wird von der API durchgesetzt, nicht per Konvention. Die Zahlen stammen aus derselben Konfiguration, die die Middleware liest.

Seitentiefe

Die tiefste Seitenzahl, die ein Tarif auf den Firearm-Listen anfordern darf. Darüber hinaus ist die Antwort ein 403; Liste mit Filtern eingrenzen oder upgraden.

Explorer
5 Seiten
Builder
25 Seiten
Studio
Enterprise

Gesamtzahlen

Ob die Hülle total und totalPages trägt. Im kostenlosen Tarif verborgen, damit die Größe des Katalogs nicht aus einer Liste abgelesen werden kann.

Explorer
Builder
Studio
Enterprise

Sequenzieller Seiten-Burst

10 oder mehr aufeinanderfolgende Seiten innerhalb von 90 Sekunden sind ein 429, pro Schlüssel oder Adresse.

Zielt auf Crawler. Wer eine UI durchblättert, erreicht es nie; ein Skript, das den Katalog will, sollte per_page an der Obergrenze, Filter oder Webhooks nutzen.

Harte Obergrenzen

page endet bei 10,000 und per_page bei 100, auf jedem Tarif, auch Enterprise.

Ein Wert über der Obergrenze ist ein 400, kein Zuschnitt: per_page=500 wird abgelehnt statt stillschweigend als 100 bedient.

Wie eine abgelehnte Seitenanfrage aussieht

  • The plan does not page this deep into a list. Narrow the list with filters, or upgrade for deeper paging.

  • Too many sequential pages in a short time. Slow the walk down, or use a larger per_page.

Wo eine Liste sortiert werden kann, deklariert sie ein sort-Vokabular und eine order-Richtung; die Standardreihenfolge zeigt die Referenz je Operation. Jede andere Liste hat eine feste Reihenfolge, die die Beschreibung der Operation nennt.

    • name
    • weight
    • year
    • caliber
    • created_at
    • favorites

    order: asc | desc

    • created_at
    • updated_at
    • status
    • priority

    order: asc | desc

30 Operationen nehmen page und per_page und antworten mit der Hülle; 6 nehmen ein einzelnes limit. Jede Zeile verlinkt auf ihre Referenzseite.

ZeileEndpunktStilStandardMaxTarif
01/v1/firearmsList firearmspage + per_page20100Explorer
02/v1/firearms/searchFull-text searchpage + per_page20100Builder
03/v1/firearms/mediaIndex every firearm that has imagerypage + per_page2501000Explorer
04/v1/firearms/topRank firearms by a superlativelimit1025Builder
05/v1/firearms/by-featureFilter by featurepage + per_page20100Builder
06/v1/firearms/by-actionFilter by action typepage + per_page20100Explorer
07/v1/firearms/by-materialFilter by construction materialpage + per_page20100Builder
08/v1/firearms/by-designerFilter by designerpage + per_page20100Builder
09/v1/firearms/by-conflictFilter by conflictpage + per_page20100Studio
10/v1/firearms/power-ratingRank by composite power ratingpage + per_page20100Builder
11/v1/firearms/timelineBrowse the catalog chronologicallypage + per_page50100Builder
12/v1/popular/firearmsList the most viewed firearmslimit1020Explorer
13/v1/manufacturersList manufacturerspage + per_page20100Explorer
14/v1/manufacturers/{id}/firearmsList a manufacturer firearmspage + per_page20100Explorer
15/v1/calibersList caliberspage + per_page20100Explorer
16/v1/calibers/{id}/firearmsList firearms in a caliberpage + per_page20100Explorer
17/v1/calibers/{id}/ammunitionList ammunition for a caliberpage + per_page20100Builder
18/v1/ammunitionList ammunition loadspage + per_page20100Builder
19/v1/categories/{slug}/firearmsList firearms in a categorypage + per_page20100Explorer
20/v1/stats/calibers/popularRank calibers by adoptionlimit20100Explorer
21/v1/stats/manufacturers/prolificRank manufacturers by outputlimit20100Explorer
22/v1/stats/feature-frequencyRank features by frequencylimit50100Builder
23/v1/data/tasksList data remediation taskslimit50200Explorer
24/v1/data/gaps/recordsList records missing a fieldpage + per_page20100Enterprise
25/v1/data/confidenceGet per-record confidence scorespage + per_page20100Enterprise
26/v1/me/favoritesList your favoritespage + per_page20100Explorer
27/v1/me/reportsList your data reportspage + per_page20100Explorer
28/v1/me/supportList your support ticketspage + per_page20100Explorer
29/v1/me/webhooksList your webhook endpointspage + per_page20100Explorer
30/v1/game-stats/versions/{version}/firearmsList firearms in a snapshotpage + per_page20100Builder
31/v1/changelogList changelog entriespage + per_page20100Explorer
32/v1/blogList blog postspage + per_page20100Explorer
33/v1/attachmentsList attachmentspage + per_page20100Explorer
34/v1/attachments/{id}/firearmsList firearms an attachment fitspage + per_page20100Studio
35/v1/vendor/offersRead back your listingspage + per_page20100Enterprise
36/v1/interfaces/{id}/firearmsList firearms exposing a standardpage + per_page20100Studio

Die offiziellen SDKs bieten einen Auto-Paging-Iterator, der jede Regel dieser Seite anwendet: Seiten werden bei Bedarf geholt, bei einer kurzen Seite stoppt er und totalPages liest er nie.

TypeScript
typescript
for await (const firearm of client.firearms.listAutoPaging({ category: 'rifle' })) {  console.log(firearm.name); // pages are fetched on demand}
Python
python
for firearm in client.firearms.list_auto_paging({"category": "rifle"}):    print(firearm["name"])  # pages are fetched on demand

Sie geben das an einen Coding-Agenten? Die Agenten-Pakete und llms.txt enthalten dieselben Regeln in einer Form, auf die ein Modell reagieren kann: über das Kurzseiten-Signal blättern, per_page ausreizen und bei 403 oder 429 error.reason lesen, bevor erneut versucht wird.