9NTY API
Free, read-only Fortnite data as JSON: today's Item Shop, new cosmetics, leaks, weapons and every cosmetic's shop history. No account, no key, no cost.
Just send a request. Works from servers, bots and browsers.
The same data that powers this site and our X posts.
It never touches your Epic account. See "Can I get banned?"
01 What the API is
An API (application programming interface) is a way for programs to ask a website for data instead of a person reading a page. You send a web address, called a request, and get back JSON: plain text structured so any programming language can read it.
Each address is called an endpoint. For example, /api/v1/shop is the endpoint for today's Item Shop. People use the 9NTY API for Discord bots, Item Shop websites, stream overlays, spreadsheets and school projects.
The API is read-only. You can get data, but you can't change anything, sign in or buy anything through it.
02 Quick start
Open this in your browser, or run it in a terminal:
curl https://9ntyapi.com/api/v1/shop
JavaScript
const res = await fetch('https://9ntyapi.com/api/v1/shop');
const { data, updated } = await res.json();
console.log(`${data.length} offers, updated ${updated}`);
for (const offer of data) console.log(offer.name, offer.price);Python
import requests
r = requests.get("https://9ntyapi.com/api/v1/shop", timeout=10)
r.raise_for_status()
body = r.json()
for offer in body["data"]:
print(offer["name"], offer["price"])Discord bot (discord.py)
async with aiohttp.ClientSession() as s:
async with s.get("https://9ntyapi.com/api/v1/shop/new") as r:
new = (await r.json())["data"]
await channel.send(f"{len(new)} new offers today: " + ", ".join(o["name"] for o in new[:10]))| Base URL | https://9ntyapi.com/api/v1 |
|---|---|
| Method | GET only |
| Format | JSON, UTF-8. Times are UTC in ISO 8601, for example 2026-11-06T00:01:15Z. |
| Every response has | status, updated (when that data last changed) and data |
| Lists | Use limit (up to 500) and offset to page. Responses include total. |
| Browsers | CORS is open (Access-Control-Allow-Origin: *), so you can call it from a web page. |
| Images | All image URLs point at 9ntyapi.com/img/… and can be hot-linked. |
03 Endpoints
Every endpoint below is a GET request. Press "Try it" to see the live response in a new tab.
GET /api/v1/shopToday's full Item Shop: every offer with price, section, dates and the cosmetics inside.
GET /api/v1/shop/newOffers new in today's shop (first time or returning).
GET /api/v1/newCosmetics newly added to the game files, newest first. ?type=Outfit&limit=&offset=
GET /api/v1/leaksLeaked cosmetics not in the Item Shop yet, plus recently released leaks.
GET /api/v1/weaponsWeapons with stats per rarity. ?q=name&type=Shotgun&loot=1&limit=&offset=
GET /api/v1/cosmetics/{id}One cosmetic by ID, with its Item Shop history where recorded.
GET /api/v1/statusWhen each data set was last updated.
Query parameters
| Parameter | Works on | What it does |
|---|---|---|
limit | All lists | How many results to return, 1 to 500. |
offset | All lists | How many to skip. Use with limit to page through results. |
type | /new, /weapons | Filter by type, for example Outfit or Shotgun. |
q | /weapons | Search weapon names. |
loot | /weapons | 1 for weapons currently in the loot pool only. |
04 Example responses
Real responses from the live API, shortened to one result each.
/shop
{
"status": 200,
"updated": "2026-11-06T00:01:15Z",
"date": "2026-11-06",
"total": 240, "limit": 1, "offset": 0,
"data": [{
"name": "Harley Quinn",
"bundle": false,
"price": 1500,
"regularPrice": 1500,
"banner": null,
"rarity": "dc",
"section": "DC",
"inDate": "2026-11-02T00:00:00Z",
"outDate": "2026-11-06T23:59:59.999Z",
"giftable": true,
"image": "https://9ntyapi.com/img/…",
"items": [{ "id": "CID_704_Athena_Commando_F_LollipopTrickster", "name": "Harley Quinn", "type": "Outfit" }]
}]
}/shop/new
{
"status": 200,
"updated": "2026-11-05T00:01:27Z",
"date": "2026-11-05",
"total": 58,
"data": [{
"name": "Guardians of the Globe Bundle",
"bundle": true,
"price": 2800,
"regularPrice": 4500,
"banner": "1700 V-Bucks Off",
"section": "Invincible",
"items": [
{ "id": "Character_SharpMagnet", "name": "Omni-Man", "type": "Outfit", "rarity": "epic" },
{ "id": "Backpack_SharpMagnet", "name": "The Immortal's Head", "type": "Back Bling", "rarity": "epic" }
]
}]
}/new
{
"status": 200,
"updated": "2026-11-05T14:01:41Z",
"total": 208, "limit": 1, "offset": 0,
"data": [{
"id": "Backpack_TonicMailWeb",
"name": "Hi-Fi Jets",
"type": "Back Bling",
"rarity": "icon",
"set": "A$AP Rocky",
"image": "https://9ntyapi.com/img/…",
"added": "2026-11-05T14:00:58Z",
"version": "43.00"
}]
}/leaks
{
"status": 200,
"updated": "2026-11-05T14:56:20Z",
"total": 347,
"data": {
"unreleased": [{ "id": "Backpack_TonicMailWeb", "name": "Hi-Fi Jets", "type": "Back Bling",
"rarity": "icon", "set": "A$AP Rocky", "leakedAt": "2026-11-05T14:00:58Z" }],
"released": [{ "id": "Backpack_LazarusUntold", "name": "Psyonic Elite Cloak", "type": "Back Bling",
"leakedAt": "2026-09-17T16:17:14Z", "releasedOn": "2026-11-05", "daysInFiles": 48 }]
}
}/weapons
{
"status": 200,
"updated": "2026-11-04T22:56:42Z",
"version": "43.00",
"total": 2052,
"data": [{
"id": "WID_FG_Fang_Pistol_UR",
"name": "9mm Baba Yaga",
"rarity": "Mythic",
"type": "Pistol",
"inLoot": true,
"mode": "Battle Royale",
"stats": { "damage": 35, "headshot": 1.35, "fireRate": 7.7, "magazine": 21,
"reload": 2.3, "buildDamage": 28, "pellets": 1 },
"icon": "https://9ntyapi.com/media/weapons/…png"
}]
}/cosmetics/{id}
{
"status": 200,
"data": {
"id": "Character_SharpMagnet",
"name": "Omni-Man",
"description": "Not exactly \"Father of the Year\".",
"type": "Outfit",
"rarity": "Epic",
"set": "Guardians of the Globe",
"introduction": "Introduced in Chapter 4, Season OG.",
"shop": { "lastSeen": "2026-11-06", "daysSinceLastSeen": 0, "appearances": 48,
"dates": ["2023-11-25", "2023-11-26", "…"] }
}
}/status
{
"status": 200,
"data": {
"shop": "2026-11-06T00:01:15Z",
"newShop": "2026-11-05T00:01:27Z",
"newCosmetics": "2026-11-05T14:01:41Z",
"leaks": "2026-11-05T14:56:20Z",
"weapons": "2026-11-04T22:56:42Z"
}
}05 Limits and caching
- 120 requests a minute per IP address. That's plenty for almost every project.
- Responses are cached for about a minute, so asking more often than that gets the same answer.
- The Item Shop changes once a day at midnight UTC. Check
/statusto see when each data set changed, instead of downloading everything again.
Tip: for a bot that posts the shop, poll /status every few minutes after reset and fetch /shop only when shop changes.
06 Errors
| Code | Meaning | What to do |
|---|---|---|
200 | Success | Read data. |
404 | Not found, for example an unknown cosmetic ID | Check the ID or path. |
429 | Too many requests (over 120 a minute) | Wait a minute, then slow down. Nothing else happens. |
5xx | Something went wrong on our side | Try again in a few minutes. |
07 Can I get banned for using it?
From Fortnite?
No. The 9NTY API never connects to your Epic account. You don't sign in, it doesn't touch your game, and Epic can't see that you use it. It only returns public information (the Item Shop, cosmetics, weapon stats) that we've already collected on our own server. Using it is no different from reading a Fortnite news site.
From 9NTY?
No. We don't ban or block people for using the API, and you don't need permission. The only limit is the automatic 120-requests-a-minute rate limit above: if you go over it, you get a 429 for the rest of that minute, then it works again on its own.
Be careful with other tools. Things that log in to your Epic account, change game files, or promise free V-Bucks or skins can get your account banned or stolen. The 9NTY API does none of those things.
08 Fair use and credit
- Free for personal and commercial projects.
- Please credit "9NTY" with a link to 9ntyapi.com in public projects.
- Leaks are things found in the game files, not release dates. Please don't present them as confirmed.
- Cosmetic names and images belong to Epic Games. 9NTY is a fan site and isn't affiliated with Epic Games.
