Build on Shooters Hub.
Use stable public APIs, scoped credentials, and hosted Match Finder embeds without scraping pages or rebuilding the same discovery tools.
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.
Generate clients and inspect the governed request and response schemas.
→Signed-in accessAPI keysCreate, rotate, and revoke personal or entity-scoped credentials.
→Public endpointService healthCheck current liveness and the deployment timestamp before a smoke test.
→Talk to the teamIntegration supportStart a staff thread with the route, use case, and organization attached.
→Stable API surface
The reference below and the OpenAPI document are generated from the same contract.
https://shootershub.net/apiGET/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"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.tsServer 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();Build and test a real request.
Requests run against the current deployment, so the same form works for localhost checks and production smoke tests.
https://shootershub.net/api/matches?type=NRL22&radius=150&limit=25&sort=dateAsccurl "https://shootershub.net/api/matches?type=NRL22&radius=150&limit=25&sort=dateAsc"// Run the request to preview the response.API scopes
matches.readRead matchesRead public match discovery and match-detail data.
readclubs.readRead clubsRead public club directory and club metadata.
readseries.readRead seriesRead public series, season, and standings metadata.
readseasons.readRead seasonsRead public season schedules and standings.
readmatch.events.writeWrite match eventsSubmit match-scoped scoring events from an explicitly authorized integration.
write
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 →Developer changelog
- 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.