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.

  • 41Operationen 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, 500, 50) gilt für die Bulk-Listen: /v1/firearms/media, /v1/contract/findings, /v1/data/tasks, /v1/updates.

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/docs/guides/search.

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.

DiagrammJede Zeile einer Liste lesen
100%
Jede Zeile einer Liste lesenFordern Sie die größte Seite an, die Ihr Tarif erlaubt, lesen Sie die Zeilen und hören Sie auf, wenn eine Seite weniger Zeilen zurückgibt als angefordert. Das ist in jedem Tarif die letzte Seite. Steuern Sie die Schleife nicht über total oder totalPages: beide fehlen bei anonymen und Explorer-Aufrufen, eine Schleife über totalPages liest also genau eine Seite. Jenseits der Seitentiefe Ihres Tarifs kommt eine 403, ein Signal, die Liste zu filtern, statt weiterzublättern.
  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

41 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/features/iconsList feature iconspage + per_page20100Explorer
06/v1/firearms/by-featureFilter by featurepage + per_page20100Builder
07/v1/firearms/by-actionFilter by action typepage + per_page20100Explorer
08/v1/firearms/by-materialFilter by construction materialpage + per_page20100Builder
09/v1/firearms/by-designerFilter by designerpage + per_page20100Builder
10/v1/firearms/by-conflictFilter by conflictpage + per_page20100Studio
11/v1/firearms/power-ratingRank by composite power ratingpage + per_page20100Builder
12/v1/firearms/timelineBrowse the catalog chronologicallypage + per_page50100Builder
13/v1/popular/firearmsList the most viewed firearmslimit1020Explorer
14/v1/manufacturersList manufacturerspage + per_page20100Explorer
15/v1/manufacturers/{id}/firearmsList a manufacturer firearmspage + per_page20100Explorer
16/v1/calibersList caliberspage + per_page20100Explorer
17/v1/calibers/{id}/firearmsList firearms in a caliberpage + per_page20100Explorer
18/v1/calibers/{id}/ammunitionList ammunition for a caliberpage + per_page20100Builder
19/v1/ammunitionList ammunition loadspage + per_page20100Builder
20/v1/categories/{slug}/firearmsList firearms in a categorypage + per_page20100Explorer
21/v1/stats/calibers/popularRank calibers by adoptionlimit20100Explorer
22/v1/stats/manufacturers/prolificRank manufacturers by outputlimit20100Explorer
23/v1/stats/feature-frequencyRank features by frequencylimit50100Builder
24/v1/data/tasksList data remediation taskspage + per_page50500Explorer
25/v1/data/verificationsList accepted verificationspage + per_page20100Explorer
26/v1/data/sourcesList cited sourcespage + per_page20100Explorer
27/v1/data/outcomesList accepted results on catalogue taskspage + per_page20100Explorer
28/v1/data/gaps/recordsList records missing a fieldpage + per_page20100Enterprise
29/v1/data/confidenceGet per-record confidence scorespage + per_page20100Enterprise
30/v1/me/favoritesList your favoritespage + per_page20100Explorer
31/v1/me/reportsList your data reportspage + per_page20100Explorer
32/v1/me/supportList your support ticketspage + per_page20100Explorer
33/v1/me/webhooksList your webhook endpointspage + per_page20100Explorer
34/v1/game-stats/versions/{version}/firearmsList firearms in a snapshotpage + per_page20100Builder
35/v1/changelogList changelog entriespage + per_page20100Explorer
36/v1/updatesList site updatespage + per_page2050Explorer
37/v1/contract/findingsOne check's findings from the latest runpage + per_page1001000Explorer
38/v1/docs/guides/searchSearch the documentation guideslimit825Explorer
39/v1/blogList blog postspage + per_page20100Explorer
40/v1/attachmentsList attachmentspage + per_page20100Explorer
41/v1/attachments/{id}/firearmsList firearms an attachment fitspage + per_page20100Studio
42/v1/vendor/offersRead back your listingspage + per_page20100Enterprise
43/v1/interfaces/{id}/firearmsList firearms exposing a standardpage + per_page20100Studio
44/v1/papersList research paperspage + per_page20100Explorer
45/v1/releasesList new firearm modelspage + per_page20100Explorer
46/v1/changesList changes to the cataloguepage + per_page20100Explorer
47/v1/me/changesList changes to my saved firearmspage + per_page20100Explorer

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.