Skip to content

Search the national FFL listing

POST
/v1/ffl/search
curl --request POST \
--url https://api.oldsteelarsenal.com/v1/ffl/search \
--header 'Content-Type: application/json' \
--header 'x-client-id: <x-client-id>' \
--header 'x-signature: <x-signature>' \
--header 'x-timestamp: <x-timestamp>' \
--data '{ "license_number": "example", "limit": 50, "name": "example", "radius_miles": 50, "types": [ "example" ], "zip": "example" }'

Two modes, by presence of zip:

  • Geo (zip given): dealers within radius_miles of the ZIP centroid, nearest first, distance_miles populated.
  • Text (zip omitted): match by name (ILIKE + trigram) and/or license_number, sorted by name, distance_miles = 0. At least one of zip / name / license_number is required.

license_number matches on the licence’s stable identity — segment 5 (the expiration code) is wildcarded, so stale or placeholder codes still resolve. Reads the monthly listing only: no live ATF call, no rate-limit spend, no real expiry dates (use verify for those). Scope: ffl:read.

x-client-id
Any of:
string
x-timestamp
Any of:
string
x-signature
Any of:
string
Media typeapplication/json
SearchRequest
object
license_number
Any of:
string
limit
Limit
integer
default: 50 >= 1 <= 200
name
Any of:
string
radius_miles
Radius Miles

Geo radius in miles; ignored without a zip.

number
default: 50 > 0 <= 3000
types
Any of:
Array<string>
zip
Any of:
string
>= 5 characters <= 5 characters

Successful Response

Media typeapplication/json
SearchResponse
object
results
required
Results
Array<object>
FflResult
object
distance_miles
required
Distance Miles

Miles from the search ZIP centroid; 0.0 in text-only searches.

number
expiration_date
required
Any of:
string
license_name
required
Any of:
string
license_number
required
License Number

Canonical 6-segment licence number with the real expiration code in segment 5.

string
premise_city
required
Any of:
string
premise_state
required
Any of:
string
premise_street
required
Any of:
string
premise_zip
required
Any of:
string
trade_name
required
Any of:
string
type_code
required
Any of:
string
voice_phone
required
Any of:
string
stale
Stale

Mirrors /v1/sync/status staleness at response time.

boolean
Example
{
"stale": false
}

Missing/invalid HMAC auth

Missing ffl:read

Zip not found in centroid table

No zip, name, or license_number given