Put jurisdiction intelligence inside the checkout flow.
Gun-Go gives FFLs and POS teams a deterministic, source-linked on-ramp for building location-aware firearm workflows. Resolve a state, pilot slug, or coordinate pair; receive one predictable jurisdiction brief your product can render, log, or review.
01 / Request
Start with one clear input.
Choose exactly one selector mode. State accepts a two-letter code or supported state name. The slug selector is sent as jurisdiction in the query string.
Coordinates require both lat and lng, with latitude from -90 to 90 and longitude from -180 to 180.
Do not mix state or jurisdiction with coordinates. Postal-code lookup is not supported.
The current pilot resolver covers Colorado, Kansas, Texas, Arizona, North Dakota, Missouri, Wyoming, and New Hampshire aliases and locations. Treat an unsupported selector as a lookup miss, not as a legal conclusion.
curl "/api/jurisdiction-lookup?state=MO"curl "/api/jurisdiction-lookup?jurisdiction=missouri"curl "/api/jurisdiction-lookup?lat=38.4561&lng=-92.2884"Selector reference
Parameters at a glance.
| Parameter | Accepts | Notes |
|---|---|---|
| state | Two-letter code or slug-like state name | Case-insensitive; supports CO, COLORADO, KS, KANSAS, TX, TEXAS, AZ, ARIZONA, ND, NORTH-DAKOTA, MO, MISSOURI, WY, WYOMING, NH, and NEW-HAMPSHIRE. |
| jurisdiction | Slug-like jurisdiction selector | Case-insensitive; supported slugs are colorado, kansas, texas, arizona, north-dakota, missouri, wyoming, and new-hampshire. |
| lat + lng | A numeric coordinate pair | Both are required; lat is -90..90 and lng is -180..180. |
| postal | Unsupported | Returns 400. Unknown query keys are also rejected. |
Pilot coverage
Eight supported jurisdictions.
| Code | Name | jurisdiction value | Review status |
|---|---|---|---|
| CO | Colorado | colorado | Approved |
| KS | Kansas | kansas | Approved |
| TX | Texas | texas | Approved |
| AZ | Arizona | arizona | Approved |
| ND | North Dakota | north-dakota | Approved |
| MO | Missouri | missouri | Approved |
| WY | Wyoming | wyoming | Approved |
| NH | New Hampshire | new-hampshire | Approved |
02 / Response
Four slots, plus a mapping layer.
The selected jurisdiction always returns the same four rule categories: carry, magazine, transport, and duty-to-inform. A slot can be present with rule: null when no current rule record is available. The additive equipment array maps equipment and ammunition questions to those rules without making a new legal conclusion.
Useful for integrators
- • Store the rule id with the transaction or cart review.
- • Render the label and summary in your own workflow.
- • Keep sourceUrl available for a human verification step.
Live example
GET /api/jurisdiction-lookup?state=MO
Response schema
Stable at the edges, rich in the middle.
The four rule slots are always present and ordered as carry, magazine, transport, then duty-to-inform. An unavailable current rule is represented by rule: null. The separate equipment array always contains four mappings; each mapped rule is nullable and scopeCopy explains the mapping’s limits.
{
id, name, abbreviation,
rules: [
{ category, rule: null | {
id, category, label, summary,
effectiveFrom, effectiveTo, updatedAt,
jurisdictionId, reviewStatus,
sourceLabel, sourceUrl,
lastReviewedAt, reviewedBy,
revisions: [{ changedAt, changeSummary }],
history: [{ timestamp, kind, summary }]
} }
],
equipment: [
{ category, label, mappedRuleCategory,
rule: null | { ...same rule fields... },
scopeCopy: string | null }
]
}| Path | Type | Meaning |
|---|---|---|
| id · name · abbreviation | string | Selected jurisdiction identity and state abbreviation. |
| rules[] | 4 ordered slots | Each slot has category and a nullable current rule. |
| equipment[] | 4 mappings | Long-gun, standard-capacity magazine, high-capacity magazine, and ammunition transport mappings. Each includes a nullable mapped rule and scopeCopy. |
| rule.* | string fields | id, category, label, summary, jurisdictionId, reviewStatus, sourceLabel, and sourceUrl. |
| rule.*At / effective* | ISO date-time | effectiveFrom and updatedAt are required; effectiveTo and lastReviewedAt are nullable. reviewedBy is nullable. |
| revisions[] · history[] | arrays, max 5 | Revision entries use changedAt/changeSummary; history entries use timestamp/kind/summary. |
Errors
Predictable failures, safe to handle.
Every failure is JSON with the same shape. Branch on the status, then show or log the returned message without exposing implementation details.
Invalid, missing, conflicting, out-of-range, postal, or unknown parameters.
{ "error": "Postal-code lookup is not supported." }The endpoint allows Access-Control-Allow-Origin: * for browser and server integrations. Requests are read-only; cache responsibly around the timestamps returned by each rule.
03 / Evidence
The brief comes with its paper trail.
A populated rule includes the citation pair, effective and update timestamps, plus change and review context so your team can decide when to surface a re-check. The reviewStatus value describes the returned review state; effectiveFrom and updatedAt anchor it in time.
sourceLabel names the authority; sourceUrl points your reviewer to the cited source.revisions[] lists changedAt and changeSummary for recorded rule changes.history[] exposes timestamp, kind, and summary for review and revision events.Informational, not legal advice.
Timestamps and citations describe the returned dataset; they are not a guarantee of legal advice, completeness, or freshness beyond those timestamps. Verify the current official source and consult qualified counsel for a decision that matters.