{
  "info": {
    "name": "Onmeta API",
    "_postman_id": "onmeta-api-v1",
    "description": "Complete Onmeta API collection — On-Ramp, Off-Ramp, KYC, Bank/UPI, and Merchant Wallet endpoints.\n\n**Setup:**\n1. Set the `apiKey` variable to your Client ID (from Dashboard → Setup → API's Setup)\n2. Call **User Login** and copy the `accessToken` from the response into the `accessToken` variable\n3. All other requests are pre-configured to use these variables\n\n**Base URLs:**\n- Production: `https://api.platform.onmeta.in`\n- Staging: `https://stg.api.onmeta.in`\n\nSet the `baseUrl` variable to switch between environments.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "baseUrl", "value": "https://api.platform.onmeta.in", "type": "string" },
    { "key": "stagingUrl", "value": "https://stg.api.onmeta.in", "type": "string" },
    { "key": "apiKey", "value": "your_client_id_here", "type": "string" },
    { "key": "accessToken", "value": "", "type": "string" },
    { "key": "userEmail", "value": "user@example.com", "type": "string" },
    { "key": "orderId", "value": "", "type": "string" },
    { "key": "offrampOrderId", "value": "", "type": "string" },
    { "key": "bankRefNumber", "value": "", "type": "string" },
    { "key": "upiRefNumber", "value": "", "type": "string" }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [{ "key": "token", "value": "{{accessToken}}", "type": "string" }]
  },
  "item": [
    {
      "name": "1. Auth",
      "item": [
        {
          "name": "User Login",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.accessToken) {",
                  "  pm.collectionVariables.set('accessToken', json.data.accessToken);",
                  "  console.log('accessToken saved');",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"{{userEmail}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/users/login", "host": ["{{baseUrl}}"], "path": ["v1", "users", "login"] },
            "description": "Authenticate a user by email. Returns an accessToken (JWT, valid 15 minutes) and a refreshToken.\n\nThe test script automatically saves the accessToken to the collection variable.\n\nJWT claims in the accessToken: sub (user ID), aud (your Client ID), iss (https://iam.onmeta.io/onmeta), iat (issued-at), exp (expiry — 15 min after iat), jti (unique token ID for tracing), tenant_id."
          }
        },
        {
          "name": "Refresh Access Token",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": { "raw": "{{baseUrl}}/v1/users/refresh-token", "host": ["{{baseUrl}}"], "path": ["v1", "users", "refresh-token"] },
            "description": "Refresh an expired access token without requiring the user to log in again."
          }
        },
        {
          "name": "Fetch User Limit",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": { "raw": "{{baseUrl}}/v1/users/limit", "host": ["{{baseUrl}}"], "path": ["v1", "users", "limit"] },
            "description": "Fetch the user's remaining daily transaction limit. Use this before order creation to show available limits."
          }
        }
      ]
    },
    {
      "name": "2. KYC",
      "item": [
        {
          "name": "Fetch KYC Status",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"{{userEmail}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/users/kyc-status", "host": ["{{baseUrl}}"], "path": ["v1", "users", "kyc-status"] },
            "description": "Check if the user has completed KYC. Call this before order creation to ensure the user is verified."
          }
        },
        {
          "name": "Upload KYC",
          "request": {
            "method": "POST",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "email", "value": "{{userEmail}}", "type": "text", "description": "User's email address (required)" },
                { "key": "firstName", "value": "<encrypted_value>", "type": "text", "description": "First name — must be encrypted before sending (required)" },
                { "key": "lastName", "value": "<encrypted_value>", "type": "text", "description": "Last name — must be encrypted before sending (required)" },
                { "key": "panNumber", "value": "<encrypted_value>", "type": "text", "description": "PAN card number — must be encrypted before sending (required)" },
                { "key": "aadharNumber", "value": "<encrypted_value>", "type": "text", "description": "Aadhaar number — must be encrypted before sending (required)" },
                { "key": "incomeRange", "value": "<10L", "type": "text", "description": "Income range (required). Allowed: <10L, 10L-15L, 15L-20L, 20L-25L, 25L-50L, >50L" },
                { "key": "profession", "value": "Software Engineer", "type": "text", "description": "Occupation/profession (required)" },
                { "key": "phone", "value": "9999999999", "type": "text", "description": "Phone number (required)" },
                { "key": "countryCode", "value": "+91", "type": "text", "description": "Country code (optional)" },
                { "key": "address[pin]", "value": "400001", "type": "text", "description": "PIN / ZIP code" },
                { "key": "address[state]", "value": "Maharashtra", "type": "text", "description": "State" },
                { "key": "address[city]", "value": "Mumbai", "type": "text", "description": "City" },
                { "key": "address[locality]", "value": "Bandra", "type": "text", "description": "Locality" },
                { "key": "address[district]", "value": "Mumbai Suburban", "type": "text", "description": "District (optional)" },
                { "key": "address[landmark]", "value": "Near Station", "type": "text", "description": "Landmark (optional)" },
                { "key": "aadharFront", "src": [], "type": "file", "description": "Aadhaar card front image — JPG/PNG/PDF (required)" },
                { "key": "aadharBack", "src": [], "type": "file", "description": "Aadhaar card back image — JPG/PNG/PDF (required)" },
                { "key": "panFront", "src": [], "type": "file", "description": "PAN card front image — JPG/PNG/PDF (required)" },
                { "key": "panBack", "src": [], "type": "file", "description": "PAN card back image — JPG/PNG/PDF (required)" },
                { "key": "selfie", "src": [], "type": "file", "description": "User selfie image — JPG/PNG (required)" }
              ]
            },
            "url": { "raw": "{{baseUrl}}/v1/users/upload/kyc", "host": ["{{baseUrl}}"], "path": ["v1", "users", "upload", "kyc"] },
            "description": "Submit KYC documents for Indian (resident) users. Uses multipart/form-data — attach the actual image files in Postman before sending.\n\n**Note:** `firstName`, `lastName`, `panNumber`, and `aadharNumber` must be encrypted before sending. Contact Onmeta to get the encryption key and method.\n\nRequired files: Aadhaar front, Aadhaar back, PAN front, PAN back, selfie."
          }
        },
        {
          "name": "Upload NRI KYC",
          "request": {
            "method": "POST",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "name", "value": "John Doe", "type": "text", "description": "Full name (required)" },
                { "key": "email", "value": "{{userEmail}}", "type": "text", "description": "Email address (required)" },
                { "key": "dob", "value": "1990-01-01", "type": "text", "description": "Date of birth in YYYY-MM-DD format (required)" },
                { "key": "income_range", "value": "<10L", "type": "text", "description": "Income range (optional)" },
                { "key": "profession", "value": "Software Engineer", "type": "text", "description": "Occupation/profession (optional)" },
                { "key": "address[pin]", "value": "400001", "type": "text", "description": "PIN / ZIP code (required)" },
                { "key": "address[state]", "value": "Maharashtra", "type": "text", "description": "State (required)" },
                { "key": "address[city]", "value": "Mumbai", "type": "text", "description": "City (required)" },
                { "key": "address[locality]", "value": "Bandra", "type": "text", "description": "Locality (required)" },
                { "key": "address[district]", "value": "Mumbai Suburban", "type": "text", "description": "District (optional)" },
                { "key": "address[landmark]", "value": "Near Station", "type": "text", "description": "Landmark (optional)" },
                { "key": "documents[0].docName", "value": "passport", "type": "text", "description": "Document type (required). Allowed: drivers_license_front, drivers_license_back, selfie, passport, SSN, visa" },
                { "key": "documents[0].docNumber", "value": "A1234567", "type": "text", "description": "Document number / ID for the document (required)" },
                { "key": "documents[0].file", "src": [], "type": "file", "description": "Document image file — JPG/PNG/PDF (required). Repeat documents[1].docName / docNumber / file for additional documents." },
                { "key": "selfie", "src": [], "type": "file", "description": "User selfie image — JPG/PNG (optional if selfie is included in documents array)" }
              ]
            },
            "url": { "raw": "{{baseUrl}}/v1/users/nri/kyc", "host": ["{{baseUrl}}"], "path": ["v1", "users", "nri", "kyc"] },
            "description": "Submit KYC documents for NRI users. Uses multipart/form-data.\n\nUse `documents[0]`, `documents[1]`, etc. to submit multiple documents (passport, visa, driver's license, SSN). Each document needs docName, docNumber, and file."
          }
        },
        {
          "name": "Send KYC Email",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"{{userEmail}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/commercial-emails/kyc", "host": ["{{baseUrl}}"], "path": ["v1", "commercial-emails", "kyc"] },
            "description": "Send a KYC completion email to the user."
          }
        }
      ]
    },
    {
      "name": "3. Bank & UPI",
      "item": [
        {
          "name": "Link Bank Account",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.referenceNumber) {",
                  "  pm.collectionVariables.set('bankRefNumber', json.data.referenceNumber);",
                  "  console.log('bankRefNumber saved:', json.data.referenceNumber);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"bankDetails\": {\n    \"accountNumber\": \"1234567890\",\n    \"ifsc\": \"HDFC0001234\"\n  }\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/users/account-link", "host": ["{{baseUrl}}"], "path": ["v1", "users", "account-link"] },
            "description": "Link a bank account for the user. Verification is done via penny drop. The test script saves the referenceNumber for use in Bank Verification Status."
          }
        },
        {
          "name": "Bank Verification Status",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/users/get-bank-status/{{bankRefNumber}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "users", "get-bank-status", "{{bankRefNumber}}"]
            },
            "description": "Poll this endpoint to check bank verification status (SUCCESS / PENDING / FAILED / MANUAL)."
          }
        },
        {
          "name": "Fetch All Bank Accounts",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": { "raw": "{{baseUrl}}/v1/users/bank/fetch", "host": ["{{baseUrl}}"], "path": ["v1", "users", "bank", "fetch"] },
            "description": "Get all bank accounts linked to this user. Max 50 accounts per user."
          }
        },
        {
          "name": "Unlink Bank Account",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"referenceNumber\": \"{{bankRefNumber}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/users/account-unlink", "host": ["{{baseUrl}}"], "path": ["v1", "users", "account-unlink"] },
            "description": "Remove a linked bank account. After unlinking you can re-submit the same account for verification."
          }
        },
        {
          "name": "Link UPI ID",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.referenceId) {",
                  "  pm.collectionVariables.set('upiRefNumber', json.data.referenceId);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"{{userEmail}}\",\n  \"upiId\": \"user@upi\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/users/upi-link", "host": ["{{baseUrl}}"], "path": ["v1", "users", "upi-link"] },
            "description": "Link a UPI ID (VPA) to the user's account. The test script saves the referenceId for use in UPI Verification Status."
          }
        },
        {
          "name": "UPI Verification Status",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/users/get-upi-status/{{upiRefNumber}}",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "users", "get-upi-status", "{{upiRefNumber}}"]
            },
            "description": "Poll UPI verification status."
          }
        },
        {
          "name": "Fetch All UPI IDs",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": { "raw": "{{baseUrl}}/v1/users/upi/fetch", "host": ["{{baseUrl}}"], "path": ["v1", "users", "upi", "fetch"] },
            "description": "Get all UPI IDs linked to this user."
          }
        }
      ]
    },
    {
      "name": "4. On-Ramp",
      "item": [
        {
          "name": "Supported Currencies",
          "request": {
            "method": "GET",
            "header": [{ "key": "x-api-key", "value": "{{apiKey}}" }],
            "url": { "raw": "{{baseUrl}}/v1/orders/currencies", "host": ["{{baseUrl}}"], "path": ["v1", "orders", "currencies"] },
            "description": "Get the list of enabled fiat currencies and payment modes for your API key."
          }
        },
        {
          "name": "Chain-wise Limits",
          "request": {
            "method": "GET",
            "header": [{ "key": "x-api-key", "value": "{{apiKey}}" }],
            "url": { "raw": "{{baseUrl}}/v1/orders/get-chain-limit", "host": ["{{baseUrl}}"], "path": ["v1", "orders", "get-chain-limit"] },
            "description": "Get minimum and maximum transaction limits per blockchain network."
          }
        },
        {
          "name": "Fetch Tokens",
          "request": {
            "method": "GET",
            "header": [{ "key": "x-api-key", "value": "{{apiKey}}" }],
            "url": {
              "raw": "{{baseUrl}}/v1/tokens/",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "tokens", ""]
            },
            "description": "Get all supported tokens. Returns all tokens regardless of chain — no query parameters are accepted."
          }
        },
        {
          "name": "Fetch Buy Quotation",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"buyTokenSymbol\": \"USDT\",\n  \"buyTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"fiatAmount\": 500,\n  \"paymentMode\": \"INR_UPI\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/quote/buy", "host": ["{{baseUrl}}"], "path": ["v1", "quote", "buy"] },
            "description": "Get a real-time buy quotation. Valid for 30 seconds. Use the returned rate to show the user how much crypto they will receive."
          }
        },
        {
          "name": "Create On-Ramp Order",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.orderId) {",
                  "  pm.collectionVariables.set('orderId', json.data.orderId);",
                  "  console.log('orderId saved:', json.data.orderId);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"buyTokenSymbol\": \"USDT\",\n  \"buyTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"fiatAmount\": 500,\n  \"receiverAddress\": \"0xYourWalletAddress\",\n  \"paymentMode\": \"INR_UPI\",\n  \"upiId\": {\n    \"upiId\": \"YourUpiId\",\n    \"name\": \"YourName\"\n  }\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/orders/create", "host": ["{{baseUrl}}"], "path": ["v1", "orders", "create"] },
            "description": "Create an on-ramp order. The test script saves the orderId for use in status polling and UTR submission.\n\nFor `INR_UPI` payment mode, include the `upiId` object as shown. For `INR_IMPS`, replace `upiId` with `bankDetails: { accountNumber, ifsc }`."
          }
        },
        {
          "name": "Fetch Order Status",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"{{orderId}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/orders/status", "host": ["{{baseUrl}}"], "path": ["v1", "orders", "status"] },
            "description": "Poll this endpoint every 10-15 seconds to track order status. Stop polling on terminal statuses: completed, expired, cancelled, refunded."
          }
        },
        {
          "name": "Submit UTR",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"{{orderId}}\",\n  \"utr\": \"123456789012\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/orders/utr", "host": ["{{baseUrl}}"], "path": ["v1", "orders", "utr"] },
            "description": "Submit the UTR (Unique Transaction Reference) after the user completes bank transfer or UPI payment. This is mandatory — without it the order stays at fiatPending and expires after 3 hours."
          }
        },
        {
          "name": "Order History",
          "request": {
            "method": "GET",
            "header": [
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/0",
              "host": ["{{baseUrl}}"],
              "path": ["v1", "orders", "0"],
              "description": "Replace 0 with the skip value for pagination"
            },
            "description": "Fetch paginated order history for the user. Pass skip value for pagination (0, 10, 20, ...)."
          }
        }
      ]
    },
    {
      "name": "5. Off-Ramp",
      "item": [
        {
          "name": "Fetch Sell Quotation",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sellTokenSymbol\": \"USDT\",\n  \"sellTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"sellTokenAmount\": 10\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/quote/sell", "host": ["{{baseUrl}}"], "path": ["v1", "quote", "sell"] },
            "description": "Get a real-time sell quotation. Shows how much INR the user will receive for selling a given amount of crypto."
          }
        },
        {
          "name": "Create Off-Ramp Order",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.orderId) {",
                  "  pm.collectionVariables.set('offrampOrderId', json.data.orderId);",
                  "  console.log('offrampOrderId saved:', json.data.orderId);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sellTokenSymbol\": \"USDT\",\n  \"sellTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"sellTokenAmount\": 10,\n  \"senderWalletAddress\": \"0xYourWalletAddress\",\n  \"refundWalletAddress\": \"0xYourWalletAddress\",\n  \"bankDetails\": {\n    \"accountNumber\": \"1234567890\",\n    \"ifsc\": \"HDFC0001234\"\n  }\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/offramp/orders/create", "host": ["{{baseUrl}}"], "path": ["v1", "offramp", "orders", "create"] },
            "description": "Create an off-ramp order. After creation, send crypto to the receiverWalletAddress in the response, then submit the transaction hash."
          }
        },
        {
          "name": "Fetch Off-Ramp Order Status",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"{{offrampOrderId}}\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/offramp/orders/status", "host": ["{{baseUrl}}"], "path": ["v1", "offramp", "orders", "status"] },
            "description": "Poll off-ramp order status. Terminal status: completed."
          }
        },
        {
          "name": "Submit Transaction Hash",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"{{offrampOrderId}}\",\n  \"txnHash\": \"0xYourBlockchainTransactionHash\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/offramp/orders/txnhash", "host": ["{{baseUrl}}"], "path": ["v1", "offramp", "orders", "txnhash"] },
            "description": "Submit the blockchain transaction hash after sending crypto. Required for Onmeta to verify receipt and process the INR payout."
          }
        }
      ]
    },
    {
      "name": "6. Merchant Wallet",
      "item": [
        {
          "name": "Fetch Wallet Balance",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"chainId\": 101,\n  \"tokenAddress\": \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/merchant/wallet/balance", "host": ["{{baseUrl}}"], "path": ["v1", "merchant", "wallet", "balance"] },
            "description": "Check the current balance of your merchant wallet for a given chain and token."
          }
        },
        {
          "name": "Load Merchant Wallet",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"chainId\": 101,\n  \"tokenAddress\": \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n  \"amount\": \"100\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/merchant/wallet/load", "host": ["{{baseUrl}}"], "path": ["v1", "merchant", "wallet", "load"] },
            "description": "Initiate a wallet load request. Contact the Onmeta tech team to get a dedicated merchant wallet address before using this API."
          }
        },
        {
          "name": "Submit Merchant Transaction Hash",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"{{orderId}}\",\n  \"txnHash\": \"0xYourBlockchainTransactionHash\",\n  \"senderAddress\": \"0xMerchantSenderWalletAddress\"\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/merchant/wallet/transactions/hash", "host": ["{{baseUrl}}"], "path": ["v1", "merchant", "wallet", "transactions", "hash"] },
            "description": "Submit the transaction hash for funds sent from the merchant's wallet to Onmeta. `senderAddress` is the merchant's wallet address that sent the funds."
          }
        },
        {
          "name": "Fetch Sell Quotation (Merchant Wallet)",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sellTokenSymbol\": \"USDT\",\n  \"sellTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"sellTokenAmount\": 10\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/quote/sell", "host": ["{{baseUrl}}"], "path": ["v1", "quote", "sell"] },
            "description": "Get a real-time sell quotation for the merchant wallet off-ramp flow. Same endpoint as the standard off-ramp quotation."
          }
        },
        {
          "name": "Create Off-Ramp Order (Merchant Wallet)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "var json = pm.response.json();",
                  "if (json.data && json.data.orderId) {",
                  "  pm.collectionVariables.set('offrampOrderId', json.data.orderId);",
                  "  console.log('offrampOrderId saved:', json.data.orderId);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" },
              { "key": "x-api-key", "value": "{{apiKey}}" },
              { "key": "Authorization", "value": "Bearer {{accessToken}}" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sellTokenSymbol\": \"USDT\",\n  \"sellTokenAddress\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\",\n  \"chainId\": 137,\n  \"fiatCurrency\": \"inr\",\n  \"sellTokenAmount\": 10,\n  \"bankDetails\": {\n    \"accountNumber\": \"1234567890\",\n    \"ifsc\": \"HDFC0001234\"\n  }\n}"
            },
            "url": { "raw": "{{baseUrl}}/v1/offramp/orders/create", "host": ["{{baseUrl}}"], "path": ["v1", "offramp", "orders", "create"] },
            "description": "Create an off-ramp order using the merchant wallet flow. Same as the standard off-ramp order but `senderWalletAddress` and `refundWalletAddress` are not required — funds come from the pre-loaded merchant wallet."
          }
        }
      ]
    }
  ]
}
