Public market-data API

Read SPlus Fund's prices, markets and asset list with no sign-up and no key — read-only, versioned and free.

Overview

This is a small, public gateway to market data: the same information the SPlus Fund website and app already show, in a machine-readable form.

Every endpoint is GET-only, needs no authentication, and returns the same answer to every caller.

Base URL
https://api.splusfund.com/api/public/v1
Version
v1
Authentication
None — no key or token is needed
Methods
GET
Format
JSON, UTF-8

What this API does not provide

  • Any information about users, accounts, balances or portfolios
  • Orders, user trades, deposits or withdrawals
  • Authentication, order placement or any other write operation
  • Assets that are not shown in the public list

Quick start

Get the latest price of several assets in one request:

curl -s "https://api.splusfund.com/api/public/v1/prices?symbols=BTC,ETH,USDT"

Browsers can call these URLs directly: a simple GET with no custom headers needs no CORS preflight.

Response conventions

  • A successful response always carries status, api_version and data.
  • Prices are exact decimal strings (for example "98765432101234.56789012") so no precision is lost to floating point. Parse them with an arbitrary-precision decimal library.
  • All timestamps are Unix epoch milliseconds (UTC).
  • A field without a value is sent as null — it is never omitted.
  • The Rial price is the effective price shown on SPlus Fund; the USD price is derived from the USDT rate and is null when no rate is available.
  • Responses are cached briefly; each endpoint's lifetime is in its Cache-Control header, and polling faster than that returns no fresher data.
  • Unknown, repeated or empty parameters are refused with a 400.

Rate limits

To keep the service stable, requests are limited at two levels:

  • Per IP address: a burst of up to 30 requests, then 10 requests every 10 seconds.
  • For the whole service: a burst of up to 300 requests, then 100 requests every 1 seconds.

Over the limit, the API answers 429 with errorCode 4029 and a Retry-After header in seconds. Wait that long before retrying.

Rather than polling repeatedly, fetch several prices in one prices request and respect each endpoint's cache lifetime.

Example 429 response
{
  "status": "Failure",
  "errorCode": 4029,
  "message": "Too many requests from this client. Retry after 10 second(s).",
  "traceId": "0HNOILC44Q4IJ:00000001",
  "timestamp": 1789422992
}

Errors

Every error has the same shape:

HTTP statuserrorCodeMeaning
4004006Invalid, unknown, repeated or out-of-range parameter
4044004Asset or path not found
405Only GET is supported (no request body)
4294029Rate limit exceeded
5034018The platform is being updated; try again in a few minutes
5034503Market data is temporarily unavailable
Example error response
{
  "status": "Failure",
  "errorCode": 4006,
  "message": "'page' must be an integer between 1 and 1000.",
  "traceId": "0HNOILD89MRS3:00000001",
  "timestamp": 1789423116
}

Endpoints

Server time

GET/api/public/v1/time

Returns the server clock, for keeping your system in step.

Cache lifetime: Not cached

Parameters

This endpoint takes no parameters.

Example request
curl -s "https://api.splusfund.com/api/public/v1/time"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": {
    "server_time": 1789423579453,
    "api_version": "v1"
  }
}

Fields of data

FieldTypeDescription
server_timeintegerCurrent server time, Unix epoch milliseconds
api_versionstringAPI version

Markets

GET/api/public/v1/markets

The public markets, in display order.

Cache lifetime: 60 seconds

Parameters

This endpoint takes no parameters.

Example request
curl -s "https://api.splusfund.com/api/public/v1/markets"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": [
    {
      "key": "crypto",
      "name_fa": "رمزارز",
      "name_en": "Crypto",
      "position": 1,
      "asset_count": 3
    },
    {
      "key": "metal",
      "name_fa": "طلا و فلزات",
      "name_en": "Metals",
      "position": 2,
      "asset_count": 1
    },
    {
      "key": "currency",
      "name_fa": "ارز",
      "name_en": null,
      "position": 3,
      "asset_count": 1
    }
  ]
}

Fields of data

FieldTypeDescription
keystringStable market identifier — the value the market parameter takes
name_fastringPersian market name
name_enstring|nullEnglish market name
positionintegerDisplay position, from 1
asset_countintegerNumber of listed assets in this market

Assets

GET/api/public/v1/currencies

The visible assets, paged and filterable by market.

Cache lifetime: 60 seconds

Parameters

NameRequiredRules
marketNoA market key from markets; up to 40 characters of A-Z, a-z, 0-9, _ and -
pageNoInteger from 1 to 1000; default 1
page_sizeNoInteger from 1 to 100; default 50
Example request
curl -s "https://api.splusfund.com/api/public/v1/currencies?page=1&page_size=3"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": {
    "items": [
      {
        "symbol": "BTC",
        "standard_symbol": null,
        "name_fa": "بیت‌کوین",
        "name_en": "Bitcoin",
        "market": "crypto",
        "amount_precision": 8,
        "price_precision": 0
      },
      {
        "symbol": "ETH",
        "standard_symbol": null,
        "name_fa": "اتریوم",
        "name_en": "Ethereum",
        "market": "crypto",
        "amount_precision": 6,
        "price_precision": 0
      },
      {
        "symbol": "USDT",
        "standard_symbol": null,
        "name_fa": "تتر",
        "name_en": "Tether",
        "market": "crypto",
        "amount_precision": 2,
        "price_precision": 0
      }
    ],
    "page": 1,
    "page_size": 3,
    "total": 5
  }
}

Fields of data

FieldTypeDescription
itemsarrayThe assets on this page
pageintegerPage number
page_sizeintegerPage size
totalintegerMatching assets across all pages

Fields of each items entry

FieldTypeDescription
symbolstringThe asset's symbol on SPlus Fund
standard_symbolstring|nullStandard symbol, where it differs from the symbol
name_fastringPersian name
name_enstring|nullEnglish name
marketstringKey of the market the asset belongs to
amount_precisionintegerDecimal places an amount of this asset is shown with
price_precisionintegerDecimal places a price quoted in this asset is shown with

Prices

GET/api/public/v1/prices

Latest price of listed assets; with no parameters, all of them. Unknown symbols are ignored.

Cache lifetime: 10 seconds

Parameters

NameRequiredRules
symbolsNoComma-separated symbols; 1 to 100 symbols, each up to 20 ASCII letters or digits
marketNoA market key from markets; up to 40 characters of A-Z, a-z, 0-9, _ and -
Example request
curl -s "https://api.splusfund.com/api/public/v1/prices?symbols=BTC,ETH,USDT"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": [
    {
      "symbol": "BTC",
      "price_irr": "98765432101234.56789012",
      "price_usd": "93852700.88657458",
      "updated_at": 1789422817784
    },
    {
      "symbol": "ETH",
      "price_irr": "3456789012.5",
      "price_usd": "3284.84347525",
      "updated_at": 1789422817784
    },
    {
      "symbol": "USDT",
      "price_irr": "1052345.12345678",
      "price_usd": "1",
      "updated_at": 1789422817784
    }
  ]
}

Fields of data

FieldTypeDescription
symbolstringAsset symbol
price_irrstringLatest price in Rial, exact decimal string
price_usdstring|nullUSD price (from the USDT rate), exact decimal string
updated_atinteger|nullWhen the price was last updated, Unix epoch milliseconds

24-hour summary

GET/api/public/v1/tickers

Price and the real 24-hour change for several symbols, sorted by symbol.

Cache lifetime: 15 seconds

Parameters

NameRequiredRules
symbolsYesRequired; comma-separated symbols; 1 to 10 symbols, each up to 20 ASCII letters or digits
Example request
curl -s "https://api.splusfund.com/api/public/v1/tickers?symbols=BTC,ETH,GOLD18"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": [
    {
      "symbol": "BTC",
      "price_irr": "98765432101234.56789012",
      "price_usd": "93852700.88657458",
      "change_24h_percent": "-0.80",
      "updated_at": 1789422817784
    },
    {
      "symbol": "ETH",
      "price_irr": "3456789012.5",
      "price_usd": "3284.84347525",
      "change_24h_percent": "-0.80",
      "updated_at": 1789422817784
    },
    {
      "symbol": "GOLD18",
      "price_irr": "186070000",
      "price_usd": "176.81461704",
      "change_24h_percent": "-0.80",
      "updated_at": 1789422812784
    }
  ]
}

Fields of data

FieldTypeDescription
symbolstringAsset symbol
price_irrstringLatest price in Rial
price_usdstring|nullUSD price
change_24h_percentstring|null24-hour change in percent, two decimals; null when history is insufficient
updated_atinteger|nullWhen the price was last updated, Unix epoch milliseconds

Price history

GET/api/public/v1/history

One asset's price series over the chosen period — the last recorded price in each interval.

Cache lifetime: 60 seconds

Parameters

NameRequiredRules
symbolYesOne symbol; up to 20 ASCII letters or digits
periodNoOne of 24h, 7d, 30d, 90d, 1y; default 24h
Example request
curl -s "https://api.splusfund.com/api/public/v1/history?symbol=BTC&period=24h"
Example response
{
  "status": "Success",
  "api_version": "v1",
  "data": {
    "symbol": "BTC",
    "period": "24h",
    "interval": "15m",
    "points": [
      {
        "t": 1789337320784,
        "price_irr": "99560108376900.125",
        "price_usd": null
      },
      {
        "t": 1789338220784,
        "price_irr": "99476652191278.96875",
        "price_usd": null
      },
      {
        "t": 1789339120784,
        "price_irr": "99377916924386.15625",
        "price_usd": null
      }
    ]
  }
}

Fields of data

FieldTypeDescription
symbolstringAsset symbol
periodstringRequested period
intervalstringSpacing of the series
pointsarraySeries points, in ascending time order

Fields of each points entry

FieldTypeDescription
tintegerPoint time, Unix epoch milliseconds
price_irrstringPrice in Rial
price_usdstring|nullUSD price, where recorded

Versioning and changes

  • The version is part of the path. Within the current version no field or endpoint is removed or changes meaning without notice.
  • New fields may be added to responses; your client should ignore fields it does not know.
  • Incompatible changes ship only in a new version, at a separate path.

The data is for information only; the final price of any trade is set in the SPlus Fund app.