Search the national FFL listing
POST
/v1/ffl/search
const url = 'https://api.oldsteelarsenal.com/v1/ffl/search';const options = { method: 'POST', headers: { 'x-client-id': '<x-client-id>', 'x-signature': '<x-signature>', 'x-timestamp': '<x-timestamp>', 'Content-Type': 'application/json' }, body: '{"license_number":"example","limit":50,"name":"example","radius_miles":50,"types":["example"],"zip":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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 (
zipgiven): dealers withinradius_milesof the ZIP centroid, nearest first,distance_milespopulated. - Text (
zipomitted): match byname(ILIKE + trigram) and/orlicense_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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”Responses
Section titled “ Responses ”Successful Response
Media typeapplication/json
SearchResponse
object
results
required
Results
Array<object>
FflResultobject
distance_miles
required
Distance Miles
Miles from the search ZIP centroid; 0.0 in text-only searches.
number
license_number
required
License Number
Canonical 6-segment licence number with the real expiration code in segment 5.
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
