Skip to main content

Build on Shooters Hub.

Use stable public APIs, scoped credentials, and hosted Match Finder embeds without scraping pages or rebuilding the same discovery tools.

Start here

Choose the integration surface that fits the job.

Use public HTTP routes for discovery, scoped keys for governed access, or a hosted embed when you do not need to own the entire interface.

Contract1.1.0Additive changes stay compatible. Breaking changes require a new version.

Governed reference

Stable API surface

The reference below and the OpenAPI document are generated from the same contract.

https://shootershub.net/api
GET/api/matchesPublic match discoverystable · public

Search published matches by discipline, date, location, radius, limit, and stable sort.

typeCSV · query
One or more disciplines.
fromYYYY-MM-DD · query
Inclusive start date.
toYYYY-MM-DD · query
Inclusive end date.
latnumber · query
Search latitude.
lngnumber · query
Search longitude.
radiusnumber · query
Search radius in miles.
limitinteger · query
Maximum records from 1 through 1000.
sortstring · query
dateAsc, dateDesc, nameAsc, nameDesc, or distance.

200: Published matches and discovery metadata.

curl "https://shootershub.net/api/matches?type=NRL22&limit=25&sort=dateAsc"
  • 500 Failed to fetch matchesThe match discovery service could not complete the request.
GET/api/searchHybrid site searchstable · public

Search public matches, clubs, discussions, listings, users, and pages.

qstring · query · required
Search query containing at least two characters.
typestring · query
Optional result-type filter.
limitinteger · query
Maximum results from 1 through 100.
cursorstring · query
Opaque continuation cursor returned by a previous request.

200: Ranked public search results.

Pagination: send cursor; read nextCursor.

curl "https://shootershub.net/api/search?q=appleseed&limit=10"
  • 400 invalid_localeThe requested locale is invalid.
  • 503 search_generation_cutover_blockedSearch is temporarily unavailable during a governed generation cutover.
  • 500 search_failedSearch could not complete the request.
POST/api/olc/tilesHydrate OLC tilesstable · public

Resolve governed Open Location Code tile identifiers through the backend proxy.

tilesstring[] · body · required
OLC tile identifiers.

200: Controlled tile hydration payload.

curl -X POST "https://shootershub.net/api/olc/tiles" -H "content-type: application/json" -d '{"tiles":["86HJV"]}'
  • 400 invalid_requestThe tile request is malformed.
  • 502 upstream_errorThe governed tile service did not return a usable response.
GET/api/healthService healthstable · public

Lightweight Next-layer liveness check for integration smoke tests.

200: Current service liveness and timestamp.

curl "https://shootershub.net/api/health"
Integration patterns

Start with the least machinery you need.

Hosted embeds cover common publishing needs. OpenAPI-generated clients and direct requests are there when the integration needs deeper control.

Hosted Match Finder

The fastest path for a club or series site.

<iframe
  src="https://shootershub.net/match-finder?type=NRL22"
  title="Shooters Hub Match Finder"
  loading="lazy"
  style="width:100%;height:720px;border:0;border-radius:18px;"
></iframe>

Script widget

Keep configuration in markup and let Shooters Hub own delivery.

<div class="shmf"
  data-sh-config='{"type":["NRL22"],"view":"map"}'>
</div>
<script src="https://shootershub.net/embed/match-finder.js" defer></script>

Generated TypeScript

Build typed clients from the same reference used on this page.

npx openapi-typescript \
  https://shootershub.net/api/openapi \
  --output shooters-hub-api.d.ts

Server request

Use ordinary HTTP and check the response before parsing.

const response = await globalThis.fetch(
  "https://shootershub.net/api/matches?limit=25",
  { headers: { accept: "application/json" } },
);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const payload = await response.json();
Live request builder

Build and test a real request.

Requests run against the current deployment, so the same form works for localhost checks and production smoke tests.

Request URLhttps://shootershub.net/api/matches?type=NRL22&radius=150&limit=25&sort=dateAsc
cURL
curl "https://shootershub.net/api/matches?type=NRL22&radius=150&limit=25&sort=dateAsc"
Response
// Run the request to preview the response.
Permission model

API scopes

  • matches.readRead matches

    Read public match discovery and match-detail data.

    read
  • clubs.readRead clubs

    Read public club directory and club metadata.

    read
  • series.readRead series

    Read public series, season, and standings metadata.

    read
  • seasons.readRead seasons

    Read public season schedules and standings.

    read
  • match.events.writeWrite match events

    Submit match-scoped scoring events from an explicitly authorized integration.

    write
Delivery contract

Polling is the supported event strategy today.

Webhooks, signing secrets, and delivery guarantees are not yet public surfaces. Poll documented read endpoints and treat undocumented event payloads as internal.

Discuss an integration →
Compatibility record

Developer changelog

  1. 1.1.0

    Established the governed, machine-readable developer reference.

    • Added OpenAPI 3.1 output.
    • Published explicit scope risk levels.
    • Added compatibility and change history to the developer hub.

Document detailsVersion 1.1.0

Developer Hub — The Shooters Hub