# Fortnite Island Stats - UEFN Player Counts & Daily History (`that_red_bird/fortnite-island-player-stats`) Actor

Fortnite/UEFN island players, plays, minutes, peak CCU and retention from Epic's official API, archived daily past Epic's 7-day window. Day-over-day movers, creator filter, CSV/JSON export. No API key. Failed lookups are never charged.

- **URL**: https://apify.com/that_red_bird/fortnite-island-player-stats.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Other, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 island metrics

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fortnite Island Stats - UEFN Player Counts & Daily History

Pulls players, plays, minutes, peak concurrent users, favorites and D1/D7 retention for Fortnite Creative / UEFN islands from **Epic's official ecosystem API**, and archives every day into a history store so you keep data **beyond Epic's 7-day window**. Built for UEFN creators, studios, brand agencies and gaming analysts who want a daily export and a "who moved" list without writing code.

No API key, no login, no browser.

### What you get

- Latest-day metrics per island (unique players, plays, minutes played, average minutes per player, peak CCU, favorites, recommendations, retention D1 / D7 when Epic has them).
- **Movers**: day-over-day change in unique players, a change versus the average of the previous days, and an `isMover` flag with your own threshold.
- **History that keeps growing**: on every run each island's days are merged into a named key-value store. Epic itself only serves the last 7 days; schedule this Actor daily and your archive keeps going.
- Track by island code, by creator code (every island of a studio), or let the Actor sample the public catalog.

### Input examples

Track specific islands, every day (schedule it):

```json
{ "islandCodes": ["5482-8892-9979", "9465-9367-6684"], "outputMode": "summary" }
```

Islands of one or more creators (found by scanning the catalog), only the ones that moved at least 40%:

```json
{ "creatorCodes": ["oliboibtw"], "onlyMovers": true, "moverThresholdPct": 40, "minPlayers": 50 }
```

Chart-ready: one row per island per archived day:

```json
{ "islandCodes": ["5482-8892-9979"], "outputMode": "daily" }
```

Empty input `{}` works: it samples 150 islands from Epic's catalog and returns the top 25 by players.

### Input guide

| Field | Meaning |
|---|---|
| `islandCodes` | Island codes (`1234-5678-9012`). Anything containing a code works. |
| `creatorCodes` | Creator codes; islands are matched while paging the catalog (Epic has no creator filter), up to `maxCatalogPages` pages. |
| `scanIslands` / `maxResults` | Only for the no-codes catalog sample. |
| `sortBy` | players, peakCCU, plays or change. |
| `onlyMovers`, `moverThresholdPct`, `minPlayers` | Mover detection. |
| `outputMode` | `summary` (one row per island) or `daily` (one row per island per day). |
| `archive`, `historyStoreName` | Keep history in a named key-value store. Use the same name every run. |

### Output fields (summary mode)

| Field | Meaning |
|---|---|
| `islandCode`, `title`, `creatorCode`, `createdIn`, `tags` | Island identity. |
| `date`, `partialDay` | Day the numbers describe (latest complete UTC day; today is flagged partial). |
| `uniquePlayers`, `plays`, `minutesPlayed`, `avgMinutesPerPlayer`, `peakCCU`, `favorites`, `recommendations` | Epic's day metrics. |
| `retentionD1`, `retentionD7`, `retentionDate` | Latest retention Epic had published (fractions, may be null for new islands). |
| `previousDayPlayers`, `playersChangePct`, `avgPlayersPrior7d`, `vs7dAvgPct` | Movement versus the archive. |
| `isMover`, `direction` | Mover flag and `up` / `down`. |
| `daysInHistory`, `historyFrom`, `historyTo` | How much history is in the archive. |

Sample row:

```json
{"islandCode":"5482-8892-9979","title":"1X1 1C1 1V1 1VS1","creatorCode":"oliboibtw","date":"2026-10-03","uniquePlayers":2374,"plays":2965,"minutesPlayed":40963,"peakCCU":143,"playersChangePct":null,"isMover":false,"daysInHistory":2,"rank":1}
```

Errors (island not found, request failed) come back as `{"type":"error", ...}` rows and are never charged.

### Use it with

- **Schedule daily** at the same hour so the archive has one point per day.
- Dataset to Google Sheets / Looker Studio / Slack (movers only) with Apify integrations.
- Pair with your own list of competitor island codes for a daily brand-agency report.

### FAQ

**Does it need a key?** No. It uses Epic's public ecosystem API.

**Why are some islands missing?** Epic publishes metrics only for islands with traffic. Islands with no data yet are skipped in the catalog sample, and explicit codes with no data are not returned.

**Where does the history live?** In the named key-value store `fortnite-island-history` (change it with `historyStoreName`), one record `h-<islandCode>` per island. The store is created by the Actor in your account.

### Honest limits

- Epic's API serves only the last 7 days; older history exists only from the first day this Actor archived an island (and only if it ran that day).
- The catalog endpoint cannot be sorted by popularity, so the empty-input run ranks a *sample* of the catalog, not the true global top list. For real tracking, give island or creator codes.
- Today's numbers are partial; the summary uses the latest complete UTC day.
- Epic's list API has no creator filter: creator codes are matched by paging the catalog (default 40,000 islands deep), so a creator can be missed. Island codes are the reliable way to track.
- Epic rate-limits the metrics endpoint; the Actor keeps modest concurrency and retries, so very large creator lists take a few minutes.

### Price

Pay per event: **`island-metric` $0.001** per delivered island row (or per island-day row in daily mode). Example: tracking 100 islands daily in summary mode = 100 rows x $0.001 = **$0.10 per run**. Failed lookups and error rows are free.

# Actor input Schema

## `islandCodes` (type: `array`):

Island codes like 9465-9367-6684 (the 12-digit code shown in Fortnite / UEFN). Leave empty together with Creator codes to scan a sample of Epic's catalog and rank it.

## `creatorCodes` (type: `array`):

Creator (support-a-creator) codes. Every island published by these creators is tracked. Useful for agencies and studios that own many islands.

## `maxCatalogPages` (type: `integer`):

Epic's API has no creator filter, so creator codes are matched while paging the island catalog (1,000 islands per page). Raise this to search deeper; island codes are the reliable way to track a specific island.

## `scanIslands` (type: `integer`):

Used only when no island or creator codes are given. Epic's API cannot sort islands by popularity, so the Actor samples this many islands from the catalog and ranks them. Bigger = more chance of seeing hit islands but slower.

## `maxResults` (type: `integer`):

How many top islands of the sample to return. Ignored when you give explicit island or creator codes (all of them are returned).

## `sortBy` (type: `string`):

Ranking of the returned islands.

## `onlyMovers` (type: `boolean`):

Return only islands whose unique players moved by at least the threshold versus the previous day.

## `moverThresholdPct` (type: `integer`):

An island is flagged as a mover when its players changed by at least this percent versus the day before.

## `minPlayers` (type: `integer`):

Ignore tiny islands when flagging movers: either day must have at least this many unique players.

## `outputMode` (type: `string`):

'summary' returns one row per island (latest day plus change versus history). 'daily' returns one row per island per archived day, for charting.

## `archive` (type: `boolean`):

Keep a daily history of every island you query in a named key-value store, so the history grows past Epic's 7-day window. Schedule the Actor daily to build it.

## `historyStoreName` (type: `string`):

Name of the key-value store that holds the archive (one record per island). Use the same name on every scheduled run.

## Actor input object example

```json
{
  "islandCodes": [],
  "creatorCodes": [],
  "maxCatalogPages": 40,
  "scanIslands": 150,
  "maxResults": 25,
  "sortBy": "players",
  "onlyMovers": false,
  "moverThresholdPct": 25,
  "minPlayers": 10,
  "outputMode": "summary",
  "archive": true,
  "historyStoreName": "fortnite-island-history"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `count` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "islandCodes": [],
    "creatorCodes": [],
    "maxCatalogPages": 40,
    "scanIslands": 150,
    "maxResults": 25,
    "sortBy": "players",
    "onlyMovers": false,
    "moverThresholdPct": 25,
    "minPlayers": 10,
    "outputMode": "summary",
    "archive": true,
    "historyStoreName": "fortnite-island-history"
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/fortnite-island-player-stats").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "islandCodes": [],
    "creatorCodes": [],
    "maxCatalogPages": 40,
    "scanIslands": 150,
    "maxResults": 25,
    "sortBy": "players",
    "onlyMovers": False,
    "moverThresholdPct": 25,
    "minPlayers": 10,
    "outputMode": "summary",
    "archive": True,
    "historyStoreName": "fortnite-island-history",
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/fortnite-island-player-stats").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "islandCodes": [],
  "creatorCodes": [],
  "maxCatalogPages": 40,
  "scanIslands": 150,
  "maxResults": 25,
  "sortBy": "players",
  "onlyMovers": false,
  "moverThresholdPct": 25,
  "minPlayers": 10,
  "outputMode": "summary",
  "archive": true,
  "historyStoreName": "fortnite-island-history"
}' |
apify call that_red_bird/fortnite-island-player-stats --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/fortnite-island-player-stats"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1bgsEsoQxBHoT09am/builds/2UsMMkDLA2JcWw15f/openapi.json
