[{"data":1,"prerenderedAt":1454},["ShallowReactive",2],{"navigation_docs":3,"-developer-zone-10-backend-api-reference":121,"-developer-zone-10-backend-api-reference-surround":1451},[4,60],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"User Guide",false,"/getting-started","1.getting-started",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Contribute","/getting-started/contribute","1.getting-started/10.contribute","i-lucide-git-pull-request",{"title":16,"path":17,"stem":18,"icon":19},"FAQ","/getting-started/faq","1.getting-started/11.faq","i-lucide-circle-help",{"title":21,"path":22,"stem":23,"icon":24},"Introduction","/getting-started/introduction","1.getting-started/2.introduction","i-lucide-house",{"title":26,"path":27,"stem":28,"icon":29},"Install Salmon","/getting-started/installation","1.getting-started/3.installation","i-lucide-download",{"title":31,"path":32,"stem":33,"icon":34},"Create or Restore","/getting-started/wallet-setup","1.getting-started/4.wallet-setup","i-lucide-wallet-cards",{"title":36,"path":37,"stem":38,"icon":39},"Use the Wallet","/getting-started/using-salmon","1.getting-started/5.using-salmon","i-lucide-send",{"title":41,"path":42,"stem":43,"icon":44},"Accounts and Settings","/getting-started/settings","1.getting-started/6.settings","i-lucide-settings",{"title":46,"path":47,"stem":48,"icon":49},"Connect to dApps","/getting-started/dapps","1.getting-started/7.dapps","i-lucide-plug",{"title":51,"path":52,"stem":53,"icon":54},"Security and Self-Custody","/getting-started/self-custody","1.getting-started/8.self-custody","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Releases","/getting-started/release-notes","1.getting-started/9.release-notes","i-lucide-clipboard-list",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":6},"Developer Guide","i-lucide-cpu","/developer-zone","2.developer-zone",[66,71,76,81,86,91,96,101,106,111,116],{"title":67,"path":68,"stem":69,"icon":70},"System Overview","/developer-zone/00_stack_and_contributing","2.developer-zone/00_stack_and_contributing","i-lucide-boxes",{"title":72,"path":73,"stem":74,"icon":75},"Frontend Architecture","/developer-zone/01_onboarding_flow","2.developer-zone/01_onboarding_flow","i-lucide-panels-top-left",{"title":77,"path":78,"stem":79,"icon":80},"UI and Design System","/developer-zone/02_ui_component_library","2.developer-zone/02_ui_component_library","i-lucide-layout-template",{"title":82,"path":83,"stem":84,"icon":85},"Product Flows","/developer-zone/03_route_navigation_system","2.developer-zone/03_route_navigation_system","i-lucide-route",{"title":87,"path":88,"stem":89,"icon":90},"State, Storage, and Vault","/developer-zone/04_appcontext","2.developer-zone/04_appcontext","i-lucide-database",{"title":92,"path":93,"stem":94,"icon":95},"Backend Architecture","/developer-zone/05_storage_and_persistence_layer","2.developer-zone/05_storage_and_persistence_layer","i-lucide-server",{"title":97,"path":98,"stem":99,"icon":100},"Internationalization","/developer-zone/06_translation_system","2.developer-zone/06_translation_system","i-lucide-languages",{"title":102,"path":103,"stem":104,"icon":105},"Blockchain Integration","/developer-zone/07_blockchain_account_abstraction","2.developer-zone/07_blockchain_account_abstraction","i-lucide-blocks",{"title":107,"path":108,"stem":109,"icon":110},"API and dApp Integration","/developer-zone/08_wallet_adapter_system","2.developer-zone/08_wallet_adapter_system","i-lucide-waypoints",{"title":112,"path":113,"stem":114,"icon":115},"Local Development","/developer-zone/09_local_development","2.developer-zone/09_local_development","i-lucide-terminal",{"title":117,"path":118,"stem":119,"icon":120},"Backend API Reference","/developer-zone/10_backend_api_reference","2.developer-zone/10_backend_api_reference","i-lucide-braces",{"id":122,"title":117,"body":123,"description":1442,"extension":1443,"links":1444,"meta":1445,"navigation":1446,"path":118,"seo":1447,"stem":119,"__hash__":1450},"docs/2.developer-zone/10_backend_api_reference.md",{"type":124,"value":125,"toc":1426},"minimark",[126,135,140,180,183,228,235,239,312,330,347,351,362,369,395,398,432,435,453,456,460,477,542,547,578,582,587,596,617,696,699,703,712,719,790,793,797,800,809,825,870,873,923,926,930,940,982,1013,1016,1020,1114,1131,1162,1166,1175,1186,1219,1222,1226,1232,1239,1243,1246,1304,1313,1406,1419,1422],[127,128,129,130,134],"p",{},"The Salmon API serves the wallet applications with network discovery, balances, activity, market data, token and NFT data, swaps, and dApp metadata. The checked-in ",[131,132,133],"code",{},"backend/docs/openapi.yaml"," file is the canonical machine-readable contract; this page is the task-oriented companion.",[136,137,139],"h2",{"id":138},"base-urls","Base URLs",[141,142,143,156],"table",{},[144,145,146],"thead",{},[147,148,149,153],"tr",{},[150,151,152],"th",{},"Environment",[150,154,155],{},"Base URL",[157,158,159,170],"tbody",{},[147,160,161,165],{},[162,163,164],"td",{},"Production",[162,166,167],{},[131,168,169],{},"https://api.salmonwallet.io",[147,171,172,175],{},[162,173,174],{},"Serverless offline",[162,176,177],{},[131,178,179],{},"http://127.0.0.1:3000/local",[127,181,182],{},"Examples below use an environment variable so the same command works against either deployment:",[184,185,190],"pre",{"className":186,"code":187,"language":188,"meta":189,"style":189},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SALMON_API_URL=http://127.0.0.1:3000/local\ncurl \"$SALMON_API_URL/status\"\n","bash","",[131,191,192,209],{"__ignoreMap":189},[193,194,197,201,205],"span",{"class":195,"line":196},"line",1,[193,198,200],{"class":199},"sTEyZ","SALMON_API_URL",[193,202,204],{"class":203},"sMK4o","=",[193,206,208],{"class":207},"sfazB","http://127.0.0.1:3000/local\n",[193,210,212,216,219,222,225],{"class":195,"line":211},2,[193,213,215],{"class":214},"sBMFI","curl",[193,217,218],{"class":203}," \"",[193,220,221],{"class":199},"$SALMON_API_URL",[193,223,224],{"class":207},"/status",[193,226,227],{"class":203},"\"\n",[127,229,230,231,234],{},"The API is public and does not require an API key from clients. Production browser requests are CORS-restricted, and ",[131,232,233],{},"/v1"," endpoints are subject to per-IP rate limits.",[136,236,238],{"id":237},"service-and-network-discovery","Service and network discovery",[141,240,241,254],{},[144,242,243],{},[147,244,245,248,251],{},[150,246,247],{},"Method",[150,249,250],{},"Path",[150,252,253],{},"Purpose",[157,255,256,271,284,298],{},[147,257,258,263,268],{},[162,259,260],{},[131,261,262],{},"GET",[162,264,265],{},[131,266,267],{},"/health",[162,269,270],{},"Dependency health, including network access and Redis",[147,272,273,277,281],{},[162,274,275],{},[131,276,262],{},[162,278,279],{},[131,280,224],{},[162,282,283],{},"Service version, build, commit, stage, and server time",[147,285,286,290,295],{},[162,287,288],{},[131,289,262],{},[162,291,292],{},[131,293,294],{},"/ip",[162,296,297],{},"Server-side IP geolocation lookup",[147,299,300,304,309],{},[162,301,302],{},[131,303,262],{},[162,305,306],{},[131,307,308],{},"/v1/networks",[162,310,311],{},"Stage-aware network catalog and enabled feature sections",[127,313,314,315,317,318,321,322,325,326,329],{},"Clients should use ",[131,316,308],{}," instead of hard-coding which networks and sections are enabled. A network entry includes its ",[131,319,320],{},"id",", blockchain, environment, currency information, public configuration, ",[131,323,324],{},"enabled"," state, and feature ",[131,327,328],{},"sections",".",[184,331,333],{"className":186,"code":332,"language":188,"meta":189,"style":189},"curl \"$SALMON_API_URL/v1/networks\"\n",[131,334,335],{"__ignoreMap":189},[193,336,337,339,341,343,345],{"class":195,"line":196},[193,338,215],{"class":214},[193,340,218],{"class":203},[193,342,221],{"class":199},[193,344,308],{"class":207},[193,346,227],{"class":203},[136,348,350],{"id":349},"balances","Balances",[184,352,356],{"className":353,"code":354,"language":355,"meta":189,"style":189},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GET /v1/{networkId}/account/{address}/balance\n","http",[131,357,358],{"__ignoreMap":189},[193,359,360],{"class":195,"line":196},[193,361,354],{},[127,363,364,365,368],{},"Supported ",[131,366,367],{},"networkId"," values are:",[370,371,372,386],"ul",{},[373,374,375,378,379,382,383],"li",{},[131,376,377],{},"solana-mainnet",", ",[131,380,381],{},"solana-testnet",", and ",[131,384,385],{},"solana-devnet",[373,387,388,391,392],{},[131,389,390],{},"bitcoin-mainnet"," and ",[131,393,394],{},"bitcoin-testnet",[127,396,397],{},"Optional query parameters:",[141,399,400,410],{},[144,401,402],{},[147,403,404,407],{},[150,405,406],{},"Parameter",[150,408,409],{},"Meaning",[157,411,412,422],{},[147,413,414,419],{},[162,415,416],{},[131,417,418],{},"tokens",[162,420,421],{},"Chain-specific token filter passed to the provider",[147,423,424,429],{},[162,425,426],{},[131,427,428],{},"includeSpam=true",[162,430,431],{},"Include assets normally removed by spam filtering",[127,433,434],{},"The response is always an array. Each item identifies the owner, blockchain, amount in base units, decimals, symbol, name, type, and asset address. Price and logo fields are present only when enrichment succeeds.",[184,436,438],{"className":186,"code":437,"language":188,"meta":189,"style":189},"curl \"$SALMON_API_URL/v1/solana-mainnet/account/ACCOUNT_ADDRESS/balance\"\n",[131,439,440],{"__ignoreMap":189},[193,441,442,444,446,448,451],{"class":195,"line":196},[193,443,215],{"class":214},[193,445,218],{"class":203},[193,447,221],{"class":199},[193,449,450],{"class":207},"/v1/solana-mainnet/account/ACCOUNT_ADDRESS/balance",[193,452,227],{"class":203},[127,454,455],{},"Do not interpret a provider error as an empty balance. The backend deliberately surfaces failures rather than returning a misleading empty array.",[136,457,459],{"id":458},"solana-activity-and-tokens","Solana activity and tokens",[127,461,462,463,378,466,469,470,473,474,329],{},"Solana paths accept ",[131,464,465],{},"mainnet",[131,467,468],{},"testnet",", or ",[131,471,472],{},"devnet"," as ",[131,475,476],{},"{env}",[141,478,479,490],{},[144,480,481],{},[147,482,483,485,487],{},[150,484,247],{},[150,486,250],{},[150,488,489],{},"Parameters",[157,491,492,511,525],{},[147,493,494,498,503],{},[162,495,496],{},[131,497,262],{},[162,499,500],{},[131,501,502],{},"/v1/solana-{env}/account/{address}/transactions",[162,504,505,378,508],{},[131,506,507],{},"pageSize",[131,509,510],{},"pageToken",[147,512,513,517,522],{},[162,514,515],{},[131,516,262],{},[162,518,519],{},[131,520,521],{},"/v1/solana-{env}/ft/verified",[162,523,524],{},"None",[147,526,527,531,536],{},[162,528,529],{},[131,530,262],{},[162,532,533],{},[131,534,535],{},"/v1/solana-{env}/ft/search",[162,537,538,539],{},"Required ",[131,540,541],{},"query",[127,543,544,546],{},[131,545,510],{}," is the transaction signature before which the next page is loaded. The primary provider is the configured RPC/DAS provider; Helius may serve as a rate-limited fallback when configured.",[184,548,550],{"className":186,"code":549,"language":188,"meta":189,"style":189},"curl \"$SALMON_API_URL/v1/solana-mainnet/account/ACCOUNT_ADDRESS/transactions?pageSize=20\"\ncurl \"$SALMON_API_URL/v1/solana-mainnet/ft/search?query=USDC\"\n",[131,551,552,565],{"__ignoreMap":189},[193,553,554,556,558,560,563],{"class":195,"line":196},[193,555,215],{"class":214},[193,557,218],{"class":203},[193,559,221],{"class":199},[193,561,562],{"class":207},"/v1/solana-mainnet/account/ACCOUNT_ADDRESS/transactions?pageSize=20",[193,564,227],{"class":203},[193,566,567,569,571,573,576],{"class":195,"line":211},[193,568,215],{"class":214},[193,570,218],{"class":203},[193,572,221],{"class":199},[193,574,575],{"class":207},"/v1/solana-mainnet/ft/search?query=USDC",[193,577,227],{"class":203},[136,579,581],{"id":580},"swaps","Swaps",[583,584,586],"h3",{"id":585},"create-an-order","Create an order",[184,588,590],{"className":353,"code":589,"language":355,"meta":189,"style":189},"GET /v1/solana-{env}/ft/swap/order\n",[131,591,592],{"__ignoreMap":189},[193,593,594],{"class":195,"line":196},[193,595,589],{},[127,597,598,599,378,602,382,605,608,609,612,613,616],{},"Required query parameters are ",[131,600,601],{},"inputMint",[131,603,604],{},"outputMint",[131,606,607],{},"publicKey",". Supply exactly one amount representation appropriate to the client flow: ",[131,610,611],{},"amount"," for base units or ",[131,614,615],{},"uiAmount"," for a display amount.",[184,618,620],{"className":186,"code":619,"language":188,"meta":189,"style":189},"curl --get \"$SALMON_API_URL/v1/solana-mainnet/ft/swap/order\" \\\n  --data-urlencode \"inputMint=INPUT_MINT\" \\\n  --data-urlencode \"outputMint=OUTPUT_MINT\" \\\n  --data-urlencode \"publicKey=ACCOUNT_ADDRESS\" \\\n  --data-urlencode \"uiAmount=1.5\"\n",[131,621,622,642,656,670,684],{"__ignoreMap":189},[193,623,624,626,629,631,633,636,639],{"class":195,"line":196},[193,625,215],{"class":214},[193,627,628],{"class":207}," --get",[193,630,218],{"class":203},[193,632,221],{"class":199},[193,634,635],{"class":207},"/v1/solana-mainnet/ft/swap/order",[193,637,638],{"class":203},"\"",[193,640,641],{"class":199}," \\\n",[193,643,644,647,649,652,654],{"class":195,"line":211},[193,645,646],{"class":207},"  --data-urlencode",[193,648,218],{"class":203},[193,650,651],{"class":207},"inputMint=INPUT_MINT",[193,653,638],{"class":203},[193,655,641],{"class":199},[193,657,659,661,663,666,668],{"class":195,"line":658},3,[193,660,646],{"class":207},[193,662,218],{"class":203},[193,664,665],{"class":207},"outputMint=OUTPUT_MINT",[193,667,638],{"class":203},[193,669,641],{"class":199},[193,671,673,675,677,680,682],{"class":195,"line":672},4,[193,674,646],{"class":207},[193,676,218],{"class":203},[193,678,679],{"class":207},"publicKey=ACCOUNT_ADDRESS",[193,681,638],{"class":203},[193,683,641],{"class":199},[193,685,687,689,691,694],{"class":195,"line":686},5,[193,688,646],{"class":207},[193,690,218],{"class":203},[193,692,693],{"class":207},"uiAmount=1.5",[193,695,227],{"class":203},[127,697,698],{},"The response includes order data plus the transaction material the client must review and sign. The backend never receives the seed phrase or private key.",[583,700,702],{"id":701},"execute-a-signed-order","Execute a signed order",[184,704,706],{"className":353,"code":705,"language":355,"meta":189,"style":189},"POST /v1/solana-{env}/ft/swap/execute\n",[131,707,708],{"__ignoreMap":189},[193,709,710],{"class":195,"line":196},[193,711,705],{},[127,713,714,715,718],{},"Send the base64-encoded signed transaction and the ",[131,716,717],{},"requestId"," returned with the order:",[184,720,722],{"className":186,"code":721,"language":188,"meta":189,"style":189},"curl -X POST \"$SALMON_API_URL/v1/solana-mainnet/ft/swap/execute\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"signedTransaction\": \"BASE64_SIGNED_TRANSACTION\",\n    \"requestId\": \"ORDER_REQUEST_ID\"\n  }'\n",[131,723,724,745,761,771,776,781],{"__ignoreMap":189},[193,725,726,728,731,734,736,738,741,743],{"class":195,"line":196},[193,727,215],{"class":214},[193,729,730],{"class":207}," -X",[193,732,733],{"class":207}," POST",[193,735,218],{"class":203},[193,737,221],{"class":199},[193,739,740],{"class":207},"/v1/solana-mainnet/ft/swap/execute",[193,742,638],{"class":203},[193,744,641],{"class":199},[193,746,747,750,753,756,759],{"class":195,"line":211},[193,748,749],{"class":207},"  -H",[193,751,752],{"class":203}," '",[193,754,755],{"class":207},"Content-Type: application/json",[193,757,758],{"class":203},"'",[193,760,641],{"class":199},[193,762,763,766,768],{"class":195,"line":658},[193,764,765],{"class":207},"  -d",[193,767,752],{"class":203},[193,769,770],{"class":207},"{\n",[193,772,773],{"class":195,"line":672},[193,774,775],{"class":207},"    \"signedTransaction\": \"BASE64_SIGNED_TRANSACTION\",\n",[193,777,778],{"class":195,"line":686},[193,779,780],{"class":207},"    \"requestId\": \"ORDER_REQUEST_ID\"\n",[193,782,784,787],{"class":195,"line":783},6,[193,785,786],{"class":207},"  }",[193,788,789],{"class":203},"'\n",[127,791,792],{},"This endpoint accepts already signed transaction data. Never log the request body or reuse a signed order after its intended flow.",[136,794,796],{"id":795},"nfts","NFTs",[127,798,799],{},"List the NFTs owned by a public key:",[184,801,803],{"className":353,"code":802,"language":355,"meta":189,"style":189},"GET /v1/solana-{env}/nft?publicKey={address}\n",[131,804,805],{"__ignoreMap":189},[193,806,807],{"class":195,"line":196},[193,808,802],{},[127,810,811,812,378,815,378,818,382,821,824],{},"Optional parameters are ",[131,813,814],{},"includeSpam",[131,816,817],{},"limit",[131,819,820],{},"offset",[131,822,823],{},"noCache",". Fungible assets are excluded. Spam filtering can make a page contain fewer items than the provider's reported total.",[184,826,828],{"className":186,"code":827,"language":188,"meta":189,"style":189},"curl --get \"$SALMON_API_URL/v1/solana-mainnet/nft\" \\\n  --data-urlencode \"publicKey=ACCOUNT_ADDRESS\" \\\n  --data-urlencode \"limit=20\"\n",[131,829,830,847,859],{"__ignoreMap":189},[193,831,832,834,836,838,840,843,845],{"class":195,"line":196},[193,833,215],{"class":214},[193,835,628],{"class":207},[193,837,218],{"class":203},[193,839,221],{"class":199},[193,841,842],{"class":207},"/v1/solana-mainnet/nft",[193,844,638],{"class":203},[193,846,641],{"class":199},[193,848,849,851,853,855,857],{"class":195,"line":211},[193,850,646],{"class":207},[193,852,218],{"class":203},[193,854,679],{"class":207},[193,856,638],{"class":203},[193,858,641],{"class":199},[193,860,861,863,865,868],{"class":195,"line":658},[193,862,646],{"class":207},[193,864,218],{"class":203},[193,866,867],{"class":207},"limit=20",[193,869,227],{"class":203},[127,871,872],{},"The transaction builders return unsigned material for client-side review and signing:",[141,874,875,886],{},[144,876,877],{},[147,878,879,881,883],{},[150,880,247],{},[150,882,250],{},[150,884,885],{},"Required query parameters",[157,887,888,905],{},[147,889,890,895,900],{},[162,891,892],{},[131,893,894],{},"POST",[162,896,897],{},[131,898,899],{},"/v1/solana-{env}/nft/{mintAddress}",[162,901,902],{},[131,903,904],{},"owner",[147,906,907,911,916],{},[162,908,909],{},[131,910,894],{},[162,912,913],{},[131,914,915],{},"/v1/solana-{env}/nft/{mintAddress}/transfer",[162,917,918,378,920],{},[131,919,904],{},[131,921,922],{},"destination",[127,924,925],{},"Burn and transfer are destructive after the returned transaction is signed and submitted. Integrations must show an explicit approval step and verify the network, mint, owner, and destination.",[136,927,929],{"id":928},"bitcoin-activity","Bitcoin activity",[127,931,932,933,935,936,473,938,329],{},"Bitcoin paths accept ",[131,934,465],{}," or ",[131,937,468],{},[131,939,476],{},[141,941,942,952],{},[144,943,944],{},[147,945,946,948,950],{},[150,947,247],{},[150,949,250],{},[150,951,253],{},[157,953,954,968],{},[147,955,956,960,965],{},[162,957,958],{},[131,959,262],{},[162,961,962],{},[131,963,964],{},"/v1/bitcoin-{env}/account/{address}/transactions",[162,966,967],{},"Canonical transaction history",[147,969,970,974,979],{},[162,971,972],{},[131,973,262],{},[162,975,976],{},[131,977,978],{},"/v1/bitcoin-{env}/account/{address}/utxo",[162,980,981],{},"Spendable outputs for an address",[184,983,985],{"className":186,"code":984,"language":188,"meta":189,"style":189},"curl \"$SALMON_API_URL/v1/bitcoin-mainnet/account/ACCOUNT_ADDRESS/transactions\"\ncurl \"$SALMON_API_URL/v1/bitcoin-mainnet/account/ACCOUNT_ADDRESS/utxo\"\n",[131,986,987,1000],{"__ignoreMap":189},[193,988,989,991,993,995,998],{"class":195,"line":196},[193,990,215],{"class":214},[193,992,218],{"class":203},[193,994,221],{"class":199},[193,996,997],{"class":207},"/v1/bitcoin-mainnet/account/ACCOUNT_ADDRESS/transactions",[193,999,227],{"class":203},[193,1001,1002,1004,1006,1008,1011],{"class":195,"line":211},[193,1003,215],{"class":214},[193,1005,218],{"class":203},[193,1007,221],{"class":199},[193,1009,1010],{"class":207},"/v1/bitcoin-mainnet/account/ACCOUNT_ADDRESS/utxo",[193,1012,227],{"class":203},[127,1014,1015],{},"These endpoints are read-only. The backend does not receive or relay a signed Bitcoin transaction.",[136,1017,1019],{"id":1018},"market-data","Market data",[141,1021,1022,1033],{},[144,1023,1024],{},[147,1025,1026,1028,1030],{},[150,1027,247],{},[150,1029,250],{},[150,1031,1032],{},"Useful parameters",[157,1034,1035,1048,1067,1084,1099],{},[147,1036,1037,1041,1046],{},[162,1038,1039],{},[131,1040,262],{},[162,1042,1043],{},[131,1044,1045],{},"/v1/exchange-rates",[162,1047,524],{},[147,1049,1050,1054,1059],{},[162,1051,1052],{},[131,1053,262],{},[162,1055,1056],{},[131,1057,1058],{},"/v1/chart/{coinId}",[162,1060,1061,378,1064],{},[131,1062,1063],{},"days",[131,1065,1066],{},"currency",[147,1068,1069,1073,1078],{},[162,1070,1071],{},[131,1072,262],{},[162,1074,1075],{},[131,1076,1077],{},"/v1/chart/{platform}/contract/{address}",[162,1079,1080,378,1082],{},[131,1081,1063],{},[131,1083,1066],{},[147,1085,1086,1090,1095],{},[162,1087,1088],{},[131,1089,262],{},[162,1091,1092],{},[131,1093,1094],{},"/v1/coin/{coinId}",[162,1096,1097],{},[131,1098,1066],{},[147,1100,1101,1105,1110],{},[162,1102,1103],{},[131,1104,262],{},[162,1106,1107],{},[131,1108,1109],{},"/v1/coin/{platform}/contract/{address}",[162,1111,1112],{},[131,1113,1066],{},[127,1115,1116,391,1119,1122,1123,1126,1127,1130],{},[131,1117,1118],{},"coinId",[131,1120,1121],{},"platform"," are CoinGecko identifiers. For Solana tokens, ",[131,1124,1125],{},"address"," is the mint. Contract lookup can return ",[131,1128,1129],{},"404"," when CoinGecko does not list that asset; this is expected for long-tail tokens.",[184,1132,1134],{"className":186,"code":1133,"language":188,"meta":189,"style":189},"curl \"$SALMON_API_URL/v1/chart/solana?days=7&currency=usd\"\ncurl \"$SALMON_API_URL/v1/coin/solana/contract/TOKEN_MINT?currency=usd\"\n",[131,1135,1136,1149],{"__ignoreMap":189},[193,1137,1138,1140,1142,1144,1147],{"class":195,"line":196},[193,1139,215],{"class":214},[193,1141,218],{"class":203},[193,1143,221],{"class":199},[193,1145,1146],{"class":207},"/v1/chart/solana?days=7&currency=usd",[193,1148,227],{"class":203},[193,1150,1151,1153,1155,1157,1160],{"class":195,"line":211},[193,1152,215],{"class":214},[193,1154,218],{"class":203},[193,1156,221],{"class":199},[193,1158,1159],{"class":207},"/v1/coin/solana/contract/TOKEN_MINT?currency=usd",[193,1161,227],{"class":203},[136,1163,1165],{"id":1164},"dapp-metadata","dApp metadata",[184,1167,1169],{"className":353,"code":1168,"language":355,"meta":189,"style":189},"GET /v1/dapp/metadata?url={https-url}\n",[131,1170,1171],{"__ignoreMap":189},[193,1172,1173],{"class":195,"line":196},[193,1174,1168],{},[127,1176,1177,1178,1181,1182,1185],{},"The backend retrieves bounded OpenGraph metadata and returns a sanitized ",[131,1179,1180],{},"name"," and HTTPS ",[131,1183,1184],{},"icon",". The URL is checked against SSRF protections and redirects are revalidated.",[184,1187,1189],{"className":186,"code":1188,"language":188,"meta":189,"style":189},"curl --get \"$SALMON_API_URL/v1/dapp/metadata\" \\\n  --data-urlencode \"url=https://example.com\"\n",[131,1190,1191,1208],{"__ignoreMap":189},[193,1192,1193,1195,1197,1199,1201,1204,1206],{"class":195,"line":196},[193,1194,215],{"class":214},[193,1196,628],{"class":207},[193,1198,218],{"class":203},[193,1200,221],{"class":199},[193,1202,1203],{"class":207},"/v1/dapp/metadata",[193,1205,638],{"class":203},[193,1207,641],{"class":199},[193,1209,1210,1212,1214,1217],{"class":195,"line":211},[193,1211,646],{"class":207},[193,1213,218],{"class":203},[193,1215,1216],{"class":207},"url=https://example.com",[193,1218,227],{"class":203},[127,1220,1221],{},"Metadata is untrusted display content. It must never determine whether a signing request is approved.",[136,1223,1225],{"id":1224},"analytics-ingest","Analytics ingest",[127,1227,1228,1231],{},[131,1229,1230],{},"POST /v1/events"," accepts at most 100 allow-listed, anonymous events per batch. Address-like values, mints, raw numbers, oversized strings, and unknown properties are removed by server-side validation.",[127,1233,1234,1235,1238],{},"Successful ingestion returns ",[131,1236,1237],{},"202",", including when delivery is best-effort. Analytics must remain opt-in at the client and must never contain wallet secrets or identifying blockchain data.",[136,1240,1242],{"id":1241},"errors-and-retries","Errors and retries",[127,1244,1245],{},"The standard error envelope is:",[184,1247,1251],{"className":1248,"code":1249,"language":1250,"meta":189,"style":189},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"error\": \"bad_request\",\n  \"error_description\": \"Human-readable explanation\"\n}\n","json",[131,1252,1253,1257,1281,1299],{"__ignoreMap":189},[193,1254,1255],{"class":195,"line":196},[193,1256,770],{"class":203},[193,1258,1259,1262,1266,1268,1271,1273,1276,1278],{"class":195,"line":211},[193,1260,1261],{"class":203},"  \"",[193,1263,1265],{"class":1264},"spNyl","error",[193,1267,638],{"class":203},[193,1269,1270],{"class":203},":",[193,1272,218],{"class":203},[193,1274,1275],{"class":207},"bad_request",[193,1277,638],{"class":203},[193,1279,1280],{"class":203},",\n",[193,1282,1283,1285,1288,1290,1292,1294,1297],{"class":195,"line":658},[193,1284,1261],{"class":203},[193,1286,1287],{"class":1264},"error_description",[193,1289,638],{"class":203},[193,1291,1270],{"class":203},[193,1293,218],{"class":203},[193,1295,1296],{"class":207},"Human-readable explanation",[193,1298,227],{"class":203},[193,1300,1301],{"class":195,"line":672},[193,1302,1303],{"class":203},"}\n",[127,1305,1306,1307,1309,1310,1312],{},"Use ",[131,1308,1265],{}," for program logic and show ",[131,1311,1287],{}," only as contextual text. Do not branch on the human-readable message unless a documented legacy flow requires it.",[141,1314,1315,1327],{},[144,1316,1317],{},[147,1318,1319,1322,1324],{},[150,1320,1321],{},"Status",[150,1323,409],{},[150,1325,1326],{},"Client behavior",[157,1328,1329,1342,1354,1367,1380,1393],{},[147,1330,1331,1336,1339],{},[162,1332,1333],{},[131,1334,1335],{},"400",[162,1337,1338],{},"Missing, invalid, or unsupported input",[162,1340,1341],{},"Correct the request; do not retry unchanged",[147,1343,1344,1348,1351],{},[162,1345,1346],{},[131,1347,1129],{},[162,1349,1350],{},"Resource, route, quote, or asset not found",[162,1352,1353],{},"Show the specific outcome; retry only after inputs change",[147,1355,1356,1361,1364],{},[162,1357,1358],{},[131,1359,1360],{},"422",[162,1362,1363],{},"Valid input that cannot be processed safely",[162,1365,1366],{},"Explain the unsupported operation",[147,1368,1369,1374,1377],{},[162,1370,1371],{},[131,1372,1373],{},"429",[162,1375,1376],{},"Client rate limit",[162,1378,1379],{},"Back off before retrying",[147,1381,1382,1387,1390],{},[162,1383,1384],{},[131,1385,1386],{},"500",[162,1388,1389],{},"Backend or upstream failure",[162,1391,1392],{},"Treat as temporary unless the error says otherwise",[147,1394,1395,1400,1403],{},[162,1396,1397],{},[131,1398,1399],{},"503",[162,1401,1402],{},"Backend dependency unavailable or locally rate-limited",[162,1404,1405],{},"Retry with bounded exponential backoff",[127,1407,1408,1409,1412,1413,1416,1417,329],{},"Analytics errors are the exception: ",[131,1410,1411],{},"/v1/events"," returns a reduced ",[131,1414,1415],{},"{ \"error\": \"code\" }"," shape without ",[131,1418,1287],{},[127,1420,1421],{},"For automatic retries, use exponential backoff with jitter and a strict attempt limit. Never automatically retry a transaction execution unless the operation's status has been reconciled first.",[1423,1424,1425],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":189,"searchDepth":211,"depth":211,"links":1427},[1428,1429,1430,1431,1432,1436,1437,1438,1439,1440,1441],{"id":138,"depth":211,"text":139},{"id":237,"depth":211,"text":238},{"id":349,"depth":211,"text":350},{"id":458,"depth":211,"text":459},{"id":580,"depth":211,"text":581,"children":1433},[1434,1435],{"id":585,"depth":658,"text":586},{"id":701,"depth":658,"text":702},{"id":795,"depth":211,"text":796},{"id":928,"depth":211,"text":929},{"id":1018,"depth":211,"text":1019},{"id":1164,"depth":211,"text":1165},{"id":1224,"depth":211,"text":1225},{"id":1241,"depth":211,"text":1242},"Integrate with the Salmon HTTP API using its current endpoints, parameters, and error contracts.","md",null,{},{"icon":120},{"title":1448,"description":1449},"Salmon backend API reference","Base URLs, endpoint groups, request examples, signing boundaries, and errors for the Salmon API.","whRZ8WDYsuZ7I67ZXRU67n8Cz7aInrE9dNTSqXazp7k",[1452,1444],{"title":112,"path":113,"stem":114,"description":1453,"icon":115,"children":-1},"Set up, run, test, and build the Salmon frontend, backend, and documentation.",1788556238898]