> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.walletstech.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.walletstech.com/_mcp/server.

# Get market prices

POST https://api-demo.walletstech.com/prices

Current fiat market prices for every coin the API supports, in USD, EUR, GBP and CAD.

There is **no request body** — no `userId`, no `assetId`. One call returns the whole map.

## Keyed by symbol, not assetId

A price belongs to a *coin*, not to a chain deployment, so the map is keyed by symbol: the single `USDT` entry is the price of USDT whichever chain you hold it on. To price a balance, resolve your `assetId` to its symbol from the [Asset IDs](/get-started/assets) table and read that entry.

## Prices are numbers, and they are indicative

- The fiat values are plain JSON **numbers** — this is the one place the API does not use decimal strings. Balances, amounts and fees stay strings everywhere else.
- Quotes are refreshed in the background, so a value is typically a few minutes old. Treat them as **indicative market data for display and estimation**, not as an execution or settlement rate.
- The endpoint serves the last known values, so it keeps answering even while a refresh behind it is failing. Read staleness from your own clock, not from the response — it carries no timestamp.
- A fiat with no recorded quote reads as `0`. Guard against that before dividing by a price.

Reference: https://docs.walletstech.com/api-reference/prices/get-prices

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: Blockchain Wallet Service
  version: 1.0.0
paths:
  /prices:
    post:
      operationId: getPrices
      summary: Get market prices
      description: >-
        Current fiat market prices for every coin the API supports, in USD, EUR,
        GBP and CAD.


        There is **no request body** — no `userId`, no `assetId`. One call
        returns the whole map.


        ## Keyed by symbol, not assetId


        A price belongs to a *coin*, not to a chain deployment, so the map is
        keyed by symbol: the single `USDT` entry is the price of USDT whichever
        chain you hold it on. To price a balance, resolve your `assetId` to its
        symbol from the [Asset IDs](/get-started/assets) table and read that
        entry.


        ## Prices are numbers, and they are indicative


        - The fiat values are plain JSON **numbers** — this is the one place the
        API does not use decimal strings. Balances, amounts and fees stay
        strings everywhere else.

        - Quotes are refreshed in the background, so a value is typically a few
        minutes old. Treat them as **indicative market data for display and
        estimation**, not as an execution or settlement rate.

        - The endpoint serves the last known values, so it keeps answering even
        while a refresh behind it is failing. Read staleness from your own
        clock, not from the response — it carries no timestamp.

        - A fiat with no recorded quote reads as `0`. Guard against that before
        dividing by a price.
      tags:
        - prices
      parameters:
        - name: Authorization
          in: header
          description: >-
            A 15-minute token from `/auth`. Required on every endpoint except
            `/auth`.
          required: true
          schema:
            type: string
        - name: X-Request-Id
          in: header
          description: >-
            Correlation id. Generated if omitted, echoed on every response, and
            written to the audit log. **`/send` is the exception — there it is
            required, and it doubles as the idempotency key.**
          required: false
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Prices_getPrices_Response_200'
        '401':
          description: >-
            Unauthorized — no bearer token, or one that does not verify. Get a
            fresh access token from `/refresh` (or `/auth`) and replay the
            request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
servers:
  - url: https://api-demo.walletstech.com
    description: Sandbox. Develop and test here. Requires its own credentials.
  - url: https://api.walletstech.com
    description: >-
      Production — real funds, and transfers that cannot be reversed. Requires
      its own credentials.
components:
  schemas:
    FiatPrices:
      type: object
      properties:
        USD:
          type: number
          format: double
        EUR:
          type: number
          format: double
        GBP:
          type: number
          format: double
        CAD:
          type: number
          format: double
      description: >-
        One market price per supported fiat currency. Plain JSON **numbers**,
        not the decimal strings used for balances and amounts.
      title: FiatPrices
    PriceMap:
      type: object
      additionalProperties:
        $ref: '#/components/schemas/FiatPrices'
      description: >-
        One entry per priced coin, keyed by **symbol** rather than `assetId` — a
        price belongs to a coin, so a single `USDT` entry covers USDT on every
        chain it lives on.
      title: PriceMap
    RequestId:
      type: string
      description: Echo of the inbound `X-Request-Id`, or a generated one.
      title: RequestId
    Prices_getPrices_Response_200:
      type: object
      properties:
        result:
          $ref: '#/components/schemas/PriceMap'
        requestId:
          $ref: '#/components/schemas/RequestId'
      required:
        - result
        - requestId
      title: Prices_getPrices_Response_200
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
          description: Safe, client-facing message. Internal detail never leaks here.
        error:
          type: string
          description: The HTTP status code, as a string.
        requestId:
          $ref: '#/components/schemas/RequestId'
      required:
        - message
        - error
        - requestId
      title: ErrorResponse
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A 15-minute token from `/auth`. Required on every endpoint except
        `/auth`.

```

## Examples



**Response**

```json
{
  "result": {
    "BNB": {
      "USD": 601.83,
      "EUR": 528.09,
      "GBP": 451.29,
      "CAD": 848.05
    },
    "BTC": {
      "USD": 64665.47,
      "EUR": 56750.22,
      "GBP": 48501.5,
      "CAD": 91136.61
    },
    "ETH": {
      "USD": 3187.04,
      "EUR": 2796.51,
      "GBP": 2389.85,
      "CAD": 4490.72
    },
    "POL": {
      "USD": 0.4471,
      "EUR": 0.3923,
      "GBP": 0.3352,
      "CAD": 0.63
    },
    "SOL": {
      "USD": 148.92,
      "EUR": 130.67,
      "GBP": 111.67,
      "CAD": 209.86
    },
    "TRX": {
      "USD": 0.1284,
      "EUR": 0.1127,
      "GBP": 0.0963,
      "CAD": 0.1809
    },
    "USDC": {
      "USD": 0.9999,
      "EUR": 0.8774,
      "GBP": 0.7499,
      "CAD": 1.4092
    },
    "USDT": {
      "USD": 1.0002,
      "EUR": 0.8776,
      "GBP": 0.7501,
      "CAD": 1.4096
    }
  },
  "requestId": "b7a1f0c2-3d4e-4a5b-9c6d-7e8f90a1b2c3"
}
```

**SDK Code**

```python All prices
import requests

url = "https://api-demo.walletstech.com/prices"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript All prices
const url = 'https://api-demo.walletstech.com/prices';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go All prices
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api-demo.walletstech.com/prices"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby All prices
require 'uri'
require 'net/http'

url = URI("https://api-demo.walletstech.com/prices")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java All prices
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api-demo.walletstech.com/prices")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php All prices
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api-demo.walletstech.com/prices', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp All prices
using RestSharp;

var client = new RestClient("https://api-demo.walletstech.com/prices");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift All prices
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-demo.walletstech.com/prices")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```