AmmoSeek APIammoseek.com ↗
Search in-stock ammunition, firearms, and reloading components across retailers via the AmmoSeek API. Get prices, calibers, retailer ratings, and deals.
What is the AmmoSeek API?
The AmmoSeek API provides 7 endpoints for querying in-stock ammunition, firearms, and reloading supplies aggregated from multiple retailers. The search_ammo endpoint returns per-listing fields including price, cost-per-round (cp, cp_cleaned), grain weight, casing type, condition, and retailer URL — making it straightforward to build price-comparison tools or inventory monitors across calibers like 9mm-luger, 223-remington, and 22lr.
curl -X GET 'https://api.parse.bot/scraper/0a603c5c-dac6-4a0a-a758-05abdfc3060e/search_ammo?brand=0&start=0&grains=0&length=5&caliber=12-gauge&gun_type=handgun' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ammoseek-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""AmmoSeek SDK walkthrough — search ammo, guns, reloading supplies; compare retailers and deals."""
from parse_apis.ammoseek_api import AmmoSeek, GunType, ReloadingCategory, InvalidCategory
client = AmmoSeek()
# List popular calibers to discover valid slugs for ammo search.
for cal in client.calibers.list_popular(limit=5):
print(cal.label, cal.slug)
# Search ammunition by caliber — limit caps total items returned.
for listing in client.ammolistings.search(caliber="9mm-luger", gun_type=GunType.HANDGUN, limit=3):
print(listing.descr, listing.price, listing.cp_cleaned)
# Search firearms — no required params, returns all guns sorted by price.
gun = client.gunlistings.search(limit=1).first()
if gun:
print(gun.descr, gun.price, gun.retailer)
# Search reloading components with a category enum.
for item in client.reloadinglistings.search(category=ReloadingCategory.PRIMERS, limit=3):
print(item.descr, item.price, item.retailer)
# List retailer ratings to evaluate trustworthiness.
for retailer in client.retailers.list(limit=5):
print(retailer.name, retailer.rating, retailer.review_count)
# Check current deals and coupon codes.
deal = client.deals.list(limit=1).first()
if deal:
print(deal.retailer, deal.description, deal.coupon_code)
# Typed error handling — catch invalid category input.
try:
bad = client.reloadinglistings.search(category="invalid_category", limit=1).first()
except InvalidCategory as exc:
print(f"Invalid category: {exc.category}")
print("exercised: calibers.list_popular / ammolistings.search / gunlistings.search / reloadinglistings.search / retailers.list / deals.list")
Search for in-stock ammunition by caliber. Returns detailed product listings including price, price per round, brand, retailer ratings, and condition. Results are paginated via start/length parameters. Each listing includes retailer trust data and a direct purchase link.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort order for results. |
| brand | string | Brand/manufacturer filter ID. 0 means no filter. |
| start | integer | Pagination offset (0-based). |
| grains | string | Grain weight filter. 0 means no filter. |
| length | integer | Number of results per page (max 40). |
| caliberrequired | string | Caliber slug (e.g. '9mm-luger', '223-remington', '22lr', '45acp'). Use get_ammo_caliber_list or get_popular_calibers to discover valid slugs. |
| exclude | string | Keywords to exclude from search results. |
| include | string | Keywords to include in search results. |
| gun_type | string | Gun type filter. Accepted values: handgun, rifle, rimfire, shotgun. |
{
"type": "object",
"fields": {
"items": "array of ammunition listing objects with retailer, description, manufacturer, caliber, price, cost per round, count, grains, casing, condition, rating, and retailer URL",
"total": "integer total number of matching records",
"filtered": "integer number of records after filtering"
},
"sample": {
"data": {
"items": [
{
"cp": "6.4¢",
"mfg": "Wolf",
"count": 50,
"descr": "Wolf Performance 9mm Luger Ammo 124 Grain FMJ",
"price": "$3.20",
"casing": "steel",
"grains": 124,
"rating": 4,
"caliber": "9mm Luger",
"retailer": "Ammo ASAP",
"condition": "new",
"cp_cleaned": 6.4,
"num_ratings": 99,
"retailer_url": "https://ammoseek.com/share/a/422646495040"
}
],
"total": 500,
"filtered": 500
},
"status": "success"
}
}About the AmmoSeek API
Ammo and Firearm Search
The search_ammo endpoint accepts a required caliber slug (e.g. 45acp, 308-winchester) plus optional filters for brand, grains, include, and exclude keywords. Results are paginated via start and length parameters and each item in the items array carries fields: retailer, descr, mfg, caliber, price, cp (cost per round), cp_cleaned, count, grains, casing, and condit. The total and filtered integers in the response tell you how many records match before and after filtering. Use get_ammo_caliber_list to retrieve valid caliber slugs, or get_popular_calibers if you only need the commonly searched ones organized by firearm type (handgun, rifle, rimfire, shotgun).
Firearms and Reloading
search_guns follows the same pagination pattern and returns firearm listings with retailer, descr, mfg, caliber, price, rating, num_ratings, and retailer_url. search_reloading requires a category parameter — one of bullets, brass, primers, powder, or miscellaneous — and returns component listings with cost-per-unit fields alongside retailer ratings. Both endpoints support brand, include, and exclude filters.
Retailer Intelligence and Deals
get_retailer_ratings returns the full roster of indexed retailers with each retailer's name, rating, and review_count — useful for filtering or ranking results from the search endpoints by seller reputation. get_deals surfaces current promotions from participating retailers, including retailer, description, and coupon_code fields. Neither endpoint requires any input parameters.
The AmmoSeek API is a managed, monitored endpoint for ammoseek.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ammoseek.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ammoseek.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a cost-per-round price tracker for a specific caliber across all indexed retailers
- Alert users when in-stock 9mm or 223 ammo drops below a target price using
search_ammosorted bycp_cleaned - Aggregate retailer ratings from
get_retailer_ratingsto rank search results by seller reputation - Surface active coupon codes from
get_dealsinside a browser extension or deal-alert service - Compare reloading primer and powder prices across brands using
search_reloadingwith category filters - Populate a caliber selector UI from
get_ammo_caliber_listto ensure valid search inputs - Monitor firearm listings by caliber and brand using
search_gunsfor in-stock availability notifications
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does AmmoSeek have an official developer API?+
What does `cp` versus `cp_cleaned` mean in `search_ammo` results?+
cp is the raw cost-per-round string as listed, which may include formatting characters or symbols. cp_cleaned is a normalized numeric version suitable for sorting and arithmetic comparisons. Use cp_cleaned when building price filters or ranking results.Does `search_ammo` return sold-out or historical listings?+
Can I filter `search_guns` by firearm type (handgun, rifle, etc.)?+
search_guns endpoint currently filters by brand, caliber, include, and exclude keywords. A dedicated firearm-type or action-type filter is not exposed. You can fork this API on Parse and revise it to add a category or type parameter to narrow firearm results further.How do I discover valid caliber slugs for `search_ammo`?+
get_ammo_caliber_list returns an array of objects each with a label (human-readable name) and seo (the slug to pass as caliber). For a shorter list of commonly searched calibers grouped by firearm type, use get_popular_calibers, which returns label and slug fields.