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¤t=80&target=140'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.appAll 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.
expectedDamageGainPercentis already a percentage. Star Force plansuccessandboomare fractions.bossPDR=3.8means 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, andassumptionswhen 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.
| Status | What to do |
|---|---|
| 400 | Fix a missing, invalid, or conflicting parameter. Retrying the same input will not help. |
| 404 | Check the IGN and region, and confirm the character has a published build. |
| 422 | The requested calculation is unavailable for these inputs. Show the returned reason; supply missing facts or use a supported target. |
| 429 | If the service or host throttles a request, stop immediate retries. Honor Retry-After when available; otherwise back off. |
| 500–599 | Treat 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-Controldirectives. Deployment and error paths can differ; do not assume every response is cacheable. Keepno-storeresponses 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=1on 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.
Build summary
/api/build/{IGN}/summaryRead 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
/api/build/{IGN}/recommendGet 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
/api/build/{IGN}/rankGet 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
/api/build/{IGN}/hexaGet 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
/api/calc/starforceCalculate 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
/api/calc/cubeCalculate 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.
Example request
https://gms-upgrade-tracker.vercel.app/api/calc/cube?mode=tierup¤tTier=unique&targetTier=legendary&cubeType=glowingResponse 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.
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.
Example request
https://gms-upgrade-tracker.vercel.app/api/calc/flame?itemLevel=200¤t=80&target=140Response 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
/api/calc/powerscoreCalculate 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
/api/leaderboardGet 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)
Example request
https://gms-upgrade-tracker.vercel.app/api/leaderboard?type=interactive®ion=eu&limit=10Response 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.