FN SHOP

FN SHOP developer docs

Base URL: https://fnitem.shop/api/v3/service/ · Your API key is on the API Key page.

Authentication

Send your API key as a header or query param:

The API detects your site’s domain from the request and locks your key to it on first use — no domain parameter needed. Your key only sees that owner’s accounts, categories and orders.

Plan limits

Each key is on a plan with a number of requests per term. A term is the period you paid for — a month, or the three, six or twelve you bought at once — and the count starts over when you renew. verify_license is never counted, so checking your key costs nothing.

PlanPer monthRequests per term
Basic$255,000
Standard$5020,000
Unlimited$100no limit

Doubling the price quadruples the requests, so the bigger plan is cheaper per call.

A call past the plan is refused before it does anything, and is not counted:

{
    "result": false,
    "code": "plan_limit_reached",
    "description": "The standard plan allows 20,000 requests per term, and this key has used them. Renew to start a new term.",
    "plan": "standard",
    "limit": 20000,
    "used": 20000,
    "resets_at": 1790794897,
    "resets_in": 432000
}

resets_at is when the term ends — the key’s expiry. Renewing before then starts a new term at once. groups_status returns plan with used, remaining and resets_at, so a storefront can see how close it is before a call is refused, and your API key page shows the same.

Request & response

Call https://fnitem.shop/api/v3/service/{action} (GET or POST). Every response is JSON with at least:

{ "result": true, "code": "ok_code", "description": "", ... }

Gift lifecycle

ActionMethodParamsPurpose
verify_licenseGET/POST—Validate the API key; returns user_id + plan.
resolve_accountGET/POSTusername, modeResolve a Fortnite username (or psn: / xbl: / nintendo: prefixed) to an Epic account id.
friend_addGET/POSTreceiver, receiver_id?, category?, account_id?, limit?Friend the buyer from every account (or one category) and report when gifting becomes possible.
friend_statusGET/POSTreceiver, receiver_id?Where the buyer stands with each of your accounts: friends and giftable, friends but inside the 48 hours, request pending, or none.
gift_checkGET/POSTofferId, receiver, receiver_id?, categoryCheck whether a gift can be sent from the category's pool.
gift_sendGET/POSTofferId, receiver, receiver_id?, order_id, categorySend the gift from the category's pool. Records the order.

Shop

ActionMethodParamsPurpose
shopGET/POSTofferId?, giftable?, search?, limit?The live item shop: name, image, price, rarity and both ids for every item.

Categories (per owner)

ActionMethodParamsPurpose
category_listGET/POST—List your categories with account counts + the default.
category_createPOSTslug, nameCreate a category. slug: 2-40 chars of a-z 0-9 _ ; "all" reserved.
category_deletePOSTslug, reassign_to?Delete a category; if it holds accounts, pass reassign_to=<slug>.

Accounts

ActionMethodParamsPurpose
accounts_listGET/POSTcategory?List your accounts (id, name, category, cached V-Bucks/gifts).
accounts_dataGET/POST—Live per-account V-Bucks + gifts (queries Epic).
account_assignPOSTaccount_id | account_ids, categoryMove existing account(s) into a category.
account_linkPOSTcode, categoryLink a new Epic account (Android authorization code) into a category.
account_removePOSTaccount_idUnlink an account (DB row only).

Dashboards

ActionMethodParamsPurpose
inventoryGET/POST—Aggregate per category: counts, V-Bucks, free gift slots. No identifiers.
groups_statusGET/POSTlive?Per-account detail per category, in gifting priority order. live=1 refreshes first.

Orders

ActionMethodParamsPurpose
order_historyGET/POSTtype?, status?, receiver?, sender?, offer?, order_id?, category?, from?, to?, q?, sort?, dir?, limit?, offset?Every order you have: gifts sent, Battle Pass gifts, and purchases on your own accounts.

category

For gift_check/gift_send, category is one of your category slugs, or all (any account), or omitted (default). Only accounts whose group matches are used; an empty pool returns no_accounts_in_group.

Identifying the buyer

Every gifting call takes receiver, an Epic username. That works until the buyer renames — then the stored value stops resolving, and they are told their username is wrong for an account that is perfectly fine.

gift_check, gift_send and friend_add therefore also return receiver_id, the resolved Epic account id, and accept it back on the next call. An account id never changes, so a shop that stores one keeps working across a rename — and skips the lookup, so the call is slightly faster too.

FieldNotes
receiverStill required, even when you send an id — it is what gets resolved if the id is missing or unusable.
receiver_idOptional. Used as-is when it looks like an Epic id: exactly 32 hex characters. Anything else — truncated, stale, padded, or not hex — is ignored and receiver is resolved instead, so a bad stored value degrades to the old behaviour rather than being handed to Epic as a recipient.

Returned on refusals as well as on success, so a shop can capture the id from the first call it makes even when that call says no. friend_add also returns it as receiver for callers written before this existed; both fields carry the same value.

friend_add

Fortnite only allows a gift once both accounts have been friends for 48 hours. Call friend_add as soon as a buyer enters their name — at the top of checkout, or when they add to cart — so the wait is already running by the time they pay. Calling it again is safe: accounts that are already friends are skipped rather than sent a second request.

Leave category out and the request goes from every account you have. That is usually what you want: any account might end up being the one that gifts, and befriending only one leaves the rest unable to deliver. Pass a category to restrict it to that pool.

FieldNotes
receiverRequired. Epic username, or an account id, or a console name with a platform prefix: psn:, xbl: or nintendo: (xb:, xbox:, ns:, switch:, ps5: are accepted as the same thing).
categoryOptional. Restrict to one pool. Omitted → every account.
account_idOptional. Pin a single sender, so a returning buyer stays with the account that already befriended them.
limitOptional. Caps how many accounts are contacted in one call. Unlimited by default — the whole pool is contacted together, so size no longer costs time.

The reply summarises the whole pool, then breaks it down per account:

FieldNotes
codefriend_request_sent, already_friends, partially_sent (some accounts failed), friend_request_failed (all did), or friends_lists_full — every account that would have had to send is at Epic's friends cap, so nothing was attempted. That one is for the store owner, not the buyer.
sent, already_friends, failed, skippedCounts across the pool. skipped accounts were set aside before anything was sent because their friends list is full; they are neither a success nor a failure, and one that already knows the buyer can still gift them.
can_gift_nowtrue if any account can gift right now — check this before offering checkout.
giftable_atSoonest unix time any account becomes able to gift. null while every request is still unaccepted.
giftable_inSeconds until that moment, for a countdown.
accounts_total, accounts_tried, truncatedtruncated is true when the pool was bigger than limit; the rest are picked up on the next call.
accounts[]Per account: account_id, displayName, status (sent / already_friends / skipped / failed), friends_since, giftable_at, can_gift_now, error when it failed, and reason when it was skipped.

A pending request has giftable_at: null: Epic starts the 48 hours when the buyer accepts, not when you send. Tell them to accept, then poll this or gift_check. One account failing doesn't stop the others — check accounts[] for the detail.

friend_status

Where a buyer stands with each of your accounts, without sending anything. Call it before offering checkout, or to show a returning buyer how long is left.

FieldNotes
ready, waiting, pending, noneCounts across the pool: friends for 48 hours and able to gift; friends but still inside the 48 hours; a request sent and not yet accepted; no relationship at all.
min_hoursThe friendship Epic requires, in hours (48).
soonest_hoursHours until the first waiting account becomes able to gift; null when none is waiting.
accounts[]Per account: account_id, displayName, state (friends / pending / none), created, hours of friendship so far, giftable, ready_in_hours.

Takes receiver and receiver_id like friend_add, and reads the pool of the same category. A buyer with ready above zero can be gifted right now.

shop

Returns the items currently in the shop, ready to list in a storefront. Filter with offerId, giftable=1|0, search (name substring) or limit.

FieldNotes
offerIdPass this to gift_check / gift_send. It changes every time the shop rotates, so don't use it to identify an item.
mainIdThe item's permanent id (CID_…, EID_…). Use this one to recognise the same item across rotations.
name, descriptionFor a bundle, the bundle's own name and blurb.
kindWhat the entry is: bundle, jam_track, instrument, car, lego_kit or item. Use this to include or exclude a whole class of item — type is null for jam tracks, cars, LEGO kits, instruments and V-Bucks packs, so it can't be filtered on. A bundle stays bundle even when it is made of music.
type, rarity, seriese.g. outfit / Epic / Icon Series. series is null for ordinary items.
price, regularPriceV-Bucks. They differ when the item is discounted.
giftablefalse for items Epic won't allow as a gift (Battle Passes, V-Bucks packs).
imageItem artwork URL.
colorsThe item's colour pair, for matching the in-game card background.
inDate, outDateHow long the item stays in the shop (ISO-8601).

Also returned: uid (changes when the shop rotates, so you can skip a refresh), count and total. shop_unavailable means shop data could not be read.

groups_status

Every category with its accounts, in the order gifts actually use them — the drag order you set on the Accounts page. A gift goes out from the first eligible account in the list, so this is the order to show if you display a pool anywhere.

FieldNotes
position1-based place in the gifting queue. Label rows with this, not with sort_order.
sort_orderThe raw stored value. It repeats freely and is 0 for every account never dragged, so it means nothing on its own.

position can be null, and the list then falls back to name order. Treat null as "no priority to show" rather than implying one. In the (ungrouped) bucket position is cosmetic: those accounts aren't in any category, so they never gift.

order_history

Every order placed against your accounts, whatever placed it. Alias: orders.

type says what kind of order a row is:

typeMeaning
giftSent to a receiver.
purchaseBought on your own account. No receiver.
api_giftSent to a receiver, placed through an API key.
battlepassA Battle Pass gift.

gift and api_gift are both gifts and differ only in how they were placed, so the filter takes a list: type=gift,api_gift gives every gift and nothing you bought for yourself.

Orders record what kind they were, not which app placed them, so there is no filter for that.

Filters are optional and combine. Send all, or leave a filter out, to ignore it — so you can pass the same parameter every time and vary only its value.

ParameterNotes
typeOne of the four above. Comma-separated for more than one.
statusUsually completed.
receiverEpic account id of the buyer.
senderWhich of your accounts sent it.
offerThe offer id. Remember it changes when the shop rotates.
order_idYour shop's own reference, if you sent one to gift_send.
categoryThe gifting category that delivered it.
from, toA unix timestamp, or a date like 2026-08-01.
qFree text across receiver, item, track id and order id.
sort, dirdate (default), price or status; desc (default) or asc.
limit, offset1–200, default 50. Page with offset.

Alongside orders[] the reply carries total and spent for the whole filter rather than the page you asked for, so a summary can stay on screen while you page through. types counts each kind under that same filter, so you can see the mix at once instead of asking once per kind.

{
  "result": true, "code": "order_history",
  "total": 1284, "spent": 1027200, "limit": 50, "offset": 0,
  "types": { "api_gift": 900, "gift": 350, "purchase": 34 },
  "orders": [
    { "id": "trk1", "date": 1755534240, "type": "api_gift", "status": "completed",
      "receiver": "990e78dd\u2026", "sender": "acc1", "offer": "offer1",
      "price": 800, "order_id": "1042", "category": "vip" }
  ]
}

You only ever see your own orders.

Linking an account

Log into the Epic account, open this URL, and copy authorizationCode:

https://www.epicgames.com/id/api/redirect?clientId=3f69e56c7649492c8cc29f1af08a8a12&responseType=code

Then POST it to account_link with a category. Codes are single-use and expire quickly.

Code examples

Pick a language; every endpoint below updates. Replace YOUR_KEY and the sample values.

WordPress plugin (fnitemshop-auto-gift)

A WooCommerce plugin that calls this API on order completion: it maps a product to a Fortnite item and one of your categories, then sends the gift from that category’s accounts.

WordPress plugin — version 3.1.3

Released 2026-09-14 · WordPress 5.6+, PHP 7.4+, tested up to 6.8 · fnitemshop-auto-gift-3.1.3.zip

Download it from your API Key page — any active key can.

Release notes

3.1.3

  • The leaving-the-shop badge appears on every product picture — the shop grid, the home page and anywhere else the products are shown — whichever theme or builder draws them, not only on the product page.
  • Hovering the badge shows the full sentence: Leaves Fortnite's item shop in 5h 30m.
  • The badge uses your site's own font, taken from the product title, on the grid and on the product page alike.

3.1.1

  • Chinese (Simplified) added, making nine languages. Sites on any zh locale pick it up automatically.
  • The sync button now reports what it did — added, updated, removed, and how many products carry a leaving-the-shop date.
  • Each product shows how long the item is still in Fortnite's shop as a badge on its picture — 5h 30m — in the shop list and on the product page, the same chip the web shop has always shown. It turns red in the last day. On by default; there is a switch in settings.
  • A gifting account whose friends list Epic reports as full is no longer asked to send friend requests. It failed identically on every order and each failure counted against the buyer. Buyers it already knows can still be gifted by it; it is tried again after a day in case friends were removed.
  • The add-friend page offers the accounts a customer has already saved, the same way the product page does, with typing reserved for a new one. It also sends the Epic ID behind a saved account, so someone who renamed themselves in-game still resolves.
  • New optional setting: when you add a gifting account, anyone who bought in the last 60 days and saved an account is sent a friend request from it within the hour — so the 48-hour wait is already over the next time they order, rather than starting when they arrive. Off by default: unaccepted requests occupy a limited slot on every account they went out from.
  • When friend requests cannot be sent, the buyer is told which of their own Fortnite settings is in the way — requests switched off, a full friends list, or too many requests already waiting — instead of one error covering all three. Each needs a different action from them.
  • A Fortnite username that does not exist is reported as such rather than as a general failure.
  • Accounts Epic could not answer for are reported as "try again in a moment" instead of being counted as unable to gift. Previously a busy moment at Epic's end looked like a refusal.
  • A buyer returning to the add-friend page is told how many requests are waiting for them, instead of being told requests were just sent when they had all been waiting since the last visit.
  • The number of your accounts that could not send is no longer shown to the buyer. It says nothing they can act on, and one accepted account is enough to receive a gift.
  • Plugin fields follow your theme's fonts and colours. Grey text and hairline borders were unreadable on dark themes.
  • Tick boxes render as tick boxes on themes that restyle form controls as switches.
  • Reaching the saved-account limit now says so, with a link to remove one, instead of silently deleting the oldest saved account to make room.
  • Saved accounts can be managed with the [fnitemshop_saved_accounts] shortcode, for themes that do not show the WooCommerce account form.

3.1.0

  • Customers can save their Fortnite accounts on their account page and pick one at checkout instead of retyping it every order. Saved against the Epic account ID, so someone renaming themselves in-game does not create a duplicate entry or break the gift.
  • New Customer accounts screen in the plugin menu: see what each customer has saved, and search by their name, email, Fortnite username, nickname or Epic ID.
  • A limit on how many accounts each customer may keep, and a switch to turn saving off entirely.
  • Eight languages, matching the Mini App. Regional locales such as es-ES, fa-IR and pt-BR now resolve instead of quietly falling back to English.
  • Prices come from your gifting categories rather than the global V-Bucks setting.
  • Gifting accounts are listed in the order they will actually be used.
  • When a buyer is already a friend but has not been one for 48 hours yet, the page shows how long is left.
  • Automatic updates from fnitem.shop.

3.0.0

  • Moved to the v3 API.
  • Products are taken off sale when the gifting service is unreachable, instead of accepting orders that cannot be delivered.

Setup

  1. Link your Epic accounts and create your categories in the panel.
  2. Download the plugin above and install it on your WordPress site (Plugins → Add New → Upload), then activate it. Updates arrive through WordPress from then on.
  3. Paste your API key (from the API Key page) in the plugin settings. It binds to your site domain on first use.
  4. Per product: set the Fortnite item, the category to gift from, and the price.

The plugin uses the same endpoints documented under REST API — gift_check then gift_send against the mapped category. Epic requires 48 hours of friendship before a gift is allowed, so an order may complete after that wait. Sent gifts appear under Orders.