{
  "info": {
    "name": "LayerHop API (0.1.0)",
    "description": "LayerHop is a meta-aggregator. `GET /v1/quote` asks every liquidity provider that supports the route (Jupiter, Relay, deBridge, 0x, KyberSwap, LI.FI) in parallel and ranks the answers by time-adjusted output for the user. `POST /v1/orders` turns a quote into a transaction the user's own wallet signs. LayerHop never holds funds.\n\nSet the `apiKey` collection variable to a key from https://dashboard.layerhop.com/keys (an `lh_test_` key runs everything in test mode: sandbox quotes, placeholder transactions, no real funds). Most read routes also work without a key. Point `baseUrl` at `http://localhost:8787` to use the local mock API (`npx @layerhop/cli dev`).\n\nGenerated from https://docs.layerhop.com/openapi.yaml by scripts/gen-postman.mjs. Do not edit by hand.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "x-api-key",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{apiKey}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.layerhop.com",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Meta",
      "description": "Liveness.",
      "item": [
        {
          "name": "Health check",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/health",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "health"
              ]
            },
            "description": "Liveness probe. Lists the providers loaded in this API instance."
          },
          "response": [
            {
              "name": "200 The API is up.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/health",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "health"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"ok\": true,\n  \"providers\": [\n    \"jupiter\",\n    \"relay\",\n    \"debridge\",\n    \"zerox\",\n    \"kyberswap\",\n    \"lifi\"\n  ]\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Assets",
      "description": "Chains, tokens, USD prices and wallet balances: every chain and token LayerHop's providers can\nroute, for chain and token pickers and balance displays.",
      "item": [
        {
          "name": "List chains",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/chains",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "chains"
              ]
            },
            "description": "Every chain at least one loaded provider can quote from or to. The registry merges the chain\nlists of Relay, LI.FI, deBridge, KyberSwap, Mayan, 0x and Jupiter, is refreshed every 6 hours\nand falls back to the static list in `@layerhop/shared` when a provider list is unavailable.\nPopular chains come first, then the rest alphabetically. `providers` lists the providers that\nsupport the chain in either direction."
          },
          "response": [
            {
              "name": "200 The chain registry.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/chains",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "chains"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"chains\": [\n    {\n      \"id\": 8453,\n      \"slug\": \"base\",\n      \"name\": \"Base\",\n      \"vm\": \"evm\",\n      \"nativeSymbol\": \"ETH\",\n      \"nativeDecimals\": 18,\n      \"logoURI\": \"https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/chains/base.svg\",\n      \"explorerTx\": \"https://basescan.org/tx/\",\n      \"explorerAddress\": \"https://basescan.org/address/\",\n      \"providers\": [\n        \"debridge\",\n        \"kyberswap\",\n        \"lifi\",\n        \"mayan\",\n        \"relay\",\n        \"zerox\"\n      ],\n      \"popular\": true\n    },\n    {\n      \"id\": 80094,\n      \"slug\": \"berachain\",\n      \"name\": \"Berachain\",\n      \"vm\": \"evm\",\n      \"nativeSymbol\": \"BERA\",\n      \"nativeDecimals\": 18,\n      \"logoURI\": \"https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/chains/bera.svg\",\n      \"explorerTx\": \"https://berascan.com/tx/\",\n      \"explorerAddress\": \"https://berascan.com/address/\",\n      \"providers\": [\n        \"kyberswap\",\n        \"lifi\",\n        \"relay\",\n        \"zerox\"\n      ],\n      \"popular\": true\n    },\n    {\n      \"id\": 7565164,\n      \"slug\": \"solana\",\n      \"name\": \"Solana\",\n      \"vm\": \"svm\",\n      \"nativeSymbol\": \"SOL\",\n      \"nativeDecimals\": 9,\n      \"logoURI\": \"https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/chains/solana.svg\",\n      \"explorerTx\": \"https://solscan.io/tx/\",\n      \"explorerAddress\": \"https://solscan.io/account/\",\n      \"providers\": [\n        \"debridge\",\n        \"jupiter\",\n        \"lifi\",\n        \"mayan\",\n        \"relay\"\n      ],\n      \"popular\": true\n    }\n  ]\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/chains",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "chains"
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        },
        {
          "name": "List tokens",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tokens?chain=berachain",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tokens"
              ],
              "query": [
                {
                  "key": "chain",
                  "value": "berachain",
                  "description": "Required. Chain id or slug."
                },
                {
                  "key": "q",
                  "value": "HONEY",
                  "description": "Symbol, name or address to search for.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                }
              ]
            },
            "description": "Tokens on one chain, from LI.FI's token list (all chains, with prices), Jupiter's verified\nlist (Solana) and LayerHop's curated list, de-duplicated by `chainId:address` and cached for\n1 hour. Without `q`, tokens are ordered popular first (native coin, curated, stables and\nmajors), then verified, then by liquidity or price presence.\n\n`q` matches the symbol or name (case-insensitive substring) or an exact address / mint.\nRanking: exact symbol, then popular, then verified, then liquidity / price presence.\nTokens not on any list can still be used: read them with\n[`GET /v1/tokens/lookup`](#look-up-a-token) and quote them by address."
          },
          "response": [
            {
              "name": "200 One page of tokens.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens?chain=berachain",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "berachain",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "q",
                      "value": "HONEY",
                      "description": "Symbol, name or address to search for.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"tokens\": [\n    {\n      \"chainId\": 80094,\n      \"address\": \"0xFCBD14DC51f0A4d49d5E53C2E0950e0bC26d0Dce\",\n      \"symbol\": \"HONEY\",\n      \"name\": \"HONEY\",\n      \"decimals\": 18,\n      \"logoURI\": \"https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/tokens/honey.svg\",\n      \"priceUsd\": 0.9979,\n      \"verified\": true\n    }\n  ],\n  \"nextCursor\": \"1\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens?chain=berachain",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "berachain",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "q",
                      "value": "HONEY",
                      "description": "Symbol, name or address to search for.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens?chain=berachain",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "berachain",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "q",
                      "value": "HONEY",
                      "description": "Symbol, name or address to search for.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Look up a token",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tokens/lookup?chain=base&address=0x4200000000000000000000000000000000000006",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tokens",
                "lookup"
              ],
              "query": [
                {
                  "key": "chain",
                  "value": "base",
                  "description": "Required. Chain id or slug."
                },
                {
                  "key": "address",
                  "value": "0x4200000000000000000000000000000000000006",
                  "description": "Required. Token address (EVM) or mint (Solana)."
                }
              ]
            },
            "description": "One token by address / mint. Listed tokens come from the token list. Anything else is read\non-chain: ERC-20 `symbol`, `name` and `decimals` through Multicall3 on EVM chains; on Solana,\nthe mint account's decimals plus name and symbol from Jupiter's token search (or the\nToken-2022 metadata extension). Tokens read on-chain have `verified: false`; show a warning\nbefore a user trades them."
          },
          "response": [
            {
              "name": "200 The token.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens/lookup?chain=base&address=0x4200000000000000000000000000000000000006",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "base",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "address",
                      "value": "0x4200000000000000000000000000000000000006",
                      "description": "Required. Token address (EVM) or mint (Solana)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"token\": {\n    \"chainId\": 8453,\n    \"address\": \"0x4200000000000000000000000000000000000006\",\n    \"symbol\": \"WETH\",\n    \"name\": \"Wrapped Ether\",\n    \"decimals\": 18,\n    \"priceUsd\": 2423.34,\n    \"verified\": true,\n    \"popular\": true\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens/lookup?chain=base&address=0x4200000000000000000000000000000000000006",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "base",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "address",
                      "value": "0x4200000000000000000000000000000000000006",
                      "description": "Required. Token address (EVM) or mint (Solana)."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/tokens/lookup?chain=base&address=0x4200000000000000000000000000000000000006",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "tokens",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "chain",
                      "value": "base",
                      "description": "Required. Chain id or slug."
                    },
                    {
                      "key": "address",
                      "value": "0x4200000000000000000000000000000000000006",
                      "description": "Required. Token address (EVM) or mint (Solana)."
                    }
                  ]
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get USD prices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/prices?ids=8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "prices"
              ],
              "query": [
                {
                  "key": "ids",
                  "value": "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                  "description": "Required. Comma-separated `chainId:address` (the chain may also be a slug). At most 100."
                }
              ]
            },
            "description": "USD prices for up to 100 tokens: LI.FI prices for EVM chains, Jupiter Price API v3 for\nSolana, with the hourly token-list price as a fallback. Cached for 60 seconds. Ids without a\nknown price are left out of the response."
          },
          "response": [
            {
              "name": "200 Prices keyed by the ids exactly as requested.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/prices?ids=8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "prices"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                      "description": "Required. Comma-separated `chainId:address` (the chain may also be a slug). At most 100."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"prices\": {\n    \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": 0.9998,\n    \"7565164:So11111111111111111111111111111111111111112\": 103.88\n  }\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/prices?ids=8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "prices"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                      "description": "Required. Comma-separated `chainId:address` (the chain may also be a slug). At most 100."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/prices?ids=8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "prices"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,7565164:So11111111111111111111111111111111111111112",
                      "description": "Required. Comma-separated `chainId:address` (the chain may also be a slug). At most 100."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get wallet balances",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "balances"
              ],
              "query": [
                {
                  "key": "address",
                  "value": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                  "description": "Required. EVM address or Solana wallet address."
                },
                {
                  "key": "chains",
                  "value": "base,arbitrum,berachain",
                  "description": "Comma-separated chain ids or slugs (at most 25), all of the address's VM.",
                  "disabled": true
                }
              ]
            },
            "description": "Non-zero balances of a wallet with token metadata, USD price and value, sorted by value.\n\n- EVM address: the native coin plus a Multicall3 `balanceOf` over each chain's top ~200\n  popular and verified tokens, on every requested chain in parallel. Default chains: the\n  popular EVM chains.\n- Solana address: SOL plus every Token and Token-2022 account (summed per mint). Default\n  chain: Solana. Unlisted mints get metadata from Jupiter and `verified: false`; NFTs are skipped.\n\nA chain that fails or times out is reported in `errors` and never fails the request.\nResults are cached per address and chain for 20 seconds."
          },
          "response": [
            {
              "name": "200 The wallet's balances.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "balances"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                      "description": "Required. EVM address or Solana wallet address."
                    },
                    {
                      "key": "chains",
                      "value": "base,arbitrum,berachain",
                      "description": "Comma-separated chain ids or slugs (at most 25), all of the address's VM.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"address\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"vm\": \"evm\",\n  \"balances\": [\n    {\n      \"chainId\": 8453,\n      \"address\": \"0x0000000000000000000000000000000000000000\",\n      \"symbol\": \"ETH\",\n      \"name\": \"ETH\",\n      \"decimals\": 18,\n      \"priceUsd\": 2423.34,\n      \"verified\": true,\n      \"popular\": true,\n      \"amount\": \"3128821803472737280\",\n      \"valueUsd\": 7582.2\n    },\n    {\n      \"chainId\": 8453,\n      \"address\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"symbol\": \"USDC\",\n      \"name\": \"USD Coin\",\n      \"decimals\": 6,\n      \"priceUsd\": 0.9998,\n      \"verified\": true,\n      \"popular\": true,\n      \"amount\": \"2500000\",\n      \"valueUsd\": 2.4995\n    }\n  ],\n  \"totalUsd\": 7584.7,\n  \"errors\": [\n    {\n      \"chainId\": 80094,\n      \"message\": \"Berachain: timed out after 8000 ms\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "balances"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                      "description": "Required. EVM address or Solana wallet address."
                    },
                    {
                      "key": "chains",
                      "value": "base,arbitrum,berachain",
                      "description": "Comma-separated chain ids or slugs (at most 25), all of the address's VM.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "balances"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
                      "description": "Required. EVM address or Solana wallet address."
                    },
                    {
                      "key": "chains",
                      "value": "base,arbitrum,berachain",
                      "description": "Comma-separated chain ids or slugs (at most 25), all of the address's VM.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Quotes",
      "description": "Ask every provider for a price.",
      "item": [
        {
          "name": "Get quotes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/quote?srcChain=base&srcToken=USDC&amount=100000000&dstChain=solana&dstToken=SOL&sender=0x1111111111111111111111111111111111111111&recipient=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "quote"
              ],
              "query": [
                {
                  "key": "srcChain",
                  "value": "base",
                  "description": "Required. Source chain id or slug (any chain from `GET /v1/chains`)."
                },
                {
                  "key": "srcToken",
                  "value": "USDC",
                  "description": "Required. Source token address / mint (any token, see `GET /v1/tokens`), a curated symbol (`USDC`) or the native symbol (`ETH`). Unknown symbols return `UNSUPPORTED_TOKEN`."
                },
                {
                  "key": "amount",
                  "value": "100000000",
                  "description": "Required. Input amount, integer string in base units of `srcToken`. Must be greater than 0."
                },
                {
                  "key": "dstChain",
                  "value": "solana",
                  "description": "Required. Destination chain id or slug."
                },
                {
                  "key": "dstToken",
                  "value": "SOL",
                  "description": "Required. Destination token address / mint, curated symbol or native symbol."
                },
                {
                  "key": "sender",
                  "value": "0x1111111111111111111111111111111111111111",
                  "description": "Required. Address that signs and pays on the source chain."
                },
                {
                  "key": "recipient",
                  "value": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                  "description": "Required. Address that receives the output on the destination chain."
                },
                {
                  "key": "slippageBps",
                  "value": "50",
                  "description": "Maximum slippage in basis points.",
                  "disabled": true
                },
                {
                  "key": "channel",
                  "value": "api",
                  "description": "Where the trade comes from. Decides the LayerHop fee (see `FeeChannel`).",
                  "disabled": true
                },
                {
                  "key": "integrator",
                  "value": "myapp",
                  "description": "Partner id (`[a-z0-9-]{1,32}`). When it is a registered partner, that partner's fee is added on top of LayerHop's and reported as `fees.integratorFeeBps`. Unknown or malformed ids are ignored (never an error). An `x-api-key` that belongs to a partner takes precedence.",
                  "disabled": true
                },
                {
                  "key": "integratorFeeBps",
                  "value": "50",
                  "description": "Partner fee override in bps. Honored only when `x-api-key` belongs to a partner, and must be within that partner's `maxFeeBps` (otherwise `INVALID_PARAMS`). Ignored for label-only partners. LayerHop fee + partner fee is capped at 150 bps by default; the partner part is trimmed to fit.",
                  "disabled": true
                },
                {
                  "key": "gasOnArrival",
                  "value": "false",
                  "description": "Gas on arrival: `true` also delivers $2 of the destination chain's native gas token (ETH on Arbitrum, POL on Polygon…) to `recipient`, paid out of the swap, so the recipient can transact right away. Applies only to cross-chain routes to an EVM chain whose output token is not already native; otherwise it is ignored. Providers that can't deliver gas ignore it; quotes that include it carry `gasOnArrival`. Today: Relay. See the gas-on-arrival guide.",
                  "disabled": true
                },
                {
                  "key": "gasOnArrivalUsd",
                  "value": "",
                  "description": "USD value of native gas to deliver (implies `gasOnArrival=true`). Default 2.",
                  "disabled": true
                }
              ]
            },
            "description": "Fans the request out to every provider that supports the route, in parallel, with a\nper-provider timeout (8 s by default). Successful quotes are ranked best-for-the-user\nfirst by time-adjusted output (1 bp penalty per minute of ETA beyond the first minute,\ncapped at 50 bps), then by speed. Providers that failed are listed in `errors` and do not\nfail the request, unless every provider failed (`NO_ROUTE`). With gas on arrival requested,\nquotes that deliver it (`gasOnArrival` set) rank before those that don't.\n\nEach quote has its own `quoteId`; pass it to `POST /v1/orders` before `expiresAt`."
          },
          "response": [
            {
              "name": "200 Ranked quotes.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote?srcChain=base&srcToken=USDC&amount=100000000&dstChain=solana&dstToken=SOL&sender=0x1111111111111111111111111111111111111111&recipient=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ],
                  "query": [
                    {
                      "key": "srcChain",
                      "value": "base",
                      "description": "Required. Source chain id or slug (any chain from `GET /v1/chains`)."
                    },
                    {
                      "key": "srcToken",
                      "value": "USDC",
                      "description": "Required. Source token address / mint (any token, see `GET /v1/tokens`), a curated symbol (`USDC`) or the native symbol (`ETH`). Unknown symbols return `UNSUPPORTED_TOKEN`."
                    },
                    {
                      "key": "amount",
                      "value": "100000000",
                      "description": "Required. Input amount, integer string in base units of `srcToken`. Must be greater than 0."
                    },
                    {
                      "key": "dstChain",
                      "value": "solana",
                      "description": "Required. Destination chain id or slug."
                    },
                    {
                      "key": "dstToken",
                      "value": "SOL",
                      "description": "Required. Destination token address / mint, curated symbol or native symbol."
                    },
                    {
                      "key": "sender",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Address that signs and pays on the source chain."
                    },
                    {
                      "key": "recipient",
                      "value": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                      "description": "Required. Address that receives the output on the destination chain."
                    },
                    {
                      "key": "slippageBps",
                      "value": "50",
                      "description": "Maximum slippage in basis points.",
                      "disabled": true
                    },
                    {
                      "key": "channel",
                      "value": "api",
                      "description": "Where the trade comes from. Decides the LayerHop fee (see `FeeChannel`).",
                      "disabled": true
                    },
                    {
                      "key": "integrator",
                      "value": "myapp",
                      "description": "Partner id (`[a-z0-9-]{1,32}`). When it is a registered partner, that partner's fee is added on top of LayerHop's and reported as `fees.integratorFeeBps`. Unknown or malformed ids are ignored (never an error). An `x-api-key` that belongs to a partner takes precedence.",
                      "disabled": true
                    },
                    {
                      "key": "integratorFeeBps",
                      "value": "50",
                      "description": "Partner fee override in bps. Honored only when `x-api-key` belongs to a partner, and must be within that partner's `maxFeeBps` (otherwise `INVALID_PARAMS`). Ignored for label-only partners. LayerHop fee + partner fee is capped at 150 bps by default; the partner part is trimmed to fit.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrival",
                      "value": "false",
                      "description": "Gas on arrival: `true` also delivers $2 of the destination chain's native gas token (ETH on Arbitrum, POL on Polygon…) to `recipient`, paid out of the swap, so the recipient can transact right away. Applies only to cross-chain routes to an EVM chain whose output token is not already native; otherwise it is ignored. Providers that can't deliver gas ignore it; quotes that include it carry `gasOnArrival`. Today: Relay. See the gas-on-arrival guide.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrivalUsd",
                      "value": "",
                      "description": "USD value of native gas to deliver (implies `gasOnArrival=true`). Default 2.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"best\": {\n    \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n    \"provider\": \"relay\",\n    \"dstAmount\": \"612345678\",\n    \"dstAmountMin\": \"609283949\",\n    \"estimatedSeconds\": 8,\n    \"fees\": {\n      \"ourFeeBps\": 20,\n      \"providerFeeUsd\": 0.12,\n      \"gasUsd\": 0.03\n    },\n    \"expiresAt\": 1760000030\n  },\n  \"quotes\": [\n    {\n      \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n      \"provider\": \"relay\",\n      \"dstAmount\": \"612345678\",\n      \"dstAmountMin\": \"609283949\",\n      \"estimatedSeconds\": 8,\n      \"fees\": {\n        \"ourFeeBps\": 20,\n        \"providerFeeUsd\": 0.12,\n        \"gasUsd\": 0.03\n      },\n      \"expiresAt\": 1760000030\n    },\n    {\n      \"quoteId\": \"q_0b9a4f7e-1d2c-4e3b-8a6f-5c4d3e2b1a09\",\n      \"provider\": \"debridge\",\n      \"dstAmount\": \"611900000\",\n      \"dstAmountMin\": \"611900000\",\n      \"estimatedSeconds\": 6,\n      \"fees\": {\n        \"ourFeeBps\": 20\n      },\n      \"expiresAt\": 1760000030\n    }\n  ],\n  \"errors\": [\n    {\n      \"provider\": \"lifi\",\n      \"code\": \"PROVIDER_TIMEOUT\",\n      \"message\": \"Timed out: li.quest\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote?srcChain=base&srcToken=USDC&amount=100000000&dstChain=solana&dstToken=SOL&sender=0x1111111111111111111111111111111111111111&recipient=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ],
                  "query": [
                    {
                      "key": "srcChain",
                      "value": "base",
                      "description": "Required. Source chain id or slug (any chain from `GET /v1/chains`)."
                    },
                    {
                      "key": "srcToken",
                      "value": "USDC",
                      "description": "Required. Source token address / mint (any token, see `GET /v1/tokens`), a curated symbol (`USDC`) or the native symbol (`ETH`). Unknown symbols return `UNSUPPORTED_TOKEN`."
                    },
                    {
                      "key": "amount",
                      "value": "100000000",
                      "description": "Required. Input amount, integer string in base units of `srcToken`. Must be greater than 0."
                    },
                    {
                      "key": "dstChain",
                      "value": "solana",
                      "description": "Required. Destination chain id or slug."
                    },
                    {
                      "key": "dstToken",
                      "value": "SOL",
                      "description": "Required. Destination token address / mint, curated symbol or native symbol."
                    },
                    {
                      "key": "sender",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Address that signs and pays on the source chain."
                    },
                    {
                      "key": "recipient",
                      "value": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                      "description": "Required. Address that receives the output on the destination chain."
                    },
                    {
                      "key": "slippageBps",
                      "value": "50",
                      "description": "Maximum slippage in basis points.",
                      "disabled": true
                    },
                    {
                      "key": "channel",
                      "value": "api",
                      "description": "Where the trade comes from. Decides the LayerHop fee (see `FeeChannel`).",
                      "disabled": true
                    },
                    {
                      "key": "integrator",
                      "value": "myapp",
                      "description": "Partner id (`[a-z0-9-]{1,32}`). When it is a registered partner, that partner's fee is added on top of LayerHop's and reported as `fees.integratorFeeBps`. Unknown or malformed ids are ignored (never an error). An `x-api-key` that belongs to a partner takes precedence.",
                      "disabled": true
                    },
                    {
                      "key": "integratorFeeBps",
                      "value": "50",
                      "description": "Partner fee override in bps. Honored only when `x-api-key` belongs to a partner, and must be within that partner's `maxFeeBps` (otherwise `INVALID_PARAMS`). Ignored for label-only partners. LayerHop fee + partner fee is capped at 150 bps by default; the partner part is trimmed to fit.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrival",
                      "value": "false",
                      "description": "Gas on arrival: `true` also delivers $2 of the destination chain's native gas token (ETH on Arbitrum, POL on Polygon…) to `recipient`, paid out of the swap, so the recipient can transact right away. Applies only to cross-chain routes to an EVM chain whose output token is not already native; otherwise it is ignored. Providers that can't deliver gas ignore it; quotes that include it carry `gasOnArrival`. Today: Relay. See the gas-on-arrival guide.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrivalUsd",
                      "value": "",
                      "description": "USD value of native gas to deliver (implies `gasOnArrival=true`). Default 2.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 No provider supports the route, or every provider failed (`NO_ROUTE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote?srcChain=base&srcToken=USDC&amount=100000000&dstChain=solana&dstToken=SOL&sender=0x1111111111111111111111111111111111111111&recipient=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ],
                  "query": [
                    {
                      "key": "srcChain",
                      "value": "base",
                      "description": "Required. Source chain id or slug (any chain from `GET /v1/chains`)."
                    },
                    {
                      "key": "srcToken",
                      "value": "USDC",
                      "description": "Required. Source token address / mint (any token, see `GET /v1/tokens`), a curated symbol (`USDC`) or the native symbol (`ETH`). Unknown symbols return `UNSUPPORTED_TOKEN`."
                    },
                    {
                      "key": "amount",
                      "value": "100000000",
                      "description": "Required. Input amount, integer string in base units of `srcToken`. Must be greater than 0."
                    },
                    {
                      "key": "dstChain",
                      "value": "solana",
                      "description": "Required. Destination chain id or slug."
                    },
                    {
                      "key": "dstToken",
                      "value": "SOL",
                      "description": "Required. Destination token address / mint, curated symbol or native symbol."
                    },
                    {
                      "key": "sender",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Address that signs and pays on the source chain."
                    },
                    {
                      "key": "recipient",
                      "value": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                      "description": "Required. Address that receives the output on the destination chain."
                    },
                    {
                      "key": "slippageBps",
                      "value": "50",
                      "description": "Maximum slippage in basis points.",
                      "disabled": true
                    },
                    {
                      "key": "channel",
                      "value": "api",
                      "description": "Where the trade comes from. Decides the LayerHop fee (see `FeeChannel`).",
                      "disabled": true
                    },
                    {
                      "key": "integrator",
                      "value": "myapp",
                      "description": "Partner id (`[a-z0-9-]{1,32}`). When it is a registered partner, that partner's fee is added on top of LayerHop's and reported as `fees.integratorFeeBps`. Unknown or malformed ids are ignored (never an error). An `x-api-key` that belongs to a partner takes precedence.",
                      "disabled": true
                    },
                    {
                      "key": "integratorFeeBps",
                      "value": "50",
                      "description": "Partner fee override in bps. Honored only when `x-api-key` belongs to a partner, and must be within that partner's `maxFeeBps` (otherwise `INVALID_PARAMS`). Ignored for label-only partners. LayerHop fee + partner fee is capped at 150 bps by default; the partner part is trimmed to fit.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrival",
                      "value": "false",
                      "description": "Gas on arrival: `true` also delivers $2 of the destination chain's native gas token (ETH on Arbitrum, POL on Polygon…) to `recipient`, paid out of the swap, so the recipient can transact right away. Applies only to cross-chain routes to an EVM chain whose output token is not already native; otherwise it is ignored. Providers that can't deliver gas ignore it; quotes that include it carry `gasOnArrival`. Today: Relay. See the gas-on-arrival guide.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrivalUsd",
                      "value": "",
                      "description": "USD value of native gas to deliver (implies `gasOnArrival=true`). Default 2.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NO_ROUTE\",\n    \"message\": \"No provider returned a quote\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NO_ROUTE\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote?srcChain=base&srcToken=USDC&amount=100000000&dstChain=solana&dstToken=SOL&sender=0x1111111111111111111111111111111111111111&recipient=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ],
                  "query": [
                    {
                      "key": "srcChain",
                      "value": "base",
                      "description": "Required. Source chain id or slug (any chain from `GET /v1/chains`)."
                    },
                    {
                      "key": "srcToken",
                      "value": "USDC",
                      "description": "Required. Source token address / mint (any token, see `GET /v1/tokens`), a curated symbol (`USDC`) or the native symbol (`ETH`). Unknown symbols return `UNSUPPORTED_TOKEN`."
                    },
                    {
                      "key": "amount",
                      "value": "100000000",
                      "description": "Required. Input amount, integer string in base units of `srcToken`. Must be greater than 0."
                    },
                    {
                      "key": "dstChain",
                      "value": "solana",
                      "description": "Required. Destination chain id or slug."
                    },
                    {
                      "key": "dstToken",
                      "value": "SOL",
                      "description": "Required. Destination token address / mint, curated symbol or native symbol."
                    },
                    {
                      "key": "sender",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Address that signs and pays on the source chain."
                    },
                    {
                      "key": "recipient",
                      "value": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
                      "description": "Required. Address that receives the output on the destination chain."
                    },
                    {
                      "key": "slippageBps",
                      "value": "50",
                      "description": "Maximum slippage in basis points.",
                      "disabled": true
                    },
                    {
                      "key": "channel",
                      "value": "api",
                      "description": "Where the trade comes from. Decides the LayerHop fee (see `FeeChannel`).",
                      "disabled": true
                    },
                    {
                      "key": "integrator",
                      "value": "myapp",
                      "description": "Partner id (`[a-z0-9-]{1,32}`). When it is a registered partner, that partner's fee is added on top of LayerHop's and reported as `fees.integratorFeeBps`. Unknown or malformed ids are ignored (never an error). An `x-api-key` that belongs to a partner takes precedence.",
                      "disabled": true
                    },
                    {
                      "key": "integratorFeeBps",
                      "value": "50",
                      "description": "Partner fee override in bps. Honored only when `x-api-key` belongs to a partner, and must be within that partner's `maxFeeBps` (otherwise `INVALID_PARAMS`). Ignored for label-only partners. LayerHop fee + partner fee is capped at 150 bps by default; the partner part is trimmed to fit.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrival",
                      "value": "false",
                      "description": "Gas on arrival: `true` also delivers $2 of the destination chain's native gas token (ETH on Arbitrum, POL on Polygon…) to `recipient`, paid out of the swap, so the recipient can transact right away. Applies only to cross-chain routes to an EVM chain whose output token is not already native; otherwise it is ignored. Providers that can't deliver gas ignore it; quotes that include it carry `gasOnArrival`. Today: Relay. See the gas-on-arrival guide.",
                      "disabled": true
                    },
                    {
                      "key": "gasOnArrivalUsd",
                      "value": "",
                      "description": "USD value of native gas to deliver (implies `gasOnArrival=true`). Default 2.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get quotes (JSON body, destination calls)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "quote"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"dstAmount\": \"10000000\",\n  \"sender\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"recipient\": \"0x1111111111111111111111111111111111111111\",\n  \"action\": {\n    \"type\": \"aave-v3-supply\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "The same as `GET /v1/quote` with the parameters as a JSON body, plus **destination calls**:\ncontract calls run on the destination chain with the output, in the same user action (for\nexample bridge USDC and supply it to Aave for `recipient`). See the destination-calls guide.\n\nWith `calls` or `action`, send `dstAmount` (the exact amount of `dstToken` the calls receive)\ninstead of `amount`; each quote then reports `srcAmount` (what `sender` pays, fees included).\nOnly providers that run destination calls are asked (today: Relay); the others are skipped.\nDestination calls are cross-chain only, to EVM chains (not Solana or Hyperliquid), and\ncan't be combined with gas on arrival.\n\n**Trust model.** The calls are made by the provider's executor contract (`calls.executor`),\nnot by the user: `msg.sender` is the executor. Targets must credit `recipient` from a\nparameter (e.g. Aave `supply(..., onBehalfOf)`), never `msg.sender`. For an ERC-20 output,\napprove the target first (`approve(target, dstAmount)` on `dstToken`). Calls that move or\nauthorize third-party assets (`transferFrom`, `safeTransferFrom`, `permit`, Permit2) are\nrejected.\n\n**Mandatory simulation.** Before a quote is returned, its calls run in a read-only\n`eth_simulateV1` on the destination chain, from the executor, after giving it exactly\n`dstAmount` of the output. A call that would revert fails the request with `CALLS_REVERTED`\n(naming the call and the revert reason); if the simulation can't run, `PROVIDER_ERROR`.\nIf a call still reverts at fill time (state changed), the provider refunds `sender`."
          },
          "response": [
            {
              "name": "200 Ranked quotes. With destination calls every quote carries `srcAmount` and `calls`.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"dstAmount\": \"10000000\",\n  \"sender\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"recipient\": \"0x1111111111111111111111111111111111111111\",\n  \"action\": {\n    \"type\": \"aave-v3-supply\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"best\": {\n    \"quoteId\": \"q_713598a2-7493-4cf5-8412-7e44015c9c88\",\n    \"provider\": \"relay\",\n    \"dstAmount\": \"10000000\",\n    \"dstAmountMin\": \"10000000\",\n    \"srcAmount\": \"10083608\",\n    \"estimatedSeconds\": 1,\n    \"fees\": {\n      \"ourFeeBps\": 25,\n      \"providerFeeUsd\": 0.0586,\n      \"gasUsd\": 0.001194\n    },\n    \"expiresAt\": 1792430763,\n    \"calls\": {\n      \"items\": [\n        {\n          \"to\": \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\",\n          \"data\": \"0x095ea7b3000000000000000000000000794a61358d6845594f94dc1db02a252b5b4814ad0000000000000000000000000000000000000000000000000000000000989680\",\n          \"value\": \"0\"\n        },\n        {\n          \"to\": \"0x794a61358d6845594f94dc1db02a252b5b4814ad\",\n          \"data\": \"0x617ba037000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000098968000000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000\",\n          \"value\": \"0\"\n        }\n      ],\n      \"executor\": \"0xb92fe925dc43a0ecde6c8b1a2709c170ec4fff4f\",\n      \"executed\": true,\n      \"simulation\": {\n        \"ok\": true,\n        \"gasUsed\": \"288491\",\n        \"leftover\": \"0\"\n      }\n    }\n  },\n  \"quotes\": [\n    {\n      \"quoteId\": \"q_713598a2-7493-4cf5-8412-7e44015c9c88\",\n      \"provider\": \"relay\",\n      \"dstAmount\": \"10000000\",\n      \"dstAmountMin\": \"10000000\",\n      \"srcAmount\": \"10083608\",\n      \"estimatedSeconds\": 1,\n      \"fees\": {\n        \"ourFeeBps\": 25,\n        \"providerFeeUsd\": 0.0586,\n        \"gasUsd\": 0.001194\n      },\n      \"expiresAt\": 1792430763\n    }\n  ],\n  \"errors\": []\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"dstAmount\": \"10000000\",\n  \"sender\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"recipient\": \"0x1111111111111111111111111111111111111111\",\n  \"action\": {\n    \"type\": \"aave-v3-supply\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 No provider supports the route, or every provider failed (`NO_ROUTE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"dstAmount\": \"10000000\",\n  \"sender\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"recipient\": \"0x1111111111111111111111111111111111111111\",\n  \"action\": {\n    \"type\": \"aave-v3-supply\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NO_ROUTE\",\n    \"message\": \"No provider returned a quote\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NO_ROUTE\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "quote"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"dstAmount\": \"10000000\",\n  \"sender\": \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n  \"recipient\": \"0x1111111111111111111111111111111111111111\",\n  \"action\": {\n    \"type\": \"aave-v3-supply\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Orders",
      "description": "Build, submit and track the transaction for a quote.",
      "item": [
        {
          "name": "List orders by address",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/orders?address=0x1111111111111111111111111111111111111111",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders"
              ],
              "query": [
                {
                  "key": "address",
                  "value": "0x1111111111111111111111111111111111111111",
                  "description": "Required. Sender or recipient address."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only orders with this status.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "Page size.",
                  "disabled": true
                }
              ]
            },
            "description": "Orders built through LayerHop that were sent from or to `address`, newest first. EVM addresses\nmatch case-insensitively. Only public fields are returned. Requires the operator to run the API\nwith a database; otherwise this route returns 404."
          },
          "response": [
            {
              "name": "200 One page of orders.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders?address=0x1111111111111111111111111111111111111111",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Sender or recipient address."
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only orders with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"orders\": [\n    {\n      \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n      \"status\": \"filled\",\n      \"provider\": \"relay\",\n      \"channel\": \"api\",\n      \"srcChainId\": 8453,\n      \"srcToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"dstChainId\": 7565164,\n      \"dstToken\": \"So11111111111111111111111111111111111111112\",\n      \"sender\": \"0x1111111111111111111111111111111111111111\",\n      \"recipient\": \"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM\",\n      \"amount\": \"100000000\",\n      \"dstAmount\": \"612345678\",\n      \"ourFeeBps\": 20,\n      \"partnerFeeBps\": 0,\n      \"srcTxHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\",\n      \"dstTxHash\": \"3nKqYdW1hS8vZ4cT2pXeR7mB9uJfL6aG5oN1wQ8kE3sD7yH2xV4tC6bM9rP1zA5uF8jL2gK7eW3qS6dN4hT9vB1\",\n      \"createdAt\": \"2026-10-17T10:00:00.000Z\",\n      \"updatedAt\": \"2026-10-17T10:00:42.000Z\"\n    }\n  ],\n  \"nextCursor\": \"MjAyNi0xMC0xN1QxMDowMDowMC4wMDBafHFfNmYxYzJkMGU\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders?address=0x1111111111111111111111111111111111111111",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Sender or recipient address."
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only orders with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders?address=0x1111111111111111111111111111111111111111",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Sender or recipient address."
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only orders with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "429 Over your rate limit (`RATE_LIMITED`): the key's `rateLimitRpm`, or `ANON_RATE_LIMIT_RPM` per IP without a key. Wait `retry-after` seconds.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders?address=0x1111111111111111111111111111111111111111",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ],
                  "query": [
                    {
                      "key": "address",
                      "value": "0x1111111111111111111111111111111111111111",
                      "description": "Required. Sender or recipient address."
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only orders with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "Page size.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"Rate limit of 120 requests/minute exceeded; retry in 1s\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Build the transaction",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Returns the transaction for a quote, for the user's wallet to sign. EVM transactions may\ncarry an `approval` (an ERC-20 `approve` to send first). Solana transactions are a base64\nserialized `VersionedTransaction`; when `submitViaApi` is true, sign it and send it to\n`POST /v1/orders/submit` instead of an RPC node.\n\nThe quote must not be expired. Some providers ask you to submit within ~30 s of building."
          },
          "response": [
            {
              "name": "200 The transaction to sign.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"provider\": \"relay\",\n  \"tx\": {\n    \"vm\": \"evm\",\n    \"chainId\": 8453,\n    \"to\": \"0xa5F565650890fBA1824Ee0F21EbBbF660a179934\",\n    \"data\": \"0x58109c...\",\n    \"value\": \"0\",\n    \"approval\": {\n      \"token\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"spender\": \"0xa5F565650890fBA1824Ee0F21EbBbF660a179934\",\n      \"amount\": \"100000000\"\n    }\n  }\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 Unknown `quoteId`, or the provider can no longer build it (`QUOTE_NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"QUOTE_NOT_FOUND\",\n    \"message\": \"Unknown quoteId\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/QUOTE_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "410 The quote is past `expiresAt` (`QUOTE_EXPIRED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "",
              "code": 410,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"QUOTE_EXPIRED\",\n    \"message\": \"Quote expired, request a new one\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/QUOTE_EXPIRED\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            },
            {
              "name": "504 The upstream provider did not answer in time (`PROVIDER_TIMEOUT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "",
              "code": 504,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_TIMEOUT\",\n    \"message\": \"Timed out: dln.debridge.finance\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_TIMEOUT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a signed transaction",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/submit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                "submit"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Only for Solana transactions built with `submitViaApi: true` (today: Jupiter, whose RFQ and\ngasless transactions are co-signed and never land through a plain RPC node). Send the\nwallet-signed transaction as base64; LayerHop forwards it to the provider and returns the\ntransaction signature. For every other provider this returns `INVALID_PARAMS` — broadcast\nfrom the wallet instead."
          },
          "response": [
            {
              "name": "200 The provider accepted and executed the transaction.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"provider\": \"jupiter\",\n  \"txHash\": \"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 Unknown `quoteId`, or the provider can no longer build it (`QUOTE_NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"QUOTE_NOT_FOUND\",\n    \"message\": \"Unknown quoteId\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/QUOTE_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            },
            {
              "name": "504 The upstream provider did not answer in time (`PROVIDER_TIMEOUT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    "submit"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"signedTransaction\": \"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "",
              "code": 504,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_TIMEOUT\",\n    \"message\": \"Timed out: dln.debridge.finance\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_TIMEOUT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get order status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/:provider/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                ":provider",
                ":id"
              ],
              "variable": [
                {
                  "key": "provider",
                  "value": "relay",
                  "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                },
                {
                  "key": "id",
                  "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                  "description": "Provider order id or source tx hash (see above). URL-encode it."
                }
              ]
            },
            "description": "Asks the provider for the current state of an order. What `id` means depends on the\nprovider:\n\n- `relay`: Relay request id or the source deposit tx hash.\n- `debridge`: source tx hash (EVM hash or Solana signature) or a DLN order id.\n- `lifi`: source tx hash.\n- `jupiter`, `zerox`, `kyberswap`: same-chain swaps have nothing to track off-chain; the state is always\n  `unknown`. Confirm the transaction on chain instead.\n\nPoll until `state` is `filled`, `refunded` or `failed`."
          },
          "response": [
            {
              "name": "200 Current order state.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"provider\": \"relay\",\n  \"id\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\",\n  \"state\": \"filled\",\n  \"srcTxHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\",\n  \"dstTxHash\": \"3nKqYdW1hS8vZ4cT2pXeR7mB9uJfL6aG5oN1wQ8kE3sD7yH2xV4tC6bM9rP1zA5uF8jL2gK7eW3qS6dN4hT9vB1\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The provider does not know this order (`ORDER_NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"ORDER_NOT_FOUND\",\n    \"message\": \"deBridge: order not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/ORDER_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "429 The upstream provider rate-limited LayerHop (`RATE_LIMITED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"li.quest 429\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            },
            {
              "name": "504 The upstream provider did not answer in time (`PROVIDER_TIMEOUT`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:provider/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":provider",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "provider",
                      "value": "relay",
                      "description": "The `provider` from the quote. Must be a provider loaded in this API instance."
                    },
                    {
                      "key": "id",
                      "value": "0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
                      "description": "Provider order id or source tx hash (see above). URL-encode it."
                    }
                  ]
                }
              },
              "status": "",
              "code": 504,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_TIMEOUT\",\n    \"message\": \"Timed out: dln.debridge.finance\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_TIMEOUT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Stream an order's status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/:quoteId/events",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                ":quoteId",
                "events"
              ],
              "variable": [
                {
                  "key": "quoteId",
                  "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                  "description": "The order's quote id."
                }
              ]
            },
            "description": "Server-Sent Events: a `ready` event, then an `order` event (`OrderSummary`) with the current\nstate and one more on every change, until the order is final (`filled`, `refunded`, `failed`,\n`expired`), when the stream closes. Comment lines (`: ping`) keep the connection alive every\n15 s; streams last at most 30 minutes (reconnect to continue). Anyone with the `quoteId` can\nwatch; at most 20 open streams per API key or IP."
          },
          "response": [
            {
              "name": "404 The provider does not know this order (`ORDER_NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/events",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "events"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The order's quote id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"ORDER_NOT_FOUND\",\n    \"message\": \"deBridge: order not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/ORDER_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "429 The upstream provider rate-limited LayerHop (`RATE_LIMITED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/events",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "events"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The order's quote id."
                    }
                  ]
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"li.quest 429\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Report the broadcast transaction",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                ":quoteId",
                "submitted"
              ],
              "variable": [
                {
                  "key": "quoteId",
                  "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                  "description": "The quote the transaction was built from."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Call this after the user's wallet broadcast the transaction from `POST /v1/orders`, so LayerHop\ncan track the order to completion (status, webhooks, partner earnings). The SDK's\n`reportSubmitted(quoteId, txHash)` does it for you; `POST /v1/orders/submit` does it automatically.\n\nSets the order's `status` to `submitted`. Idempotent for the same hash. A different hash for an\norder that already has one returns `CONFLICT`. Orders already past `submitted` keep their status."
          },
          "response": [
            {
              "name": "200 Recorded (or already recorded).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"status\": \"submitted\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The provider does not know this order (`ORDER_NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"ORDER_NOT_FOUND\",\n    \"message\": \"deBridge: order not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/ORDER_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            },
            {
              "name": "429 Over your rate limit (`RATE_LIMITED`): the key's `rateLimitRpm`, or `ANON_RATE_LIMIT_RPM` per IP without a key. Wait `retry-after` seconds.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"Rate limit of 120 requests/minute exceeded; retry in 1s\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            },
            {
              "name": "500 Unexpected server error (`INTERNAL`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/orders/:quoteId/submitted",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "orders",
                    ":quoteId",
                    "submitted"
                  ],
                  "variable": [
                    {
                      "key": "quoteId",
                      "value": "q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10",
                      "description": "The quote the transaction was built from."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"txHash\": \"0x3f1e6a2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INTERNAL\",\n    \"message\": \"Internal error\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INTERNAL\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Simulate the transaction",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/simulate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "simulate"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Builds the transaction for a quote (like `POST /v1/orders`, but without recording an order) and\ndry-runs it from the sender on a public RPC. Nothing is signed or sent.\n\n- **EVM:** `eth_call` + `eth_estimateGas`. When the transaction needs an ERC-20 `approval` and the\n  sender's allowance is too low, the swap is simulated with an allowance state override and\n  `needsApproval` is true. If the RPC cannot override state, only the approval is simulated\n  (`simulated: \"approval\"`).\n- **Solana:** `simulateTransaction` with `sigVerify: false` and `replaceRecentBlockhash: true`;\n  `computeUnits` is reported, and failure logs are returned in `error.logs`.\n\nA failing simulation is still a `200` with `ok: false`."
          },
          "response": [
            {
              "name": "200 Simulation result and the transaction that was simulated.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\",\n  \"provider\": \"relay\",\n  \"ok\": true,\n  \"vm\": \"evm\",\n  \"gasEstimate\": \"184233\",\n  \"needsApproval\": true,\n  \"simulated\": \"tx\",\n  \"tx\": {\n    \"vm\": \"evm\",\n    \"chainId\": 8453,\n    \"to\": \"0xa5F565650890fBA1824Ee0F21EbBbF660a179934\",\n    \"data\": \"0x58109c...\",\n    \"value\": \"0\",\n    \"approval\": {\n      \"token\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"spender\": \"0xa5F565650890fBA1824Ee0F21EbBbF660a179934\",\n      \"amount\": \"100000000\"\n    }\n  }\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 Unknown `quoteId`, or the provider can no longer build it (`QUOTE_NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"QUOTE_NOT_FOUND\",\n    \"message\": \"Unknown quoteId\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/QUOTE_NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "410 The quote is past `expiresAt` (`QUOTE_EXPIRED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "",
              "code": 410,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"QUOTE_EXPIRED\",\n    \"message\": \"Quote expired, request a new one\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/QUOTE_EXPIRED\"\n  }\n}"
            },
            {
              "name": "429 Over your rate limit (`RATE_LIMITED`): the key's `rateLimitRpm`, or `ANON_RATE_LIMIT_RPM` per IP without a key. Wait `retry-after` seconds.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"Rate limit of 120 requests/minute exceeded; retry in 1s\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "simulate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quoteId\": \"q_6f1c2d0e-8a51-4c1e-9d0b-2f7a9e3c4b10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Checkout",
      "description": "Pay with any token: a merchant creates a checkout session (an amount in USDC or USDT on one\nchain, paid to their address) and shares its hosted link. The payer pays with any token on any\nchain; LayerHop routes it so the merchant receives at least the amount due, verifies the\ndelivery on the settlement chain, then marks the session `paid` and sends\n`checkout.session.completed`. Creating and managing sessions needs an API key; the payer-facing\nroutes (`GET` a session, `POST …/quote`) do not. Paid sessions can be refunded (in full or in\npart) from the merchant's own wallet with `POST /v1/checkout/sessions/{id}/refunds`.",
      "item": [
        {
          "name": "List checkout sessions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Only sessions with this status.",
                  "disabled": true
                },
                {
                  "key": "productId",
                  "value": "",
                  "description": "Only sessions started from this product.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–100, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Your account's sessions of the key's mode (live or test), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only sessions with this status.",
                      "disabled": true
                    },
                    {
                      "key": "productId",
                      "value": "",
                      "description": "Only sessions started from this product.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–100, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create a checkout session",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"description\": \"Pro plan, 1 month\",\n  \"reference\": \"order_1042\",\n  \"successUrl\": \"https://shop.example.com/thanks\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a payment request for `amount` (base units) of a settlement stablecoin (USDC or USDT on\na supported chain), paid to `recipient`. Returns the session with its hosted `url`; send your\ncustomer there. Needs an API key: an `lh_test_` key creates a test-mode session (`cs_test_…`)\nthat is paid through the sandbox.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "201 Session created.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"description\": \"Pro plan, 1 month\",\n  \"reference\": \"order_1042\",\n  \"successUrl\": \"https://shop.example.com/thanks\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"cs_01k7t9m2c4x8q6r0v3b5n7p9d\",\n  \"object\": \"checkout.session\",\n  \"livemode\": true,\n  \"status\": \"open\",\n  \"amount\": \"49000000\",\n  \"settlement\": {\n    \"chainId\": 8453,\n    \"token\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n    \"symbol\": \"USDC\",\n    \"decimals\": 6\n  },\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"description\": \"Pro plan, 1 month\",\n  \"url\": \"https://layerhop.com/pay/cs_01k7t9m2c4x8q6r0v3b5n7p9d\",\n  \"successUrl\": \"https://shop.example.com/thanks\",\n  \"expiresAt\": \"2026-10-18T11:00:00.000Z\",\n  \"reference\": \"order_1042\",\n  \"refundedAmount\": \"0\",\n  \"createdAt\": \"2026-10-18T10:00:00.000Z\",\n  \"updatedAt\": \"2026-10-18T10:00:00.000Z\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"description\": \"Pro plan, 1 month\",\n  \"reference\": \"order_1042\",\n  \"successUrl\": \"https://shop.example.com/thanks\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"description\": \"Pro plan, 1 month\",\n  \"reference\": \"order_1042\",\n  \"successUrl\": \"https://shop.example.com/thanks\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a checkout session",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "description": "Public: the hosted page and your own code can poll it. Without your API key the response omits\n`reference` and `metadata`. An `open` session past `expiresAt` reads as `expired`."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "List products",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "products"
              ],
              "query": [
                {
                  "key": "active",
                  "value": "",
                  "description": "`true` or `false` to filter.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–100, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "List products\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products"
                  ],
                  "query": [
                    {
                      "key": "active",
                      "value": "",
                      "description": "`true` or `false` to filter.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–100, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create a product",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "products"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Pro plan\",\n  \"description\": \"1 month\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"successUrl\": \"https://shop.example.com/thanks\",\n  \"allowedOrigins\": [\n    \"https://shop.example.com\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "A fixed price for payment buttons, `layerhop.com/buy/{id}` links and store plugins. The amount,\nsettlement token, payout address and redirect URLs live on the product, so anyone may start a\nsession from it (see `POST /v1/checkout/products/{id}/sessions`) without being able to change\nthe price. `allowedOrigins` (https origins, empty = any) limits which websites may start sessions\nfrom a browser. The key's mode decides the product's mode.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Pro plan\",\n  \"description\": \"1 month\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"successUrl\": \"https://shop.example.com/thanks\",\n  \"allowedOrigins\": [\n    \"https://shop.example.com\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Pro plan\",\n  \"description\": \"1 month\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"successUrl\": \"https://shop.example.com/thanks\",\n  \"allowedOrigins\": [\n    \"https://shop.example.com\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a product",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/products/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "products",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                  "description": "Product id."
                }
              ]
            },
            "description": "Public (CORS open to any origin): name, price and settlement for a payment button. With the owner's key: every field."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                      "description": "Product id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Update a product",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/products/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "products",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                  "description": "Product id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"active\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Change any field (the payout is re-validated). `active: false` stops new sessions. Existing sessions keep their terms.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                      "description": "Product id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"active\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Start a checkout for a product",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/products/:id/sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "products",
                ":id",
                "sessions"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                  "description": "Product id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reference\": \"order_1042\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Public, no key, CORS open to any origin (unless the product sets `allowedOrigins`; then other\nbrowser origins get `FORBIDDEN`). Creates a checkout session with the product's amount, token,\npayout address and URLs; the caller may only add `reference` and `metadata`. Inactive products\nreturn `CONFLICT`. Send the payer to the returned `url`, or open it with the embedded checkout."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                      "description": "Product id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reference\": \"order_1042\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/products/:id/sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "products",
                    ":id",
                    "sessions"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "prod_01m57hq2c4x8q6r0v3b5n7p9d",
                      "description": "Product id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reference\": \"order_1042\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Stream a checkout session",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id/events",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id",
                "events"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "description": "Server-Sent Events: `ready`, then a `session` event (`CheckoutSession`, payer view) now and on\nevery change until the session is `paid`, `expired` or `needs_review`. Same limits as the order\nstream."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/events",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "events"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Expire a checkout session",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id/expire",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id",
                "expire"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "description": "Cancels an `open` session so it can no longer be paid (`CONFLICT` for any other status).\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/expire",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "expire"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/expire",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "expire"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Quote a payment for a session",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id",
                "quote"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"srcChain\": \"arbitrum\",\n  \"srcToken\": \"ETH\",\n  \"sender\": \"0x1111111111111111111111111111111111111111\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Public (the payer's side). Prices paying the session with `srcToken` on `srcChain` from\n`sender`. Every quote delivers at least the amount due to the session's recipient (set by the\nsession, never by the payer) and overpays by at most about 3%. Paying in the settlement token\non the settlement chain is a direct transfer (`provider: direct`): the recipient gets exactly\nthe amount due, and LayerHop's same-token fee (0.5% of the amount due, `fees.ourFeeBps: 50`) is\na second transfer on top, so `srcAmount` is the amount due plus the fee. On Solana both\ntransfers are in one transaction; on EVM chains the fee transfer is in the built transaction's\n`extraTxs`. Then build\nthe transaction with `POST /v1/orders` and report it with `POST /v1/orders/{quoteId}/submitted`;\nthe session moves to `processing`."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "quote"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"arbitrum\",\n  \"srcToken\": \"ETH\",\n  \"sender\": \"0x1111111111111111111111111111111111111111\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "quote"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"arbitrum\",\n  \"srcToken\": \"ETH\",\n  \"sender\": \"0x1111111111111111111111111111111111111111\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "quote"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"arbitrum\",\n  \"srcToken\": \"ETH\",\n  \"sender\": \"0x1111111111111111111111111111111111111111\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            },
            {
              "name": "422 No provider supports the route, or every provider failed (`NO_ROUTE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/quote",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "quote"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"arbitrum\",\n  \"srcToken\": \"ETH\",\n  \"sender\": \"0x1111111111111111111111111111111111111111\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NO_ROUTE\",\n    \"message\": \"No provider returned a quote\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NO_ROUTE\"\n  }\n}"
            }
          ]
        },
        {
          "name": "List a session's refunds",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id",
                "refunds"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "description": "Every refund of one of your sessions, newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Refund a paid session",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "checkout",
                "sessions",
                ":id",
                "refunds"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                  "description": "Session id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Starts a full or partial refund of a `paid` session. Non-custodial: LayerHop never holds the\nmoney, so you send the refund from your own wallet (`from`, default the session's payout\naddress). By default it is routed from the settlement token back to the payer's original chain\nand token (`to: original`); `to: settlement` sends the settlement token to the payer's address on\nthe settlement chain (same chain family only). The response carries a `quote`: build its\ntransaction with `POST /v1/orders { quoteId }`, sign it from `quote.from`, then report it with\n`POST /v1/orders/{quoteId}/submitted`. When the transfer lands the refund is `completed`, the\nsession's `refundedAmount` grows and `checkout.session.refunded` is sent. LayerHop takes no fee\non refunds. Test-mode sessions refund through the sandbox.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "201 Refund created (`pending` until you report its transaction).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"refund\": {\n    \"id\": \"re_01k7v2a8c4x8q6r0v3b5n7p9d\",\n    \"object\": \"refund\",\n    \"sessionId\": \"cs_01k7t9m2c4x8q6r0v3b5n7p9d\",\n    \"livemode\": true,\n    \"status\": \"pending\",\n    \"amount\": \"20000000\",\n    \"reason\": \"Partial refund: one seat cancelled\",\n    \"quoteId\": \"q_01k7v2a8d1y3m5p7r9t1v3x5z\",\n    \"to\": {\n      \"chainId\": 42161,\n      \"token\": \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n      \"address\": \"0x1111111111111111111111111111111111111111\"\n    },\n    \"createdAt\": \"2026-10-18T12:00:00.000Z\",\n    \"updatedAt\": \"2026-10-18T12:00:00.000Z\"\n  },\n  \"quote\": {\n    \"quoteId\": \"q_01k7v2a8d1y3m5p7r9t1v3x5z\",\n    \"provider\": \"relay\",\n    \"srcAmount\": \"20000000\",\n    \"dstAmount\": \"19968000\",\n    \"dstAmountMin\": \"19768320\",\n    \"estimatedSeconds\": 12,\n    \"expiresAt\": 1792324830,\n    \"from\": \"0x2222222222222222222222222222222222222222\"\n  },\n  \"next\": \"Build the transaction with POST /v1/orders { quoteId }, sign it from the `from` wallet, then report it with POST /v1/orders/{quoteId}/submitted.\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/checkout/sessions/:id/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "checkout",
                    "sessions",
                    ":id",
                    "refunds"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cs_01k7t9m2c4x8q6r0v3b5n7p9d",
                      "description": "Session id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"20000000\",\n  \"reason\": \"Partial refund: one seat cancelled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Invoices",
      "description": "Bill a customer by email: line items in a settlement stablecoin, a hosted invoice page\n(`https://layerhop.com/invoice/{id}`) where they pay with any token on any chain, an emailed\nreceipt and a PDF. Managing invoices needs an API key; the customer-facing routes (`…/public`,\n`…/pay`, `…/receipt.pdf`) do not.",
      "item": [
        {
          "name": "List invoices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Only invoices with this status.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–100, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Your account's invoices of the key's mode (live or test), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only invoices with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–100, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customerEmail\": \"ap@acme.example\",\n  \"customerName\": \"Acme Corp\",\n  \"merchantName\": \"Studio Nine\",\n  \"lineItems\": [\n    {\n      \"description\": \"Design retainer, October\",\n      \"quantity\": 1,\n      \"unitAmount\": \"1500000000\"\n    },\n    {\n      \"description\": \"Extra revision\",\n      \"quantity\": 2,\n      \"unitAmount\": \"100000000\"\n    }\n  ],\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"dueAt\": \"2026-11-01\",\n  \"memo\": \"Thank you!\",\n  \"send\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Bills a customer for line items in a settlement stablecoin (USDC or USDT on a supported chain),\npaid to `recipient`. The invoice starts as a `draft` with the next number of the key's mode\n(`INV-0001`, …); pass `send: true` to finalize and email it at once. The total `amount` is the\nsum of `quantity × unitAmount`. An `lh_test_` key creates a test-mode invoice (`inv_test_…`).\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "201 Invoice created.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ap@acme.example\",\n  \"customerName\": \"Acme Corp\",\n  \"merchantName\": \"Studio Nine\",\n  \"lineItems\": [\n    {\n      \"description\": \"Design retainer, October\",\n      \"quantity\": 1,\n      \"unitAmount\": \"1500000000\"\n    },\n    {\n      \"description\": \"Extra revision\",\n      \"quantity\": 2,\n      \"unitAmount\": \"100000000\"\n    }\n  ],\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"dueAt\": \"2026-11-01\",\n  \"memo\": \"Thank you!\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"inv_01k7v0c2c4x8q6r0v3b5n7p9d\",\n  \"object\": \"invoice\",\n  \"livemode\": true,\n  \"number\": \"INV-0001\",\n  \"status\": \"open\",\n  \"merchantName\": \"Studio Nine\",\n  \"customerName\": \"Acme Corp\",\n  \"customerEmail\": \"ap@acme.example\",\n  \"memo\": \"Thank you!\",\n  \"lineItems\": [\n    {\n      \"description\": \"Design retainer, October\",\n      \"quantity\": 1,\n      \"unitAmount\": \"1500000000\"\n    },\n    {\n      \"description\": \"Extra revision\",\n      \"quantity\": 2,\n      \"unitAmount\": \"100000000\"\n    }\n  ],\n  \"amount\": \"1700000000\",\n  \"settlement\": {\n    \"chainId\": 8453,\n    \"token\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n    \"symbol\": \"USDC\",\n    \"decimals\": 6\n  },\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"dueAt\": \"2026-11-01T23:59:59.000Z\",\n  \"url\": \"https://layerhop.com/invoice/inv_01k7v0c2c4x8q6r0v3b5n7p9d\",\n  \"sentAt\": \"2026-10-18T10:00:00.000Z\",\n  \"createdAt\": \"2026-10-18T10:00:00.000Z\",\n  \"updatedAt\": \"2026-10-18T10:00:00.000Z\"\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ap@acme.example\",\n  \"customerName\": \"Acme Corp\",\n  \"merchantName\": \"Studio Nine\",\n  \"lineItems\": [\n    {\n      \"description\": \"Design retainer, October\",\n      \"quantity\": 1,\n      \"unitAmount\": \"1500000000\"\n    },\n    {\n      \"description\": \"Extra revision\",\n      \"quantity\": 2,\n      \"unitAmount\": \"100000000\"\n    }\n  ],\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"dueAt\": \"2026-11-01\",\n  \"memo\": \"Thank you!\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ap@acme.example\",\n  \"customerName\": \"Acme Corp\",\n  \"merchantName\": \"Studio Nine\",\n  \"lineItems\": [\n    {\n      \"description\": \"Design retainer, October\",\n      \"quantity\": 1,\n      \"unitAmount\": \"1500000000\"\n    },\n    {\n      \"description\": \"Extra revision\",\n      \"quantity\": 2,\n      \"unitAmount\": \"100000000\"\n    }\n  ],\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"dueAt\": \"2026-11-01\",\n  \"memo\": \"Thank you!\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get an invoice",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Get an invoice\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Update a draft invoice",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"dueAt\": \"2026-11-15\",\n  \"memo\": \"Net 30\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Change any field of a `draft` (other statuses return `CONFLICT`). The total and the payout are re-validated; `null` clears an optional field.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueAt\": \"2026-11-15\",\n  \"memo\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueAt\": \"2026-11-15\",\n  \"memo\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueAt\": \"2026-11-15\",\n  \"memo\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Send an invoice",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id/send",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id",
                "send"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Finalizes a `draft` (it becomes `open` and can no longer be edited) and emails it to\n`customerEmail` from billing@layerhop.com with a link to the hosted page\n`https://layerhop.com/invoice/{id}`. Sending an `open` invoice again re-sends the email. Sends\n`invoice.sent`. Paid and void invoices return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Void an invoice",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id/void",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id",
                "void"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Cancels a `draft` or `open` invoice for good; an open checkout session paying it is expired. Paid and void invoices return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get the customer's view of an invoice",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id/public",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id",
                "public"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Public, no key: what the hosted invoice page shows. Drafts return `NOT_FOUND`. Omits the customer email, the payout address and the session."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/public",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "public"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Start paying an invoice",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id/pay",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id",
                "pay"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Public, no key: returns the checkout session that pays this invoice. A session that is still\nopen (with more than 5 minutes left) or already processing is reused (200); otherwise a new\none is created (201). Send the customer to `url`; when it is paid the invoice becomes `paid`,\nthe receipt is emailed and `invoice.paid` is sent. Paid and void invoices return `CONFLICT`."
          },
          "response": [
            {
              "name": "201 A new session.",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/pay",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "pay"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"sessionId\": \"cs_01k7v1f4c4x8q6r0v3b5n7p9d\",\n  \"url\": \"https://layerhop.com/pay/cs_01k7v1f4c4x8q6r0v3b5n7p9d\"\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/pay",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "pay"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/pay",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "pay"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Download a receipt",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:id/receipt.pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":id",
                "receipt.pdf"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Invoice id."
                }
              ]
            },
            "description": "Public, no key: a one-page PDF receipt of a `paid` invoice (the `receiptUrl` of the invoice). Unpaid invoices return `NOT_FOUND`."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/invoices/:id/receipt.pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "invoices",
                    ":id",
                    "receipt.pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "inv_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Invoice id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Limit orders",
      "description": "Solana limit orders through Jupiter Trigger (beta): sell a token once it reaches your price, with\npartial fills and an optional expiry. The order lives on chain and the wallet signs every step;\nLayerHop never holds funds. Each fill becomes an order (`quoteId` starting with `lof_`,\n`limitOrderId` set) and sends `limit_order.filled`. Recurring (DCA) orders are not offered: no\nDCA API lets integrators charge a fee yet.",
      "item": [
        {
          "name": "List limit orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders"
              ],
              "query": [
                {
                  "key": "wallet",
                  "value": "",
                  "description": "The maker wallet. Required without an API key.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only orders with this status.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–200, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Orders of `wallet` (any caller, like `GET /v1/orders?address=`), or without `wallet` the orders\nof your API key's account. Only orders of the caller's mode (live, or test with an `lh_test_`\nkey), newest first."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders"
                  ],
                  "query": [
                    {
                      "key": "wallet",
                      "value": "",
                      "description": "The maker wallet. Required without an API key.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only orders with this status.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–200, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create a limit order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"SOL\",\n  \"dstToken\": \"USDC\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": 1792540800\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Builds a Solana limit order (Jupiter Trigger): sell `amount` of `srcToken` for at least\n`dstAmount` of `dstToken` (the limit price is `dstAmount / amount`), optionally until\n`expiresAt`. Returns the order and an unsigned transaction (`tx.submitViaApi: true`): the\n`wallet` signs it and you send it to `POST /v1/limit-orders/{id}/submit`. Nothing is on chain\nuntil then. Orders may fill in several parts. The fee is the channel fee plus your partner fee\n(`integrator`, `integratorFeeBps`, resolved as for `GET /v1/quote`), written into the on-chain\norder and charged in `dstToken` on every fill. It applies when `dstToken` is SOL, USDC or USDT;\nfor other output tokens the order carries no fee and `fees` reports 0. Orders must be worth at\nleast $5. An API key is optional (orders are attributed to its account); an `lh_test_` key\ncreates a test-mode order (provider `sandbox`, a fake transaction). Uses the strict rate-limit bucket."
          },
          "response": [
            {
              "name": "201 Order built; sign `tx` with `wallet` and submit it.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"SOL\",\n  \"dstToken\": \"USDC\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": 1792540800\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"lo_01k7x2m4c4x8q6r0v3b5n7p9d\",\n  \"object\": \"limit_order\",\n  \"livemode\": true,\n  \"status\": \"built\",\n  \"provider\": \"jupiter\",\n  \"chainId\": 7565164,\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"So11111111111111111111111111111111111111112\",\n  \"dstToken\": \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": \"2026-10-20T00:00:00.000Z\",\n  \"fees\": {\n    \"ourFeeBps\": 20,\n    \"integratorFeeBps\": 0\n  },\n  \"providerOrderId\": \"hU7b1KJtdhUazueSB85CYFdt8osnpAQYmvNGde7U3Ut\",\n  \"filledAmount\": \"0\",\n  \"filledDstAmount\": \"0\",\n  \"fillCount\": 0,\n  \"channel\": \"api\",\n  \"createdAt\": \"2026-10-19T10:00:00.000Z\",\n  \"updatedAt\": \"2026-10-19T10:00:00.000Z\",\n  \"tx\": {\n    \"vm\": \"svm\",\n    \"serializedTx\": \"AQAAAAAAAAAA…\",\n    \"submitViaApi\": true\n  }\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"SOL\",\n  \"dstToken\": \"USDC\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": 1792540800\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "429 Over your rate limit (`RATE_LIMITED`): the key's `rateLimitRpm`, or `ANON_RATE_LIMIT_RPM` per IP without a key. Wait `retry-after` seconds.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"SOL\",\n  \"dstToken\": \"USDC\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": 1792540800\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"Rate limit of 120 requests/minute exceeded; retry in 1s\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wallet\": \"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9\",\n  \"srcToken\": \"SOL\",\n  \"dstToken\": \"USDC\",\n  \"amount\": \"1000000000\",\n  \"dstAmount\": \"250000000\",\n  \"expiresAt\": 1792540800\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a limit order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Limit order id."
                }
              ]
            },
            "description": "The order and its fills (each one an order whose `quoteId` starts with `lof_`), newest first."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Submit a signed limit order transaction",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders/:id/submit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders",
                ":id",
                "submit"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Limit order id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"signedTransaction\": \"AQAB…\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Sends the wallet-signed create or cancel transaction (whichever was built last) to the provider,\nwhich lands it. Creating: the order becomes `open` and `limit_order.opened` is sent. Cancelling:\n`cancelTxHash` is set right away and the order becomes `cancelled` (with any fills recorded first)\nonce the provider confirms, usually within seconds. `CONFLICT` when there is nothing to submit."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "submit"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"signedTransaction\": \"AQAB…\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "submit"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"signedTransaction\": \"AQAB…\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "submit"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"signedTransaction\": \"AQAB…\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/submit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "submit"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"signedTransaction\": \"AQAB…\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Cancel a limit order",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Limit order id."
                }
              ]
            },
            "description": "An `open` order returns an unsigned cancel transaction (`tx`) for the order's wallet: sign it and\nsend it to `POST /v1/limit-orders/{id}/submit`; the unfilled input goes back to the wallet. A\n`built` order (never submitted) is cancelled at once and `tx` is null. Other statuses return `CONFLICT`."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Simulate a fill or expiry (test mode)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/limit-orders/:id/simulate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "limit-orders",
                ":id",
                "simulate"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Limit order id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"outcome\": \"fill\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Test-mode orders only (live orders return `FORBIDDEN`). The order must be `open`. Within a few\nseconds the worker applies `outcome`: `fill` fills the rest, `partial_fill` fills half of the\nrest (the order stays `open`), `expire` expires it, with the usual `limit_order.*` webhooks and a\nfill order for each fill.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"outcome\": \"fill\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"outcome\": \"fill\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"outcome\": \"fill\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/limit-orders/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "limit-orders",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "lo_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Limit order id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"outcome\": \"fill\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Subscriptions",
      "description": "Recurring billing in crypto. A wallet can't be charged automatically, so each period LayerHop\nissues an invoice for the subscription and emails its pay link; the customer pays it with any\ntoken on any chain. Unpaid past its due date the subscription becomes `past_due`, the customer\ngets reminders 1 and 3 days after the due date, and after 7 days it is canceled. Managing\nsubscriptions needs an API key; an `lh_test_` key creates test-mode subscriptions whose invoices\nare paid in the sandbox.",
      "item": [
        {
          "name": "List subscriptions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Only subscriptions with this status.",
                  "disabled": true
                },
                {
                  "key": "customerEmail",
                  "value": "",
                  "description": "Only this customer's subscriptions.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–100, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Your account's subscriptions of the key's mode (live or test), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only subscriptions with this status.",
                      "disabled": true
                    },
                    {
                      "key": "customerEmail",
                      "value": "",
                      "description": "Only this customer's subscriptions.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–100, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create a subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customerEmail\": \"ada@example.com\",\n  \"customerName\": \"Ada Lovelace\",\n  \"merchantName\": \"Studio Nine\",\n  \"description\": \"Pro plan\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"interval\": \"month\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Starts billing a customer every `intervalCount` × `interval` (day, week, month or year) in a\nsettlement stablecoin. Pass `productId` to bill a product's price, settlement token and payout\naddress, or `amount`, `settleChain`, `settleToken`, `recipient` and `description` directly.\nThe first invoice is issued and emailed at `startAt` (default: now, within a minute); each next\none at the end of the period. Invoices are due `daysUntilDue` days after they are issued\n(default 3). Sends `subscription.created`. An `lh_test_` key creates a test-mode subscription\n(`sub_test_…`).\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ada@example.com\",\n  \"customerName\": \"Ada Lovelace\",\n  \"merchantName\": \"Studio Nine\",\n  \"description\": \"Pro plan\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"interval\": \"month\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ada@example.com\",\n  \"customerName\": \"Ada Lovelace\",\n  \"merchantName\": \"Studio Nine\",\n  \"description\": \"Pro plan\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"interval\": \"month\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerEmail\": \"ada@example.com\",\n  \"customerName\": \"Ada Lovelace\",\n  \"merchantName\": \"Studio Nine\",\n  \"description\": \"Pro plan\",\n  \"amount\": \"49000000\",\n  \"settleChain\": \"base\",\n  \"settleToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"interval\": \"month\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a subscription",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "description": "Get a subscription\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Update a subscription",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": \"59000000\",\n  \"cancelAtPeriodEnd\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes apply from the next invoice: the customer, `description`, `memo`, `amount`, `daysUntilDue`\nand `metadata`. `cancelAtPeriodEnd: true` schedules a cancel at the end of the current period and\n`false` undoes it. The interval and the settlement can't change (create a new subscription).\nCanceled subscriptions return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"59000000\",\n  \"cancelAtPeriodEnd\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"59000000\",\n  \"cancelAtPeriodEnd\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"59000000\",\n  \"cancelAtPeriodEnd\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "List a subscription's invoices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id",
                "invoices"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "description": "The invoices issued for this subscription (up to 100), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "invoices"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Cancel a subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"atPeriodEnd\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cancels now (`atPeriodEnd` false, the default): no more invoices and `subscription.canceled`.\nInvoices already sent stay open; void them with `POST /v1/invoices/{id}/void` if the customer\nshouldn't pay them. With `atPeriodEnd: true` it stays active until `currentPeriodEnd` and is\ncanceled instead of renewed (`cancelAtPeriodEnd` true). Already canceled returns `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Pause a subscription",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id/pause",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id",
                "pause"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "description": "Stops issuing invoices and sending reminders. Only `active` subscriptions can be paused (a\n`past_due` one must be paid or canceled first); others return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Resume a subscription",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/subscriptions/:id/resume",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "subscriptions",
                ":id",
                "resume"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                  "description": "Subscription id."
                }
              ]
            },
            "description": "Resumes a `paused` subscription. If the current period hasn't ended, billing continues on the\nold schedule; otherwise a new period starts now and its invoice goes out right away (paused\ntime is never billed). Invoices still open get a fresh due date. Other statuses return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "sub_01k7v0c2c4x8q6r0v3b5n7p9d",
                      "description": "Subscription id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Deposit addresses",
      "description": "Swap or bridge by sending tokens to an address, without connecting a wallet (beta). Each deposit\nbecomes an order (`quoteId` starting with `dep_`, `depositAddressId` set) with the usual\n`order.*` webhooks. The address belongs to the liquidity provider (Relay); LayerHop never holds\nfunds. Needs an API key; live mode is rolling out (test keys always work).",
      "item": [
        {
          "name": "List deposit addresses",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Only addresses with this status.",
                  "disabled": true
                },
                {
                  "key": "label",
                  "value": "",
                  "description": "Only addresses with exactly this label.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "`nextCursor` from the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "1–200, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Your account's deposit addresses of the key's mode (live or test), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only addresses with this status.",
                      "disabled": true
                    },
                    {
                      "key": "label",
                      "value": "",
                      "description": "Only addresses with exactly this label.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–200, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Only addresses with this status.",
                      "disabled": true
                    },
                    {
                      "key": "label",
                      "value": "",
                      "description": "Only addresses with exactly this label.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "`nextCursor` from the previous page.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "1–200, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create a deposit address",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Returns an address on `srcChain` that your user sends `srcToken` to; each deposit is swapped or\nbridged to `dstToken` on `dstChain` and delivered to `recipient`. The address is created by the\nliquidity provider (Relay); LayerHop never holds the funds. The fee is the API channel fee plus\nyour partner fee (`integrator`, `integratorFeeBps`, resolved exactly as for `GET /v1/quote`).\n`reusable: true` (default) accepts any number of deposits of any amount on the same route;\n`reusable: false` is a one-time address for exactly `amount` (underpayments are refunded to\n`refundTo`). Deposits must be worth at least $1. The response adds an `estimate` for `amount`\n(default: about $100 of `srcToken`). An `lh_test_` key creates a test-mode address (provider\n`sandbox`, a fake address you can `simulate` deposits to); live keys get `FORBIDDEN` until\ndeposit addresses are enabled for live mode on your account (rolling out, available on\nrequest). Uses the strict rate-limit bucket.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "201 Deposit address created.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"da_01k7x2m4c4x8q6r0v3b5n7p9d\",\n  \"object\": \"deposit_address\",\n  \"livemode\": true,\n  \"status\": \"active\",\n  \"provider\": \"relay\",\n  \"address\": \"0x7d3a9f0c1b2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f\",\n  \"chainId\": 8453,\n  \"token\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n  \"dstChainId\": 42161,\n  \"dstToken\": \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"reusable\": true,\n  \"fees\": {\n    \"ourFeeBps\": 20,\n    \"integratorFeeBps\": 0\n  },\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  },\n  \"depositCount\": 0,\n  \"createdAt\": \"2026-10-19T10:00:00.000Z\",\n  \"estimate\": {\n    \"amount\": \"100000000\",\n    \"dstAmount\": \"99780000\",\n    \"dstAmountMin\": \"99280000\",\n    \"estimatedSeconds\": 12\n  }\n}"
            },
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            },
            {
              "name": "429 Over your rate limit (`RATE_LIMITED`): the key's `rateLimitRpm`, or `ANON_RATE_LIMIT_RPM` per IP without a key. Wait `retry-after` seconds.",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"RATE_LIMITED\",\n    \"message\": \"Rate limit of 120 requests/minute exceeded; retry in 1s\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/RATE_LIMITED\"\n  }\n}"
            },
            {
              "name": "502 The upstream provider failed (`PROVIDER_ERROR`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"srcChain\": \"base\",\n  \"srcToken\": \"USDC\",\n  \"dstChain\": \"arbitrum\",\n  \"dstToken\": \"USDC\",\n  \"recipient\": \"0x2222222222222222222222222222222222222222\",\n  \"refundTo\": \"0x3333333333333333333333333333333333333333\",\n  \"label\": \"user-4821\",\n  \"metadata\": {\n    \"userId\": \"4821\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Gateway",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"PROVIDER_ERROR\",\n    \"message\": \"api.relay.link 500\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/PROVIDER_ERROR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a deposit address",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Deposit address id."
                }
              ]
            },
            "description": "The address and its 20 most recent deposits (each one an order), newest first.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Check for deposits now",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses/:id/refresh",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses",
                ":id",
                "refresh"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Deposit address id."
                }
              ]
            },
            "description": "Deposits are detected every ~15 seconds while an address is busy, backing off to every 15 minutes\nwhen it is idle. Call this when your user says they sent funds: the next check runs right away\nand the backoff resets. Disabled addresses return `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/refresh",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "refresh"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/refresh",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "refresh"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/refresh",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "refresh"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Disable a deposit address",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses/:id/disable",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses",
                ":id",
                "disable"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Deposit address id."
                }
              ]
            },
            "description": "Stops tracking the address (`status: disabled`). Stop showing it to your user: the provider may\nstill process funds sent to it later, but LayerHop no longer reports them.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/disable",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "disable"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/disable",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "disable"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Simulate a deposit (test mode)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/deposit-addresses/:id/simulate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "deposit-addresses",
                ":id",
                "simulate"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                  "description": "Deposit address id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": \"25000000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Test keys only (live addresses return `FORBIDDEN`). Records a deposit of `amount` as a new\n`submitted` order that settles like any test order: an amount ending in `4001` is refunded,\n`4002` fails, anything else fills, with the usual `order.*` webhooks. A one-time address needs\nexactly its `amount` and accepts a single deposit (`CONFLICT` after that); disabled addresses\nreturn `CONFLICT`.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "400 Invalid request (`INVALID_PARAMS`, `UNSUPPORTED_CHAIN`, `UNSUPPORTED_TOKEN`, `AMOUNT_TOO_SMALL`, `AMOUNT_TOO_LARGE`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"25000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"amount: amount must be an integer string in base units\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/INVALID_PARAMS\"\n  }\n}"
            },
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"25000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            },
            {
              "name": "404 The resource does not exist or belongs to another account (`NOT_FOUND`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"25000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"API key not found\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/NOT_FOUND\"\n  }\n}"
            },
            {
              "name": "409 The request conflicts with existing state (`CONFLICT`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/deposit-addresses/:id/simulate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "deposit-addresses",
                    ":id",
                    "simulate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "da_01k7x2m4c4x8q6r0v3b5n7p9d",
                      "description": "Deposit address id."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": \"25000000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONFLICT\",\n    \"message\": \"A different txHash was already reported for this order\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/CONFLICT\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Status",
      "description": "Public platform status, the data behind status.layerhop.com.",
      "item": [
        {
          "name": "Get platform status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/status",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "status"
              ]
            },
            "description": "Public, no key, CORS open, cached for 30 seconds: the data behind status.layerhop.com. Every\ncomponent is probed each minute; `status` is `outage` when a component is down, `degraded` when\none failed its latest probe, else `operational`. Includes 90 days of daily uptime per component\nand the incidents of the last 14 days."
          },
          "response": [
            {
              "name": "200 Current status.",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/status",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "status"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"operational\",\n  \"updatedAt\": \"2026-10-18T10:00:00.000Z\",\n  \"components\": [\n    {\n      \"id\": \"api\",\n      \"name\": \"API\",\n      \"group\": \"Core\",\n      \"status\": \"operational\",\n      \"latencyMs\": 84,\n      \"uptime90d\": 99.98,\n      \"days\": [\n        {\n          \"date\": \"2026-10-18\",\n          \"uptime\": 100\n        }\n      ]\n    },\n    {\n      \"id\": \"provider:relay\",\n      \"name\": \"Relay\",\n      \"group\": \"Liquidity providers\",\n      \"status\": \"operational\",\n      \"latencyMs\": 412,\n      \"uptime90d\": 99.9,\n      \"days\": [\n        {\n          \"date\": \"2026-10-18\",\n          \"uptime\": 100\n        }\n      ]\n    }\n  ],\n  \"incidents\": [\n    {\n      \"id\": \"inc_01k7r1a8c4x8q6r0v3b5n7p9d\",\n      \"componentId\": \"provider:relay\",\n      \"component\": \"Relay\",\n      \"title\": \"Relay quotes failing\",\n      \"startedAt\": \"2026-10-12T08:10:00.000Z\",\n      \"resolvedAt\": \"2026-10-12T08:24:00.000Z\"\n    }\n  ],\n  \"url\": \"https://layerhop.com/status\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Developer tools for webhooks with an API key: stream your account's events to your laptop\n(`layerhop listen`) and trigger sample events in test mode (`layerhop trigger`).",
      "item": [
        {
          "name": "Stream your webhook events",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/stream",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                "stream"
              ]
            },
            "description": "Server-Sent Events: every webhook event of the API key's account and mode (live or test),\nas it is created, as `event: event` with the exact payload your endpoints receive. This is what\n`layerhop listen --forward-to <url>` uses to deliver events to your laptop without a public URL.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/webhooks/stream",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "webhooks",
                    "stream"
                  ]
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Trigger a sample event",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/trigger",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                "trigger"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"order.filled\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a realistic sample event of `type` in test mode (`livemode: false`, `sample: true`),\ndelivered to your test endpoints that subscribe to it and to open `listen` streams. Test keys\nonly, so a sample can never reach a live endpoint.\n\n**Requires an API key** (`x-api-key`). Use an `lh_test_` key while you build."
          },
          "response": [
            {
              "name": "401 Missing or wrong credentials (`UNAUTHORIZED`).",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/webhooks/trigger",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "webhooks",
                    "trigger"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"order.filled\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid admin token\",\n    \"requestId\": \"0d5e1f6a-3b2c-4d1e-8f9a-7b6c5d4e3f21\",\n    \"docsUrl\": \"https://docs.layerhop.com/errors/UNAUTHORIZED\"\n  }\n}"
            }
          ]
        }
      ]
    }
  ]
}
