Skip to content

Map

client.map — markers, raids, camps, world events, and live player pins.

Official docs: Map.

When to use which

GoalMethodShape
Live player pins (friends / party / guild context)listPlayerLocationsPlayerLocation[]
Static POIs / NPCs / dungeonslistMarkersMapMarker[]
Active world eventslistWorldEventsWorldEvent[]
Camps (+ loot)listCampscamp list (level filter)
Raids (+ loot)listRaidsraid list (level filter)
Standalone loot poolslistLootPoolsloot pool list (level filter)
Gathering nodeslistGatheringNodesnode list
Total quest countgetQuestCount{ quests: number }

listCamps, listRaids, and listLootPools accept level?: number to filter by combat level.

Live players

ts
const { data } = await client.map.listPlayerLocations();

for (const player of data) {
  console.log(player.name, player.server, player.x, player.z);
  console.log("party", player.party.length, "guild", player.guild.length);
}
ts
type PlayerLocation = {
  uuid: string;
  name: string;
  nickname: string | null;
  character: string;
  server: string | null;
  x: number;
  y: number;
  z: number;
  friends: PlayerLocationMember[];
  party: PlayerLocationMember[];
  guild: PlayerLocationMember[];
};

Markers

ts
const { data: markers } = await client.map.listMarkers();
console.log(markers.length, markers[0]);

World events

ts
type WorldEvent = {
  name: string;
  internalName: string;
  lore: string;
  difficulty: string | null;
  level: number | null;
  length: string | null;
  requirements: Array<{ type: string; value: number | string }> | null;
  location: Array<{
    event: { x: number; y: number; z: number } | null;
    spawn: { x: number; y: number; z: number } | null;
    reward: { x: number; y: number; z: number } | null;
    radius: number | null;
    spawnRadius: number | null;
  }>;
  schedule: string | null;
  rewardPerLevel: Record<string, string[]> | null;
};
ts
const { data: events } = await client.map.listWorldEvents();
for (const event of events) {
  console.log(event.name, event.level, event.difficulty);
}

Camps, raids, loot pools

These share a loot-oriented content shape (name, difficulty, level, rewards, optional location).

ts
const level = 90;

const [{ data: camps }, { data: raids }, { data: pools }] = await Promise.all([
  client.map.listCamps({ level }),
  client.map.listRaids({ level }),
  client.map.listLootPools({ level }),
]);

console.log(camps.length, raids.length, pools.length);
ts
type LootPoolReward = {
  name: string;
  type: string;
  amount: number;
  always: boolean;
  tier?: string | null;
  shiny?: boolean;
};

Omit level to fetch the unfiltered list.

Gathering + quests

ts
const { data: nodes } = await client.map.listGatheringNodes();
const { data: quests } = await client.map.getQuestCount();
console.log(nodes.length, quests.quests);

Parallel snapshot

ts
const [markers, events, questCount, camps] = await Promise.all([
  client.map.listMarkers(),
  client.map.listWorldEvents(),
  client.map.getQuestCount(),
  client.map.listCamps({ level: 90 }),
]);

console.log(markers.data.length, events.data.length, questCount.data.quests, camps.data.length);

Watch rate limits if you fan out many map calls on a guest client.

Unofficial TypeScript tooling for the Wynncraft API