Authentication

All requests require an API key passed in the x-api-key header. Keys are prefixed with fns_.

Required headerx-api-key: fns_your_api_key_here
# Pass your key in the x-api-key header curl https://api.fndata.gg/v1/shop \ -H "x-api-key: fns_your_api_key_here"
import requests HEADERS = {"x-api-key": "fns_your_api_key_here"} r = requests.get("https://api.fndata.gg/v1/shop", headers=HEADERS) data = r.json()
const API_KEY = "fns_your_api_key_here"; const res = await fetch("https://api.fndata.gg/v1/shop", { headers: { "x-api-key": API_KEY } }); const data = await res.json();

Rate limits

Rate limits are per API key. Monthly quotas also apply.

PlanRate (per min)Monthly quota
Free3010,000
Pro1201,000,000

When rate-limited, the response is 429 with a Retry-After: 1 header.

Error codes

All error responses follow the format: {"code": "error_code", "message": "...", "retryable": bool}

HTTPCodeDescription
401invalid_api_keyMissing or invalid API key
403plan_forbiddenYour plan doesn't include this endpoint
429rate_limitedRate limit exceeded — retry after 1s
429quota_exceededMonthly quota exhausted
429abuse_detectedUnusual traffic pattern
503service_unavailableUpstream data unavailable

Item shop

GET/v1/shopToday's offers

Returns all current offers in the Fortnite item shop, normalized from Epic's storefront catalog. Cached for 5 minutes.

curl https://api.fndata.gg/v1/shop \ -H "x-api-key: fns_your_key"
r = requests.get("https://api.fndata.gg/v1/shop", headers=HEADERS) shop = r.json() for offer in shop["offers"]: print(offer["name"], offer["price_vbucks"])
const { offers } = await ( await fetch("/v1/shop", { headers: { "x-api-key": key } }) ).json(); offers.forEach(o => console.log(o.name, o.price_vbucks));
200 response
{ "offers": [ { "offer_id": "v2:/BattlePass/Season...", "name": "Crew Pack Skin", "price_vbucks": 1200, "regular_price_vbucks": 1500 } ] }

News

GET/v1/newsGame news feed

Returns current in-game news entries. Cached for 10 minutes.

Missions

GET/v1/missionsActive mission alerts

Returns the current Save the World mission alert board (power level, tile, rewards). Cached for 5 minutes.

Cosmetics

GET/v1/cosmeticsFull catalog with search

Returns the full cosmetics catalog. Supports optional query params: q (name search), type, rarity. Cached for 1 hour.

# Search for legendary skins curl "https://api.fndata.gg/v1/cosmetics?type=AthenaCharacter&rarity=legendary" \ -H "x-api-key: fns_your_key"
r = requests.get( "https://api.fndata.gg/v1/cosmetics", params={"type": "AthenaCharacter", "rarity": "legendary"}, headers=HEADERS ) cosmetics = r.json()
GET/v1/cosmetics/{cosmetic_id}Single cosmetic by ID

Look up a specific cosmetic. Returns 404 if not found.

Player lookup

GET/v1/players/{display_name}Resolve a display name

Looks up a player by their Fortnite display name. Returns account ID and display name. Cached for 10 minutes.

curl https://api.fndata.gg/v1/players/Ninja \ -H "x-api-key: fns_your_key"
200 response
{ "account_id": "4735ce9132924caf8a5b17789b40f79c", "display_name": "Ninja" }

BR stats

GET/v1/players/{account_id}/br-statsBattle Royale statistics

Returns Battle Royale stats for an account ID. Use /v1/players/{display_name} first to resolve a display name to an account ID. Cached for 5 minutes.

STW resources PRO

Save the World is the active focus of this API. This endpoint returns an account's STW resource counts — Gold, Storm Shards, XP boosts, vouchers, and more — pulled from Epic's public campaign profile.

GET/v1/players/{account_id}/stwAccount resource breakdown

Requires the Pro plan (account group). Pulls a public campaign profile snapshot — no login from the target player required. Each fresh (non-cached) lookup also reports into the shared community leaderboard.

curl https://api.fndata.gg/v1/players/4735ce9132924caf8a5b17789b40f79c/stw \ -H "x-api-key: fns_your_pro_key"
r = requests.get( "https://api.fndata.gg/v1/players/4735ce9132924caf8a5b17789b40f79c/stw", headers=HEADERS ) for res in r.json(): if res["amount"] > 0: print(res["name"], res["amount"])
200 response
[ { "template_id": "AccountResource:eventcurrency_scaling", "abstract_id": "stw:gold", "name": "Gold", "category": "Currencies", "amount": 4500 }, { …46 more resources… } ]

Account portal

POST/account/signupCreate a tenant + key

No auth required. Body: {"name": "...", "plan_name": "free" | "pro"}. Returns the API key once — it's never shown again.

GET/account/keysList your keys

Returns your keys without secrets — status, plan, version, created date.

POST/account/keys/{id}/rotateRotate a key

Invalidates the old key immediately and returns a new one. Shown once.

GET/account/usageCurrent month usage

Returns used, limit, remaining, and month.

GET/account/planCurrent plan details

Returns name, monthly_quota, rate_per_minute, allowed_groups.

Interactive explorer

Live OpenAPI spec from your running API instance. Requires a key to test endpoints.

// OpenAPI spec

The interactive spec is served directly from your API at /openapi.json.


View raw spec →    Open Swagger UI →