Docs

Docs / FFL Checkout / FFL dealers

For FFL Checkout stores
Endpoint · Find FFL dealers

GET/dealers/search

Licensed dealers a firearm may be sent to, by ZIP, by a point, by name or by licence number, nearest first, with what you need to draw them on your own map.

Needs FFL dealers: ReadBase URL https://backend.fflmonkey.com/api/v1Counts 1 toward 120 a minute

Query parameters

Needs FFL dealers: Read, a permission of FFL Checkout stores. Say where with a zip or a point (latitude and longitude), never both, or which with a name or a license_number. At least one of them is required.

ParameterTypeMeaning
zipstringA 5-digit ZIP, or ZIP+4, to search around. Refused with a point.
latitudenumberWith longitude: a point to search around, more precise than a ZIP. -90 to 90.
longitudenumberWith latitude. -180 to 180.
namestringThe start of the dealer's business name or licence name, or of any word in it, in any case. 3 to 120 characters.
license_numberstringA licence number in any form: printed, with or without separators. Finds that dealer or nothing. Up to 32 characters.
radius_mintegerHow far to search from a ZIP or a point, in metres: 1 to 321869 (200 miles). Default 80467 (50 miles).
limitintegerHow many dealers at most: 1 to 100. Default 25.
only_on_fileboolean1 or true: only dealers your store already holds paperwork for. 0 or false does not filter. true and false are read in any letter case; anything else is refused.
sot_onlyboolean1 or true: only dealers with an SOT in force, who can receive NFA items: the class from the dealer's approved SOT stamp, until its tax year ends on 30 June. 0 or false does not filter. true and false are read in any letter case; anything else is refused.
verified_onlyboolean1 or true: only dealers the registry has seen accept a transfer, from a store's FFL transfer report. 0 or false does not filter. true and false are read in any letter case; anything else is refused.
  • The search FFL Monkey's dealer picker runs, with its rules. Only dealers whose licence is current (active, and expiring today or later, UTC) and of a type a firearm may be transferred to are found, and only those the registry could place on a map.
  • By a ZIP or a point, nearest first, within radius_m. A ZIP the registry cannot place answers no dealers with meta.zip_known false: "we do not know that ZIP", not "nobody near it".
  • By name or licence number, measured from the ZIP or point when you send one too, nearest first, otherwise by name. radius_m and only_on_file are for a ZIP or a point only.
  • sot_only and verified_only filter before limit, on every kind of search, so the dealers they leave are still the nearest ones.
  • Caps are refused, never cut down: a radius_m over 321869 or a limit over 100 is 422.
  • Searches share your checkout's limits: 120 a minute from one address, across every key and dealer picker searching from it, and 5,000 a day for the store. A search by license_number with limit=1 is outside the daily limit.

What it answers

data is a list of dealers, meta says what was searched, and map names the map FFL Monkey's dealer picker draws, its style and the tiles it falls back to, so a map you draw on the results can use the same ones. Each dealer:

FieldMeaning
license_numberThe licence number as the registry holds it, usually as printed on the licence.
license_keyThe licence without its expiry group, such as 1-62-037-01-01187: the same when the licence is renewed, so the value to keep, and to look the dealer up by again with GET /dealers/{licenseNumber}. Null only for a number that cannot be read.
business_nameThe dealer's business name.
licensee_nameThe name on the licence, often a person's. Sent for a search by name or licence number; null for a search by ZIP or by a point.
addressThe licensed premises, below.
phoneThe dealer's phone number, or null.
latitudeWhere to put the dealer on a map, in WGS84 degrees.
longitudeThe same, east to west.
distance_metersFrom the ZIP or point searched from, in metres; null when the search had no origin.
expiration_dateWhen the licence expires, the last day of its month, or null.
sot_classThe Special Occupational Tax class, for NFA items, when the dealer pays it, such as 3; otherwise null.
on_fileWhether your store already holds this dealer's paperwork, from a completed FFL order or an upload FFL Monkey approved. Your store's own: another store gets its own answer.
documentThe registry holds a current copy of the dealer's licence, below, or null.
sot_documentThe same for its SOT stamp, or null.
addressMeaning
line_1The street address, as ATF's list or the approved licence gives it.
line_2A second line, or null.
cityThe city.
stateThe two-letter state code.
zipThe ZIP.
document, sot_documentMeaning
availableAlways true when the object is there. Availability only, never a link to the document.
kindffl or sot.
expires_onWhen the copy held stops covering the dealer: the licence's expiry, or the end of the SOT tax year.
metaMeaning
zipThe 5-digit ZIP searched from; null for a search by a point, or by name or licence number without a ZIP.
zip_knownfalse only when the ZIP could not be placed, so an empty answer means "unknown ZIP" rather than "nobody within the radius".
countHow many dealers data holds.
mapMeaning
tile_urlA tile URL template with {z}, {x} and {y}.
attributionThe tile provider's credit, as HTML, to show on the map as its terms ask.
max_zoomThe deepest zoom the tiles go to.
style_urlA MapLibre style the picker draws in place of the tiles, or null when it draws the tiles. The tiles stay its fallback.
style_attributionThe style's credit, as HTML, to show on the map while the style draws. null when style_url is.

A page with a Content Security Policy must allow the tile host in img-src, and, to draw the style, its host in connect-src and what MapLibre itself needs (blob: workers and images).

Returns

  • 200The dealers found in data, nearest first when there is an origin, with meta and map. No dealer is still a 200.
  • 422validation_failed: no ZIP, point, name or licence number; a ZIP and a point together; or a parameter that broke a rule.

This endpoint can also answer 401 invalid_api_key, 403 license_not_active, 403 product_not_included, 403 insufficient_scope and 429 rate_limited.

Example

FFL Monkey FFL Checkout API, version 1. Questions: Support in your FFL Monkey account, or [email protected].