Skip to main content
—

Build with the tracker

Developer documentation for shared character builds, upgrade recommendations, and MapleStory calculators. JSON over HTTP, free to call, with no API key required.

Your first request

Start with a standalone calculation. This example asks how many flames are expected to improve an advantaged level-200 armor item from score 80 to 140.

curl --fail-with-body --silent --show-error \
  -H 'X-API-Client: my-guild-overlay' \
  'https://gms-upgrade-tracker.vercel.app/api/calc/flame?itemLevel=200&current=80&target=140'

Runs one flame calculation. No saved build needed.

Expected output: a JSON object with currentScore: 80, targetScore: 140, and a positive expectedFlames. Run it to see the current engine result.

Making requests

Base URL

https://gms-upgrade-tracker.vercel.app

All endpoints documented here use GET with query parameters and return JSON on success. The public developer API is read-only. You do not need an account, subscription, API key, or Nexon token to call it.

Browser requests are CORS-enabled: the API permits other origins. Use credentials: 'omit'. The optional X-API-Client header is allowed by preflight; it identifies an app label and grants no access.

Characters & regions

{IGN} is a published character name, not a Discord ID. Encode path names with encodeURIComponent and query values with URLSearchParams. Use region=na or region=eu; character lookups default to NA. The region selects GMS North America or Europe, not a different game ruleset.

Parameters & units

Parameter names and enum values are case-sensitive. Send decimal numbers without commas or K/M/B suffixes. Boolean calculator parameters accept true/false, 1/0, or yes/no. Use true/false in new clients. Conditional requirements are listed per endpoint.

Players must publish or save their build online before lookup routes can read it. Data saved only in a browser is unavailable to the API. A lookup reads the tracker's stored build; it does not fetch a fresh equipment snapshot from Nexon.

Build an integration

A character card or guild overlay

Start with the compact summary. Preserve an unavailable score as null and show its reason while keeping the gear visible.

async function loadBuild(ign, region = 'na') {
  const url = new URL(
    '/api/build/' + encodeURIComponent(ign) + '/summary',
    'https://gms-upgrade-tracker.vercel.app',
  );
  url.searchParams.set('region', region);
  const response = await fetch(url, {
    headers: { 'X-API-Client': 'my-guild-overlay' },
    credentials: 'omit',
    signal: AbortSignal.timeout(15000),
  });
  const data = await response.json().catch(() => null);
  if (!response.ok) throw new Error(data?.error ?? ('HTTP ' + response.status));
  if (!data) throw new Error('Expected a JSON response');
  return {
    name: data.buildId,
    score: data.powerScore?.totalScore ?? null,
    unavailableReason: data.powerScoreUnavailableReason,
    gear: [...data.gear.wse, ...data.gear.armor, ...data.gear.accessories],
  };
}
// Replace with an IGN that has a published tracker build.
loadBuild('BobaSlayer', 'na').then(console.log).catch(console.error);

Upgrade advice

Request recommendations when someone asks for advice. Pass economy and event settings explicitly. Show meso cost, FD gain, assumptions, and input issues together. Refresh after the player publishes changes.

Guild standings

Use leaderboard filters for server type, region, and class. Render the returned sharePath as the build link. Fetch a shared standings response for all viewers instead of refetching each member's rank.

Want these features in a server without building your own integration? See the Discord bot guide.

Understanding results

  • Expected cost is an average. Random upgrades can cost more or less. Cube percentile modes describe a distribution; a probability target is not a realized item. Never apply an expected roll to someone's saved gear.
  • Percentages and fractions differ. expectedDamageGainPercent is already a percentage. Star Force plan success and boom are fractions. bossPDR=3.8 means 380% defense. Read the power-score reference for the special IED input convention.
  • Keep useful partial results. A 200 response can include costAvailable=false, statGainAvailable=false, a null score, or input issues. Display the reason next to the withheld value, and preserve independent results.
  • Keep estimate labels. Show estimated, estimateProvenance, calculationStatus, calculationProvenance, and assumptions when supplied. Null HEXA completion means unknown, not 0% complete.
  • Compare equivalent inputs. These routes use the site's shared calculation engines, but different routes can use different boss-defense defaults and saved-build context. Matching mechanics alone does not make differently configured scores comparable.

Errors & retries

Validation and application errors usually return { "error": "message" }. Hosting or network failures can return plain text or HTML. Check the HTTP status before using a result and tolerate a non-JSON error body, as the quickstart does.

HTTP status handling
StatusWhat to do
400Fix a missing, invalid, or conflicting parameter. Retrying the same input will not help.
404Check the IGN and region, and confirm the character has a published build.
422The requested calculation is unavailable for these inputs. Show the returned reason; supply missing facts or use a supported target.
429If the service or host throttles a request, stop immediate retries. Honor Retry-After when available; otherwise back off.
500–599Treat as temporary service failure. Use a small retry budget with increasing delays and jitter; let the user retry manually afterward.

Use a request timeout. On a failed refresh, retain previously loaded data with a visible stale/error label. Avoid replacing a useful score or recommendation list with zeros.

Caching & responsible usage

Free to call does not mean unlimited capacity. We do not publish a fixed per-app quota or offer a dedicated capacity guarantee. Hosting and storage are paid by the project; efficient integrations help keep the API available.

  • Follow the actual response's Cache-Control directives. Deployment and error paths can differ; do not assume every response is cacheable. Keep no-store responses out of persistent caches.
  • Reuse cacheable results for identical parameters and combine simultaneous identical requests. Request only the endpoints and result counts your UI needs.
  • As a starting integration policy, refresh visible standings about every five minutes and recommendations on user request. These are client design suggestions, not server-enforced limits. Pause background polling when the view is hidden.
  • Do not add random cache-busting parameters. Reserve fresh=1 on the shared-build endpoint for deliberate reloads.

Tell us what you’re building

Optionally send X-API-Client: my-guild-overlay so we can see which integrations use the API. Choose a public app name: 2–40 letters, digits, or hyphens, starting with a letter. Names are normalized to lowercase. Invalid labels are ignored without rejecting the request.

Use one stable label for the app. Do not include tokens, email addresses, character names, Discord IDs, or other personal identifiers. Labels are self-declared; they are not API keys or verified identities.

When enabled, API telemetry records every documented GET request that reaches the server handler, without sampling. It retains daily aggregate endpoint counts, status groups, handler timing, coarse request-source hints, and optional app labels for 30 days. Cached responses that skip the handler, preflights, and other methods are excluded. Delivery is best-effort, so these counts are not an exactly-once billing record.

This API usage telemetry does not record IP addresses, raw URLs, user agents, credentials, or request/response bodies. This describes the API counter, not every hosting log or analytics system. See the privacy policy for the service policy. The header is optional and does not change API output.

Builds reference

Inputs are query parameters unless shown in the path. Response outlines below name fields and variants; they are not literal JSON examples or exhaustive nested schemas.

Shared build

GET/api/share?id={IGN}

Fetch a shared build by character name. Returns full gear, stats, class, server type, and Nexon region.

Parameters (3 entries)
idstring · Required
Published character IGN. URL-encode the name.
regionstring · default: na
Optional Nexon region for build lookup: na or eu
freshstring
Use exactly 1 for an explicit reload of the stored build (no-store). Omit for routine reads. This does not import new data from Nexon.

Response outline

{ id, selectedClass, serverType, nexonRegion, characterStats, gear, characterLevel?, arcanePower?, sacredPower?, hexaProgress?, hexaAssumptionMode?, ozRingState?, autoRepairs? }
  • gear is an object keyed by equipment slot. Optional progression fields are present only when saved. autoRepairs describes persisted-state repairs when applicable.
  • Only published builds are available. A browser-local profile is not automatically published.

Build summary

GET/api/build/{IGN}/summary

Read a published build’s score, character stats, and compact gear groups for a bot or overlay.

Parameters (1 entries)
regionstring · default: na
Optional Nexon region for build lookup: na or eu

Response outline

{ buildId, class, serverType, nexonRegion, effectivePrimaryStat, characterStats, powerScore, powerScoreUnavailableReason, hexaAssumptionMode, gear: { wse, armor, accessories } }
  • powerScore is { totalScore, tier } or null. Render powerScoreUnavailableReason when supplied; missing stats can also leave the score null.
  • gear.wse, gear.armor, and gear.accessories are arrays. Entries include slot, name, stars, potentialTier, flameScore, and optional formatted potential/scroll fields. This is a display summary; use /api/share for structured gear.
  • Scores at 380% boss defense (3.8), the same headline convention as every other score on the site.

Upgrade recommendations

GET/api/build/{IGN}/recommend

Get upgrade recommendations ranked by meso efficiency. Supports query params for limit, mesoRate, sfDiscount, feverTime, cubeSale.

Parameters (8 entries)
limitint · default: 5
Number of recommendations (1-20)
mesoRateint · default: 300000
Meso market rate (meso per NX)
sfDiscountbool · default: false
Star Force 30% discount event
feverTimebool · default: false
Spell Trace Fever Time event
cubeSalebool · default: false
Cube 25% off event
bossPDRnumber · default: 3.8
Boss-defense multiplier for recommendation FD (3.8 = 380% PDR); the power score stays at 3.8
regionstring · default: na
Optional Nexon region for build lookup: na or eu
serverTypestring · default: Saved build
interactive | heroic; overrides calculation economy. Saved gear is still validated against its original server.

Response outline

{ buildId, class, nexonRegion, assumptions, powerScore: { totalScore, bossPDRMultiplier, tier, breakdownAvailable: false }, recommendations, validationIssues, recommendationInputIssues, computeTimeMs }
  • recommendations contains rank, gearSlot, gearName, upgradeType, description, targetDescription, expectedMesoCost, expectedMesoCostFormatted, expectedDamageGainPercent, and optional expectedBooms, calculationStatus, calculationProvenance, inputEstimate, explanation.
  • Costs are meso and damage gains are percentages. Preserve validationIssues and recommendationInputIssues beside results, including when recommendations is empty. A missing option does not prove the build is optimal.
  • assumptions records bossPDRMultiplier, bossBuffProfile, and cubeCostMode. assumptions.bossPDRMultiplier is the bossPDR query and weights recommendations only; powerScore.bossPDRMultiplier is the 3.8 every headline Power Score uses. Missing Heroic level or unsupported explicit HEXA inputs can return 422.

Leaderboard rank

GET/api/build/{IGN}/rank

Get a player's leaderboard rank (overall and class-specific).

Parameters (1 entries)
regionstring · default: na
Optional Nexon region for build lookup: na or eu

Response outline

{ buildId, nexonRegion, overall, class }
  • overall and class each contain a one-based rank (or null if unranked) and total. class also contains className.
  • region selects the character; ranks are across both regions within the saved server type, not region-filtered standings. /api/leaderboard can produce a different rank after filtering.

HEXA estimate

GET/api/build/{IGN}/hexa

Get the calibrated HEXA Matrix estimate — hexa score, gear-only score, completion %, and per-tier estimated FD. Completion is null in estimated-assumption mode.

Parameters (1 entries)
regionstring · default: na
Optional Nexon region for build lookup: na or eu

Response outline

{ buildId, nexonRegion, selectedClass, hexaAssumptionMode, estimated: true, estimateProvenance, hexaScore, gearOnlyScore, scoreGap, completionPercent, fragmentProgressPercent, solErdaProgressPercent, breakdown }
  • These are calibrated estimates, including when saved levels are explicit. Keep estimated and estimateProvenance visible.
  • completionPercent is deprecated but unchanged: the HEXA Matrix Final Damage ratio (actual / class max), or Erda Link progress for a SHINE class. Use fragmentProgressPercent and solErdaProgressPercent, the share of Erda Fragments and Sol Erda needed to max the HEXA Matrix that this build has used (Sol Janus excluded, rounded down); both are null for an Erda Link class. All three are null in estimated-assumption mode. breakdown may be null; otherwise it contains actualFD, maxFD, and perTier. Never turn null completion into 0%.

Calculators reference

Inputs are query parameters unless shown in the path. Response outlines below name fields and variants; they are not literal JSON examples or exhaustive nested schemas.

Star Force

GET/api/calc/starforce

Calculate ordinary, true-Superior, weapon-style Sweetwater Katara, or paired Zero Star Force expected cost and booms. Level-only requests preserve the ordinary cost-only API. Item-aware requests may use a named preset as autofill or provide an arbitrary item's explicit profile, cap, and clean stats. Level 160 Sweetwater targets can reconstruct an exact Transposition residual from a certified source name plus its source-star history; custom sources require all source facts and clean stats. A true-Superior source caps the destination at 15 stars. Zero uses the actual weapon type level for stats, caps tap cost at level 150, and returns Alpha/Lazuli and Beta/Lapis separately. Type 8/9 consumes finite entered essence stock exactly; Heroic requires at least 75% completion coverage under the selected protection policy. Fixed Genesis/Destiny profiles return certified snapshots with costAvailable=false. Level 138-249 ordinary and Type 5-9 Zero weapon stat projection is available through 30 stars; level-250 ordinary weapons remain separate.

Parameters (43 entries)
itemLevelint · Required
Item level, integer 0–300; the selected item/profile must support the requested stars.
fromint · Required
Current star count, integer 0–29.
toint · Required
Target star count, integer 1–30, above from and within the item’s supported cap.
replacementCostint · default: 0
Cost per boom replacement (meso); for Zero, the exact repurchased unenhanced Lazuli/Lapis pair cost before any Type 8/9 essence.
itemNamestring
Optional item identity. An exact named preset autofills mechanical metadata; any other name is treated as an arbitrary item.
slotstring
Required with itemName; exact equipment slot. Category and WSE identity are always derived from this slot or a recognized preset.
classstring
Required with itemName; exact class name used to resolve Job Stats and ATT/MATT.
serverTypestring
Required with itemName: heroic or interactive. Heroic needs no scroll parameters.
starforceItemKindstring
Required for arbitrary items: ordinary, superior, fixed, zero, destiny, or special. A recognized preset owns this value.
mechanicsPresetNamestring | null
Canonical preset/mechanics identity when name is a custom display label. Use null for an explicitly custom item; omit only for legacy exact-name migration.
starforceStatProfilestring
Use weapon-secondary for an ordinary Dual Blade Katara, or nonweapon-secondary for an ordinary armor-category shield. Sweetwater Katara and Terminus Defender autofill their respective profiles.
zeroWeaponIdentitystring
Required for Zero unless inferred from a Genesis/Destiny or Type 1-9 item name: type-1 through type-9, genesis, or destiny-stage1.
zeroEssenceCostint · default: 0
Zero Type 8/9 Interactive only: price of one additional AbsoLab or Arcane Umbra Essence. Required when the exact finite-stock path expects to buy essences after owned stock is exhausted. Heroic must omit it or pass 0.
zeroEssencesOwnedint
Required for Zero Type 8/9: exact owned essence count. Interactive prices only purchases beyond this stock; Heroic uses it for the 75% completion-coverage gate.
zeroLuckyScrollStatestring
Required for player-enhanced Zero weapons: none, root-abyss, absolab, or arcane-umbra. This is the set scroll currently applied before Star Force begins.
zeroLuckyScrollsOwnedint
Required when an applied Lucky Item Scroll state is selected: exact count of raw replacement scroll items owned. A no-boom run consumes none; after any number of booms the engine models one eventual successful application at the final target.
zeroLuckyScrollCostint
Interactive price/opportunity value for one additional raw Lucky Item Scroll. Required when the exact path can exhaust owned scrolls; distinct from zeroEssenceCost. Heroic must omit it or pass 0 and uses joint owned-resource coverage.
starforceCapint
Required for arbitrary items. Use 0 for the published level/profile cap or provide the item-specific cap.
baseStr / baseDex / baseInt / baseLuk / baseAtt / baseMatt / baseHp / baseMpint
Complete clean, non-flame stat block. Supply all eight or none; arbitrary weapons and ordinary 16+ stat projections require all eight.
starforceJobStatVariantstring
Required for Xenon armor: thief (DEX/LUK) or pirate (STR/DEX).
transposedbool · default: false
Set true only for a Level 160 Sweetwater destination with exact source history. Transposition keeps a permanent source C(S) - destination C(S-1) residual; it is included in a 0-to-current snapshot and cancels from a current-to-target delta.
transposeSourceNamestring
Required when transposed=true. Certified autofill names include Fafnir Rapid Edge, Papulatus Mark, Dominator Pendant, Daybreak Pendant, Superior Gollux Pendant, and Reaper's Pendant. Other names are custom sources.
transposeSourceStarsint
Required when transposed=true: the source item's exact Star Force count at the moment of Transposition (before the destination displayed one fewer star).
transposeSourceItemLevel / transposeSourceSlot / transposeSourceItemKind / transposeSourceCapmixed · default: certified source autofill
Required for a custom source: level 140-150, compatible equipment slot, ordinary or superior Star Force system, and item cap (0 = profile/level cap). For a certified source these may be omitted; any supplied value must exactly match its canonical profile.
transposeSourceStatProfilestring
Custom Katara sources require weapon-secondary. Fafnir Rapid Edge autofills it. Do not use it for shields or non-Katara secondaries.
transposeSourceBaseStr / transposeSourceBaseDex / transposeSourceBaseInt / transposeSourceBaseLuk / transposeSourceBaseAtt / transposeSourceBaseMatt / transposeSourceBaseHp / transposeSourceBaseMpint
All eight exact clean, non-flame source stats are required for a custom source and must be omitted for a certified source.
transposeSourceJobStatVariantstring
Required only for a custom Xenon armor source: thief or pirate.
totalSlotsint · default: slot default
Arbitrary-item upgrade-slot count. Recognized presets autofill and validate this value.
scrollTypestring
Interactive only; required with successfulScrolls and failedSlots. Use none for a clean item. On a transposed target these fields are the exact transferred source scroll state now stored on the Sweetwater item.
successfulScrollsint
Interactive only; exact successful scroll count.
failedSlotsint
Interactive only; exact failed-slot count.
scrollATT / scrollStat / scrollSecStat / scrollTertStatint
Interactive variable-roll scrolls only; all four captured totals are required, including explicit zeros.
sparesint
True Superior only; owned replacement copies consumed before paid replacements. Finite-spare expectation is solved exactly.
strategystring · default: optimal
Ordinary and Zero; the ACCOUNT-wide protection strategy: none, optimal, or max. It answers every star that modePlan, mode, and itemStrategy leave open.
itemStrategystring
Ordinary and Zero; ONE item's own protection strategy (none, optimal, or max), the API form of a saved per-item plan's fallback. It replaces strategy for every star modePlan does not pin, including the steps a boom re-climb passes back through.
starCatchbool · default: true
Accepted and ignored since v.271: Star Catching was removed and its success bonus is applied to every ordinary and true Superior tap. Echoed as true.
discountbool · default: false
Ordinary only; apply the 30% Star Force discount event.
lessBoomsbool · default: false
Ordinary only; apply the 30% lower boom-rate event.
mvpstring · default: none
Ordinary only; MVP discount rank: none, silver, gold, or diamond.
modeint
Ordinary only: force enhancement mode 1–4 instead of choosing modes by strategy.
modePlanstring
Ordinary and Zero only: one item's own per-star protection, as star:level pairs (modePlan=15:4,18:2). Source stars 15–21, protection levels 1–4; at 15–17 any level above 1 is Safeguard. A pinned star outranks mode, itemStrategy, and strategy. Zero prices each pinned star through its recovery engine.
safeguardbool
Legacy alias when strategy is omitted: true selects optimal, false selects none.
selectedClassstring
Alias for class on item-aware requests. If both are supplied they must agree.

Response outline

{ costAvailable, costEngine: ordinary | superior | zero-paired | zero-paired-fixed, expectedCost, expectedBooms, expectedRecoveryResources: { replacementWeaponPairs, essence, luckyScroll: { applicationProbability, expectedRawScrolls, expectedOwnedScrollsConsumed, expectedPurchasedScrolls, ownedCoveragePercent } }, statGainAvailable, statGain, transposition: { inheritedResidual, sourceStars, destinationBaselineStars, includedInStatGain }, pairedStatGain: { alpha, beta }, aggregateFdAvailable, plan }
  • For a simple cost calculation, provide itemLevel, from, and to. For exact item stat gains, also provide identity and the complete required item context below.
  • Respect costAvailable, statGainAvailable, and aggregateFdAvailable independently. Render statGainUnavailableReason when present; a usable cost can still be returned without a stat projection. Zero uses pairedStatGain for Alpha and Beta.
  • Response fields vary by costEngine. Ordinary plan entries contain star, mode, safeguard, success, boom, and costPerTap. success and boom are probabilities from 0 to 1. Expected cost includes the entered replacement cost.

Potential & cubes

GET/api/calc/cube

Calculate mean (default), P50, P75, or P85 cube counts for potential targets. Modes: tierup, wse, armor, glove, hat. Violet and Equality are explicitly opt-in, unverified cross-server references because current GMS probabilities are unpublished.

Parameters (11 entries)
modestring · Required
tierup | wse | armor | glove | hat
cubeTypestring · default: Depends on mode
glowing for tierup/armor/glove; bright for wse/hat. glowing | bright | solid in every mode; violet | equality only in wse/armor/glove with explicit reference opt-in. Legacy red/black names are not accepted.
allowUnverifiedReferencebool · default: false
Required true for Violet or Equality. Explicitly acknowledges that this is a cross-server reference, not a published current-GMS probability.
costModestring · default: mean
mean (long-run expectation) | median (P50) | p75 | p85 (unlucky-run percentiles of the same distribution)
attackTypestring · default: att
att | matt (wse mode only)
weaponProfilestring · default: ordinary
ordinary | destiny (wse mode only; destiny requires slot=weapon and uses the upgraded 35/40/45 Boss pool)
itemLevelint · default: 200
Required-level band for Potential values. GMS 13/10 lines begin at level 151.
primaryStatstring · default: str
str | dex | int | luk | hp (armor/glove/hat).
currentTierstring · Required for tierup
rare | epic | unique | legendary; targetTier must be higher.
targetTierstring · default: legendary
epic | unique | legendary (tierup mode)
slotstring · default: Depends on mode
wse: weapon (default), secondary, emblem. armor: cape (default), hat, top, bottom, shoes, gloves, belt, shoulder, ring1, ring2, ring3, ring4, pendant1, pendant2, face, eye, earring, heart.

Response outline

tierup: { mode, cubeType, currentTier, targetTier, costMode, countMeaning, steps: [{ from, to, expectedCubes }], totalCubes }
wse / glove: { mode, cubeType, costMode, countMeaning, combos: [{ id, label, expectedCubes, ... }], ... }
armor / hat: { mode, cubeType, costMode, countMeaning, targets: [{ id, label, expectedCubes, ... }], ... }
  • Counts describe the selected costMode, even when a field is named expectedCubes. mean is an expectation; median/p75/p85 are percentiles, not guarantees. A multi-step tier-up percentile is not the sum of its step percentiles.
  • Violet/Equality requests return 422 unless allowUnverifiedReference=true. Display the returned calculationStatus and calculationProvenance at both response and target level. The opt-in does not certify current GMS rates.

Flames

GET/api/calc/flame

Calculate expected flames to reach a target score.

Parameters (12 entries)
itemLevelint · Required
Item level, integer 0–300.
currentint · default: 0
Current score, integer ≥0. Alias: currentScore (takes precedence).
targetint
Target score, integer ≥1. Alias: targetScore (takes precedence). Omit for supported armor benchmarks.
flameTypestring · default: eternal
meso (Bonus Stat reset for mesos, Eternal rates) | eternal | red (Powerful Rebirth Flame) | abyssal — every flame type with a certified tier table
advantagedbool · default: true
Whether the item has flame advantage.
weaponbool · default: false
Weapon mode requires an explicit target and positive clean weapon attack.
baseWeaponAttint · default: 0
Clean weapon ATT/MATT used in weapon mode. Alias: baseAtt; baseWeaponAtt takes precedence.
classstring
Exact class name; derives the stat model and attack type. Conflicting explicit stat choices return 400.
primaryStatstring · default: Class-derived or str
str | dex | int | luk | hp.
secondaryStatstring · default: Class/stat-derived
str | dex | int | luk | hp. Must differ from primary and tertiary.
tertiaryStatstring · default: Class-derived
Optional str | dex | int | luk; use class=Xenon for its full stat model.
attackTypestring · default: Class-derived or att
att | matt.

Response outline

{ itemLevel, currentScore, targetScore, advantaged, flameType, flameLabel, expectedFlames }
  • With target, returns expectedFlames. If the current score already meets the target, expectedFlames is 0 and the smaller response includes currentScore, targetScore, flameType, flameLabel, and message.
  • Without target, returns benchmarks instead of targetScore/expectedFlames. Weapon, HP, and tertiary-stat models require an explicit target; generic armor benchmarks do not apply. Unreachable targets return 422.

Power score

GET/api/calc/powerscore

Calculate converted stat from raw character stats. Critical Rate is expected-hit weighted and capped at 100%; omitting it uses a visibly labeled 100% assumption. Heroic requests require characterLevel for the GMS passive FD band.

Parameters (20 entries)
buildIdstring
Optional shared build IGN to load stats from instead of manual stat params
regionstring · default: na
Optional Nexon region when using buildId: na or eu
bossPDRnumber · default: 3.8
Boss-defense multiplier (3.8 = 380% PDR, the site's headline convention; maximum 10)
critRatePercentnumber · default: 100 (assumed)
Status-window Critical Rate, 0-100. Supply it to replace the assumption.
characterLevelint
Required for Heroic: selects 15/20/25/35/45% passive FD by level band.
classstring
Manual mode: exact class name (alias selectedClass). Selects the class stat model and default weapon multiplier.
serverTypestring · default: interactive
Manual mode: interactive | heroic. Build mode uses the saved server type.
primaryStatint · Required in manual mode
Base primary stat before percentage-stat multiplication; do not substitute the final displayed stat.
totalATTint · Required in manual mode
ATT/MATT before percentage-attack multiplication.
secondaryStat / tertiaryStatint · default: 0
Base secondary/tertiary stats in manual mode.
totalPercentStat / totalPercentSecondaryStat / totalPercentTertiaryStatnumber · default: 0
Percentage bonuses to the corresponding base stats.
totalPercentATTnumber · default: 0
Percentage ATT/MATT bonus.
damagePercent / bossDamagePercent / critDamagePercent / finalDamagePercentnumber · default: 0
Percentage values, e.g. 130 means 130%. Use complete inputs for a meaningful result.
iednumber · default: 0
0–100 accepted. Values above 1 are divided by 100; 0–1 are fractions. 97 and 0.97 both mean 97% IED; 1 means 100%.
additionalPrimaryStat / additionalSecondaryStat / additionalTertiaryStatint · default: 0
Flat stats outside percentage-stat multiplication.
weaponMultipliernumber · default: Class-derived or 1.3
Manual-mode weapon multiplier.
ozRingStateJSON · default: None entered
Manual mode: saved Active and Passive rings, each with id and level. Uses the existing score reference; missing scaling inputs are named in ozRings.note.
gearJSON · default: None entered
Manual mode: equipment keyed by slot. A complete weapon supplies the attack needed to compare Oz rings with the score reference. Requires class for class-specific weapon validation.
hexaProgressJSON · default: None entered
Manual mode: the HEXA Matrix as JSON, e.g. {"skillNodes":[30,30,30,30,30,30],"mastery":{},"boost":{},"common":{}}. Requires class. Omit it and the score uses the board 6th Job grants at Lv. 260+ (Origin at level 1), which reads far below a maxed matrix - hexaAssumption names whichever board was used.
erdaLinkProgressJSON · default: None entered
Manual mode, SHINE classes only (Sia, Erel Light): the Erda Link board as JSON, e.g. {"version":1,"stones":{"sia-origin":1}}. Same default rule as hexaProgress.

Response outline

{ totalScore, tier, bossPDRMultiplier, breakdownAvailable, breakdown, marginalValues, hexaAssumption, assumptions }
  • buildId selects saved-build mode and replaces manual stats, class, serverType, and characterLevel with the saved values. bossPDR still applies. Prefer this mode for a published character.
  • Manual defaults are API defaults, not a representative character. Match the tracker’s input definitions and supply full stats. All scores include the shared boss-buff profile.
  • Read assumptions; missing Critical Rate uses a labeled 100% assumption. breakdown describes score contributions, while marginalValues describes stat sensitivity. Do not interpret totalScore as in-game combat power.
  • hexaAssumption states the 6th-Job board behind the score, and assumptions always carries the same fact as a sentence. Naming a class without a board is answerable but scores the Lv. 260+ grant, worth up to ~17% of the total - supply hexaProgress (or erdaLinkProgress for a SHINE class) for a recorded matrix, or omit class to keep the maxed calibration anchor.

Leaderboard reference

Inputs are query parameters unless shown in the path. Response outlines below name fields and variants; they are not literal JSON examples or exhaustive nested schemas.

Leaderboard

GET/api/leaderboard

Get the top players ranked by converted stat. Filter by server type, class, and Nexon region.

Parameters (4 entries)
typestring · default: interactive
Server type: interactive or heroic
regionstring · default: all
Optional region filter: all, na, or eu
classstring
Filter by class (e.g. Hero, Demon Slayer)
limitint · default: 100
Number of entries (1-2000)

Response outline

{ entries: [{ rank, name, displayName, selectedClass, nexonRegion, sharePath, score }], serverType, region }
  • Returns entries (possibly empty), serverType, and region. Each entry includes rank, name, displayName, selectedClass, nexonRegion, sharePath, score, and hexaAssumptionMode; guildClaim, characterImgURL, and characterLevel are optional.
  • scoreAdjusted: true marks a score estimated after a scoring update from the player's latest saved build, not computed from the ranked build; it is replaced by an exact score the next time the player saves. Do not diff it as progress.
  • scoreOutdated: true marks a score still on the scoring from before the latest update (not rescored or estimated); it is replaced the next time the player saves.
  • rank is one-based in the returned filtered standings. There is no cursor or offset pagination. Use sharePath for character links, especially for EU builds.

Compatibility & help

The API currently uses unversioned paths. Calculation corrections can change numeric results, and optional fields can be added. Read the fields your app needs, tolerate additional fields, and handle missing or null values explicitly. There is no public SDK, webhook subscription, or bulk-export endpoint documented here.

For a failed lookup, open the published character on the site and check the same region first. For a calculator discrepancy, compare the exact item context, event settings, and returned assumptions.

Use the site’s Feedback button to report an integration issue. Include the endpoint, non-sensitive parameters, HTTP status, returned error, and time of failure. Never send credentials or an unpublished profile.

Documentation expanded September 14, 2026: complete input tables, integration examples, response caveats, and optional API usage labels. Related: Discord commands · Interactive calculators.