# Builder FAQ Source: https://docs.msu.io/msu-builder/builder-faq ### **1. General** **What is MSU Builder?** * MSU Builder is a platform and program that enables creators and developers to build services, tools, and content within the MapleStory Universe (MSU) ecosystem, using Open APIs and other resources provided by MSU. **Who can become a Builder?** * Anyone interested in building on MSU can apply, including individual developers, teams, and entities. **Can I become a Builder if I am already using MSU as a user?** * Builder and user accounts are separate. A single wallet can be linked to either a Builder or a user account, and switching between the two is not allowed. * API access can only be requested through a Builder account. *** ### **2. Identity, Accounts & Wallets** **Do I need KYC (for individuals) or KYB (for entities) verification?** * Once you sign up on the MSU Builder platform and apply for API access, you must complete the KYC/KYB verification process directly on the platform. Upon successful completion of your KYC/KYB verification, the team will issue your API key and deliver it to your registered email address. **What identity model does MSU use? How does MSU verify a Builder's identity?** * MSU uses a wallet-based identity model. All participants in the official Builder program must complete either KYC (for individuals/teams) or KYB (for entities). **Which chains and wallets are supported?** * Currently, only Henesys (Avalanche L1) is supported, with wallet access (e.g., MetaMask) available via Web3Auth. Support for additional chains and wallets is under review. **Can a Builder account use MSU infra services?** * Builder accounts can access essential infrastructure services within MSU, but some services are restricted. * Available services: MSU Marketplace, MSU Navigator, Swap\&Warp * Restricted services: MapleStory N, Smithy **Can I use multiple accounts or wallets?** * Builders may use multiple accounts or wallets as long as doing so does not violate MSU policies or create unfair advantages. Each account must be connected to a different wallet. *** ### **3. KYC/KYB** **Why is KYC/KYB verification required?** * KYC/KYB verification is required to ensure a safe and compliant Builder ecosystem. It helps prevent misuse, enables secure transactions, and allows access to advanced features such as monetization. **What is the difference between KYC and KYB?** * KYC (Know Your Customer) is for individual users, while KYB (Know Your Business) is for business entities. The required documents and verification scope differ accordingly. **Do I need to complete verification to use MSU Builder?** * Some features are available without verification. However, to access the full range of Builder features — including API usage, app launch, and monetization — you must complete verification. **How does the verification process work?** * After signing up for an account and requesting API access, you will receive a verification link via email. You can then complete KYC or KYB verification through the provided link. **How long does the verification process take?** * Verification times may vary depending on the level and review process. In most cases, verification is completed within a few business days, but delays may occur. **What happens if my verification is rejected?** * If your verification is rejected, you may be asked to submit updated or additional documents for re-verification. **Can I reapply if my verification fails?** * You can reapply after correcting the issues identified during the verification process. If you are unable to reapply, please contact us for further assistance. **Will I be notified once my verification is approved?** * You will be notified via email once your verification is approved. **What can I do with each verification level?** * Each level grants different access to features. Level 1 is mainly for testing, while Level 2 enables full access, including production use and monetization. | **Feature** | **Level 0** | **Level 1** | **Level 2** | | :----------------------------------- | :---------------- | :---------------- | :------------------ | | API Keys | ❌ | 1 per app | 3 per app | | READ API | ❌ | ✅ | ✅ | | Action API | ❌ | ❌ | ✅ (only applicable) | | App Registration & Launch | ❌ | ❌ | ✅ | | Reward Programs | ❌ | ❌ | ✅ | | Revenue Claim | ❌ | ❌ | ✅ | | MSU Marketplace | ✅ | ✅ | ✅ | | Swap | ✅ | ✅ | ✅ | | Warp (NXPC) | \$1,000/day | \$10,000/day | \$30,000/day | | Reactor | ✅ | ✅ | ✅ | | MapleStory N | ❌ | ❌ | ❌ | | 1st-party Synergy Apps (e.g. Smithy) | ❌ | ❌ | ❌ | | NXPC / NESO Transfer | ✅ (limit applies) | ✅ (limit applies) | ✅ (limit applies) | | NFT / FT Transfer | ❌ | ✅ | ✅ | * *Level 0* is the default level upon wallet connection and account creation. * *Level 1* is intended for testing and prototyping. * *Level 2* enables production use and monetization of Synergy Apps. * Warp and Transfer limits are applied as a combined limit. * Revenue claim is subject to minimum thresholds and settlement policies as defined in the Builder Terms. **Can I upgrade from Level 1 to Level 2 later?** * You can upgrade by completing additional verification requirements. **What features are restricted before verification is completed?** * Features such as API usage, app launch, reward programs, and monetization are restricted until verification is completed. **Do I need both KYC and KYB verification?** * No, you only need to complete one type of verification depending on whether you are an individual or a business entity. **Can I switch from an individual account to a business account?** * Switching is possible, but you may need to complete KYB verification separately. **How is my personal or company data handled during verification?** * Your data is handled securely and used only for verification and compliance purposes in accordance with applicable policies. *** ### **4. API & Development** **How can I access and use MSU Open APIs?** * After registering on the MSU Builder platform and applying for API access, you will be notified that the remaining steps will be handled via email. The MSU team will then provide detailed guidance through email. **Are there any limitations or conditions when using APIs?** * API usage is subject to rate limits, access scopes, and other restrictions that may vary by verification level. Builders must comply with the Builder Terms, Open API Terms, and any additional guidelines provided by MSU. **Can API access be restricted or revoked?** * API access may be limited, suspended, or revoked if a Builder violates policies, exceeds usage limits, or poses a risk to the ecosystem. **What resources are available in the Open API?** * Available endpoints include account, character, game meta, and item data (v1rc1). APIs are primarily read-only, with limited metadata write support. For full details, refer to the API documentation. **Are there SDKs or only REST APIs?** * Currently, only REST/HTTP APIs are provided. **Are webhooks or event streams supported?** * No, Webhooks or event streams are not currently provided. Builders should use polling where necessary. **What are the API rate limits and authentication methods?** * API keys are scoped per Builder level, with a default rate limit of 1 request/second and 1,000 requests/day. These limits can be increased after Level 2 verification is approved. **How long does it take to receive an API key?** * API keys are typically issued within one week. *** ### **5. Tech Stack, Hosting & Infrastructure** **Are there restrictions on backend or hosting?** * There are no restrictions on programming languages, hosting providers, or databases. **Are there recommended server architectures?** * No specific architecture is enforced. Builders should follow industry best practices. **What is the service availability or SLA?** * Current availability is provided on a best-effort basis. *** ### **6. Editors & External Platforms** **Does MSU Builder provide an editor?** * MSU Builder does not provide or endorse any editor. Builders may use their own tools or engines. **Can MSU integrate with MapleStory Worlds?** * MSU and MapleStory Worlds are independent platforms. MSU Builder does not provide official integration. *** ### **7. Rewards & Monetization** **Can Builders receive rewards or incentives?** * Builders may receive rewards based on their participation in specific programs, such as the affiliate program or other incentive-based initiatives. **How are rewards calculated and distributed?** * Reward structures, calculation methods, and distribution schedules vary by program. Detailed criteria and processes are provided separately for each program.. **Are there any conditions or restrictions for receiving rewards?** * Builders must meet eligibility criteria and comply with all relevant policies. Rewards may be withheld, adjusted, or revoked in cases of policy violations or abnormal activity. **What monetization models are supported?** * Supported monetization models and requirements are defined in the Builder Terms. *** ### **8. Compliance, Moderation & Content Policy** **What policies and content moderation rules must Builders comply with?** * Builders must comply with all applicable policies, including the IP Guide, Open API Terms, Builder Terms, and any guidance shared through official channels such as the Builder Forum. * All content must meet applicable legal, platform, moderation, and age rating standards. Explicit, violent, discriminatory, or otherwise inappropriate material is not permitted and may result in moderation actions. **What happens if I violate IP policies?** * Violations may result in content removal, restriction of Builder privileges, or further action depending on the severity of the issue. **Can I freely use MapleStory IP in my project?** * Builders must comply with the IP Guide. The use of MapleStory Universe IP is permitted only within the scope defined by [MSU policies](https://msu.io/policy/ip_guide_for_content_creators) and guidelines. **Can I monetize content using MapleStory IP?** * Monetization is allowed only if it complies with MSU policies, including the IP Guide and any applicable program-specific rules. **Can Builders use their own assets?** * Builders may use original art, animations, audio, and UI assets. **Are there restrictions on asset usage?** * Use of MapleStory Universe IP requires attribution and may require prior approval. Commercial sale of UGC is prohibited, though ad revenue and donations via free-access platforms are permitted. *** ### **9. Support & Communication** **Is there a developer community or a place to communicate with other Builders?** * [The Builder Forum](http://forum.msu.io/) is available for Builders to ask questions, share knowledge, and collaborate. **Where can I get support or ask questions?** * Builders can ask questions, share issues, and exchange knowledge through [the Builder Forum](http://forum.msu.io/). * The forum is the primary communication channel, where Builders can help each other and discuss MSU-related topics. **Are there sample apps available?** * Reference applications are not yet available. *** # Builder Verification Source: https://docs.msu.io/msu-builder/builder-verification All Builders who wish to access the full range of MSU Builder features — including API usage, app registration, and monetization — must complete identity verification. The required verification type differs depending on whether you are an individual or a legal entity: * KYC (Know Your Customer): For individual Builders and teams * KYB (Know Your Business): For legal entities (corporations)   ## **1. Why Verification Is Required** Verification is required to maintain a safe and compliant Builder ecosystem. It serves three main purposes: * Preventing misuse and protecting the ecosystem * Enabling secure transactions and asset transfers * Unlocking advanced features such as API access, app registration, and monetization   ## **2. Verification Levels and Feature Access** MSU Builder has three verification levels. Higher levels unlock more features. | **Feature** | **Level 0** | **Level 1** | **Level 2** | | :----------------------------------- | :---------- | :----------- | :------------------ | | API Keys Limit (Max) | ❌ | 1 per app | 3 per app | | READ API | ❌ | ✅ | ✅ | | Action API | ❌ | ❌ | ✅ (only applicable) | | App Registration | ❌ | ❌ | ✅ | | Reward Programs | ❌ | ❌ | ✅ | | Revenue Claim | ❌ | ❌ | ✅ | | MSU Marketplace | ✅ | ✅ | ✅ | | Swap | ✅ | ✅ | ✅ | | Warp (NXPC) | \$1,000/day | \$10,000/day | \$30,000/day | | Reactor | ✅ | ✅ | ✅ | | MapleStory N | ❌ | ❌ | ❌ | | 1st-party Synergy Apps (e.g. Smithy) | ❌ | ❌ | ❌ | | NXPC / NESO Transfer (limit applies) | ✅ | ✅ | ✅ | | NFT / FT Transfer | ❌ | ✅ | ✅ | * Level 0 is the default level upon wallet connection and account creation. * Level 1 is intended for testing and prototyping. * Level 2 enables production use and monetization of Synergy Apps. - Warp and Transfer limits are controlled integrately. - Revenue claim is subject to minimum thresholds and settlement policies as defined in the Builder Terms.   ## **3. How the Verification Process Works** The verification process follows these steps: 1. Create a Builder account on the MSU Builder platform. 2. Apply for API access on the MSU Builder platform. 3. Once the application is received, a KYC/KYB verification link will be sent to the registered email address. 4. Complete KYC or KYB verification through the link provided in the email. 5. Check the KYC/KYB approval status and your APL key from the MSU Builder platform. * The verification link is sent upon API access application submission to the e-mail on the application. * KYC approval process can be completed within 2-3 business days, whereas, approval process could take upto 7 business days. Delays may occur.   ## **4. KYC vs. KYB** The verification type is determined by how you are participating in MSU Builder. Choose the type that applies to you: ### **4.1. KYC — For Individuals and Teams** Individual and team that are not legal entities are required to complete KYC verification. The required documents by level are as follows: * **Level 1**: * Passport or government-issued ID, along with a Selfie * **Level 2**: * Proof of address document issued within the last 3 months, containing the same full name and address as verified in Level 1 (e.g., utility bills, bank statements) - Selfie verification must be completed in an environment where your identity can be clearly confirmed, following the instrucion from the verification service. - For more details on accepted ID types and other requirements, refer to the guidance within the Verification page. - For non-incorporated teams, the representative or leader of the team should complete the KYC process for the whole team. ### **4.2. KYB — For Business Entities** Legal entities (corporations) are required to complete KYB verification. KYB requires different documents from KYC. The required documents include; * Certificate of Incorporation * Memorandum / Articles of Incorporation - KYC verification for the Ultimate Beneficial Owner (UBO) will be conducted separately. - Additional documents may be required depending on the type of legal entity and jurisdiction. Detailed guidance will be provided during the verification process. ### **4.3. Upgrading Your Verification Level** KYC verification grants Level 1 access. Builders can upgrade to Level 2 by completing additional verification requirements. Each level will be granted under the following condition; * Level 1 (Testing): After completing initial KYC verification * Level 2 (Production): After completing KYB verifitation or additional verification following KYC Level 1 or KYB verification Switching from an individual account to a legal entity account requires a separate KYB verification.   ## **5. If Your Verification Is Rejected** If the verification is rejected, Builders can reapply by correcting the issues identified during the review process. Additional document submission may be required, and retrial is available within the allowed number of attempts. For inquiries related to re-verification, please contact [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io).   ## **6. Data Privacy** All personal or company data submitted during verification is handled securely and is used only for verification and compliance purposes in accordance with applicable policies.   *** # Code of Conduct Source: https://docs.msu.io/msu-builder/compliance-rules/code-of-conduct *Effective Date: October 23, 2025*   The purpose of this Code of Conduct (this “Code of Conduct”) is to (i) inform the end users (“Users” or “you”) of the rules of conduct applicable to their use of the platform, which comprises our website, mobile application, forums, marketplaces, blogs, hubs, tools, protocols, games, interactive software products and services, and any supporting servers used to deliver our services (collectively, the “Platform”), and the community which comprises of Platform and third-party integrations to the Platform, including decentralized applications (dApps) developed by third parties (the “MSU Community”), including the rules of conduct applicable to the Users’ communications with other Users within the MSU Community; and (ii) set clear expectations for behavior, promote a safe culture of mutual respect, and create an environment where all Users can enjoy, collaborate, learn, and grow. By adhering to this Code of Conduct, the Users should uphold the integrity and ethos of the MSU Community and ensure that it remains a positive, inclusive, and forward-thinking space. Materials published on the website [https://msu.io](https://msu.io), and communication channels are for information purposes and community growth only. It is the sole responsibility of the User to analyze and perform proper due diligence before acting upon any of the information provided within the MSU Community. The information published on, and related discussions taking place through the MSU Community and is not intended as, and shall not be understood to have been intended as legal, tax, accounting, financial, investment, or technology advice, or any other professional advice, and the Users should not regard it as a substitute for the exercise of their own judgment. ### **1. Purpose** **1.1** This Code of Conduct is intended to ensure that every User feels valued, respected, and safe as they navigate the exciting and ever-evolving landscape of blockchain space. Whether you are a seasoned gamer, expert, or a curious newcomer, your contributions to the MSU Community are vital to the collective success and innovation in the blockchain arena and the MSU Community. **1.2** The MSU Community are intended to provide an environment where diversity is respected, and everyone’s voice can be heard and are built on the foundational belief that constructive dialogue and respectful interactions are key to advancing the game and blockchain technology space. This Code of Conduct serves as a roadmap to maintaining these values and guiding interactions both online, according to the rules below. ### **2. Community Rules** **2.1** Every User must comply with the following rules in connection with use of the MSU Community. Violation of any of these rules may result in restrictions or penalties in accordance with relevant policies without a prior notice. * Rule 1: Comply with all of the rules as set out in this Code of Conduct. * Rule 2: Discrimination, trolling, insulting, belittling, demeaning, or harassment of any kind (including attack or abuse of any kind based on race, ethnicity, national origin, sex, gender, gender identity, sexual orientation, religion, disability or disease) is strictly prohibited within the MSU Community. * Rule 3: Sharing of your personal information with other Users, including but not limited to private keys linked to your NFTs, fungible tokens or any other digital asset, name, national identification, networks, personal affiliations, or any other personal information that could potentially be deemed sensitive, is prohibited. Additionally, sharing the personal information of other User(s) or any material, non-public information about any corporate entity(ies) without proper authorization is not allowed. Please ensure that you have the right to post any content you share through the MSU Community. * Rule 4: Violence, threat, glorification, encouragement of violence, or hate speech in any form through any means against any User in connection with use of the MSU Community is not allowed. * Rule 5: Transmission of vulgar, obscene, sexually explicit or otherwise inappropriate content or message is not allowed. * Rule 6: Transmission of spam or links that are not relevant to MSU Community, including promotions or bashing of other games or blockchain projects, is not allowed. * Rule 7: Offering to buy, sell, or trade any type of financial instruments or digital assets, regardless of the purpose, is not allowed. * Rule 8: Promotion of contests, giveaways, airdrops, or any other promotions of services is not allowed, unless explicitly permitted. * Rule 9: Posting of files of any kind, or any links to: (i) a form collecting personal information, (ii) phishing, (iii) pharming websites, (iv) malware, (v) spyware, or (vi) any other harmful materials is not allowed. * Rule 10: Committing violation of any law in any manner, including, but not limited to, encouraging tax evasion, promoting leaks, and revealing personal information, is not allowed. Rule 11:Gambling or betting is not allowed. * Rule 12:Engaging in deceptive practices through any means (e.g., through hacks, cracks, bugs, automation software, mods or any other third-party programs that modify or interfere with gameplay) such as manipulating game mechanics, misleading others about NFTs or digital assets, or misrepresenting themselves to gain an unfair advantage, is not allowed. * Rule 13: Gaining unauthorized access to any information, including the information on account or personal data of other Users, through any means (e.g., hacking, phishing) is not allowed. * Rule 14: Creating nicknames, usernames, or character names (collectively, the “MSU Community Name”) that are offensive, discriminatory, or problematic in any social, cultural, political, or other context, is not allowed. MSU Community Name creation is subject to a filtered word list, which may be updated periodically. If a MSU Community Name is found to violate the filtered word list, either at the time of creation or after future updates, appropriate action may be taken without prior notice. * Rule 15: Impersonating any person or entity or otherwise misrepresenting your affiliation or identity is not allowed. * Rule 16: Removing, altering, or concealing any copyright, trademark, patent or other proprietary notices, legends, symbols, or labels (including any watermark or other digital rights management technology or other information) is not allowed. In addition, uploading or transmitting content that violates or infringes upon the applicable law or rights of others, including intellectual property rights, publicity rights, personal rights, privacy rights or other rights, is not allowed. * Rule 17: You are responsible for your account, devices, personal information, and conduct and are expected and encouraged to use strong passwords and keep all your devices secure. If you suspect that your account has been compromised, please immediately inform the administrator of the MSU Community, and make sure you fully verify and understand any third-party tool or program before using them. ### **3. Scams Warning** **3.1** Every User must take extra precautions and stay vigilant against scams and other bad actors operating within the gaming and crypto community. **3.2** Every User must refrain from clicking a link, trust emails, or respond to chat messages soliciting investment of any kind. **3.3** If you or a third party you know becomes a victim of any type of fraud in connection with use of the MSU Community, report to the local authorities in the jurisdiction you are based.   ***   # MSU Brand Logo Guidelines Source: https://docs.msu.io/msu-builder/compliance-rules/msu-brand-logo-guidelines Msu Logo Guidelines Visual identity standards for the MapleStory Universe brand — brand architecture, logo systems, usage guidelines, and legal notices.   ## **Introduction** This guideline is designed to ensure consistent external communication of the MapleStory Universe (MSU) brand’s visual identity. It applies to all external uses of MSU logos across digital, print, and physical environments. All partners must comply with the requirements in this guide to help maintain and protect the MSU brand.   ## **Legal Notices** * **Trademark Ownership** * All MSU logos, symbols, logotypes, service marks, trade dress, and related brand assets (collectively, the “MSU Marks”) are the exclusive property of Nexpace and are protected by applicable trademark, copyright, and other intellectual property laws. * Nothing in these guidelines shall be construed as transferring or assigning any ownership rights in the MSU Marks to any third party. * **Indemnification** * You agree to indemnify and hold harmless Nexpace from and against any claims, damages, liabilities, costs, or expenses arising out of your misuse of the MSU Marks or violation of these guidelines. * **Right to Review and Revoke** * Nexpace reserves the right to review any use of the MSU Marks and may request modification or removal at any time if the usage does not comply with these guidelines or applicable agreements. * Nexpace may revoke any previously granted approval at its sole discretion. Upon notice of revocation, you must immediately cease all use of the MSU Marks and remove them from all materials, platforms, and distributions. * Unauthorized use of the MSU Marks, or failure to comply with these guidelines, may result in legal action, including claims for injunctive relief and damages, to the fullest extent permitted by law, and termination of permission to use the MSU logo. * **Version Control** * Nexpace may update these guidelines from time to time. The most current version supersedes all previous versions. * Continued use of the MSU Marks after any update constitutes acceptance of the revised guidelines. * **No License or Rights Granted** * Use of the MSU Marks does not grant any ownership, license, or other rights in or to the MSU trademarks or brand assets. * Except for the limited, revocable, non-exclusive, non-transferable right expressly granted pursuant to written approval by Nexpace, no rights (whether express or implied) are granted under these guidelines, including by implication, estoppel, or otherwise. * The MSU Marks may be used only in accordance with these guidelines and any applicable written agreement with Nexpace. * Any goodwill arising from the use of the MSU Marks shall inure solely to the benefit of Nexpace. * **No Security Interest / No Tokenization** * You may not tokenize, fractionalize, mint, wrap, stake, or otherwise encode the MSU Marks into any digital asset, NFT, token, or blockchain-based instrument without prior written authorization. * The MSU Marks may not be used as part of any DAO name, token ticker, smart contract label, liquidity pool identifier, or decentralized application branding without express written consent. * **No Derivative Works or Unauthorized Registration** * You may not create derivative works based on the MSU Marks, including modified logos, adapted symbols, stylized variations, NFTs, tokens, smart contract identifiers, or composite marks incorporating the MSU Marks, without prior written authorization. * You may not register, attempt to register, or claim rights in any trademark, domain name, social media handle, blockchain address name, token name, or other identifier that incorporates or is confusingly similar to the MSU Marks. * **No Endorsement** * Use of the MSU Marks does not imply endorsement, sponsorship, partnership, or affiliation with Nexpace unless expressly authorized in a separate written agreement.   ## **Brand Architecture** The MapleStory Universe brand architecture is structured as follows. | Brand | Category | Description | | ------------------- | --------------------- | ------------------------------------------------------------------------------ | | MapleStory Universe | Master Brand | Individual Game Brand | | MapleStory N | Individual Game Brand | Represents individual games and projects offered by MapleStory Universe. | | MSU Infrastructure | Related Service Brand | Refers to utility services within the ecosystem (e.g., Marketplace, Explorer). |   ## **Logo Guidelines** ### **Logo Elements** * **Colour Palette** Msu Logo 01 * **Typography** Msu Logo 02 ### Logo System - MapleStory Universe **Usage Guidelines** MSU H MSU H * Primary Logo * A combination of the four-colored star symbol and the “MapleStory UNIVERSE” text. * Available in horizontal and vertical lockups. * Minimum width * ONLINE * Horizontal lockup 120px * Vertical lockup 80px * OFFLINE * Horizontal lockup 3.5cm * Vertical lockup 4cm * The logo must always be resized proportionally. he logo must not be stretched, compressed, or distorted. * Clear space * Maintain clear space equivalent to 1/3 of the symbol’s width on all sides. * Usage * Use the primary logo or a monochromatic logo (white or black) depending on the background. * Only logo files provided by Nexpace may be used. Do not recreate, redraw, trace, or extract logos. Msu Logo 03 ### **Logo System - MapleStory N** **Usage Guidelines** MSN MSN * Primary Logo * A combination of the “MapleStory” game logo and the “N” symbol. * Only horizontal lockups are available. * Minimum width * ONLINE * Horizontal lockup 120px * OFFLINE * Horizontal lockup 3.5cm * The logo must always be resized proportionally. he logo must not be stretched, compressed, or distorted. * Clear space * When using the symbol alone, maintain a minimum safe zone of 1/4 of the symbol’s size. * Usage * Use the primary logo or a monochromatic logo (white or black) depending on the background. * Only logo files provided by Nexpace may be used. Do not recreate, redraw, trace, or extract logos. Msu Logo 04 ### **Logo System MSU Infrastructure** **Usage Guidelines** Marketplace Marketplace Swap And Warp@2x Swap And Warp@2x MSU Builder H MSU Builder H Smithy Smithy Navigator@2x Navigator@2x Explorer@2x Explorer@2x * Primary Logo * A combination of the infrastructure name and its symbol, using a gradient attribute based on the four core MSU brand colors. * Only horizontal lockups are available. * Minimum width * ONLINE * Horizontal lockup 120px * OFFLINE * Horizontal lockup 3.5cm * The logo must always be resized proportionally. The logo must not be stretched, compressed, or distorted * Clear space * Maintain clear space equal to 1/4 of the symbol’s size. * Usage * The one-color logo is intended for offline applications or when accurate full-color reproduction is not technically feasible. * The standalone symbol must retain its original color composition, gradient treatment, proportions, and visual attributes as officially provided. * Only logo files provided by Nexpace may be used. Do not recreate, redraw, trace, or extract logos. Msu Logo 05 Msu Logo 06 ### **General Logo Usage Principles** * Select the appropriate logo orientation. * Use vertical logos when the available space is tall or compact. * Use horizontal logos when the available space is wide. * Vertical logos are only available for the MapleStory Universe logo. * Apply color thoughtfully. * Use color logos whenever possible. * Use one-color logos only when accurate color reproduction is unavailable. * Follow logo presentation guidelines. * Present the logo accurately and respectfully. * Do not use the logo in any misleading manner. * Do not present the MSU logo as the primary brand in any application. * Maintain logo integrity. * Do not recreate, redraw, trace, or extract logos. ### **Prohibited Logo Modifications** **Typography Modifications** Do not alter the logotype text style, line spacing, or letter spacing. * No changes to typeface, font weight, or typographic styling are permitted. Original line breaks and vertical alignment must be maintained. * Under no circumstances may the logotype's typography, spacing, structure, proportions, or color composition be modified, adjusted, or reinterpreted. Msu Logo 07 **Color Modifications** Do not change logotype colors or symbol color attributes. * Only officially approved color versions may be used. The gradient, color composition, and color relationships must remain exactly as provided. Msu Logo 08 **Structure and form Modifications** Do not mirror, flip, rotate, or realign the logotype. * Do not change the alignment or arrangement of the logotype. The original positioning and structural relationship between elements must be preserved. Msu Logo 09 **Indipendent Symbol Usage** Do not alter the style, proportions, or colors of the standalone symbol. * If the symbol is used independently from the full lockup, its style, proportions, and colors must not be altered. Use the standalone symbol exactly as provided, without reinterpretation or adjustment. Msu Logo 10 ### **Context Restrictions** The MSU logos must be used in an appropriate and respectful context at all times. The logo must not be used in any manner that could harm, misrepresent, or dilute the MSU brand. * **No Misleading Representation** * The logo must not be used in a way that implies ownership, partnership, sponsorship, endorsement, or affiliation unless expressly authorized in writing by Nexpace. * The logo must not be used in a manner that creates confusion regarding the relationship between Nexpace and any third party. * **No Use that Damages Brand Integrity** * The logo must not be used in a manner that diminishes the reputation, integrity, or distinctiveness of the MSU brand. * The logo must not be incorporated into materials that conflict with MSU’s value or brand positioning. * **No Harmful or Inappropriate Context** * The logo must not be used in connection with unlawful, fraudulent, or deceptive activities. * The logo must not appear in content that is offensive, defamatory, discriminatory, or harmful. * The logo must not be used in political, controversial, or sensitive contexts without prior written approval. * **No Unauthorized Commercial Use** * The logo may not be used on merchandise, physical products, NFTs, or commercial goods without prior written approval from Nexpace. * The logo must not be used as part of a product name, service name, or company name without authorization. ### **Approval Requirements** All uses of the MSU logo require prior written approval. You may proceed only after receiving written confirmation of approval. To request approval, submit your application through the link below. \[[**Approval Submission Link**](https://airtable.com/app5YJgPOLkyvAQds/pagedVgK5bxePLMRQ/form)]   *** # Get Started Source: https://docs.msu.io/msu-builder/get-started ## **1. What is MSU Builder?** MSU Builder (msu.io/builder) is the official platform where Builders can register, manage accounts, and access the tools and resources needed to build within the MapleStory Universe ecosystem. Using the MSU Open API and other resources available through the Builder Center, Builders can create services, tools, and content that connect with MSU’s games, assets, and community. The onboarding process follows these steps: • Stage 1: Create a Builder account • Stage 2: Apply for API key and complete KYC (ID + Selfie verification) or KYB verification • Stage 3: Receive API key after review • Stage 4: Complete Synergy App development and pass the live review to launch the service KYC (PoA) or KYB verification is required before going live with a service.   ## **2. Creating a Builder Account** Visit [https://msu.io/builder](https://msu.io/builder) and click the 'Connect' button to begin the sign-up process. Connecting through other MSU services will register a Mapler account, not a Builder account. To sign up as a Builder, make sure to connect through the Builder Center. ### **2.1. Wallet Connection** 계정가입1 Builders can sign up using a MetaMask wallet or a social account (Google, X, or Apple). For detailed instructions on wallet creation and sign-up methods, refer to \[**[Wallet Connect Guide](https://docs.msu.io/welcome-to-msu/wallet-connect)]**. Wallets already registered as a Mapler or Builder account cannot be used to sign up. Please use a new wallet that has not been registered with MSU. ### **2.2. Fill in Information and Email Verification** 1 become a builder Enter the following: nickname, email address. Review and agree to the terms, then proceed with sign-up. Email addresses already verified under another MSU Builder account cannot be used. If a duplicate email error appears, the email is already associated with another Builder account. Please use a different email address to sign up. 2 메일 인증 A 5-digit verification code will be sent to the registered email address. Enter the code in the 'Verification Code' field and click 'Confirm.' * The code is valid for 5 minutes. If it expires, click 'Resend' to receive a new code. * If the email is not received, check the Spam or Deleted folders and make sure the email address was entered correctly. ### **2.3. Signature Request** 3 서명 A signature request will appear in the wallet. Review the request details — Wallet Address, Network (Henesys), and the requesting site (MapleStory Universe) — then click 'Confirm' to sign. Only sign this message if the request is from MapleStory Universe ([http://msu.io](http://MSU.io)). This request does not trigger a blockchain transaction or incur any gas fees. ### **2.4. Asset Access Permission** 4 Asset Access Permission An 'Asset Access Permission' popup will appear. This grants MSU services permission to access the following assets in the wallet: • Characters, NFT Items, FT Items, Nicknames, NESO **Allowing access enables the following services:** * MSU Marketplace: Item, character, and nickname trading * Reactor: Item Fusion * Swap & Warp: NESO-NXPC swap and warp-out **The following services are not available with Builder access:** * MapleStory N: Normal play including item enhancement and minting Click 'Proceed' to grant access. ### **2.5. Final Signature Request** 5 Signature Request A signature request for asset access permissions will appear. Review the message and click 'Confirm' to complete the sign-up. ### **2.6. Account Created — Level 0** 6 New Builder Once the Builder account is created, Maplers can use essential MSU services (MSU Marketplace, Swap & Warp, Reactor) and apply for API access. KYC/KYB verification is required to use the Open API and onboard a Synergy App. * A KYC/KYB guidance email will be sent after the API key application is submitted. The API key will be issued once the process is complete. * Builders start at Level 0. Full access to the MSU Open API and Builder features requires completing KYC/KYB verification (Level 1).   ## **3. KYC/KYB Verification** ### **3.1. Complete KYC Verification** 10 KYC APPLY You can complete the verification process through **My Page > Verification** in the Builder Center. ### **3.2. Verification Complete** Once KYC/KYB verification is approved, My Page will update to show 'Complete ✓'. The following features will be activated: For details on features available at each KYC/KYB level, refer to \[[Builder Verification](https://docs.msu.io/msu-builder/builder-verification)].   ## **4. Receiving the API Key** 10 심사 완료 후 발급된 Api 키 안내 메일 After KYC/KYB verification is approved, the MSU team will review the application and issue an API key via email. Keep the API key secure. Do not share it publicly or commit it to public code repositories. API keys are typically issued within one week after verification is approved.   ## **5. Checking Builder and Verification Level** The current Builder level and KYC/KYB verification status can be checked at any time on the My Page in the Builder Center. • Visit [http://msu.io/builder](http://msu.io/builder) and log in • Navigate to My Page to view the current verification level and feature access status For questions or issues, contact the MSU Builder Team at [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io) or visit the Builder Forum at [forum.msu.io](http://forum.msu.io).   ## **6. Live Synergy App Review** Synergy Apps can go live after passing a review process. Submit a review request to [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io). Once approved, a live key will be issued. *** # Get NESO balance Source: https://docs.msu.io/msu-open-api/accounts/get-neso GET /v1rc1/accounts/{walletAddress}/neso Retrieve both on-chain and off-chain NESO balances for a wallet ## Path parameters The wallet address to query ## Response Indicates if the request was successful Off-chain NESO balance On-chain NESO balance ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/accounts/{walletAddress}/neso' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/accounts/{walletAddress}/neso', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/accounts/{walletAddress}/neso" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "offchainNeso": "0", "onchainNeso": "0" } } ``` # Get Character List Source: https://docs.msu.io/msu-open-api/accounts/list-characters GET /v1rc1/accounts/{walletAddress}/characters Retrieve a list of characters associated with the given wallet address. Pagination is supported, with range of 1 to 100 items per page. Default pagination: pageNo=1, pageSize=10 ## Path parameters The wallet address to query ## Query parameters isTradable name cursor size ## Response Indicates if the request was successful characters nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/accounts/{walletAddress}/characters?isTradable=true&name=string&cursor=string&size=0' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/accounts/{walletAddress}/characters?isTradable=true&name=string&cursor=string&size=0', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/accounts/{walletAddress}/characters" params = { "isTradable": True "name": "string" "cursor": "string" "size": 0 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "characters": [], "nextCursor": "string", "hasMore": false } } ``` # Get wallet collection list Source: https://docs.msu.io/msu-open-api/accounts/list-collection GET /v1rc1/accounts/{walletAddress}/collection Retrieve a list of collection owned by a wallet address ## Path parameters The wallet address to query ## Query parameters Last key for pagination Number of items per page Request trace ID ## Response Indicates if the request was successful List of collection items Pagination information Request trace ID ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/accounts/{walletAddress}/collection' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/accounts/{walletAddress}/collection', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/accounts/{walletAddress}/collection" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "collection": [], "paginationResult": {}, "traceId": "string" } } ``` ## Notes * Pagination is supported, with range of 1 to 200 items per page * Default pagination: pageSize=10 # Get currency list Source: https://docs.msu.io/msu-open-api/accounts/list-currencies GET /v1rc1/accounts/{walletAddress}/currencies Retrieve only internally defined currencies and balances for a given wallet address ## Path parameters The wallet address to query ## Response Indicates if the request was successful List of currency objects with balances ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/accounts/{walletAddress}/currencies' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/accounts/{walletAddress}/currencies', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/accounts/{walletAddress}/currencies" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "currency": [] } } ``` # Get Wallet Item List Source: https://docs.msu.io/msu-open-api/accounts/list-wallet-items GET /v1rc1/accounts/{walletAddress}/items Retrieve a list of items owned by a wallet address. Pagination is supported, with range of 1 to 200 items per page. Default pagination: pageNo=1, pageSize=10 ## Path parameters The wallet address to query ## Query parameters categoryNo isOnSale tokenName cursor size ## Response Indicates if the request was successful elements nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/accounts/{walletAddress}/items?categoryNo=0&isOnSale=true&tokenName=string&cursor=string&size=0' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/accounts/{walletAddress}/items?categoryNo=0&isOnSale=true&tokenName=string&cursor=string&size=0', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/accounts/{walletAddress}/items" params = { "categoryNo": 0 "isOnSale": True "tokenName": "string" "cursor": "string" "size": 0 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "elements": [], "nextCursor": "string", "hasMore": false } } ``` # MSU OpenAPI Builder Guide Source: https://docs.msu.io/msu-open-api/ai-assistant/msu-openapi-builder-guide > **Version**: v1rc1
**Audience**: Builders (external service/app developers) calling MSU OpenAPI *** **Start with AI** Paste this prompt into your AI assistant (ChatGPT, Claude, Cursor, etc.) to load this guide as context: ```text theme={null} Read from https://docs.msu.io/msu-open-api/ai-assistant/msu-openapi-builder-guide.md so I can ask questions about it. ```   ## 1. Overview MSU OpenAPI provides external builders with character, item, account, and search data from the MSU Marketplace. | Item | Value | | ------------------- | ---------------------------- | | Base URL | `https://openapi.msu.io` | | Protocol | HTTPS | | Encoding | JSON (camelCase field names) | | Version path prefix | `/v1rc1/` | **`asset_key` vs `token_id`** | Identifier | Description | | ----------- | ------------------------------------------------------------------------------------------------------------ | | `asset_key` | Internal identifier that always exists regardless of minting status | | `token_id` | Issued only after NFT minting. Calling a `by-token-id` endpoint on an unminted target returns `NOT_FOUND(3)` |   ## 2. Authentication Pass your API key in the request header for all requests. ```http theme={null} x-nxopen-api-key: ``` Endpoints requiring user authentication (market, etc.) additionally require a Bearer token. Token issuance is done through a separate MSU OAuth authentication flow. ```http theme={null} msu-authorization: ```   ## 3. Response Format All APIs respond in the following format. ### Success Response ```json theme={null} { "success": true, "data": { ... }, "traceId": "69faa56c000000006debcf3d9f4e0119" } ``` ### Error Response ```json theme={null} { "success": false, "error": { "code": 3, "message": "character not found" }, "traceId": "69faa56c000000006debcf3d9f4e0119" } ``` | Field | Type | Always Present | Description | | --------------- | ------- | --------------- | -------------------------------------------------------- | | `success` | boolean | ✅ | Whether the request succeeded | | `data` | object | On success only | Response data per endpoint | | `error.code` | integer | On failure only | Error code (see table below) | | `error.message` | string | On failure only | Error description (human-readable) | | `traceId` | string | ✅ | Request trace ID. Always provide when contacting support | > **Note**: All response field names are camelCase (proto field `asset_key` → JSON `assetKey`).   ## 4. Error Codes ### Common Errors | code | Constant | HTTP Status | Description | Common Scenarios | Resolution | | ---- | -------------------------------- | ----------- | -------------------------- | --------------------------------------------------- | ------------------------------ | | `0` | `ERROR_CODE_UNSPECIFIED` | 500 | Unspecified error | Unexpected server error | Contact support with `traceId` | | `2` | `ERROR_CODE_INVALID_ARGUMENT` | 400 | Invalid request argument | Missing required parameter, format error | Check request parameters | | `3` | `ERROR_CODE_NOT_FOUND` | 404 | Requested target not found | Non-existent `assetKey`, `tokenId`, `walletAddress` | Verify identifier value | | `4` | `ERROR_CODE_INTERNAL_ERROR` | 500 | Internal server error | Server failure | Retry or contact support | | `5` | `ERROR_CODE_PERMISSION_DENIED` | 403 | Permission denied | API key scope exceeded | Check API key permissions | | `6` | `ERROR_CODE_FAILED_PRECONDITION` | 412 | Unprocessable state | Operation not possible in current state | Check target resource state | | `7` | `ERROR_CODE_ALREADY_PROCESS` | 409 | Already processed | Duplicate request | Check for duplicate requests | | `9` | `ERROR_CODE_EXPECTATION_FAILED` | 417 | Expectation failed | Server-side precondition not met | Check `error.message` content | | `10` | `ERROR_CODE_TOO_MANY_REQUEST` | 429 | Rate limit exceeded | Per-API-key rate limit exceeded | Retry with exponential backoff | | `11` | `ERROR_CODE_CANCELED` | 408 | Request canceled/timeout | Processing time exceeded | Retry | ### Authentication Errors | code | Constant | HTTP Status | Description | Common Scenarios | Resolution | | ------ | --------------------------------------- | ----------- | --------------------------------------------------- | -------------------------------------------------------------------------------- | ----------------------------- | | `8` | `ERROR_CODE_UNAUTHENTICATED` | 401 | Authentication failed | Missing or invalid `x-nxopen-api-key` header | Verify API key | | `3001` | `ERROR_CODE_INVALID_AUTH_TOKEN` | 401 | Invalid MSU auth token | Invalid `access_token` provided | Re-issue token | | `4001` | `ERROR_CODE_TOKEN_EXPIRED` | 401 | Token expired | `access_token` validity period exceeded | Re-issue with `refresh_token` | | `4002` | `ERROR_CODE_TOKEN_EXPIRED_BY_OTHER_APP` | 401 | Token expired by another app in the same app\_group | Another app in the same `app_group` logged in, invalidating the existing session | Re-login and re-issue token | ### Domain Errors | code | Constant | HTTP Status | Description | Common Scenarios | Resolution | | ------ | --------------------------------------------- | ----------- | ------------------------------------- | ---------------------------------------------------- | ------------------------------------ | | `1001` | `ERROR_CODE_NOT_APPROVE_WALLET` | 403 | Wallet asset approval not granted | User has not granted the app access to wallet assets | Request wallet approval from user | | `1002` | `ERROR_CODE_NOT_ENOUGH_NESO` | 402 | Insufficient on-chain NESO balance | Insufficient balance for NESO-consuming operations | Guide user to top up NESO | | `2002` | `ERROR_CODE_NOT_FOUND_SYNERGY_APP` | 404 | Synergy app not found | Invalid `client_id` used | Verify `client_id` | | `2003` | `ERROR_CODE_NOT_APPROVED_SYNERGY_APP_BY_USER` | 403 | User has not approved the synergy app | User has rejected or canceled app connection | Request app approval from user again | ### Error Handling Example ```typescript theme={null} const res = await fetch(url, { headers: { 'x-nxopen-api-key': API_KEY } }); const body = await res.json(); if (!body.success) { const { code, message } = body.error; switch (code) { case 3: // NOT_FOUND console.error('Target not found'); break; case 8: // UNAUTHENTICATED console.error('API key verification needed'); break; case 4001: // TOKEN_EXPIRED case 4002: // TOKEN_EXPIRED_BY_OTHER_APP await refreshAccessToken(); break; case 10: // TOO_MANY_REQUEST await delay(Math.pow(2, attempt) * 1000); // Exponential Backoff break; default: console.error(`Error (code: ${code}): ${message}`); console.error('traceId:', body.traceId); // Always provide when contacting support } } ```   ## 5. Pagination Three pagination methods are used depending on the API. ### Cursor Pagination Used by most list APIs. Page size is fixed per API. **Request Parameters** | Parameter | Type | Description | | --------- | ------ | ---------------------------------------------------------------------- | | `cursor` | string | `nextCursor` value from the previous response. Omit for the first page | **Response Fields** | Field | Type | Description | | ------------ | ------- | --------------------------------------- | | `nextCursor` | string | Cursor to use for the next page request | | `hasMore` | boolean | Whether there is a next page |

Page Number Pagination

Used by Search endpoints. **Request Parameters (`paginationParam`)** | Parameter | Type | Description | | ---------- | ------- | ----------------------------- | | `pageNo` | integer | Page number (starting from 1) | | `pageSize` | integer | Results per page | **Response Fields (`paginationResult`)** | Field | Type | Description | | ------------ | ------- | ----------------------------- | | `totalCount` | integer | Total result count | | `pageSize` | integer | Results per page | | `currPageNo` | integer | Current page number | | `isLastPage` | boolean | Whether this is the last page | ### Scroll Pagination Used for collection queries. **Request Parameters (`paginationParam`)** | Parameter | Type | Description | | ---------- | ------- | ---------------------------------------------------------------- | | `lastKey` | string | `lastKey` from the previous response. Omit for the first request | | `pageSize` | integer | 1–200 (default: 10) | **Response Fields (`paginationResult`)** | Field | Type | Description | | ------------ | ------- | ------------------------------------ | | `totalCount` | integer | Total result count | | `pageSize` | integer | Results per page | | `lastKey` | string | Key to use for the next page request | | `isLastPage` | boolean | Whether this is the last page |   ## 6. Common Types Type definitions commonly used across multiple endpoints. ### `Category` Object | Field | Type | Description | | ------------ | ------------ | ------------------------------------------- | | `categoryNo` | integer | Category number | | `label` | string | Category label | | `tier0` | CategoryTier | Tier0 classification (NFT / FT / Character) | | `tier1` | CategoryTier | Tier1 major classification | | `tier2` | CategoryTier | Tier2 mid classification | | `tier3` | CategoryTier | Tier3 minor classification | **CategoryTier Object** | Field | Type | Description | | ------- | ------ | ------------------- | | `label` | string | Classification name | | `code` | string | Classification code | ### `TokenType` Enum | Value | Description | | ------------------------------ | ------------- | | `TOKEN_TYPE_UNSPECIFIED` (0) | Unspecified | | `TOKEN_TYPE_NFT_ITEM` (1) | NFT item | | `TOKEN_TYPE_FT_ITEM` (2) | FT item | | `TOKEN_TYPE_NFT_CHARACTER` (3) | NFT character | | `TOKEN_TYPE_NFT_NICKNAME` (4) | NFT nickname |   ## 7. API Reference Refer to the links below for detailed API documentation by category. | Category | Document Link | Key APIs | | ----------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------- | | Account | [account](https://docs.msu.io/msu-builder/ai-assitant/account) | NESO balance, currencies, collection, item/character list | | Character | [character](https://docs.msu.io/msu-builder/ai-assitant/character) | Character details, stats, equipped gear, skills, V Matrix, etc. | | Item | [item](https://docs.msu.io/msu-builder/ai-assitant/item) | NFT item details, history queries | | Market | [market](https://docs.msu.io/msu-builder/ai-assitant/market) | Marketplace item/character/nickname search, keyword autocomplete | | GameMeta | [gamemeta](https://docs.msu.io/msu-builder/ai-assistant/gamemeta) | Item/skill/set/quest metadata, V Matrix node skills | | Enhancement | [enhancement](https://docs.msu.io/msu-builder/ai-assistant/enhancement) | Enhancement price queries | | Rewards | [rewards](https://docs.msu.io/msu-builder/ai-assistant/rewards) | Reward/raffle status, character raffle history, layer static data | | Resource | [resource](https://docs.msu.io/msu-builder/ai-assistant/resource) | MCP proxy requests | ### Account | API | Endpoint | Description | | ----------------- | ------------------------------------------------ | ------------------------------------------------------------ | | `GetNeso` | `GET /v1rc1/accounts/{walletAddress}/neso` | Get on-chain and off-chain NESO balance for a wallet | | `ListCurrency` | `GET /v1rc1/accounts/{walletAddress}/currencies` | Get list of currency types and balances linked to a wallet | | `ListCollection` | `GET /v1rc1/accounts/{walletAddress}/collection` | Get NFT collection list held by a wallet (scroll pagination) | | `ListWalletItems` | `GET /v1rc1/accounts/{walletAddress}/items` | Get item list held by a wallet (cursor pagination) | | `ListCharacters` | `GET /v1rc1/accounts/{walletAddress}/characters` | Get character list linked to a wallet (cursor pagination) | ### Character | API | Endpoint | Description | | ------------------------------ | --------------------------------------------------- | ------------------------------------------------------------- | | `GetCharacter` | `GET /v1rc1/characters/{assetKey}` | Get character details (stats, equipped gear, abilities, etc.) | | `GetCharacter` (by token) | `GET /v1rc1/characters/by-token-id/{tokenId}` | Get character details by token ID | | `ListCharacterHoldingItems` | `GET /v1rc1/characters/{assetKey}/items` | Get list of items in character's inventory | | `ListCharacterHistoryMissions` | `GET /v1rc1/characters/{assetKey}/history-missions` | Get character history mission list | | `ListCharacterQuests` | `GET /v1rc1/characters/{assetKey}/quests` | Get character quest achievement information | | `ListCharacterSkills` | `GET /v1rc1/characters/{assetKey}/skills` | Get character skill information | | `ListCharacterHyperSkills` | `GET /v1rc1/characters/{assetKey}/hyper-skill` | Get character hyper skill information | | `GetCharacterVMatrix` | `GET /v1rc1/characters/{assetKey}/vmatrix` | Get V Matrix slot and V Core information | > `by-token-id` variant endpoints are available identically for each API. ### Item | API | Endpoint | Description | | ------------------------------------------ | ------------------------------------------------------------- | ---------------------------------------------------------- | | `GetNftItem` | `GET /v1rc1/items/{assetKey}` | Get NFT item details (stats, enhancement, potential, etc.) | | `GetNftItem` (by token) | `GET /v1rc1/items/by-token-id/{tokenId}` | Get NFT item details by token ID | | `ListNftItemHistoryMissions` | `GET /v1rc1/items/{assetKey}/history-missions` | Get full item history mission list | | `ListNftItemHistoryMissionsRepresentative` | `GET /v1rc1/items/{assetKey}/history-missions/representative` | Get representative item history mission list | ### Market | API | Endpoint | Description | | :------------------ | :----------------------------- | :----------------------------------------------------------- | | `ExploreItems` | `GET /v1rc1/search/items` | Search marketplace items for sale (filter/sort support) | | `ExploreCharacters` | `GET /v1rc1/search/characters` | Search marketplace characters for sale (filter/sort support) | | `ExploreNicknames` | `GET /v1rc1/search/nicknames` | Search marketplace nickname NFTs for sale | | `SuggestKeywords` | `GET /v1rc1/search/suggest` | Keyword autocomplete | ### GameMeta | API | Endpoint | Description | | ------------------------- | ---------------------------------------------- | -------------------------------------------------------- | | `GetItemMetadata` | `GET /v1rc1/gamemeta/items/{itemId}` | Get game metadata by item ID | | `GetItemCategory` | `GET /v1rc1/gamemeta/items/{itemId}/category` | Get item category classification information | | `GetItemSet` | `GET /v1rc1/gamemeta/items/{itemId}/set` | Get set effect information for the item's set | | `ListEquipExclusiveItems` | `GET /v1rc1/gamemeta/items/{itemId}/exclusive` | Get list of items that cannot be equipped simultaneously | | `GetQuestMetadata` | `GET /v1rc1/gamemeta/quests/{questId}` | Get quest metadata | | `GetSkillMetadata` | `GET /v1rc1/gamemeta/skills/{skillId}` | Get skill metadata | | `GetVMatrixNodeSkill` | `GET /v1rc1/gamemeta/vmatrix/{nodeId}` | Get V Matrix node skill information | ### Enhancement | API | Endpoint | Description | | ----------------- | ---------------------------------------------------- | ------------------------------------------------------------- | | `GetCurrentPrice` | `GET /v1rc1/enhancement/items/{itemId}/dynamicprice` | Get current Starforce/Potential enhancement price for an item | ### Rewards | API | Endpoint | Description | | ------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------ | | `GetRewardInformation` | `POST /v1rc1/msn/rewards/{worldId}` | Get NFT drop probability and inventory status for fields/bosses/content | | `GetRewardHistory` | `POST /v1rc1/msn/rewards/{worldId}/history` | Get reward history within 30 days after a raffle | | `GetCharacterRaffleInformation` | `GET /v1rc1/msn/characters/{characterAssetKey}/raffles` | Get character raffle participation status (before drawing) | | `GetCharacterRaffleHistory` | `GET /v1rc1/msn/characters/{characterAssetKey}/raffles/history` | Get character raffle participation history (up to 30 days after drawing) | | `GetLayerStaticData` | `POST /v1rc1/msn/layers/static` | Get layer static data such as level range and name | | `GetServerInformation` | `GET /v1rc1/msn/server` | Get reward server status by world | ### Resource | API | Endpoint | Description | | --------- | -------------------------- | ---------------------------------------- | | `McpCall` | `POST /v1rc1/resource/mcp` | Proxy JSON-RPC 2.0 request to MCP server |   ## 8. Contact When reporting an API error, always include the `traceId` from the response.   *** # Get character details Source: https://docs.msu.io/msu-open-api/characters/get-character GET /v1rc1/characters/{assetKey} Retrieve detailed information using the character asset key ## Path parameters The character asset key ## Response Indicates if the request was successful Full character object with detailed information ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "character": {} } } ``` # Get character details by token ID Source: https://docs.msu.io/msu-open-api/characters/get-character-by-token-id GET /v1rc1/characters/by-token-id/{tokenId} Retrieve detailed information using the character token ID ## Path parameters The character token ID ## Response Indicates if the request was successful Full character object with detailed information ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "character": {} } } ``` # Get character V-Matrix Source: https://docs.msu.io/msu-open-api/characters/get-character-vmatrix GET /v1rc1/characters/{assetKey}/vmatrix Retrieve character V-Matrix information using the character asset key ## Path parameters The character asset key ## Response Indicates if the request was successful Matrix points available Number of V-Core shards List of V-Matrix slot objects List of V-Matrix node objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/vmatrix' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/vmatrix', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/vmatrix" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "matrixPoint": 0, "vCoreShardCount": 0, "vMatrixSlots": [], "vMatrixNodes": [] } } ``` # Get character V-Matrix by token ID Source: https://docs.msu.io/msu-open-api/characters/get-character-vmatrix-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/vmatrix Retrieve character V-Matrix information using the character token ID ## Path parameters The character token ID ## Response Indicates if the request was successful Matrix points available Number of V-Core shards List of V-Matrix slot objects List of V-Matrix node objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/vmatrix' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/vmatrix', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/vmatrix" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "matrixPoint": 0, "vCoreShardCount": 0, "vMatrixSlots": [], "vMatrixNodes": [] } } ``` # Get character history mission list Source: https://docs.msu.io/msu-open-api/characters/list-character-history-missions GET /v1rc1/characters/{assetKey}/history-missions Retrieve character history mission information with optional filtering by main and sub categories ## Path parameters The character asset key ## Query parameters Filter by main category. Options: `HISTORY_MISSION_MAIN_CATEGORY_CHARACTER`, `HISTORY_MISSION_MAIN_CATEGORY_ITEM`, `HISTORY_MISSION_MAIN_CATEGORY_ADVENTURE`, `HISTORY_MISSION_MAIN_CATEGORY_BATTLE`, `HISTORY_MISSION_MAIN_CATEGORY_BLOCKCHAIN`, `HISTORY_MISSION_MAIN_CATEGORY_SOCIAL` Filter by sub category Pagination cursor for next page ## Response Indicates if the request was successful List of history mission objects Cursor for the next page Indicates if more results are available ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/history-missions?mainCategory=HISTORY_MISSION_MAIN_CATEGORY_CHARACTER' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/history-missions?mainCategory=HISTORY_MISSION_MAIN_CATEGORY_CHARACTER', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/history-missions" params = {"mainCategory": "HISTORY_MISSION_MAIN_CATEGORY_CHARACTER"} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` ## Notes * Pagination is supported, with 20 items per page # Get character history mission list by token ID Source: https://docs.msu.io/msu-open-api/characters/list-character-history-missions-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/history-missions Retrieve character history mission information with optional filtering by main and sub categories ## Path parameters The character token ID ## Query parameters Filter by main category. Options: `HISTORY_MISSION_MAIN_CATEGORY_CHARACTER`, `HISTORY_MISSION_MAIN_CATEGORY_ITEM`, `HISTORY_MISSION_MAIN_CATEGORY_ADVENTURE`, `HISTORY_MISSION_MAIN_CATEGORY_BATTLE`, `HISTORY_MISSION_MAIN_CATEGORY_BLOCKCHAIN`, `HISTORY_MISSION_MAIN_CATEGORY_SOCIAL` Filter by sub category Pagination cursor for next page ## Response Indicates if the request was successful List of history mission objects Cursor for the next page Indicates if more results are available ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/history-missions?mainCategory=HISTORY_MISSION_MAIN_CATEGORY_CHARACTER' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/history-missions?mainCategory=HISTORY_MISSION_MAIN_CATEGORY_CHARACTER', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/history-missions" params = {"mainCategory": "HISTORY_MISSION_MAIN_CATEGORY_CHARACTER"} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` ## Notes * Pagination is supported, with 20 items per page # Get character hyper-skill list Source: https://docs.msu.io/msu-open-api/characters/list-character-hyper-skills GET /v1rc1/characters/{assetKey}/hyper-skill Retrieve character hyper-skill information using the character asset key ## Path parameters The character asset key ## Response Indicates if the request was successful List of hyper-skill objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/hyper-skill' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/hyper-skill', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/hyper-skill" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "skills": [] } } ``` # Get character hyper-skill list by token ID Source: https://docs.msu.io/msu-open-api/characters/list-character-hyper-skills-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/hyper-skill Retrieve character hyper-skill information using the character token ID ## Path parameters The character token ID ## Response Indicates if the request was successful List of hyper-skill objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/hyper-skill' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/hyper-skill', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/hyper-skill" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "skills": [] } } ``` # Get character item list Source: https://docs.msu.io/msu-open-api/characters/list-character-items GET /v1rc1/characters/{assetKey}/items Retrieve a list of items owned by a character using the character asset key ## Path parameters The character asset key ## Query parameters Filter by category number Pagination cursor for next page ## Response Indicates if the request was successful List of item objects Cursor for the next page Indicates if more results are available ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/items?categoryNo=1' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/items?categoryNo=1', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/items" params = {"categoryNo": 1} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "elements": [], "nextCursor": "string", "hasMore": false } } ``` ## Notes * Pagination is supported, with 20 items per page # Get character item list by token ID Source: https://docs.msu.io/msu-open-api/characters/list-character-items-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/items Retrieve a list of items owned by a character using the character token ID ## Path parameters The character token ID ## Query parameters Filter by category number Pagination cursor for next page ## Response Indicates if the request was successful List of item objects Cursor for the next page Indicates if more results are available ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/items?categoryNo=1' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/items?categoryNo=1', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/items" params = {"categoryNo": 1} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "elements": [], "nextCursor": "string", "hasMore": false } } ``` ## Notes * Pagination is supported, with 20 items per page # Get character quest list Source: https://docs.msu.io/msu-open-api/characters/list-character-quests GET /v1rc1/characters/{assetKey}/quests Retrieve character quest information using the character asset key ## Path parameters The character asset key ## Response Indicates if the request was successful List of quest objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/quests' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/quests', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/quests" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "quests": [] } } ``` # Get character quest list by token ID Source: https://docs.msu.io/msu-open-api/characters/list-character-quests-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/quests Retrieve character quest information using the character token ID ## Path parameters The character token ID ## Response Indicates if the request was successful List of quest objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/quests' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/quests', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/quests" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "quests": [] } } ``` # Get character skill list Source: https://docs.msu.io/msu-open-api/characters/list-character-skills GET /v1rc1/characters/{assetKey}/skills Retrieve character skill information using the character asset key ## Path parameters The character asset key ## Response Indicates if the request was successful List of skill objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/{assetKey}/skills' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/{assetKey}/skills', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/{assetKey}/skills" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "skills": [] } } ``` # Get character skill list by token ID Source: https://docs.msu.io/msu-open-api/characters/list-character-skills-by-token-id GET /v1rc1/characters/by-token-id/{tokenId}/skills Retrieve character skill information using the character token ID ## Path parameters The character token ID ## Response Indicates if the request was successful List of skill objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/skills' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/skills', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/characters/by-token-id/{tokenId}/skills" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "skills": [] } } ``` # Retrieve all enhancement prices by item ID Source: https://docs.msu.io/msu-open-api/enhancement/get-dynamic-price GET /v1rc1/enhancement/items/{itemId}/dynamicprice Retrieves all enhancement prices (e.g. StarForce, Potential) for a given item using only its meta ID ## Path parameters The item meta ID ## Response Indicates if the request was successful StarForce enhancement prices by level Potential enhancement prices by level ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/enhancement/items/{itemId}/dynamicprice' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/enhancement/items/{itemId}/dynamicprice', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/enhancement/items/{itemId}/dynamicprice" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "currentPrices": { "starforce": {}, "potential": {} } } } ``` # MCP Proxy Request Source: https://docs.msu.io/msu-open-api/game-resource/get-mcp-proxy POST /v1rc1/resource/mcp Proxy request to MCP (Model Context Protocol) resources ## Body parameters Raw JSON-RPC 2.0 request body to forward to the MCP server MCP session ID ## Response Standard MCP JSON-RPC 2.0 response from the upstream MCP server. Content-Type may be `application/json` or `text/event-stream` (SSE). JSON-RPC version. Always `"2.0"` Request ID echoed from the original request Result payload. Shape depends on the MCP method called. Set only when a JSON-RPC error occurs. JSON-RPC error code Human-readable error message Additional error data ```bash cURL theme={null} curl --request POST \ --url 'https://openapi.msu.io/v1rc1/resource/mcp' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' \ --data '{ "rawBody": "{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\",\"id\":1}", "sessionId": "YOUR_SESSION_ID" }' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/resource/mcp', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' }, body: JSON.stringify({ rawBody: '{"jsonrpc":"2.0","method":"tools/list","id":1}', sessionId: 'YOUR_SESSION_ID' }) }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/resource/mcp" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } body = { "rawBody": '{"jsonrpc":"2.0","method":"tools/list","id":1}', "sessionId": "YOUR_SESSION_ID" } response = requests.post(url, headers=headers, json=body) data = response.json() ``` ```json Response theme={null} { "jsonrpc": "2.0", "id": 1, "result": {} } ``` ```json Error Response theme={null} { "jsonrpc": "2.0", "id": 1, "error": { "code": -32601, "message": "Method not found", "data": {} } } ``` # Get item category information Source: https://docs.msu.io/msu-open-api/gamemeta/get-item-category GET /v1rc1/gamemeta/items/{itemId}/category Retrieve category information for a specific item using its item ID ## Path parameters The item ID ## Response Indicates if the request was successful Item category information ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/category' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/category', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/category" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "category": {} } } ``` # Get equipment exclusive items Source: https://docs.msu.io/msu-open-api/gamemeta/get-item-exclusive GET /v1rc1/gamemeta/items/{itemId}/exclusive Retrieve a list of items that cannot be equipped simultaneously with the specified item. ## Path parameters The itemId to query ## Response Indicates if the request was successful items ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/exclusive' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/exclusive', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/exclusive" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "items": [] } } ``` # Get item metadata Source: https://docs.msu.io/msu-open-api/gamemeta/get-item-metadata GET /v1rc1/gamemeta/items/{itemId} Retrieve metadata for an item using its item ID ## Path parameters The item ID ## Response Indicates if the request was successful Item metadata object ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "item": {} } } ``` # Get item set information Source: https://docs.msu.io/msu-open-api/gamemeta/get-item-set GET /v1rc1/gamemeta/items/{itemId}/set Retrieve set information for a specific item using its item ID ## Path parameters The item ID ## Response Indicates if the request was successful Item set information ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/set' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/set', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/items/{itemId}/set" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "itemSet": {} } } ``` # Get quest metadata Source: https://docs.msu.io/msu-open-api/gamemeta/get-quest-metadata GET /v1rc1/gamemeta/quests/{questId} Retrieve metadata for a specific quest using its quest ID ## Path parameters The quest ID ## Response Indicates if the request was successful Quest metadata object ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/quests/{questId}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/quests/{questId}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/quests/{questId}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` # Get skill metadata Source: https://docs.msu.io/msu-open-api/gamemeta/get-skill-metadata GET /v1rc1/gamemeta/skills/{skillId} Retrieve metadata for a specific skill using its skill ID ## Path parameters The skill ID ## Query parameters Skill level ## Response Indicates if the request was successful Skill metadata object ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/skills/{skillId}?level=1' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/skills/{skillId}?level=1', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/skills/{skillId}" params = {"level": 1} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "skillMetadata": {} } } ``` # Get V-Matrix node skill metadata Source: https://docs.msu.io/msu-open-api/gamemeta/get-vmatrix-node-skill GET /v1rc1/gamemeta/vmatrix/{nodeId} Retrieve metadata for a specific V-Matrix node skill using its node ID ## Path parameters The V-Matrix node ID ## Query parameters Node level List of skill IDs ## Response Indicates if the request was successful Node ID Node name Node description Node level Node image URL List of skill objects ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/gamemeta/vmatrix/{nodeId}?level=1' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/gamemeta/vmatrix/{nodeId}?level=1', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/gamemeta/vmatrix/{nodeId}" params = {"level": 1} headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "nodeId": 0, "nodeName": "string", "nodeDesc": "string", "nodeLevel": 0, "nodeImageUrl": "string", "skills": [] } } ``` # Introduction Source: https://docs.msu.io/msu-open-api/introduction The MSU Open API provides read access to MapleStory Universe data — including accounts, characters, items, game metadata, and marketplace listings. Builders can use it to create tools, dashboards, and Synergy Apps that connect with the MSU ecosystem. * Base URL: [https://openapi.msu.io](https://openapi.msu.io)   ## **1. Authentication** All requests require an API key passed as a request header. | **Header** | **Type** | **Required** | **Value** | | :--------------- | :------- | :----------- | :-------------------- | | x-nxopen-api-key | string | Yes | Your MSU Open API key | * **Example**: x-nxopen-api-key: gw\_xxxxxxxxxxxxxxxxxx For instructions on how to obtain an API key, refer to the Getting Started with MSU Builder guide. Keep the API key secure. Do not expose it in public repositories or client-side code.    ## **2. Rate Limits** Rate limits are applied per API key. Higher limits are available upon request. | **Level** | **Rate Limit (RPS)** | **Quota (RPD)** | | :-------- | :------------------- | :-------------- | | Default | 2 RPS | 3,000 RPD | | Level 1 | 10 RPS | 50,000 RPD | | Level 2 | 30 RPS | 200,000 RPD | To request a limit increase, contact the MSU Builder Team at [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io). RPS = Requests Per Second, RPD = Requests Per Day. Quota resets daily at 00:00 UTC.    ## **3. Response Format** All responses use a common structure: * **Success:** ```json theme={null} {   "success": true,   "data": { ... },   "trace_id": "string" } ``` * **Error (4xx / 5xx):** ```json theme={null} {   "success": false,   "error": { "code": 0, "message": "string" },   "trace_id": "string" } ```   *** # Get NFT item information Source: https://docs.msu.io/msu-open-api/items/get-nft-item GET /v1rc1/items/{assetKey} Retrieve detailed NFT item information using the item asset key. ## Path parameters The assetKey to query ## Response Indicates if the request was successful item ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/{assetKey}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/{assetKey}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/{assetKey}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "item": {} } } ``` # Get NFT item information by token ID Source: https://docs.msu.io/msu-open-api/items/get-nft-item-by-token-id GET /v1rc1/items/by-token-id/{tokenId} Retrieve detailed NFT item information using the token id. ## Path parameters The tokenId to query ## Response Indicates if the request was successful item ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "item": {} } } ``` # Get NFT item history mission list Source: https://docs.msu.io/msu-open-api/items/list-nft-item-history-missions GET /v1rc1/items/{assetKey}/history-missions Retrieve a list of history missions for a specific NFT item using the item asset key. Pagination is supported, with 20 items per page. ## Path parameters The assetKey to query ## Query parameters cursor ## Response Indicates if the request was successful historyMissions nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions?cursor=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions?cursor=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions" params = { "cursor": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` # Get NFT item history mission list by token ID Source: https://docs.msu.io/msu-open-api/items/list-nft-item-history-missions-by-token-id GET /v1rc1/items/by-token-id/{tokenId}/history-missions Retrieve a list of history missions for a specific NFT item using the token id. Pagination is supported, with 20 items per page. ## Path parameters The tokenId to query ## Query parameters cursor ## Response Indicates if the request was successful historyMissions nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions?cursor=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions?cursor=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions" params = { "cursor": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` # Get representative NFT item history mission list Source: https://docs.msu.io/msu-open-api/items/list-nft-item-history-missions-representative GET /v1rc1/items/{assetKey}/history-missions/representative Retrieve a list of representative history missions for a specific NFT item using the item asset key. Pagination is supported, with 20 items per page. ## Path parameters The assetKey to query ## Query parameters cursor ## Response Indicates if the request was successful historyMissions nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions/representative?cursor=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions/representative?cursor=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/{assetKey}/history-missions/representative" params = { "cursor": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` # Get representative NFT item history mission list by token ID Source: https://docs.msu.io/msu-open-api/items/list-nft-item-history-missions-representative-by-token-id GET /v1rc1/items/by-token-id/{tokenId}/history-missions/representative Retrieve a list of representative history missions for a specific NFT item using the token ID. Pagination is supported, with 20 items per page. ## Path parameters The tokenId to query ## Query parameters cursor ## Response Indicates if the request was successful historyMissions nextCursor hasMore ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions/representative?cursor=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions/representative?cursor=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/items/by-token-id/{tokenId}/history-missions/representative" params = { "cursor": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "historyMissions": [], "nextCursor": "string", "hasMore": false } } ``` # Get Asset Valuation Source: https://docs.msu.io/msu-open-api/market/asset-valuation GET /v1rc1/market/valuation/asset Retrieve historical valuation data for a specific asset. Retrieve historical valuation data for a specific asset. Lookup can be performed by either `assetKey` or `itemId` (one is required). The `range` parameter defines the lookback period in days (30/90/180). Defaults to 90. ## Query parameters Asset key of the asset to query. Either `assetKey` or `itemId` is required. Item ID of the asset to query. Either `assetKey` or `itemId` is required. Lookback period in days. Accepted values: `30`, `90`, `180`. Defaults to `90`. ## Response Indicates if the request was successful Average trade price over the requested period Total number of trades over the requested period Aggregation reference date ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/market/valuation/asset?itemId=0&range=90' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/market/valuation/asset?itemId=0&range=90', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/market/valuation/asset" params = { "itemId": 0, "range": 90 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "avgPrice": 0, "tradeCount": "string", "date": "string" } } ``` # Explore Characters Source: https://docs.msu.io/msu-open-api/market/explore-characters GET /v1rc1/search/characters Explore NFT characters listed on the marketplace. ## Header parameters Auth token. When provided, search filters are applied; without it, filters are not applied. ## Query parameters Character name partial match (bidirectional wildcard, case-sensitive) Class filter. Use `all_classes` (default) for all classes Job filter. Includes all job advancement stages 1–5. Use `all_jobs` (default) to remove filter Minimum attack power threshold (inclusive). Positive integers only Minimum price (NESO, ≥0) Maximum price (NESO, ≥min) Minimum level Maximum level (≥min) Sort criterion (`HIGHEST_PRICE`, `LOWEST_PRICE`, `ENDING_SOON`, `RECENTLY_LISTED`, `HIGHEST_ATTACK_POWER`) Page number (starting from 1, default: 1) Page size (default: 30). Combined offset of `(pageNo-1) × pageSize` must not exceed 10,000 ## Response Indicates if the request was successful List of characters on sale Total result count Current page number Page size Whether this is the last page ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/search/characters?paginationParam.pageNo=1&paginationParam.pageSize=30' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/search/characters?paginationParam.pageNo=1&paginationParam.pageSize=30', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/search/characters" params = { "paginationParam.pageNo": 1, "paginationParam.pageSize": 30 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "characters": [], "paginationResult": { "totalCount": 0, "currPageNo": 1, "pageSize": 30, "isLastPage": true } } } ``` # Explore Items Source: https://docs.msu.io/msu-open-api/market/explore-items GET /v1rc1/search/items Explore NFT items listed on the marketplace. ## Header parameters Auth token. When provided, search filters are applied; without it, filters are not applied. ## Query parameters Item name partial match (bidirectional wildcard, case-sensitive) Minting number (exact match) Category number (exact match) Item meta ID (exact match) Class code filter (OR condition). Include `all_classes` to remove filter History achievement character name (exact match, case-sensitive) Color code filter for beauty/hair items (OR condition). Include `all_colors` to remove filter Pet skill code filter (OR condition) Minimum price (NESO, ≥0) Maximum price (NESO, ≥min) Minimum required level Maximum required level (≥min) Minimum Starforce (valid range: 0–25) Maximum Starforce Minimum Potential grade (0: Normal, 1: Rare, 2: Epic, 3: Unique, 4: Legendary) Maximum Potential grade Minimum additional Potential grade Maximum additional Potential grade Sort criterion (`HIGHEST_PRICE`, `LOWEST_PRICE`, `ENDING_SOON`, `RECENTLY_LISTED`) Page number (starting from 1, default: 1) Page size (default: 30). Combined offset of `(pageNo-1) × pageSize` must not exceed 10,000 ## Response Indicates if the request was successful List of items on sale Total result count Current page number Page size Whether this is the last page ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/search/items?paginationParam.pageNo=1&paginationParam.pageSize=30' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/search/items?paginationParam.pageNo=1&paginationParam.pageSize=30', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/search/items" params = { "paginationParam.pageNo": 1, "paginationParam.pageSize": 30 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "items": [], "paginationResult": { "totalCount": 0, "currPageNo": 1, "pageSize": 30, "isLastPage": true } } } ``` # Explore Nicknames Source: https://docs.msu.io/msu-open-api/market/explore-nicknames GET /v1rc1/search/nicknames Explore NFT nicknames listed on the marketplace. ## Header parameters Auth token. When provided, search filters are applied; without it, filters are not applied. ## Query parameters Nickname partial match (case-insensitive, internally normalized to lowercase) Nickname length filter (multi-select, OR condition) Minimum price (NESO, ≥0) Maximum price (NESO, ≥min) Character composition filter (`ALPHABET_ONLY`, `NUMERIC_ONLY`, `MIXED`) Sort criterion (`HIGHEST_PRICE`, `LOWEST_PRICE`, `ENDING_SOON`, `RECENTLY_LISTED`) Page number (starting from 1, default: 1) Page size (default: 30). Combined offset of `(pageNo-1) × pageSize` must not exceed 10,000 ## Response Indicates if the request was successful List of nickname NFTs on sale Total result count Current page number Page size Whether this is the last page ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/search/nicknames?paginationParam.pageNo=1&paginationParam.pageSize=30' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/search/nicknames?paginationParam.pageNo=1&paginationParam.pageSize=30', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/search/nicknames" params = { "paginationParam.pageNo": 1, "paginationParam.pageSize": 30 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "nicknames": [], "paginationResult": { "totalCount": 0, "currPageNo": 1, "pageSize": 30, "isLastPage": true } } } ``` # Get Item Valuation Source: https://docs.msu.io/msu-open-api/market/item-valuation GET /v1rc1/market/valuation/item Retrieve historical valuation data for a specific item, including lower and upper average trade prices. Retrieve historical valuation data for a specific item, including lower and upper average trade prices. The `range` parameter defines the lookback period in days (30/90/180). Defaults to 90. ## Query parameters Item ID to query Lookback period in days. Accepted values: `30`, `90`, `180`. Defaults to `90`. ## Response Indicates if the request was successful Lower average trade price over the requested period Upper average trade price over the requested period Total number of trades over the requested period Aggregation reference date ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/market/valuation/item?itemId=0&range=90' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/market/valuation/item?itemId=0&range=90', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/market/valuation/item" params = { "itemId": 0, "range": 90 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "avgBottomPrice": 0, "avgTopPrice": 0, "tradeCount": "string", "date": "string" } } ``` # Suggest Keywords Source: https://docs.msu.io/msu-open-api/market/suggest-keywords GET /v1rc1/search/suggest Retrieve autocomplete keyword suggestions based on a search keyword. Keywords shorter than 2 characters return an empty list without error. Keywords are case-insensitive (normalized to lowercase internally). Results are cached for 10 seconds per unique `(keyword, type, tokenType)` combination. ## Query parameters Search keyword (minimum 2 characters) Autocomplete type (`item`, `character`, `user`). Returns `400 INVALID_ARGUMENT` if not provided. Token type filter (`all`, `nft`, `ft`) Number of results to return ## Response Indicates if the request was successful List of autocomplete suggestions ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/search/suggest?keyword=sword&type=item' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/search/suggest?keyword=sword&type=item', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/search/suggest" params = { "keyword": "sword", "type": "item" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "suggestions": [] } } ``` # MSU OAuth 2.0 Guide Source: https://docs.msu.io/msu-open-api/oauth/msu-oauth-guide A complete guide for builder apps to implement the MSU OAuth 2.0 authorization flow — covering token issuance, refresh, introspection, and revocation.   This guide explains how builder apps can use the OAuth 2.0 Authorization Code Grant flow to obtain delegated user authorization and access MSU resources via the OpenAPI. It covers the full token lifecycle: issuance, refresh, introspection, and revocation. | Item | Value | | ----------------------- | ---------------------- | | **OAuth Server Domain** | `https://oauth.msu.io` | *** ## Overview Authenticate the user via Authorization Code Grant and issue Access Token and Refresh Token. Use the Refresh Token to renew an expired Access Token. Validate the Access Token and retrieve its metadata. Revoke the Refresh Token on logout. *** ## Sequence Diagram ```mermaid actions={true} theme={null} sequenceDiagram participant Owner as User participant Client as Builder App participant AS as OAuth Server participant RS as MSU Server rect rgb(219, 234, 254) note over Owner, RS: [Phase 1] User Authentication & Token Issuance Owner->>Client: Login request Client->>+AS: Authorization Code request (GET /oauth/authorize) alt User is not logged in AS-->>-Client: Redirect to login page Client->>+RS: Login page request RS-->>-Owner: Provide login screen Owner->>+RS: Login RS-->>-Client: Login success response Client->>+AS: Re-request Authorization Code (GET /oauth/authorize) end AS-->>-Client: Deliver Authorization Code (Redirect) Client->>+AS: Token issuance request (POST /oauth/token) AS-->>-Client: Deliver Access Token & Refresh Token end rect rgb(254, 243, 199) note over Client, AS: [Phase 2] Token Refresh Client->>+AS: Token refresh request (POST /oauth/token) AS-->>-Client: Issue new Access Token & Refresh Token end rect rgb(209, 250, 229) note over Client, AS: [Phase 3] Token Introspection Client->>+AS: Token introspection request (POST /oauth/introspect) AS-->>-Client: Return token introspection result end rect rgb(255, 228, 230) note over Client, AS: [Phase 4] Token Revocation Client->>+AS: Token revocation request (POST /oauth/revoke) AS-->>-Client: Token revocation success response end ``` *** ## Phase 1 — User Authentication & Token Issuance The user clicks the login button in the builder app. The builder app redirects to the OAuth server's authorization endpoint (`/oauth/authorize`) to obtain an Authorization Code. The request includes the app's OAuth Client ID and Redirect URI as query parameters. ```json theme={null} GET https://oauth.msu.io/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI} ``` The `redirect_uri` must exactly match the URI registered with the OAuth client. The OAuth server detects that the user has no valid session and redirects the browser to the login page. The user's browser requests the login page from the MSU server following the redirect. The MSU server serves a wallet address-based login form to the user's browser. The user submits a login request to the MSU server using their wallet address. The MSU server processes the login and returns a success response. After login is complete, the builder app re-requests an Authorization Code from the OAuth server. ```json theme={null} GET https://oauth.msu.io/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI} ``` The OAuth server redirects to the `redirect_uri` provided in the request, delivering the Authorization Code. ```json theme={null} {REDIRECT_URI}?code={AUTHORIZATION_CODE} ``` The builder app sends the Authorization Code to the OAuth token endpoint (`/oauth/token`) with client credentials via HTTP Basic Auth. ```json theme={null} POST https://oauth.msu.io/oauth/token Content-Type: application/x-www-form-urlencoded Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET}) grant_type=authorization_code&code={AUTHORIZATION_CODE}&redirect_uri={REDIRECT_URI} ``` The OAuth server validates the Authorization Code and client credentials, then issues and returns the tokens. ```json theme={null} { "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 600, "refresh_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "scope": "enhancement" } ``` *** ## Phase 2 — Token Refresh When the Access Token expires, use the Refresh Token to request a new one from the OAuth token endpoint (`/oauth/token`). ```json theme={null} POST https://oauth.msu.io/oauth/token Content-Type: application/x-www-form-urlencoded Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET}) grant_type=refresh_token&refresh_token={REFRESH_TOKEN} ``` The OAuth server validates the Refresh Token and issues a new Access Token and Refresh Token. ```json theme={null} { "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 600, "refresh_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "scope": "enhancement" } ``` *** ## Phase 3 — Token Introspection To verify whether an Access Token is valid, send a request to the OAuth Introspect endpoint (`/oauth/introspect`). ```json theme={null} POST https://oauth.msu.io/oauth/introspect Content-Type: application/x-www-form-urlencoded Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET}) token={ACCESS_TOKEN}&token_type_hint=access_token ``` The OAuth server returns the validation result along with token metadata such as issuer, expiration, and subject. ```json theme={null} { "active": true, "client_id": "e5451c6e-7bc1-4ec3-bd9c-98c18a7d3290", "exp": 1781673359, "iat": 1781672759, "iss": "NEXPACE", "jti": "b8ddec65-3697-441c-a118-fa31a08ccb42", "scope": "enhancement", "sub": "0x1234567890AbcdEF1234567890aBcdef12345678", "token_type": "Bearer" } ``` *** ## Phase 4 — Token Revocation To invalidate a Refresh Token, send a request to the OAuth Revoke endpoint (`/oauth/revoke`). ```json theme={null} POST https://oauth.msu.io/oauth/revoke Content-Type: application/x-www-form-urlencoded Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET}) token={REFRESH_TOKEN}&token_type_hint=refresh_token ``` The OAuth server invalidates the token and returns a success response (`200 OK`). *** For detailed API specifications of each endpoint, refer to the individual pages under the **OAuth** section.   ***   # Authorization Code Request Source: https://docs.msu.io/msu-open-api/oauth/oauth-authorize GET /oauth/authorize Redirect the user to authenticate and obtain an Authorization Code. Redirects the user's browser to authenticate and grant permissions. On success, issues a one-time Authorization Code to the registered `redirect_uri`. ## Query parameters Unique client identifier issued during app registration. Callback URL to receive the Authorization Code. Must exactly match the URI registered with the OAuth client. Must be fixed value `code`. Recommended. Random unique string for CSRF protection. Returned as-is in the redirect callback. PKCE code challenge (43–128 chars). Required if `code_challenge_method` is provided. PKCE method (`plain` or `S256`). Required if `code_challenge` is provided. ## Response On success, the user's browser is redirected to the `redirect_uri` with the Authorization Code. On error, the browser is redirected to an error page. One-time Authorization Code. Pass this to `POST /oauth/token` to obtain tokens. Echoed back from the request. Use this to verify the response integrity. ```bash cURL theme={null} curl --request GET \ --url 'https://oauth.msu.io/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}' ``` ```javascript JavaScript theme={null} const params = new URLSearchParams({ client_id: '{CLIENT_ID}', redirect_uri: '{REDIRECT_URI}', response_type: 'code', state: '{STATE}' }); window.location.href = `https://oauth.msu.io/oauth/authorize?${params}`; ``` ```python Python theme={null} import urllib.parse params = urllib.parse.urlencode({ "client_id": "{CLIENT_ID}", "redirect_uri": "{REDIRECT_URI}", "response_type": "code", "state": "{STATE}" }) redirect_url = f"https://oauth.msu.io/oauth/authorize?{params}" ``` ```http Response theme={null} HTTP/1.1 302 Found Location: {REDIRECT_URI}?code={AUTHORIZATION_CODE}&state={STATE} ``` # Token Introspection Source: https://docs.msu.io/msu-open-api/oauth/oauth-introspect POST /oauth/introspect Validate an Access Token and retrieve its metadata. Validates an Access Token and returns its metadata. Returns `"active": false` for expired or invalid tokens. ## Header parameters Must be `application/x-www-form-urlencoded`. Client credentials encoded in Base64: `Basic base64({CLIENT_ID}:{CLIENT_SECRET})`. ## Body parameters The Access Token to validate. Token type hint. Fixed value `access_token`. ## Response Whether the token is valid and active. Returns `false` for expired or invalid tokens. Client ID the token was issued for. Token expiration time (Unix timestamp). Token issuance time (Unix timestamp). Token issuer. Unique token identifier. Granted permission scopes. Wallet address of the token subject. Token type. Always `Bearer`. ```bash cURL theme={null} curl --request POST \ --url 'https://oauth.msu.io/oauth/introspect' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET})' \ --data 'token={ACCESS_TOKEN}&token_type_hint=access_token' ``` ```javascript JavaScript theme={null} const response = await fetch('https://oauth.msu.io/oauth/introspect', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa('{CLIENT_ID}:{CLIENT_SECRET}')}` }, body: new URLSearchParams({ token: '{ACCESS_TOKEN}', token_type_hint: 'access_token' }) }); const data = await response.json(); ``` ```python Python theme={null} import requests import base64 credentials = base64.b64encode(b'{CLIENT_ID}:{CLIENT_SECRET}').decode() response = requests.post( 'https://oauth.msu.io/oauth/introspect', headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': f'Basic {credentials}' }, data={ 'token': '{ACCESS_TOKEN}', 'token_type_hint': 'access_token' } ) data = response.json() ``` ```json Valid Token theme={null} { "active": true, "client_id": "e5451c6e-7bc1-4ec3-bd9c-98c18a7d3290", "exp": 1781673359, "iat": 1781672759, "iss": "NEXPACE", "jti": "b8ddec65-3697-441c-a118-fa31a08ccb42", "scope": "enhancement", "sub": "0x1234567890AbcdEF1234567890aBcdef12345678", "token_type": "Bearer" } ``` ```json Expired or Invalid Token theme={null} { "active": false } ``` # JWK Set Source: https://docs.msu.io/msu-open-api/oauth/oauth-jwkset GET /.well-known/jwks.json Retrieve the public key list used to verify Access Token signatures. Returns the public key list used to verify Access Token signatures, in JWK Set format. Use these public keys to verify the signature and integrity of Access Tokens. ## Response List of public keys in JWK format. Key type. Always `RSA`. Key ID. Used to identify which key was used to sign the token. Intended use of the key. Always `sig` (signature). Algorithm. Always `RS256`. RSA public key modulus (Base64URL encoded). RSA public key exponent (Base64URL encoded). ```bash cURL theme={null} curl --request GET \ --url 'https://oauth.msu.io/.well-known/jwks.json' \ --header 'Content-Type: application/json' ``` ```javascript JavaScript theme={null} const response = await fetch('https://oauth.msu.io/.well-known/jwks.json'); const data = await response.json(); ``` ```python Python theme={null} import requests response = requests.get('https://oauth.msu.io/.well-known/jwks.json') data = response.json() ``` ```json Response theme={null} { "keys": [ { "kty": "RSA", "kid": "msu-oauth", "use": "sig", "alg": "RS256", "n": "qdv0bvFFiXcOd86MazNh...", "e": "AQAB" } ] } ``` # Token Revocation Source: https://docs.msu.io/msu-open-api/oauth/oauth-revoke POST /oauth/revoke Revoke a Refresh Token. Typically called on user logout. Revokes a Refresh Token, invalidating it immediately. Typically called when the user logs out. ## Header parameters Must be `application/x-www-form-urlencoded`. Client credentials encoded in Base64: `Basic base64({CLIENT_ID}:{CLIENT_SECRET})`. ## Body parameters The Refresh Token to revoke. Token type hint. Fixed value `refresh_token`. ## Response Returns `200 OK` on success. No response body. ```bash cURL theme={null} curl --request POST \ --url 'https://oauth.msu.io/oauth/revoke' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET})' \ --data 'token={REFRESH_TOKEN}&token_type_hint=refresh_token' ``` ```javascript JavaScript theme={null} const response = await fetch('https://oauth.msu.io/oauth/revoke', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa('{CLIENT_ID}:{CLIENT_SECRET}')}` }, body: new URLSearchParams({ token: '{REFRESH_TOKEN}', token_type_hint: 'refresh_token' }) }); ``` ```python Python theme={null} import requests import base64 credentials = base64.b64encode(b'{CLIENT_ID}:{CLIENT_SECRET}').decode() response = requests.post( 'https://oauth.msu.io/oauth/revoke', headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': f'Basic {credentials}' }, data={ 'token': '{REFRESH_TOKEN}', 'token_type_hint': 'refresh_token' } ) ``` ```http Response theme={null} HTTP/1.1 200 OK ``` # Token Issuance & Refresh Source: https://docs.msu.io/msu-open-api/oauth/oauth-token POST /oauth/token Issue a new Access Token and Refresh Token using an Authorization Code, or refresh an expired Access Token using a Refresh Token. Issues a new Access Token and Refresh Token using an Authorization Code (`authorization_code`), or refreshes an expired Access Token using a Refresh Token (`refresh_token`). ## Header parameters Must be `application/x-www-form-urlencoded`. Client credentials encoded in Base64: `Basic base64({CLIENT_ID}:{CLIENT_SECRET})`. ## Body parameters Token grant type. Must be `authorization_code` or `refresh_token`. Required when `grant_type=authorization_code`. The Authorization Code received from `/oauth/authorize`. Required when `grant_type=authorization_code`. Must exactly match the URI used in the Authorization Code request. Required when `grant_type=refresh_token`. The Refresh Token to use for renewal. PKCE code verifier. Required if a `code_challenge` was provided in the Authorization Code request. ## Response Access Token. Used as a Bearer token in API calls. Token type. Always `Bearer`. Access Token validity period in seconds (600 seconds = 10 minutes). Refresh Token. Used to renew the Access Token. Valid for 3 hours. Space-separated list of granted permission scopes. ```bash cURL (Authorization Code) theme={null} curl --request POST \ --url 'https://oauth.msu.io/oauth/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET})' \ --data 'grant_type=authorization_code&code={AUTHORIZATION_CODE}&redirect_uri={REDIRECT_URI}' ``` ```bash cURL (Refresh Token) theme={null} curl --request POST \ --url 'https://oauth.msu.io/oauth/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: Basic base64({CLIENT_ID}:{CLIENT_SECRET})' \ --data 'grant_type=refresh_token&refresh_token={REFRESH_TOKEN}' ``` ```javascript JavaScript theme={null} const response = await fetch('https://oauth.msu.io/oauth/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa('{CLIENT_ID}:{CLIENT_SECRET}')}` }, body: new URLSearchParams({ grant_type: 'authorization_code', code: '{AUTHORIZATION_CODE}', redirect_uri: '{REDIRECT_URI}' }) }); const data = await response.json(); ``` ```python Python theme={null} import requests import base64 credentials = base64.b64encode(b'{CLIENT_ID}:{CLIENT_SECRET}').decode() response = requests.post( 'https://oauth.msu.io/oauth/token', headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': f'Basic {credentials}' }, data={ 'grant_type': 'authorization_code', 'code': '{AUTHORIZATION_CODE}', 'redirect_uri': '{REDIRECT_URI}' } ) data = response.json() ``` ```json Response theme={null} { "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 600, "refresh_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Im1zdS1vYXV0aCIsInR5cCI6IkpXVCJ9...", "scope": "enhancement" } ``` # Get Character Raffle Information Source: https://docs.msu.io/msu-open-api/rewards/get-character-raffles GET /v1rc1/msn/characters/{characterAssetKey}/raffles Retrieve raffle participation status for a specific character (before the draw). ## Path parameters The characterAssetKey ## Query parameters walletAddress ## Response Indicates if the request was successful walletAddress characterAssetKey informations updatedAt ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles?walletAddress=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles?walletAddress=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles" params = { "walletAddress": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "walletAddress": "string", "characterAssetKey": "string", "informations": [], "updatedAt": "string" } } ``` # Get Character Raffle History Source: https://docs.msu.io/msu-open-api/rewards/get-character-raffles-history GET /v1rc1/msn/characters/{characterAssetKey}/raffles/history Retrieve the raffle participation history for a character (up to 30 days after drawing). ## Path parameters The character asset key ## Query parameters Wallet address Raffle time to query (ISO8601 format). Must be within 30 days after the raffle. ## Response Indicates if the request was successful Wallet address Character asset key List of raffle histories Data update time (ISO8601) ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history?wallet_address=string&raffled_at=string' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history?wallet_address=string&raffled_at=string', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history" params = { "wallet_address": "string", "raffled_at": "string" } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "walletAddress": "string", "characterAssetKey": "string", "histories": [], "updatedAt": "string" } } ``` # Get Layer Static Data Source: https://docs.msu.io/msu-open-api/rewards/get-layer-static POST /v1rc1/msn/layers/static Retrieve static data for layers including level ranges and layer names. ## Response Indicates if the request was successful staticDatas expiredAt ```bash cURL theme={null} curl --request POST \ --url 'https://openapi.msu.io/v1rc1/msn/layers/static' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' \ --data '{}' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/layers/static', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' }, body: JSON.stringify({}) }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/layers/static" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.post(url, headers=headers, json={}) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "staticDatas": [], "expiredAt": "string" } } ``` # Get Reward History Source: https://docs.msu.io/msu-open-api/rewards/get-reward-history POST /v1rc1/msn/rewards/{worldId}/history Retrieve reward draw history (up to 30 days after the draw). ## Path parameters The worldId ## Response Indicates if the request was successful worldId rewardHistories updatedAt ```bash cURL theme={null} curl --request POST \ --url 'https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' \ --data '{}' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' }, body: JSON.stringify({}) }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.post(url, headers=headers, json={}) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "worldId": null, "rewardHistories": {}, "updatedAt": "string" } } ``` # Get Reward Information Source: https://docs.msu.io/msu-open-api/rewards/get-reward-information POST /v1rc1/msn/rewards/{worldId} Retrieve reward status information including drop rates, inventory for fields, bosses, and contents. ## Path parameters The worldId ## Response Indicates if the request was successful worldId rewardInformations updatedAt ```bash cURL theme={null} curl --request POST \ --url 'https://openapi.msu.io/v1rc1/msn/rewards/{worldId}' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' \ --data '{}' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/rewards/{worldId}', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' }, body: JSON.stringify({}) }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/rewards/{worldId}" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.post(url, headers=headers, json={}) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "worldId": null, "rewardInformations": {}, "updatedAt": "string" } } ``` # Get Server Info Source: https://docs.msu.io/msu-open-api/rewards/get-server-info GET /v1rc1/msn/server Retrieve server information for specified worlds including world ID, world name, and server state. ## Query parameters List of world IDs to query ## Response Indicates if the request was successful List of server information per world ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/msn/server?world_id=1' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/server?world_id=1', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/server" params = { "world_id": 1 } headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, params=params, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "informations": [] } } ``` # Stream Character Raffle History Source: https://docs.msu.io/msu-open-api/rewards/stream-character-raffle-history GET /v1rc1/msn/characters/{characterAssetKey}/raffles/history/stream Stream raffle participation history for a specific character as chunked response (up to 30 days after the draw). ## Path parameters The character asset key ## Query parameters Wallet address Start of the raffle time range to query (ISO8601 format) End of the raffle time range to query (ISO8601 format) ## Response Indicates if the request was successful Wallet address Character asset key List of raffle histories Data update time (ISO8601) ```bash cURL theme={null} curl --request GET \ --url 'https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history/stream' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history/stream', { method: 'GET', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' } }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/characters/{characterAssetKey}/raffles/history/stream" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } response = requests.get(url, headers=headers) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "walletAddress": "string", "characterAssetKey": "string", "histories": [], "updatedAt": "string" } } ``` # Stream Reward History Source: https://docs.msu.io/msu-open-api/rewards/stream-reward-history POST /v1rc1/msn/rewards/{worldId}/history/stream Stream reward draw history as chunked response (up to 30 days after the draw). ## Path parameters World ID ## Body parameters List of layer conditions to query (specify either `layer_id` or `layer_type`) Time range of raffles to query Start of the raffle time range (ISO8601 format) End of the raffle time range (ISO8601 format) ## Response Indicates if the request was successful World ID Raffle history list Data update time (ISO8601) ```bash cURL theme={null} curl --request POST \ --url 'https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history/stream' \ --header 'Content-Type: application/json' \ --header 'x-nxopen-api-key: YOUR_API_KEY' \ --data '{ "layerDescs": [], "raffledAtInterval": { "from": "string", "to": "string" } }' ``` ```javascript JavaScript theme={null} const response = await fetch('https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history/stream', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-nxopen-api-key': 'YOUR_API_KEY' }, body: JSON.stringify({ layerDescs: [], raffledAtInterval: { from: "string", to: "string" } }) }); const data = await response.json(); ``` ```python Python theme={null} import requests url = "https://openapi.msu.io/v1rc1/msn/rewards/{worldId}/history/stream" headers = { "x-nxopen-api-key": "YOUR_API_KEY" } body = { "layerDescs": [], "raffledAtInterval": { "from": "string", "to": "string" } } response = requests.post(url, headers=headers, json=body) data = response.json() ``` ```json Response theme={null} { "success": true, "data": { "worldId": 0, "rewardHistories": {}, "updatedAt": "string" } } ``` # MCP Setup Guide Source: https://docs.msu.io/msu-resources/mcp-setup-guide   ## 1. What is Resource MCP? Resource MCP is a Model Context Protocol server provided by MSU that allows Builders to search and use MapleStory Universe game resource assets directly from AI-powered development tools. Once configured, Builders can query tens of thousands of in-game assets — including Monsters, NPCs, Items, Skills, and Backgrounds — using natural language, without leaving their development environment.   ## 2. Prerequisites * An MSU Builder API key is required to use the Resource MCP. * The API key is used for authentication when making MCP calls. For instructions on obtaining an API key, refer to the Getting Started with [**MSU Builder guide**](https://docs.msu.io/msu-builder/get-started). The default rate limit is set conservatively. To request an increase, contact the MSU Builder Team at [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io).   ## 3. Configuration Add the following configuration to the MCP settings file of the AI tool you are using: ```json theme={null} { "mcpServers": { "maple-lookup": { "type": "http", "url": "", "headers": { "x-nxopen-api-key": "YOUR_API_KEY" }, "metadata": { "usage": { "initialization": "Standard MCP HTTP flow: (1) initialize request -> get mcp-session-id header, (2) send notifications/initialized with session-id, (3) call tools/list or tools/call", "imageSearch": "For image similarity: download CDN image, base64 encode, pass to search_similar with image_data parameter", "notes": [ "Session ID must be included in mcp-session-id header after initialization", "notifications/initialized is required before tools can be called", "Image files may not be available on server - use image_data with base64 for external images", "search_similar with image_path may fail if files not in /mnt/efs/data - use CDN URL + base64 instead" ] } } } } } ``` ### Configuration Fields * **type**: MCP connection method (http) * **url**: The MCP endpoint provided by MSU Open API * **x-nxopen-api-key**: Your MSU Builder API key   ## 4. Usage Once the MCP configuration is complete, Builders can search for resources using natural language queries in their AI tool. The following search types are supported: * Keyword search — Finds resources by exact or partial name match * Semantic search — Finds resources by meaning and context, even without an exact name * Hybrid search — Combines keyword and semantic search for broader results **Example queries** * "Please find the red sword item" * "Please search for cute chair images." * "Show me the pink character sprite" The AI tool will internally call the MCP and return matching results.   ## 5. Available Features Resource MCP provides the following features: * Resource search * Category lookup * Tag lookup * Image-based similarity search * Sprite data lookup * Category-based listing * Image URL retrieval   ## 6. Notes ### 6.1. MCP Is a Development Tool * Resource MCP is intended for use during AI-assisted development workflows. * It is not designed for production services or end-user-facing applications. ### 6.2. API Key Security * Keep the API key secure and do not expose it publicly. * Do not include the API key in source code repositories. * If the key is compromised, reissue it immediately. ### 6.3. Result Accuracy * Search results are returned based on keyword matching and similarity scoring. * Results may not always match the intended output. For more accurate results, provide specific and detailed search conditions.   *** # MSU Resources Skill Guide Source: https://docs.msu.io/msu-resources/msu-resource-skill-guide   ## 1. What is MSU Resource Skill? MSU Resource Skill is a standardized set of reference instructions and resources that helps AI agents find and use MapleStory Universe game resource assets when building Synergy Apps. Once installed and connected to Resource MCP, Builders can ask their AI agent to discover and use in-game assets — including Monsters, NPCs, Items, Skills, and Backgrounds — using natural language, directly within their development environment. MSU Resource Skill does not supply game resources directly. It works as a reference and support layer that connects your AI agent to the Resource MCP.   ## 2. Prerequisites Before installing MSU Resource Skill, make sure the following are in place: * Node.js 18 or later * git * An MSU Builder API key — required for Resource MCP authentication * A connected Resource MCP instance   ## 3. Installation Install MSU Resource Skill by running the following command: ```jsx theme={null} npx skills add NEXPACE-Limited/msu-skills ```   ## 4. Configuration To use MSU Resource Skill, an MSU Builder API key and a connected Resource MCP instance are required. * For API key issuance, refer to the Getting Started with [MSU Builder guide.](https://docs.msu.io/msu-builder/get-started) * For Resource MCP configuration, refer to the [MSU Resource MCP Setup Guide](https://docs.msu.io/msu-resources/mcp-setup-guide).   ## **5. Quick Start** After installing MSU Resource Skill and connecting Resource MCP, ask your AI agent to use MapleStory Universe resources while building a game. **Example prompts** * "Please build a web view featuring three moving Orange Mushrooms." * "Please write Phaser3 code for a MapleStory character walking across the screen, wearing Toben Hair, Defiant Face, Blue Cloth Pants, and a White Undershirt, and holding a Sword."   ## 6. FAQ ### What is MSU Resource Skill? MSU Resource Skill helps AI agents use MapleStory Universe resources when building games. It provides the agent with instructions and reference information for working with those resources. ### Which AI agents can I use? Any AI agent that supports Skills and MCP can be used. For example, Claude Code and other compatible AI coding agents are supported. ### Do I need an API key? Yes. Resource MCP requires an MSU Builder API key. ### Do I need to connect Resource MCP? Yes. Resource MCP is required to use MSU Resource Skill. ### Can the AI agent make mistakes? Yes. AI-generated outputs can be incomplete, outdated, or incorrect. Always review generated code, selected resources, and final outputs before publishing or sharing them.   **Important Notes** * Resource Skills are provided solely as part of the infrastructure supporting the Open API made available by Nexpace, to help your AI agent discover and use MSU game resources when creating and operating Synergy Apps. They are a reference and support layer only: they do not themselves supply game resources, do not operate or control your AI, and do not generate any outputs. They are provided on an "as is" and "as available" basis and may be updated, limited, suspended, or discontinued at any time without notice or liability. * Your use of Resource Skills is subject to the MSU API Terms and all other applicable Builder-related terms (including the Builder Terms and EULA), as well as all applicable laws and regulations. In the event of any conflict, the terms governing the Open API and the MSU API Terms shall prevail. * Resource Skills rely on a valid MSU Builder API key and a connected Resource MCP. Your access may be limited, suspended, or terminated at any time — including if your API key is suspended or expired, you exceed applicable rate limits or quotas, or you violate any applicable terms — and Nexpace shall have no liability for any resulting interruption, loss, or damage. * Resource Skills are provided for reference purposes only. Any outputs, recommendations, code, or actions are produced by your AI — a third party that Nexpace does not control — and may be inaccurate, incomplete, non-compliant, or infringing. You must independently review, test, and validate all such outputs and actions before relying on or executing them. You are solely responsible for ensuring that your Synergy App and its use of MSU game resources comply with all applicable terms and laws. * You are solely responsible for securing your API key, MCP connection, and any related wallet or account access made available to your AI agent. Nexpace is not responsible for any loss, theft, unauthorized use, or compromise of such credentials or data. * Resource Skills are owned by, or licensed to, Nexpace and are protected by applicable copyright laws, MapleStory Universe policies, and terms of use. You are granted only a limited, non-exclusive, non-transferable, revocable right to use Resource Skills for the creation and operation of Synergy Apps. You may not reverse engineer, decompile, extract, or otherwise derive the source or structure of Resource Skills, or distribute, resell, sublicense, or make them available to any third party without prior written approval from Nexpace. * You may not use Resource Skills, or any MSU game resources accessed through them, to train, fine-tune, or develop any AI or machine-learning model, dataset, or service, or to create any product or service that competes with or substitutes for Resource Skills or the Open API. * Resource Skills are provided without warranties of any kind, including accuracy, completeness, reliability, or fitness for a particular purpose. To the maximum extent permitted by applicable law, neither Nexpace nor its affiliates shall be liable for any direct, indirect, incidental, consequential, or other damages arising from your use of Resource Skills.   *** # MSU Resources Search Guide Source: https://docs.msu.io/msu-resources/msu-resources-search-guide MSU Resource Search Beta H MSU Resource Search Beta H   ## **1. What is MSU Resource Search?** MSU Resource Search is a tool where you can browse, preview, and export game resource assets from MapleStory Universe. Using MSU Resource Search, you can search across tens of thousands of in-game assets — including Monsters, NPCs, Items, Skills, and Backgrounds — and preview their animations directly in the browser. Each resource can be exported as a spritesheet or accessed via CDN link for use in external projects. MSU Resource Search is currently in Beta, and the asset library is continuously updated. You can access it at [resource-search.msu.io](http://resource-search.msu.io).   ## **2. MSU Resource Search Layout** The MSU Resource Search interface is divided into three main areas: Resources 01 * Search & Filter Panel (left): Contains the search bar, category filter tabs, and the resource result grid. * Preview Panel (center): Displays the animation preview of the selected resource, along with its action tabs, sound information, and playback controls. * Resource Detail Panel (right): Shows metadata for the selected resource, including type, category, display name, animation info, and tags.   ## **3. Searching for Resources** ### 3.1. Search Bar Enter a keyword in the search bar at the top of the page and click the Search button (or press Enter) to find resources by name. The result count will be displayed below the filter tabs. To clear the current search, click the X icon inside the search bar. ### 3.2. Category Filter Tabs You can filter results by resource category using the tabs below the search bar: | **Tab** | **Description** | | :--------- | :------------------------------------------------------- | | All | Shows all resource types across every category | | Monster | In-game monster characters (e.g., Snail, Blue Snail) | | NPC | Non-player characters (e.g., Roger, Athena Pierce) | | Item | Equippable and usable in-game items | | Skill | Skill icons and animations (e.g., Blessing of the Fairy) | | Background | Map background images with dimension info (e.g., 96×48) | Multiple category tabs can be active at the same time. Click an already-selected tab to deselect it. ### 3.3. Resource Result Grid Search results are displayed as cards in a scrollable grid. Each card shows: Resources 02 * A category badge (e.g., Monster, NPC, Item, Skill, Background) in the top-left corner * The resource thumbnail (animation preview image) * The resource name below the thumbnail * The asset ID with a copy icon in the bottom-left * For Background resources, the image dimensions (e.g., 96×48) are displayed as an additional badge * A Copy asset ID button (the icon in the bottom-right corner of each card) that copies the resource's asset ID to the clipboard Click any card to select that resource and load it in the Preview Panel.   ## 4. Previewing Resources When you select a resource from the result grid, the Preview Panel in the center of the screen. Resources 03 ### 4.1. Resource Header At the top of the Preview Panel, you can see: * The resource name and asset ID badge (click the badge to copy the ID) * The resource type (e.g., Animation) and category (e.g., Monster, Skill) * The frame count (e.g., 16f) * The CDN button and Export button on the right side ### 4.2. Action Tabs Below the header, action tabs let you switch between different animation states for the selected resource. For example, a Monster resource may have the following action tabs: * stand — Idle standing animation * move — Walking or moving animation * hit1 — Hit/damaged animation * die1 — Death animation Skill resources may have tabs such as icon, iconDisabled, and iconMouseOver. Click each tab to switch the animation playing in the preview canvas. ### 4.3. Sounds Panel If the selected resource has associated sound effects, the Sounds panel appears in the top-left of the preview area. Each sound entry shows: * The sound name (e.g., Damage, Die) * A Play button to listen to the sound directly in the browser * A CDN link button to open the audio file URL * A Copy URL button to copy the audio CDN link to the clipboard ### 4.4. Animation Playback Controls At the bottom of the preview canvas, you can control the animation playback: * Play / Pause button — Toggle animation playback * Speed controls — Set playback speed: 0.25x, 0.5x, 1x (default), 2x, 4x * Frame selector — Click individual frame thumbnails at the bottom of the panel to jump to a specific frame. The current frame number and total frames (e.g., 3 / 5) are displayed. ### 4.5. Canvas Controls In the top-right corner of the preview canvas: * Fit to view — Resets the canvas to show the full animation in view * Zoom in / Zoom out — Adjust the canvas zoom level * Actual size — Resets zoom to 100% The current zoom level is shown on the right (e.g., 200%). A ruler (in px) is displayed along the canvas edge for reference.   ## 5. Resource Detail Panel The Resource Detail Panel on the right side of the screen displays metadata for the currently selected resource. Resources 04 ### 5.1. Basic Info | **Field** | **Description** | | :-------- | :------------------------------------------------ | | Type | The resource type (e.g., Animation) | | Category | The resource category (e.g., Monster, Skill, NPC) | | dname | The display name of the resource | ### 5.2. Animation Info | **Field** | **Description** | | :-------- | :------------------------------------------------------------ | | Frames | Total number of animation frames | | Actions | Total number of action states (e.g., stand, move, hit1, die1) | ### 5.3. Tags Tags are displayed as badge chips (e.g., #bodyAttack, #tier:low). Tags can be used as reference for categorizing or filtering resources programmatically. ### 5.4. Expanding the Resource Detail Panel Click the > icon at the top-right of the Resource Detail Panel to collapse it, giving the Preview Panel more horizontal space. Click again to restore it.   ## 6. CDN — Copying the Resource CDN Link Click the CDN button in the Preview Panel header to copy the CDN URL of the currently selected resource animation to the clipboard. The button briefly shows "Copied!" to confirm the action. This CDN link points directly to the resource file hosted on MSU's static resource server and can be used to reference assets in external applications or projects.   ## 7. Similar Resources At the bottom of the Preview Panel, the Similar Resources section displays up to 11 visually or contextually related assets. Each entry shows the resource's category badge, thumbnail, name, and a similarity percentage score. Click any item in the Similar Resources list to select it and load its details in the Preview Panel.   **Important Notes** All assets available through MSU Resource Search — including monsters, NPCs, items, skills, backgrounds, sprites, animations, sound effects(where applicable), and associated metadata (collectively, the "Assets") — are the intellectual property of Nexpace Limited and/or its affiliates and licensors and are protected by copyright, trademark, and other applicable laws. All rights are reserved. * **Eligibility and permitted use:** Subject to your compliance with this notice and the terms referenced below, Nexpace grants you a non-exclusive, revocable, non-transferable, non-sublicensable license to download, copy, and use the Assets solely for the purpose of developing, prototyping, and creating Synergy Apps (as defined in the MSU Builder Terms) within the MapleStory Universe ecosystem, including the right to incorporate the Assets into such Synergy Apps. To publish, operate, distribute, or otherwise make a Synergy App incorporating any Asset publicly available, you must be a registered Builder and remain in compliance with the MSU Builder Terms. * **Conditions and limits.** This license does not permit you to: (a) use the Assets in any product, service, or project that is not a Synergy App within the MapleStory Universe ecosystem; (b) redistribute, re-host, sell, rent, sublicense, or otherwise make the Assets - or any CDN link, URL, or other means of accessing the Assets- available to third parties as standalone files asset libraries, or otherwise outside of your Synergy App; (c) claim ownership of the Assets or remove or alter any ownership, attribution, or proprietary notices; (d) use the Assets in any unlawful, infringing, or brand-damaging manner; or (e) use the Assets, in whole or in part, to train, fine-tune, or develop any machine learning or artificial intelligence model, or to derive, extract or infer any underlying data, source materials, asset taxonomy, or trade secrets. Any use outside the scope of the permitted use above requires the prior written permission of the rights holder. The Assets may embody trademarks of Nexpace, its affiliates or its licensors, or third parties, and no right to use any such trademark as a source identifier * **Incorporated terms.** Your access to and use of the Assets is also governed by the asset-use and intellectual-property provisions of the MSU Terms of Service, the MSU Builder Terms, the MSU OpenAPI Terms, and any other applicable MSU terms and legal policies, regardless of whether you are a registered builder. Those terms and policies are incorporated into this notice by reference and are available at [MSU Legal Documents](https://msu.io/policy/). By accessing, previewing, exporting, downloading, or copying a CDN link to any Asset, you acknowledge that you have read and agree to this notice and those terms. If you do not agree, do not access, download or use the Assets. * **Termination and deletion**. Your license under this notice is revocable at any time. Upon revocation, termination of your access, rejection or removal of your Synergy App, or upon our request, you must promptly cease all use of and permanently delete all downloaded copies of the Assets in your possession or control, other than Assets already lawfully incorporated into a Synergy App that remains in good standing under the MSU Builder Terms. This is a provisional notice pending publication of formal Terms of Service for MSU Resource Search. Once formal Terms are published, they will govern your use of the service and the Assets, and continued use will constitute acceptance of those Terms. MSU Resource Search is in Beta and provided "as is"; Assets, features, and access may change or be revoked at any time. Inquiries: [contact\_builder@nexpace.io](mailto:contact_builder@nexpace.io) [\[View all MSU legal policies\]](https://msu.io/policy/terms_of_use)   *** # MSU Explorer Source: https://docs.msu.io/msu-services/msu-explorer Image 110 Image 110   ## **1. What is MSU Explorer?** MSU Explorer is a platform where Maplers can view all on-chain data related to Henesys L1, the mainnet of MapleStory Universe. MSU Explorer is officially supported by CrossAngle that provides various crypto asset-related services through Xangle. MSU Explorer therefore operates under CrossAngle Terms of Service, separate from those of MapleStory Universe. For more details, please refer to the bottom-left section of MSU Explorer website. \[[Go to Terms of Service](https://msu-testnet-explorer.xangle.io/term-of-service)] Additionally, important usage notices that Maplers must follow while using MSU Explorer are provided in the form of a Disclaimer, located to the right of the Terms of Service link.   ## **2. MSU Explorer Main Dashboard** On MSU Explorer’s main page, Maplers can view the latest information on Henesys L1 at a glance. ### **2.1. Search Bar** Maplers can search for detailed blockchain data by entering one of the following into the search bar: * **Transaction Hash Value:** View details of the transaction, the related block, and associated logs. * **Block Number:** Check block data, including all transactions and internal transactions. * **Wallet Address:** View all related transactions, internal transactions, and token data (ERC-20, ERC-721, ERC-1155). * Token: Check details about a specific token. * **NFT:** View information about a particular NFT. ### **2.2. Main Dashboard** Maindashboard Please note that the image shows test environment and may not reflect the live data. On the main dashboard, Maplers can view: | Metric | Description | | :------------------------- | :------------------------------------------------------ | | **Average Block Created** | Average block time in the last hour | | **Daily Transaction** | Average number of transactions in the past 3 days | | **Daily Account Created** | Average number of accounts created over the past 3 days | | **Gas Price** | Gas price of the most recent transaction | | **Base Fee** | Average block base fee over the past hour | | **Gas Used** | Average gas used per block over the past hour | | **Internal Transactions** | Total number of internal transactions on Henesys L1 | | **New Accounts Created** | Number of accounts created over the last 30 days | | **Daily Gas Fees** | Total gas fees paid on blocks over the last 24 hours | | **ERC-20 Token Transfer** | Total number of ERC-20 token transfers on Henesys L1 | | **ERC-721 Token Transfer** | Total number of ERC-721 token transfers on Henesys L1 | Additionally, at the bottom of the main dashboard, Maplers can view the 10 most recent blocks and the 10 most recent transactions. Clicking on each entry allows Maplers to view its detailed information: * **Latest Blocks**: Displays the 10 most recent blocks, including gas used, number of transactions, and block rewards * **Latest Transactions**: Displays the 10 most recent transactions, including transaction hash, amount of NXPC transferred, sender wallet address, and recipient wallet address   ## **3. MSU Explorer Navigation Tabs** MSU Explorer Navigation Tabs Please note that the image shows test environment and may not reflect the live data. On the left side of MSU Explorer web interface, Maplers can navigate using various functional tabs that provide detailed on-chain data about MapleStory Universe. 1. **Home**: Navigates to the main homepage of MSU Explorer 2. **Blockchain:** Provides access to core blockchain data across four sub-tabs 1. **Transactions**: View all transactions on Henesys L1 in reverse chronological order 2. **Internal Transactions:** View all internal transactions executed via smart contracts, listed by latest first 3. **Blocks:** Explore all blocks on Henesys L1 starting from the most recently generated 4. **Deployed Contracts:** View smart contracts deployed on Henesys L1 3. **Tokens**: Displays information about supported tokens on Henesys L1 1. **All Tokens #1**: Native governance token of MapleStory Universe – NXPC 2. **All Tokens #2:** In-game utility token – NESO 3. **Token Transfers**: Lists all token transfers on Henesys L1 in reverse chronological order 4. **NFTs**: Offers complete visibility into NFT-related activity across three sub-tabs 1. **All NFTs & Transfers:** View all NFT types on Henesys L1 and their transfer history 2. **NFT Trades**: Review all NFT trades that have occurred via the MSU Marketplace 3. **NFT Mints**: Track all NFT minting events from within MapleStory N 5. **Accounts**: Lists all accounts connected to MapleStory Universe, ordered by NXPC token balance in descending order 6. **Analytics**: Visualize Henesys L1 network and token trends through four categories 1. **User**: Charts the trend of Unique Active Wallets connected to MapleStory Universe 2. **Network**: Shows historical data on the number of transactions over time 3. **Token:** Displays holder trends for NESO, NXPC, and NFTs 4. **Marketplace:** Tracks the number of unique accounts actively trading on the MSU Marketplace *** # MSU Marketplace Source: https://docs.msu.io/msu-services/msu-marketplace Image 111 Image 111   ## **1. What is MSU Marketplace?** MSU Marketplace is a platform where Maplers can buy or sell NFT items, characters, FT items, and nicknames to enhance their gameplay experience. Image **MSU Marketplace is composed of the following sections:** 1. **Main Screen:** Overview of in-game item listings and the trading status of the MSU Marketplace. 2. **Tabs for Purchases:** Use the “NFT Items”, “Characters”, and “FT Items”, and “Nicknames” tabs to browse available items. 3. **Bid:** Submit a price proposal if your desired item is unavailable or listed at an undesired price. 4. **Search Bar:** Quick search for specific items by keyword. 5. **Inventory:** View and manage your in-game items, including those you own, have listed, bookmarked, or made/received offers on. You can also view your trading history here. ### **1.1. Main Screen** On the Main Screen, you can check the overall activity status of the MSU Marketplace through the following data: * **Total Listings:** Cumulative number of all items ever listed on the marketplace * **Total Active Wallets:** Cumulative number of wallets that have accessed services in the MapleStory Universe * **Total Sales:** Total number of transactions made * **Total Trading Volume:** Cumulative transaction volume in NESO Scroll down to see highlighted rankings: * **Record-breaking Sales:** Top 3 in-game items sold for the highest prices. * **Recent Sales:** The 20 most recently listed NFT items * **Recent Listings:** The 20 most recently added items * **Top Traders:** Maplers ranked by trading volume ### **1.2. Tabs for Purchases** In the “NFT Items”, “Characters”, “FT Items”, and “Nicknames” tabs, you can buy and sell NFT items, characters, and FT items respectively. For more details about how to buy these items, please refer to the “How to purchase on the Marketplace” section. ### **1.3 Bid** In the “Bid” section, you can propose your desired price and quantity for specific NFT items. If a seller accepts, the transaction is made. This reverses the usual listing format; you propose the deal, and a seller may choose to accept it. Only in-game NFT items are supported in the “Bid” section. ### **1.4 Search Bar** Use the search bar at the top of the page to quickly search items. ### **1.5. Inventory** In “Inventory”, you can manage items held in your Wallet Inventory. It includes: * **Owned:** Items you currently hold. * **On Sale:** Items you have listed for sale * **Bookmark:** Items you’ve bookmarked * **Activity:** Your transaction history * **Offers:** Offers you’ve made or received MVP Bronze rank or higher is required to use the MSU Marketplace. Unranked users can only browse, bookmark, and purchase characters   ## **2. How to bring your assets to the Marketplace** To bring in-game items, characters, and nicknames obtained in-game into the MSU Marketplace, follow the steps below: ### **2.1. Items** 1. **Minting** * Mint the item obtained in-game. 2. **Moving to Wallet Inventory** * Drag or double-click the minted item to transfer it from your character inventory to your Wallet Inventory. 3. **Checking in Inventory** * Visit the MSU Marketplace and find the item listed in your “Inventory” tab. * Only items marked with “m” in the bottom right corner are mintable. Items marked with an “L” cannot be minted. ### **2.2 Characters** Characters can only be listed if they are unlinked from MapleStory N. * If the character you want to sell is linked, unlink it first via the character selection screen. * Then, go to the “Owned” tab in your Inventory to confirm it is ready for sale. ### **2.3. Nicknames** * Selling an off-chain nickname: To sell a standard (off-chain) character nickname, you must first convert it into an on-chain NFT. You can do this by changing your character's name in-game; the old name will be minted as an NFT and sent to your wallet, ready for sale. * Selling an on-chain nickname: If your character is already using an on-chain nickname NFT and you wish to sell it, simply change your character's name to something else. The previously equipped nickname NFT will be unequipped and returned to your wallet. * For more details, please refer to the \[[Nickname NFT Guide](https://docs.maplestoryn.io/msn-101/beginners-guide/item-and-equipment/nickname-nft)]   ## **3. How to purchase on the Marketplace** To buy NFT items, characters, FT items, or nicknames: * Use the search bar or browse through the “NFT Items”, “Characters”, “FT Items, or “Nicknames”” pages. - You cannot make a purchase if your NESO balance is insufficient or if the item price is below the minimum trade amount (0.000001 NESO). - Listing items is free, but transaction fees are automatically deducted from the sale amount upon purchase or offer acceptance. Image
You can check the transaction fee during the listing or offer process.
### **3.1. NFT Items** Image On the “NFT Items” page, you can use filters to narrow down your search: * **Price range:** Set minimum and maximum price. * **Unique Number:** The sequential number assigned upon minting, indicating the order in which the item was minted in MapleStory Universe. * **Item Type:** Filter by All, Weapon, Armor, Decoration, Utility, or Set-up. * If you select “All”, “Weapon” or “Armor”, additional filters are available: Image 73 * **Class:** Warrior, Magician, Bowman, Thief, Pirate * **Potential/Bonus Potential Rank:** The ranking of potential and bonus potential for the item, ranging from No Potential to Legendary. * **Level Range:** The range of levels at which the item can be equipped * **Star Force:** The Star Force level of the item * For “Weapon” and “Armor”, you can apply “Advanced Search”: Image 74 * **History:** Enter a character name to view item achievement history that is associated with that character * **Advanced Search:** Filter by up to 5 potential stats, bonus potential stats, and basic stats to refine your search After setting the filters, use the “Save Filter” button under the “Search” button to save your settings for future use. You can easily reapply saved filters whenever you want to search with the same criteria. Image 75 When you click an item from the equipment item list, the item detail page shows: Image 76 * **Item image** and **equip preview** (login required to preview equipped look) * **Item price** * **Item sale end time** and **time remaining** until sale ends * **Seller's username** (Clicking the username will take you to that user's inventory page) * **Item name** and **category** * **Item equip requirements** * **Item details** * **Transaction history** (Use the dropdown menu to view the trade history of the selected item and of identical items) On the left side of the item page, you can click “Details” section to open the Navigator for more information. ### **3.2. Characters** Image 77 On the “Characters” page, you can refine results with the following filters: * **Price Range:** Set minimum and maximum price * **Class:** Warrior, Magician, Bowman, Thief, Pirate * **Level Range:** Specify the level range of the character * **Combat Power** Selecting a character opens a detail page that shows: Image 79 * **Character Profile Image** * **Character price** * **Sale End Time** and **Time Remaining** Until Sale Ends * **Seller’s Username** (Clicking the username redirects you to the seller’s Inventory Page) * **Character Name** * **Basic Info:** Level, Job, Fame, etc. * **Detailed Stat Information** * **Equipped Items** * **Price Offer Information** * **Recent Activity History** On the left side of the page, you can click the “Details” section and access the Navigator for more info. ### **3.3. FT Items** Image 80 On the “FT Items” page, the list on the left shows consumable items currently available for purchase. Clicking an item reveals: * **Available Listings:** Current ask prices * **Trade History:** Past transaction records * **Price History:** Daily highest, lowest, and average prices * **My Listings:** FT items you have listed for sale. Use the dropdown at the top-right of the “My Listings” section to view bid listings for selected or all items. Image 81 ※ Only sellers can propose prices. Buyers input a quantity, and the system auto-matches it to the lowest price available and compete the purchase. * Only sellers can propose prices. Buyers input a quantity, and the system auto-matches it to the lowest price available and compete the purchase. * From “Activity History”, you can select either a 7-day or 30-day period to view the average daily activity price. * Hover over the price graph to see the highest, lowest, average prices, along with the trading volumes for that day. #### **3.3.1. Important Notes on FT Item Pricing & Purchase Quantity:** * When purchasing FT items, the system automatically buys from the lowest-priced listings in order, including gas fees. * The estimated price updates every 5 seconds, so the lowest price may change after each update. * A single purchase can involve up to 5 sellers only. * Example: If 10 sellers each list 1 Power Elixir, and you input a quantity of 10, the system will automatically adjust your purchase to a maximum of 5, drawing from 5 sellers only. To purchase more, you will need to place a new order. * FT items are listed for 7 days. Unsold items will be automatically delisted when the listing expires. ### **3.4. Nicknames** Image 83 The Nicknames page makes it easy to find the perfect name using a set of powerful filters. You can narrow down the listings by: * **Price Range**: Set a minimum and maximum price for the nickname * **Length**: Filter by the number of characters in the nickname (from 4 to 12) * **Composition**: Choose the character type of the nickname (Alphabet Only, Numeric Only, or Mixed) Clicking on any nickname in the results will open its dedicated detail page. Here you'll find everything you need to know: Image 84 * **Nickname Image** * **Price** * **Sale End Time**: The exact date and time the listing expires, along with the remaining time * **Seller's Username:** Clicking the username will take you to that user's Inventory page * **Nickname** * **Length and Composition**: Information about the nickname's character count and type. * **Transaction History** * **Offer Information**: Details about any offers made on the nickname. For even more information, access the Navigator via the "Details" section on the left. ### **3.5. Items Unavailable for Trade** Some items cannot be traded on the MSU Marketplace: * Items marked with "L" displayed on the bottom right cannot be minted or moved to Wallet Inventory * Items labeled "Currently in Use" are in use in MapleStory N and cannot be traded or offered * Items labeled "Discarded" are discarded in-game items and cannot be traded * Items labeled “Burned” are burned on-chain and cannot be traded. * If the wallet holding an item is not linked to MapleStory Universe, the item will display a wallet address instead of a username * Items marked with an “S” icon are Soulbound Tokens(SBTs) and cannot be traded ### **3.6. Using the Offer Feature** You can use “Offer” to negotiate the purchase price for NFT items. **3.6.1. How to Make an Offer** 1. Hover over an item and click the “Offer” button or go to the item detail page and click “Offers.” Image 85 2. Enter your desired price in the popup window and click “Make an Offer”.\ Image 86 A minimum offer of 1,000,000 NESO is required. Offers below this amount cannot be submitted. **To view your offer activity** * Go to “Inventory” > “Offers” > “Offers Sent” to see the items, characters, or nicknames you have made offers on. * Go to “Inventory” > “Offers” > “Offers Received” to see offers made on your listed items, characters, or nicknames. **3.6.2 Offer Policy Notes** * Only the top 5 highest offers are visible to the seller. If multiple offers are made at the same price, the one submitted earlier will be shown first * When an offer from the top 5 expires, is accepted, or is canceled, the next highest offer will appear * If your offer is not visible, it is either not in the top 5 or was submitted later at the same price * To change an offer already made on an item, cancel the previous one and submit a new offer * If there is an item you really want to purchase, check the “Offers” list on the item detail page and make a competitive offer * If your NESO balance drops below your offer amount, your offer will be automatically canceled * If you’ve made an offer on an item you wish to purchase, be sure to manage your NESO balance accordingly * Notifications will be sent when your offer is accepted or canceled * You will also receive a notification if your listed item receives the top offer   ## **4. What is Bid?** Image 87 Unlike the “NFT Items”, “Characters”, and “FT Items” tabs, the **“Bid"** section allows Maplers to propose their desired price and quantity for an item, regardless of its stats. Sellers may then choose to fulfill the bid. * Only price and quantity can be selected when using the Bid system. If you want to purchase an item with specific stats, use the “NFT Items” tab instead. * In the “Bid” tab, buyers can register the items they wish to purchase, and sellers can search for items they wish to sell using the search bar. * Not all items are available for Bid transactions. Only selected items may be traded through the Bid system. ### **4.1. How to Place a Bid** If there is an item you want to buy, follow these steps: 1. Enter the quantity and unit price of the item you would like to buy into the **“Place Bid”** field. \\ Image 88 2. Click the “Order” button and check your bid in the list on the left side of the page. 3. If another Mapler accepts your bid, the transaction is completed immediately. You can view the result in the “Trade History” section or in “Inventory” > “Activity”. 4. Use the dropdown at the top-right of the “My Order” section to view all of your registered bids. * A minimum bid of 1,000,000 NESO is required. Bids below this amount cannot be placed. * Bid orders are valid indefinitely unless canceled in “My Order.” * Bid history can only be viewed during the active bid period. * The total bid amount (including Offers) cannot exceed your NESO balance. ### **4.2. How to Sell to a Bid** You can search the bid list for your desired price and proceed to sell an item. * Only one item may be sold at a time * Sales can only be completed if there is a matching buy order at the exact price. * Refresh the page to check the latest bid matches and order status. If you want to sell an item, follow these steps: 1. Input the price you wish to sell at from the bid list and click “Sell”. 2. Select the item you want to sell from the list. 3. Once selected, proceed with the sale. Once a sale is initiated, it cannot be retracted. If you have multiple identical items, make sure to double-check the item’s status before selling. **Would you like to save items for later?** Image 89 Click the “💚” button at the top of the item card in the left-hand item list to bookmark them. You can manage bookmarked items in a dedicated tab. ### **4.3. Bid Cancellation Conditions** If NESO is used for other purchases outside the “Bid” tab, (e.g., to purchase items) and your NESO balance falls short of your active bid, any bid that exceeds the balance will be automatically canceled. * In this case, the entire bid is canceled, not just the portion that exceeds the balance. * If there are multiple bids at the same price, the most recently submitted bid is canceled first.   ## **5. Using Inventory Tab** ### **5.1. What is the “Owned” tab in Inventory?** Image In the “Owned” tab, you can view the list of items you currently hold in your Wallet Inventory. * Items must be transferred from your character inventory to Wallet Inventory to appear here. * Items purchased on the MSU Marketplace are also stored in the Wallet Inventory. If you wish to equip them, move them to your character inventory. * For more details, please refer to the \[[Nickname NFT Guide](https://docs.maplestoryn.io/msn-101/beginners-guide/item-and-equipment/nickname-nft)] #### **5.1.1. Item Transfer** You can directly transfer items or nicknames you own to another Mapler without listing them for sale. In the “Owned” tab, you will find a three-dot icon at the top-left corner of each asset’s image. Click the three-dot icon at the top-left corner of the asset’s image to access available functions. **\[Available functions]** * Sell * Cancel Sale * Copy Link * Transfer Click “Transfer”, input the recipient’s wallet address, and proceed with the transfer. * Double-check the quantity for FT item transfers. * Always verify the recipient’s wallet address before confirming. * Only minted characters can store and retrieve items from Wallet Inventory. * Only nicknames that are not currently equipped by a character can be transferred. * Double-check the quantity for FT item transfers. * Always verify the recipient’s wallet address before confirming. * Only minted characters can store and retrieve items from Wallet Inventory. * Only nicknames that are not currently equipped by a character can be transferred. ### **5.2. What is the “On Sale” tab in Inventory?** Image In the “On Sale” tab, you can view and manage items or nicknames you’ve listed for sale on the MSU Marketplace. * To list an item, character, FT item, or nickname for sale, go to the “Owned” tab, click on it, and proceed to its detailed page. * Once listed, the item will appear in the “On Sale” tab. Here’s what you check in this tab: * Track listings with less than 24 hours remaining on their sale period * Review the current sale price of your listed items, characters, and nicknames at any time * Check the current lowest sale price for your listed FT items * Cancel any of your active listings * Notification alerts when one of your assets is sold to another Mapler **5.2.1. Notes on Selling FT Items** * Unit prices may slightly change accordingly to the “Bid Unit Policy”. * Minimum sale quantity requirements may apply per item * If another Mapler is in the process of buying your listed item or it is sold just before you attempt to cancel, the cancellation may not go through. - Items marked with an "L" in the bottom-right corner are bound to characters and cannot be minted or sold on the MSU Marketplace. - If an item has already been transferred to another wallet, you will receive a “Cannot Sell” message. ### **5.3. What is the “Bookmark” tab in Inventory?** Image Bookmark is a feature that allows you to save NFT items, characters, FT items, or nicknames you’re interested in purchasing. * After bookmarking items, view the list in “Inventory” > “Bookmark” * To remove a bookmarked item/character/nickname, you must manually unbookmark it. * Even if the item/character/nickname is sold, it will remain bookmarked until removed. ### **5.4. What is the “Activity” tab in Inventory?** The “Activity” tab shows your transaction history for NFT items, characters, FT items, and nicknames. * You can also view transaction history via MetaMask browser extension under the “Portfolio” function. * Additionally, transactions can be checked in the \[[MSU Explorer](https://msu-explorer.xangle.io/)] ### **5.5. What is the Offers tab in Inventory?** In the Offers tab, you can view offers you've made on MSU Marketplace items as well as offers received on items you've listed for sale. * The “Received” tab displays the top 5 highest offers made on your listed items. * This list updates when offers are canceled, accepted, or expired. * The “Sent” tab shows a complete list of all offers you’ve submitted so far.   ***   # MSU Navigator Source: https://docs.msu.io/msu-services/msu-navigator Navigator Inv @2x Navigator Inv @2x   ## **1. What is MSU Navigator?** MSU Navigator is a hub where Maplers can search and view all on-chain and off-chain items, characters, nicknames, and user information within the MapleStory Universe. In MSU Navigator, you can view not only your own information but also the character, nickname, and item details of other users. * **Character Information** * Link/Unlink status * Minted / Mintable status * **Item Information** * All items in the wallet inventory (including SBT local copies) * Minted items in character inventory * Mintable items in character inventory * NFT items registered in the NFT Collection * **Nickname Information** * All nicknames present in the wallet inventory - Local items obtained through field hunting in MapleStory N cannot be searched or viewed in MSU Navigator. - SBT items granted as rewards cannot be searched in the MSU Navigator or viewed on the main dashboard. However, they can be checked in the Owned Items list.   ## **2. MSU Navigator Main Dashboard** On the main dashboard of MSU Navigator, you can view the overall status of all on-chain and off-chain items. ### **2.1. Top Menu** * **Search Bar:** Enter item name, character name (nickname), or username to search for relevant information. * **My Page:** Directs you to your Owner Detail Page, where you can view all items, characters, and nicknames held in your wallet. * For more details, please refer to **\[Section 4: My Page].** ### **2.2. Main Dashboard Overview** Under the Info tab, the following metrics are displayed: **2.2.1. Info Tab** * **Unique Active Wallets:** Number of accounts that have logged into any MSU service at least once * Transactions: Total on-chain transactions across MapleStory Universe services * MSU Marketplace Volume: Cumulative trading volume to date **2.2.2. Highest Price Equipment Items** Image 51 You can view the **top** **5 highest-priced equipment items**. * The ranking period can be selected from **7 Days, 30 Days,** or **All**. * For each equipment item, you can view its image, name, unique ID, NESO price, and USD equivalent. * Clicking an item will redirect you to its **detail page**. For more information on the detail page, please refer to **\[Section 3: MSU Navigator Search Function]**. **2.2.3. Highest Price Decoration Items** Image 52 You can view the **top 5 highest-priced decoration items**. * The ranking period can be selected from **7 Days, 30 Days,** or **All**. * For each decoration item, you can view its image, name, unique ID, NESO price, and USD equivalent. * Clicking an item will redirect you to its **detail page**. For more information on the detail page, please refer to **\[Section 3: MSU Navigator Search Function]**. **2.2.4. Character Rankings** Image 53 You can view the **top** **5 highest-level characters**. * For each character, you can view its ranking, name, job, and level. * To view rankings beyond the Top 5, click the “View All” button in the Character Rankings section to be directed to **\[MapleStory N Web > Rankings]** page. * Clicking on a character will redirect you to their **detail page**. For more information on the detail page, please refer to **\[Section 3: MSU Navigator Search Function]**.   ## **3. MSU Navigator Search Function** There are two search bars on MSU Navigator main dashboard. Both search bars serve the same function. You can enter an item name, character name (nickname), specific item info (item name + unique ID), or username to search for the information you wish to view. Image 54 ### **3.1. Important Notes When Searching** 1. **Popular Searches:** View the most-viewed item names, specific items, and character names (nicknames) from the past 7 days by clicking the search bar. Use this to discover which items and characters are currently trending among users. 2. **Autocomplete:** Enter two or more characters into the search bar. A list of autocomplete suggestions will appear, and selecting a suggestion will immediately trigger a search, allowing you to find what you’re looking for without typing the full name. Autocomplete is supported only for item names and is not available for character names or nicknames. 3. Item Type vs. Specific Item: A specific item refers to an item that includes its unique ID and represents an individual instance owned by a user. (***Example:*** Among many Dominator Pendants, Dominator Pendant#1 owned by User A is a specific item) 1. To search by item type: enter only the item name. 2. To search by specific item: enter both the item name and its unique ID. * You must enter at least 2 characters to search. * You much enter the exact item or character name. Partial matches or typos will not return results. Image 55 ### **3.2. Item Name Search - NFT** Searching by NFT item name (without the unique ID) will direct you to its detail page, where you can view: Image 56 **Item Details** | Category | Details | | :----------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Item Info** |
  • Item image
  • Item name
  • Item Type
  • Requirements for equipping
| | **Item Circulation and Trading Volume Overview** |
  • Circulating Supply: The amount of items that are circulating in the market and are tradable by the public.
  • Max Supply: Maximum Supply of the Item
  • 24h volume(NESO)
| | **Play Rewards** |
  • Display of the in-game reward allocation and remaining unclaimed (yet to be farmed) quantity using a bar graph
| For NFT items, you can also view the following additional information: **1. Dynamic Pricing Formula chart** (for enhancement-eligible equipment only): * This chart displays price fluctuations caused by Dynamic Pricing. * You can check the cost of enhancement, the number of enhancements, and other related data for each enhancement level. * It also allows you to select and view specific enhancement levels and time periods for detailed analysis. Image 57 **2. Trade Information:** * You can view the full trade history of the searched item in chronological order. * Each record shows the price, buyer and seller usernames, wallet addresses, and the date and time of the transaction. If no trade history exists for the item, a message stating “No trade history available.” will be shown. Image 58 #### **3.2.1. Top Button Functions** When viewing an item’s detail page, the following common buttons are available at the top: Image 59 | **Category** | **Button Image** | **Description** | | -------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Marketplace** | |
  • pens the MSU Marketplace in a new tab and shows current listings for the item.
| | **Add to Watchlist** | |
  • Adds the item to your Watchlist so you can track it over time.
| | **Share** | |
  • Opens sharing options:
    1. **Copy Link** – Copies the current page’s URL
    2. **Share on X** – Shares the item on X (formerly Twitter)
    3. **Share on Facebook** – Shares the item on Facebook
| | **Explorer** | | Opens MSU Explorer in a new tab, where you can view detailed information about the associated wallet address. (Only available when searching by username) | * The “Explorer” button is only available when searching by username. * The “Add to Watchlist” button is not available for FT items. * The “Marketplace” button is not available for Character NFTs. ### **3.3. Specific Item Search - NFT** Searching by NFT item name along with its unique ID takes you to that item’s detail page, where you can view the following information: Image 61 **Item Details** | Category | Details | | :---------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Item Info** |
  • Owner’s Username
  • Item Image & Mintable Status (mintable / minted)
  • Item Name + Unique ID
  • Item Type
| | \*\*Item Circulation and Trading Volume Overview \*\* |
  • Circulating Supply: The number of items currently available and tradeable on the market
  • Max Supply: The maximum quantity of this item that can exist.
  • Token Standard
| When searching for a specific item (not just by item type), you’ll be directed to the item's unique detail page, where you can view the following additional information: 1. **Info** 1. Equip Requirements 2. Item Stats & Enhancement Info 3. Item Description 4. Set Info (if the item belongs to a set) 2. **History** 1. View achievement history including achievement name, character name, and timestamp, sorted in chronological order. 3. **Activity** 1. View the item’s activity log, including achievement name, character name, and timestamp, sorted in chronological order. 2. You can filter the activity log by using the following options (multiple selections allowed): 1. All: View all records 2. Sale: Trade history 3. Transfer: Transfer history 4. Mint: Minting history ### **3.4. Item Name Search - FT** When searching by an FT item name, you willll be directed to the item detail page, where the following information is available: Image 62 **Item Details** | Category | Details | | :----------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Item Info** |
  • Item Name
  • Item Type
  • Item Description
| | **Item Circulation and Trading Volume Overview** |
  • Circulating Supply: The number of items currently available and tradeable on the market
  • Max Supply: The maximum quantity of this item that can exist
  • 24h volume(NESO)
| | **Play Rewards** |
  • Display the in-game reward allocation and remaining unclaimed (yet-to-be-farmed) quantity using a bar graph
| For FT items, you can view the following additional information: 1. **Price History** * Displays the previous day’s high, low, average price, and trading volume for the FT item. * This data is updated daily at 00:00 (UTC +0). * Below the price information is a visual chart showing the daily trading volume and average price. * Hover over any date to view detailed price data for that day. * You can set the display period to either 7 days or 30 days. * The bar graph represents daily trading volume, while the line graph represents the daily average price. ### **3.5. Character Name and Nickname Search** If you search for a character name that is also a minted nickname, the search results will show both the character and nickname cards. If the character name has not been minted, you will be redirected to the character's detail page. If you search for a name that is currently equipped on a character, you’ll be directed to the character detail page. Image 63 **Character Details** | Category | Details | | :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | \*\*Character Info \*\* |
  • Owner’s username
  • Character image & its mintable state (mintable / minted)
  • Character name
  • Character level
  • Character job
  • Birthday: Character creation date
  • Fame
  • Nesolet
| | \*\*Ranking \*\* |
  • Level Ranking
  • Job Ranking
| | \*\*Token Standard \*\* |
  • Token Standard of the character
| For Character NFTs, you can view the following additional information: 1. **Info** * View the character's Basic Information: 1. Stat (Info) 2. Hyper Stat (info) 3. Ability (Info) 4. Skill (Skill) 5. Medals (Collection) 6. Quests (Quest) * Below the Basic Info section, you can view the character’s equipped items. Hover over each item to see its tooltip: 1. EQUIP: Displays equipped gear items as images 2. DEC.: Displays equipped decoration items 3. PET: Displays equipped pets 2. **Holding Items** * Check the character’s inventory items, organized by inventory tab. * You can filter the items by: 1. All: Show all items 2. Minted: Show only minted items 3. Mintable: Show only mintable items 3. **History** * View the character’s **account history**, categorized by type. * Use the **dropdown menu in the top-left corner** to filter by specific sub-categories: Image 64 | Category | Details | | :------------------ | :------------------------------------------------------------------------------ | | \*\*Character \*\* |
  • Level
  • Job Advancement
  • Ability
| | **Item** |
  • Reward
  • Star Force
  • Potential
  • Bonus Sta
| | \*\*Adventure \*\* |
  • Reginal Quest
  • Party Quest
| | **Battle** |
  • Field
  • Boss
  • Mu Lung Dojo
| | \*\*Blockchain \*\* |
  • Minting
  • Exchange Currency
| | \*\*Social \*\* | - | 4. **Activity** * View the activity log of the selected character: 1. All: View All 2. Mint: Minting history 3. Sale: Trade history If you search for a name that is an on-chain nickname and not currently equipped on a character, you will be directed to the nickname detail page. **Nickname Details** | Category | Details | | :------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | | Nickname Info |
  • Owner’s username
  • Nickname image
  • Nickname
  • Length/Composition
  • Currently equipped status
| | Token Standard |
  • Token Standard of the nickname
| The following additional information is also available for Nickname NFTs: 1. **Activity** * View the nickname's activity list: 1. All: View All 2. Mint: Minting history 3. Sale: Trade history ### **3.6. Username Search** When searching by username, you will be directed to the user account detail page, where the following information can be viewed: Image 65 **Account Details** | Category | Details | | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | \*\*Account Info \*\* |
  • Owner's username
  • User profile image
  • Wallet address
  • Character: Number of owned character(s)
  • Item: Number of owned item(s)
  • NESO
  • Nesolet
| | \*\*On-chain Info \*\* |
  • Total Item Minted: Total number of items minted to date
  • Total NESO Minted: Total amount of NESO claimed to date
  • Total Trading Volume
| When searching by username, you can also view the following detailed information: 1. **Character** * Displays a card-style list of all characters owned by the account. * Hovering over a character image shows a detailed tooltip. * **Search Bar:** Use the search bar on the left to find a specific character by name. * **Status:** You can filter the characters by: 1. All: Show all characters 2. Minted: Show only minted characters 3. Mintable: Show only mintable characters 2. **Items** * Displays a card-style list of all items owned by the account. * Hovering over an item image shows a detailed tooltip. * Use the dropdown at the top-left to select one of the following: 1. NFT Items 2. FT Items * **Search Bar:** Use the search bar on the left to find items by the name of the character holding them. * **Sub-category Filter**: Use the dropdown below the search bar to refine by category. * **Status:** Filter the items by: 1. All: Show all items 2. Minted: Show only minted items 3. Mintable: Show only mintable items * **Item Location:** Filter the item location by: 1. All: Show all items regardless of inventory locations 2. Wallet Inventory:Show only wallet-stored items 3. Character: Show only items stored in character inventories 4. If selected, a dropdown will appear to choose a specific character 3. **Nicknames** * Displays all on-chain nicknames owned by the account as a list of image cards. * Use the search bar on the left to find a specific nickname. 4. **Watchlist** * Displays the account’s Watchlist, showing items added via the Add to Watchlist feature. * Items appear as cards sorted by most recent registration. * Use the top-left dropdown to filter by Watchlist type.   ## **4. My Page** On the My Page, you can view detailed information about your account. This section shares the same structure as **\[Section 3.6. Username Search]** **Account Details** | Category | Details | | :---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Account Info** |
  • Owner's username
  • User profile image
  • Wallet address
  • Character: Number of owned character(s)
  • Item: Number of owned item(s)
  • NESO
  • Nesolet
| | **On-chain Info** |
  • Total Item Minted: Total number of items minted to date
  • Total NESO Minted: Total amount of NESO claimed to date
  • Total Trading Volume
| When searching by username, you can also view the following detailed information: 1. **Character** * Displays a card-style list of all characters owned by your account. * Hovering over a character image shows a detailed tooltip. * **Search Bar:** Use the search bar on the left to find a specific character by name. * **Status:** You can filter the characters by: 1. All: Show all characters 2. Minted: Show only minted characters 3. Mintable: Show only mintable characters 2. **Items** * Displays a card-style list of all items owned by your account. * Hovering over an item image shows a detailed tooltip. * Use the dropdown on the top-left to select item types: 1. NFT Items 2. FT Items * **Search Bar:** Use the search bar on the left to search items by name. * You can use the dropdown menu below the search bar to filter and view items by specific sub-categories. * **Status:** You can filter the items by: 1. All: Show all items 2. Minted: Show only minted items 3. Mintable: Show only mintable items * **Item Location:** You can filter the location of the items by: 1. All: Show items from all inventories 2. Wallet Inventory: Show only wallet-stored items 3. Character: Show only items stored in character inventory * If selected, a dropdown will appear to choose a specific character 3. **Nicknames** * Displays all on-chain nicknames owned by the account as a list of image cards. * Use the search bar on the left to find a specific nickname. 4. **Watchlist** * Displays items, characters, nicknames, or users you have added to your Watchlist. * Items appear as cards sorted by most recent registration. * Use the top-left dropdown to filter by Watchlist type. *** # Smithy Source: https://docs.msu.io/msu-services/smithy Image 113 Image 113   ## **1.  What is Smithy?** Smithy is a web-based item enhancement app provided within MapleStory Universe. Instead of launching MapleStory N every time you want to enhance items, Smithy brings enhancement directly to your browser on any device. This means you can enhance items anytime, anywhere, with added flexibility that goes beyond the game client experience: * **Greater Flexibility**: Enhance items from your character's inventory or your wallet inventory * **No Game Client Required**: Exchange Power Crystals and enhance items without launching MapleStory N * **Streamlined Process**: The streamlined workflow lets you enhance items faster and more easily Image 27 With Smithy, enhancement opportunities are always within reach. Upgrade your items on the go.   ## **2.  How to log in to the Smithy Synergy App** Smithy supports login through your MSU Account. You can log in to Smithy in two ways * Click the "Sign In" button in the upper right corner * Click the "Start Enhancing" button on the intro page (if not already logged in) Image 28 When you attempt to log in, the system checks if your wallet is connected to MSU. It then proceeds with Smithy login using your connected MSU account information. ### **2.1  Signature request for first-time login** When logging in to Smithy for the first time, you'll see a permission request during the login process. This page explains what actions Smithy will perform. You can cancel the login if you prefer not to proceed. #### **2.1.1 Why Signing Is Required** This signature verifies that Smithy has safe read/write permissions for items and enhancement materials in your wallet, such as NESO and Power Crystal. It's a simple authentication step. No actual transaction is made. Image 29 After reviewing this information, you'll complete a wallet signature to confirm your approval. Once signed, you can use Smithy freely without repeating this process. ### **2.2  When already logged in to MapleStory N** Smithy and MapleStory N cannot run simultaneously since they share the same enhancement data. If you're already logged in to MapleStory N when you try to access Smithy, you'll see a message asking if you want to log out of MapleStory N first. Image 30 If you click "Confirm," your MapleStory N login session will be terminated, and you can proceed with Smithy.  If you click "Cancel," MapleStory N stays active, but login to Smithy won't be allowed.   ## **3.  Enhancement Inventory** Once you log in to Smithy, click the "Start Enhancing" button to enter the Enhancement Inventory. Here you can view and enhance all enhanceable items. You can also check and exchange Power Crystal, the materials needed for enhancement. Items that can be enhanced through Smithy include * Items owned by your characters (including equipped items) * Items in your Wallet Inventory Use the toggle buttons at the top left of the item list to switch between Character Inventory and Wallet Inventory. Click each button to explore items in the respective inventory. Items belonging to characters not linked to MapleStory N cannot be viewed. Link the character to MapleStory N first if you want to enhance those items. ### **3.1.  Character Inventory** Character Inventory shows items belonging to characters linked to MapleStory N. Image 31 Your currently selected character appears in the first filter on the left side of the item list. To change characters, click that filter and select a different one. Image 32 Use the search and filter functions to easily find items you want to enhance. When you find an item, hover over it to display the available enhancement options. Image 33 You can now choose between **“Starforce”** and “**Potential**” to open the respective enhancement window. ### **3.2.  Wallet Inventory** In Wallet Inventory, you can view all items stored in your wallet. This includes items purchased from the marketplace and items moved from your characters in MapleStory N. Image 35 The list initially shows the "Weapon" category selected. Make sure to check the selected category when browsing items. The process of exploring items and entering the enhancement window works the same as in Character Inventory. #### **3.3  Power Crystal Exchange** Image 36 Just like in MapleStory N, you need Power Crystal to proceed with enhancement in Smithy. **What is Power Crystal?** An off-chain material that can be exchanged with NESO at a 1:1 rate. At the top of the inventory, you can check the enhancement-related materials currently held in your wallet. Click the "Exchange" button to open the exchange window. Image 37 Here, you can exchange Power Crystal in advance for your enhancement needs. If you don't have enough Power Crystal when enhancing an item, you can also replenish it at that time. If you don't have enough NESO to proceed with enhancement, click the "Swap" button to go to the Swap & Warp service to replenish your NESO.   ## **4.  How to enhance in Smithy** When you select an item to enhance from the inventory, you'll be taken to a screen where you can proceed with enhancement. Smithy uses the same enhancement system as MapleStory N, so the processes and probabilities are identical. Enhancement results are automatically synchronized between both services. ### **4.1  Star Force Enhancement** Image 39 In Star Force Enhancement, you can see your selected item's current Star Force grade, success and failure probabilities, and the stats you'll gain upon success. The system displays helpful tip messages based on your current enhancement state. Use these tips to guide your enhancement decisions. For example, when enhancements have failed twice in a row, a "CHANCE TIME!" message appears. This means your next enhancement is guaranteed to succeed. Image 40 Important features like "Chance Time" sync with your last enhancement attempt in MapleStory N, so your progress carries over to Smithy. Review the displayed item information and enhancement details. If everything looks correct, click the "Enhance" button to proceed. You can also enable the "Disable Star Catching" and "Major Failure Prevention" options before enhancing. When activated, these settings will apply to your enhancement attempt. ### **4.1.1  Dynamic Pricing** Enhancement prices in Smithy use Dynamic Pricing, the same system as MapleStory N. Dynamic Pricing is MapleStory N's unique enhancement pricing system where prices change in real-time based on user enhancement demand. Both Star Force and Potential enhancements follows this system, with prices varying depending on the specific enhancement type. [\[Learn more about Dynamic Pricing\]](https://docs.maplestoryn.io/msn-101/learn-more/dynamic-pricing) ### **4.1.2  Star Catch** When you proceed with Star Force enhancement, a mini game called Star Catch automatically starts. This mini game can increase your Star Force success probability. The game gives you 5 seconds to stop a moving star at a specific point by clicking the "STOP!" button. Successfully stopping the star at the correct spot gives you a buff that increases your enhancement success probability. Image 41 If you don't want to play Star Catch, click the "Disable Star Catching" button above the enhance button. When disabled, you won't receive the success probability bonus. ### **4.1.3  Major Failure Prevention** If your current Star Force grade is 12 stars or higher, enhancement attempts can result in a "Major Failure." For items between 12-17 stars, you can enable the "Major Failure Prevention" feature to avoid this outcome. However, enabling this feature doubles your enhancement cost, and you'll see a notice explaining the increased price. Image 42 ### **4.1.4  Pop-up Disable** To provide an enhancement experience similar to MapleStory N in-game, Smithy lets you temporarily disable all confirmation messages. Image 44 When enhancing, you'll see a message showing the enhancement cost. At the bottom of this message, you can activate "Don't show again during this enhancement." Once enabled, all future enhancement attempts on that page will execute immediately without confirmation messages. Note that Star Catch will still appear unless you also activate "Disable Star Catching." Be careful when using this feature, as rapid enhancement attempts can lead to unexpected costs. ### **4.2. Potential Enhancement** Image 45 In Potential Enhancement, you can enhance both an item's Potential and its Bonus Potential. * Potential can be enhanced using Occult Cubes, Red Cubes, or Black Cubes. * Bonus Potential can be enhanced using Bonus Occult Cubes or Bonus Potential Cubes. When attempting enhancement, the grade will either increase or remain the same — it will never decrease. \ Enhancement probabilities can be checked by clicking the “Probability Info” button. To proceed, select the desired Potential type and the cube item you want to use, then click the “Enhance” button to complete the process. ### **4.2.1. Memorial Feature** Image 46 The Memorial feature allows you to choose between the current option and the newly rolled option. \ This feature is only available when enhancing with a Black Cube. After a Black Cube enhancement, both the current and new options are displayed side by side. \ You must select one to finalize the enhancement. ### **4.2.1.1. Notes on the Memorial Feature** Image 47 Black Cubes always trigger the Memorial feature, allowing you to choose between keeping your current potential option or accepting the new one. The “Enhance” button stays active during this selection for smoother enhancement. If you don’t make a choice, the system automatically keeps your current potential option. To accept new potention options, select them before proceeding. Image 48 If an item in your selected Character or Wallet Inventory has an unfinished Memorial selection, \ a ‘Potential Enhancement Pending’ popup will appear, prompting you to complete the enhancement first. Until you make a choice and finish the pending Memorial selection, no other items in that inventory can be enhanced. \ Make sure to finalize the selection before starting any new enhancement attempts. *** # Swap & Warp Source: https://docs.msu.io/msu-services/swap-and-warp Image 109 Image 109   **Precautions for Safe Token Transfers** * Please note that native NXPC tokens acquired through Swap or any other features on Henesys L1 network ***cannot*** be directly deposited to exchange addresses or transferred to other networks. * If you transfer NXPC tokens across networks without using Warp, the recipient address may not recognize them, resulting in permanent loss of your digital assets. * To avoid loss of digital assets, you must bridge your NXPC tokens to a compatible network (such as the Avalanche C-Chain) using the official dedicated bridging path including Warp. * Before using Warp, please verify the following: * The network and recipient address * That the bridge service provider is the official website or a verified source * Successful transaction with a small test transfer * Additionally, check bridge fees and processing times in advance, and ensure you have sufficient gas to cover any transaction fees. Failure to follow these precautions may result in irreversible loss of your digital assets, so please proceed with caution. ## **1. Swap** ### **1.1. What is Swap?** Swap is a token exchange service on the Henesys L1 network that allows you to swap NXPC and NESO at a fixed rate. It is designed to support seamless use of both tokens across various features and services within the MapleStory Universe. ### **1.2. How to Swap tokens with Swap** Image 66 1. **Connect your wallet** * Visit Swap ([https://msu.io/swapnwarp](https://msu.io/swapnwarp)) and connect your wallet. 2. **Select Swap direction** * To receive NESO, select NXPC as ‘PAY’ → NESO as ‘RECEIVE’ * To receive NXPC, select NESO as ‘PAY’ → NXPC as ‘RECEIVE’ 3. **Enter Swap details** * Amount: Enter the amount you want to swap. When NXPC is selected as the “PAY” token, the amount must not be less than 0.00001 or below the estimated gas fee. When NESO is selected as the “PAY” token, the minimum amount allowed is 1. **Minimum exchange amount** NESO = 1 NXPC = 0.00001 **4. Review and confirm** * Fees & Confirmation: Review the estimated network gas fees and confirm all swap details. * Initiate Swap: Approve and sign the transaction in your wallet to start the swap process. ### **1.3. Understanding rates and fees** * Exchange rate: Fixed at 1 NXPC = 100,000 NESO. * Fees: Network gas fees apply. Make sure your wallet has sufficient balance to cover them. * Gas support: Enjoy two (2) free NESO → NXPC swaps per day designed for a smoother user experience. ### **1.4. Monitoring your Swap details** * Transaction Tracker: After initiating the transaction, use the pop-up, block explorer link, or the Transaction tab to check progress. * Transaction History: View all past swaps with direction, amount, and confirmation status. You can filter by wallet address or transaction hash, or click My Transactions to see only your own swap transactions.   ## **2. Warp** ### **2.1. What is Warp?** Warp is a cross-chain bridging service that enables you to transfer tokens or NFTs between Henesys L1 and other supported networks. Warp allows you to move your digital assets securely while maintaining a seamless experience within MapleStory Universe ecosystem. ### **2.2. How to bridge using Warp** Image 67 1. **Connect your wallet** * Visit Warp ([https://msu.io/swapnwarp/warp](https://msu.io/swapnwarp/warp)) and connect your wallet. 2. **Choose your Warp parameters** * Select Warp Direction: Choose your source network and destination network. * Select Asset: Choose the token (NXPC or USDT) you wish to bridge. * Amount: Enter the amount you want to transfer * Recipient Address: Enter the wallet address to receive the tokens * Please double-check the address. Entering an incorrect address may result in permanent loss of your tokens. 3. **Review and approve the transaction** * Fees & Confirmation: Review the estimated network gas fees and bridge fees and confirm all details. * Initiate Warp: Approve and sign the transaction in your wallet to start the warp process. ### **2.3. Understanding fees and transaction status** * Fees: Warp shows estimated network gas fees and bridge fees before you confirm. Make sure your wallet has sufficient balance to cover them. * Transaction status: Transaction status varies depending on network congestion on both the source and destination networks. The status tracker will update you in real time. ### **2.4. Monitoring your Warp details** * Transaction Tracker: After initiating the transaction, use the pop-up, block explorer link, or the Transaction tab to check progress. * Transaction History: View all past warps and confirmation statuses. You can filter by wallet address or transaction hash, or click My Transactions to see only your own warp transactions. ### **2.5. Warp from Henesys L1** Image 68 * Outbound vs Inbound: Bridging out (from Henesys L1) works differently from bridging in (to Henesys L1) * Daily limits: Daily outbound limits depend on your account verification level.\\ Image 69 * There is no limit on inbound (bridge-in) transactions. * For more information, please refer to the [KYC FAQ](https://support.msu.io/hc/en-us/categories/12689000323727-KYC). * When bridging out, you must confirm that you are not located in, or otherwise subject to, any jurisdiction where access is restricted by applicable laws. | **Contact Address** | | | | ------------------------- | ------------------------------------------ | - | | NXPC on Avalanche C-Chain | 0x5E0E90E268BC247Cc850c789A0DB0d5c7621fb59 | | | NXPC on BNB Chain | 0xf2b51CC1850fEd939658317a22d73d3482767591 | | MVP Bronze rank or higher is required to use Warp-Out. Unranked users can only use the Swap and Warp-In features.   ## **3. DEX** ### **3.1. What is a DEX?** * A DEX (Decentralized Exchange) is an exchange that facilitates direct, peer-to-peer cryptocurrency transactions without a central intermediary. * You can access a DEX to swap NXPC and USDT on the Henesys Network by selecting the ‘[DEX](https://henesys.algebra.finance/swap)’ menu in Swap\&Warp. This DEX is provided and operated by Algebra Labs. For any related inquiries, please contact [Algebra Labs](https://algebra.finance/form/). **Important Notice** * Cross-chain transfers (i.e., Warp) are executed via smart contracts and only support eligible digital assets as specified by the protocol. * Make sure you have approved the Swap or Warp contract to spend your tokens. Failing to do so will block your transaction until you manually approve. * Conversion mechanisms (rates, fees, caps, etc.), bridge limits, and supported networks are subject to change at any time without prior notice. * All Swap and Warp transactions are irreversible. Carefully review all transaction details including, but not limited to, the transaction amounts and addresses before signing. * Users are solely responsible for gas fees and fees for Swap and Warp. Insufficient gas fees or failure to meet protocol conditions may result in partial or complete transaction failure. * Always perform swaps and bridges through official Swap and Warp UI. Using unverified third-party tools or websites may not support the correct routes or contract addresses. Use only official, verified bridge interfaces, and perform a small test transfer first. * For support or inquiries related to Swap or Warp, please use our support channel at [support.msu.io](http://support.msu.io).   *** # Web Common Features Source: https://docs.msu.io/msu-services/web-common-features   ## **1. Navigation Bar** All web pages provided by MapleStory Universe share a consistent set of common features that are applied across the platform. These shared features ensure a unified user experience and convenient navigation, regardless of which MapleStory Universe service page you are accessing. ### **1.1. Service Selector Button** Image 93 At the top-left corner of every MapleStory Universe webpage, you will find a **service selector button**, represented by nine dots arranged in a 3x3 grid. When clicked, a dropdown menu appears showing a list of available services. You can conveniently navigate to their desired service by selecting from this list. Image 94 ### **1.2. Notifications** Image 95 The Notifications feature allows you to view service-specific alerts related to the MapleStory Universe service. Notifications are stored for 7 days, after which they are automatically deleted on a daily basis. * You can manually delete any alert by clicking the \[X] button on the right side of each item. * All notifications are listed in chronological order, with the most recent appearing at the top. #### **1.2.1. Notification Categories** Notifications are divided into the following 6 categories: 1. **All**: Displays all alerts across MapleStory Universe services. 2. **Account:** Shows account-related notifications. 3. **Marketplace:** Notifies you of marketplace activity (purchases, sales, offers, bids, etc.). 4. **Swap & Warp:** Displays alerts related to token swap and warp actions. 5. **MSU:** System-sent notifications about MapleStory Universe services. 6. **MSN:** System-sent notifications specific to MapleStory N. #### **1.2.2. Notification Management** Click the three-dot icon in the top right corner of the notification window to access notification deleting options. Image 96 1. **Delete Individually:** Activates a selection mode where you can choose one or more notifications to delete in bulk. 2. **Delete All:** Deletes all notifications within the selected notification category at once. #### **1.2.3. Emergency Notifications** Emergency alerts are sent when there is critical information that you must be aware of while using the MapleStory Universe service. * Emergency alerts are pinned at the top of all notification categories. * They will remain pinned until the **“Confirm”** button is clicked. * You cannot delete a pinned emergency alert using the **\[X]** button. * Only after confirming via the **“Confirm”** button can the alert be removed. ### **1.3. My Page** By clicking your profile image on the top-right (next to Notifications), you can access a summary of your account details: Image 97 * Profile Image * MapleStory Universe Username * Wallet Address * NESO Balance You can also click buttons within the profile section to navigate to your full account details page. #### **1.3.1. Overview** You can view the detailed information of your account. * **Profile Card** * **Profile Image** * **MapleStory Universe username** * **Wallet address** * **Connected email address** * **Account Status:** Indicates whether the account is Normal (not restricted) or Restricted * **Verification & Withdrawal Limit:** Your withdrawal(warp-out & transfer) availability depends on both your MVP status and verification level. * If you do not have an MVP rank, all withdrawals are unavailable regardless of your verification level. * If you have an MVP rank, your daily withdrawal limit is determined by your verification level as shown below. | **Verification Level** | **NFT Transfer** | FT Transfer | Daily Withdrawal(Warp-out\&Token Transfer) Limit | | ------------------------ | ---------------- | ----------- | ------------------------------------------------ | | Lv.0) Wallet connection | Unavailable | Unavailable | \$1,000 | | Lv.1) ID Verification | Available | Available | \$10,000 | | Lv.2) Proof of Residence | Available | Available | \$30,000 | **If you do not have an MVP rank, all withdrawal types are blocked regardless of your verification level.** For more details, see the [MVP System Guide](https://docs.msu.io/welcome-to-msu/mvp-system). * **Social Account:** Your Discord account that is a member of MapleStory Universe Discord server and connected to the MapleStory Universe Web * **Last Login:** Most recent login time * You can click “View All” button on the right to view the entire list of login records. * **Item / NESO Overview** * **Total Item Minted:** Displays the total number of NFT items minted. * **Total NESO Minted:** Shows the total amount of NESO minted by the user. * **Total Trading Volume (NESO):** Indicates the cumulative total of both buying and selling amounts in NESO. * **Asset Status** * **Total NXPC Holdings:** Total NXPC held, along with its USD equivalent. * **Total NESO Holdings:** Total NESO held, along with its USD equivalent. * **Total Characters Owned:** Number of characters owned, including both on-chain and off-chain. * **Total NFT Items Owned:** Number of NFT items held across both the wallet and characters, including on-chain and off-chain. * **Total Consumable Items Owned:** Number of FT items (consumables) held across both the wallet and characters, including on-chain and off-chain. #### **1.3.2. Verification** In this tab, you can check the verification status of your account. **Your withdrawal availability depends on both your MVP status and verification level.** If you do not have an MVP rank, all transfers are unavailable regardless of your verification level. If you have an MVP rank, your NFT/FT transfer availability and daily withdrawal limits are determined by your verification level. You can view your daily withdrawal limit and remaining capacity according to your verification level under the "Withdrawal limit" section at the top. * **Transfer Availability/Daily Withdrawal Limit** The withdrawal limit resets daily at 00:00 (UTC +0). * **Users with MVP rank** | **Verification Level** | **How to Verify** | **NFT Transfer** | **FT Transfer** | **Daily Withdrawal Limit** | | :----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | :-------------- | :------------------------- | | Lv.0) Wallet connection | Connect your Wallet to the MapleStory Universe Web. | Unavailable | Unavailable | \$1,000 | | Lv.1) ID Verification | Sumsub KYC supports template OCR and accepts ID documents from over 210 countries. Typically, verify with a passport or government-issued ID. | Available | Available | \$10,000 | | Lv.2) Proof of Residence | Not available yet; will be available later. | Available | Available | \$30,000 | * **Users without MVP rank** | **Type** | **Availability** | | :------------------------------- | :--------------- | | Token(NXPC, USDT) Warp-out | **Unvailable** | | Token(NXPC, NESO, USDT) Transfer | **Unavailable** | | NFT Transfer | **Unavailable** | | FT Transfer | **Unavailable** | If you'd like to proceed to the next stage of account verification, please click the Proceed button. * For example, if your current account verification level is Lv.0, you'll see the **Proceed** button under the Lv.1 ID verification section. Click this button to start the verification process. **\[[Why do I need to verify?](https://support.msu.io/hc/en-us/categories/12689000323727)]** Clicking this button will redirect you to an FAQ page explaining why account verification is necessary. #### **1.3.3. Settings** You can review and update your account's personal information in the Settings tab. * **Profile** * **Nickname:** Displays your current account username. You can update it by clicking the Change button. * **Profile Image:** Your profile image can be set to one of your characters. If the character is transferred, it can no longer be used as your profile image. * **Email Address:** If you're using MetaMask, your email can be verified and changed. * **Socials** * **Discord:** Shows your linked Discord account. * If not linked, you will see a **Link** button. Click to connect your Discord account. * **Only one Discord account** can be linked per MapleStory Universe account. * If you unlink your Discord, a **24-hour cooldown** will apply before you can relink. * **Delete Account** * You may proceed with account deletion. * Account deletion is subject to the following conditions: * Cannot delete if there are items stored in the MapleStory N NFT Collection. * Upon deletion, the following data will be **removed**: * MSU Marketplace * Registered sales * Sent offers * Received offers * FT orders * Bid orders * Bookmarks * Saved filters * Bid favorites - In accordance with the MapleStory Universe Privacy Policy, deleted account data is stored temporarily for 30 days before being permanently erased. - During this period, you may restore your account but cannot re-register with the same wallet. - Information required by law may still be retained after deletion for the legally mandated period.   ## **2. Footer** Image 98 In the Footer, you can find detailed links and information related to the web services provided by MapleStory Universe. Please note that MSU Explorer is officially supported by the digital asset data service provider CrossAngle, and therefore has a separate Footer from MapleStory Universe. The common Footer elements listed below do not apply to MSU Explorer. The Footer is composed of **five** **key sections:** ### **2.1. Service Logo & Official Social Links** Image 99 On the left side of Footer, you can see the logo of the web service you are currently visiting. Below the logo, you will find links to the five official social media channels through which MapleStory Universe shares information with Maplers. ### **2.2. Tabs equivalent to the Top Menu** You can navigate to different pages by clicking on the **same tabs available in the Top Menu**, also shown in the Footer. Example: In the MSU Marketplace, the Top Menu tabs such as **NFT Items, FT Items, Characters, and Bid** can also be accessed directly from the Footer. Image 100 Image 100 ### **2.3. Synergy App Select Dropdown** At the right corner of the Footer, you can find a dropdown menu that allows you to select Synergy App, redirecting you to the corresponding service’s webpage. Image 102 ### **2.4. User Support Section** Image 103 1. **WhitePaper:** You can check Nexpace whitepaper that encompasses all the aspects of the MapleStory Universe project and its vision forward. 2. **Support:** This link redirects you to the official MapleStory Universe Support webpage. 3. **Contact Us:** Clicking this link opens your default email application, pre-filled with the official email address of Nexpace, the service provider of MapleStory Universe. ### **2.5. Policy Section** Image 104 1. **Terms of use:** You can view the terms and conditions of using MapleStory Universe. 2. **Privacy policy:** You can review the privacy policy regarding how MapleStory Universe handles personal information. 3. **Cookie Policy:** You can check the web cookie policy used by MapleStory Universe. 4. **Legal Document:** You can access the legal documents related to MapleStory Universe. To ensure fair and seamless game service, MapleStory N additionally provides an Operation Policy, which can be found at the bottom right corner of the footer.   *** # Getting Started with MSU Space Source: https://docs.msu.io/msu-space/getting-started-with-msu-space