Empat rute hanya-baca, tanpa kunci dan tanpa cookie, memakai nama field yang diharapkan agregator (CoinGecko, CoinMarketCap) dan pustaka pasar (CCXT). Rute ini ada untuk dibaca robot: siapa pun yang membangun dasbor, mengisi indeks, atau merekonsiliasi harga membaca dari sini. Tidak ada rute order di API ini — tidak ada yang memindahkan dana atau butuh akun.
Semuanya bergantung pada https://offcode.pro/api/public/, hanya menerima GET, dan menjawab application/json. ticker_id berbentuk BASE_TARGET (BTC_USDT): base sebelum garis bawah, quote sesudahnya, huruf kapital dan angka, 2 sampai 15 karakter di tiap sisi. Pasangan yang simbolnya tidak muat dalam bentuk itu tidak dipublikasikan.
Setiap angka dikirim sebagai string desimal, tidak pernah sebagai bilangan floating-point — koin berdesimal delapan kehilangan desimal saat melewati float. Waktu adalah milidetik sejak epoch Unix.
| Rute | Apa yang dikembalikan | Parameter |
|---|---|---|
GET /pairs | Setiap pasangan yang dilayani feed ini, masing-masing dengan sumber harganya | — |
GET /tickers | Harga, volume 24 jam, tertinggi, terendah, dan kedua sisi untuk pasangan spot | — |
GET /orderbook | Order book untuk satu pasangan | ticker_id · depth |
GET /trades | Trade terbaru untuk satu pasangan, terbaru lebih dulu | ticker_id · type · limit |
GET /historical_trades | Sama dengan /trades — dua nama, satu implementasi | sama |
Daftar semua yang dilayani feed ini, sekaligus gerbang untuk rute lain: ticker_id yang tidak berasal dari sini menjawab 404 di book dan di trade. kind memisahkan pasar spot milik platform (spot) dari perpetual (perp); saat satu nama melayani keduanya, spot yang memegangnya. price_source menyatakan dari mana angkanya, di item itu sendiri.
Harga, volume 24 jam, tertinggi, terendah, dan kedua sisi untuk setiap pasangan spot. Pasangan perp tidak disertakan: inilah irisan yang dijelaskan standar agregator.
ticker_id | Pasangannya, dalam bentuk BASE_TARGET. |
base_currency · target_currency | Mata uang dasar dan mata uang kuotasi dalam pasangan, masing-masing ditampilkan secara terpisah. |
last_price | Harga terakhir yang diperdagangkan di perpetual. |
base_volume | Volume 24 jam dalam mata uang dasar, sebagaimana diukur venue saat memublikasikannya. Hanya bila tidak ada, rute membagi target_volume dengan last_price dan memotong ke 8 desimal ke bawah — perhitungan yang dinyatakan, bukan angka dari bursa. |
target_volume | Volume 24 jam dalam mata uang kuotasi, mentah dari sumber. |
bid · ask | Keduanya bernilai sama, yaitu harga tengah kontrak perpetual, bukan harga beli dan jual terbaik dalam order book. Lihat Dari mana datanya berasal. |
high · low | Tertinggi dan terendah 24 jam terakhir. |
timestamp | Saat pembacaan, dalam milidetik sejak epoch Unix. |
Order book untuk satu pasangan. bids dan asks adalah pasangan [price, size], keduanya string desimal, harga terbaik lebih dulu. timestamp adalah jam sumber, bukan jam kami: jam lokal akan membiarkan book basi lolos sebagai yang segar.
depth opsional dan sampai 100 level per sisi. Bila dihilangkan, mengembalikan plafon: 100. Permintaan yang lebih besar tidak ditolak — dipotong ke 100.
Rekaman terbaru untuk satu pasangan, trade terbaru lebih dulu. Kedua rute adalah implementasi yang sama dan cache yang sama: standar agregator meminta historical_trades, CCXT biasanya meminta trades, dan dengan begitu tidak pernah ada hari ketika yang satu menjawab berbeda dari yang lain.
type opsional (buy atau sell, menurut sisi agresor) dan limit sampai 100, juga dipotong bukan ditolak. Menghilangkan type mengembalikan kedua sisi, dan menghilangkan limit mengembalikan plafon: 100. trade_id bersifat turunan — waktu, sisi, harga, dan ukuran — stabil untuk trade yang sama di dua pembacaan, dan bukan pengenal trade milik venue.
Harga, book, trade, dan volume 24 jam di feed ini berasal dari pasar perpetual — termasuk pada pasangan berlabel spot. Pasar spot OFFCODE tidak memiliki order book sendiri: harga yang ditawarkan mengacu pada harga tengah kontrak perpetual dengan simbol yang sama. Karena itu setiap item /pairs membawa price_source: siapa pun yang mengonsumsi feed membaca sumbernya di feed itu sendiri, bukan menebaknya dari label — dan menebak salah.
ask − bid di sini bernilai nol. Spread nol mustahil di book nyata: jangan perlakukan kedua field itu sebagai sisi-sisi satu book.base_volume adalah volume 24 jam dalam mata uang dasar dari perpetual, sebagaimana diukur venue saat memublikasikannya. Hanya bila tidak ada, rute membagi target_volume dengan last_price dan memotong ke 8 desimal ke bawah — perhitungan yang dinyatakan, bukan angka dari bursa.
Pasangan hanya dipublikasikan bila ada pasar yang bisa diperdagangkan dengan simbol yang sama: memublikasikan adalah berjanji melayani, dan ticker_id yang keluar dari /pairs adalah yang harus dijawab book dan trade segera setelahnya. Koin yang dikustodi tanpa pasangan yang bisa diperdagangkan tetap di luar feed, begitu pula pasangan yang namanya di venue membawa faktor — perpetual 1000PEPE_USDT dipublikasikan apa adanya, tidak pernah sebagai PEPE_USDT.
600 permintaan per menit per IP, di tiap rute. Di atasnya muncul 429.
Respons 2xx menyertakan Cache-Control: public, max-age=5, sedangkan respons selain 2xx menyertakan no-store. Respons 404 yang disimpan selama lima detik dapat tetap menyatakan bahwa pasangan tidak tersedia meskipun pasangan tersebut sudah terdaftar. Respons 502 yang disimpan juga dapat tetap menunjukkan gangguan meskipun venue sudah kembali beroperasi.
Di bawahnya, book dibaca ulang paling cepat setiap 350 ms per pasangan dan kedalaman, dan trade setiap 1 detik per pasangan: plafon panggilan ke venue adalah cache-nya, bukan jumlah orang yang bertanya. Pembacaan yang gagal tidak pernah di-cache.
Access-Control-Allow-Origin: *, tanpa kredensial — tidak ada cookie, kunci, atau header autentikasi, dan tidak ada dalam jawaban yang dipersonalisasi.
| Kode | Kapan terjadi | Body |
|---|---|---|
| 400 | ticker_id tidak sesuai format, type bukan buy atau sell, atau depth maupun limit bukan bilangan bulat | {"code": "VALIDATION_ERROR", "message": "…"} |
| 404 | ticker_id yang bentuknya benar tetapi tidak ada di /pairs | {"error": "UNKNOWN_TICKER"} |
| 429 | Di atas batas permintaan untuk IP ini | {"statusCode": 429, "code": "RATE_LIMITED", "message": "…"} |
| 502 | Venue tidak menjawab, atau menjawab dengan kegagalan | {"code": "UPSTREAM_UNAVAILABLE", "message": "…"} |
502 dan bukan 500, dengan sengaja: kegagalan di venue bukan kegagalan kami, dan siapa pun yang membaca dari luar butuh perbedaan itu untuk tahu apakah mencoba lagi layak.
Domain berada di balik Cloudflare. Peramban lolos; panggilan baris perintah tanpa cookie mungkin mendapat tantangan alih-alih JSON — bukan rute yang menolak, melainkan edge yang bertanya siapa yang datang. Jika robot Anda perlu menyapu feed terus-menerus, minta izin sebelum menyalakan crawler: sebutkan user-agent, rentang IP keluar, dan frekuensi yang dimaksud di Kontak.
Biaya dan aturan trading tidak ada di API ini: mereka ada di /api/public/fees dan di Biaya. Keadaan layanan ada di Status platform.