Справочник методов

Получить инвойс

GET/v1/invoices/{id}

Контракт v1 / 1.0.0 62 / 2026-10-10

На этой странице

Получить инвойс в проекте, доступном API-ключу.

Права ключа: invoices / read / payments.

Параметры

ПараметрГдеОбязательныйОписание
idpathДаНепрозрачный ID ресурса.
string minLength: 1

Примеры запроса

Примеры выполняют реальную операцию в вашем аккаунте. Задайте переменные окружения, указанные в коде. Не публикуйте ключ; изменяющие запросы не повторяются автоматически.

Shell / cURL
#!/usr/bin/env bash
set -euo pipefail
: "${CRYPTANIO_RESOURCE_ID:?Set CRYPTANIO_RESOURCE_ID}"
: "${CRYPTANIO_API_KEY:?Set CRYPTANIO_API_KEY}"
urlencode() {
  local LC_ALL=C text="$1" char index
  for ((index=0; index<${#text}; index++)); do
    char="${text:index:1}"
    case "$char" in [a-zA-Z0-9.~_-]) printf '%s' "$char" ;; *) printf '%%%02X' "'$char" ;; esac
  done
}
response_file="$(mktemp)"
trap 'rm -f "$response_file"' EXIT
transfer_status=0
http_status="$(curl \
  --silent --show-error --max-time 30 --request GET \
  --header "Authorization: Bearer $CRYPTANIO_API_KEY" \
  --header 'Accept: application/json' \
  "https://api.cryptanio.com/v1/invoices/$(urlencode "$CRYPTANIO_RESOURCE_ID")" \
  --output "$response_file" --write-out '%{http_code}')" || transfer_status=$?
if [[ "$http_status" == 2?? ]]; then
  cat "$response_file"
  exit "$transfer_status"
fi
printf 'HTTP %s\n' "$http_status" >&2
cat "$response_file" >&2
exit 1
Скачать пример
Go
// Go; standard library only. Run: go run request.go
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
    "strings"
    "time"
)

func env(name string) string {
    value := os.Getenv(name)
    if value == "" { fmt.Fprintln(os.Stderr, "Set", name); os.Exit(1) }
    return value
}
func run() error {
    path := "/v1/invoices/{id}"
    path = strings.ReplaceAll(path, "{id}", url.PathEscape(env("CRYPTANIO_RESOURCE_ID")))
    endpoint, err := url.Parse("https://api.cryptanio.com" + path)
    if err != nil { return err }
    query := endpoint.Query()

    endpoint.RawQuery = query.Encode()

    request, err := http.NewRequest("GET", endpoint.String(), nil)
    if err != nil { return err }
    request.Header.Set("Authorization", "Bearer " + env("CRYPTANIO_API_KEY"))
    request.Header.Set("Accept", "application/json")
    client := &http.Client{Timeout: 30 * time.Second, CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
    response, err := client.Do(request)
    if err != nil { return err }
    defer response.Body.Close()
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        body, err := io.ReadAll(response.Body)
        if err != nil { return err }
        return fmt.Errorf("HTTP %d: %s", response.StatusCode, body)
    }
    _, err = io.Copy(os.Stdout, response.Body)
    return err
}
func main() {
    if err := run(); err != nil { fmt.Fprintln(os.Stderr, err); os.Exit(1) }
}
Скачать пример
Rust
// Cargo.toml dependencies:
// reqwest = { version = "=0.12.24", features = ["blocking", "json"] }
// serde_json = "=1.0.145"
use std::{error::Error, io, time::Duration};
use reqwest::{blocking::Client, redirect::Policy, Method, Url};

fn env(name: &str) -> Result<String, Box<dyn Error>> {
    let value = std::env::var(name)?;
    if value.is_empty() { return Err(format!("Set {name}").into()); }
    Ok(value)
}
fn run() -> Result<(), Box<dyn Error>> {
    let mut url = Url::parse("https://api.cryptanio.com")?;
    {
        let mut segments = url.path_segments_mut().map_err(|_| "Invalid base URL")?;
        segments.clear();
        segments.push("v1");
        segments.push("invoices");
        segments.push(&env("CRYPTANIO_RESOURCE_ID")?);
    }
    let client = Client::builder().timeout(Duration::from_secs(30)).redirect(Policy::none()).build()?;
    let request = client.request(Method::GET, url)
        .header("Authorization", format!("Bearer {}", env("CRYPTANIO_API_KEY")?))
        .header("Accept", "application/json".to_owned());
    let mut response = request.send()?;
    let status = response.status();
    if !status.is_success() { return Err(format!("HTTP {}: {}", status.as_u16(), response.text()?).into()); }
    io::copy(&mut response, &mut io::stdout())?;
    Ok(())
}
fn main() {
    if let Err(error) = run() { eprintln!("{error}"); std::process::exit(1); }
}
Скачать пример
PHP
<?php
// PHP 8 with the cURL extension. Run this on your server.
function env(string $name): string {
    $value = getenv($name);
    if ($value === false || $value === '') throw new RuntimeException('Set ' . $name);
    return $value;
}
try {
    $path = '/v1/invoices/{id}';
    $path = str_replace('{id}', rawurlencode(env('CRYPTANIO_RESOURCE_ID')), $path);
    $query = [

    ];
    $url = 'https://api.cryptanio.com' . $path . ($query ? '?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986) : '');
    $headers = [
        'Authorization: ' . 'Bearer ' . env('CRYPTANIO_API_KEY'),
        'Accept: ' . 'application/json',
    ];
    $curl = curl_init($url);
    curl_setopt_array($curl, [
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 30,
    ]);
    $response = curl_exec($curl);
    if ($response === false) throw new RuntimeException(curl_error($curl));
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($status < 200 || $status >= 300) throw new RuntimeException('HTTP ' . $status . ': ' . $response);
    echo $response;
} catch (Throwable $error) {
    fwrite(STDERR, $error->getMessage() . PHP_EOL);
    exit(1);
}
Скачать пример
Python
# Python 3; standard library only.
import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.parse import quote, urlencode
from urllib.request import HTTPRedirectHandler, Request, build_opener

def env(name):
    result = os.environ.get(name)
    if not result:
        raise ValueError("Set " + name)
    return result

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

try:
    path = "/v1/invoices/{id}"
    path = path.replace("{id}", quote(env("CRYPTANIO_RESOURCE_ID"), safe=""))
    query = {

    }
    url = "https://api.cryptanio.com" + path + ("?" + urlencode(query) if query else "")
    headers = {
        "Authorization": "Bearer " + env("CRYPTANIO_API_KEY"),
        "Accept": "application/json",
    }
    data = None
    request = Request(url, data=data, headers=headers, method="GET")
    with build_opener(NoRedirect()).open(request, timeout=30) as response:
        if not 200 <= response.status < 300:
            raise ValueError("HTTP " + str(response.status))
        sys.stdout.buffer.write(response.read())
except HTTPError as error:
    print("HTTP " + str(error.code) + ": " + error.read().decode("utf-8", errors="replace"), file=sys.stderr)
    sys.exit(1)
except (ValueError, URLError, OSError) as error:
    print(str(error), file=sys.stderr)
    sys.exit(1)
Скачать пример
Node.js
// Node.js 18+. Run on your server, never in a browser.
const env = name => {
  const result = process.env[name];
  if (!result) throw new Error(`Set ${name}`);
  return result;
};
try {
  let path = "/v1/invoices/{id}";
  path = path.replace("{id}", encodeURIComponent(env("CRYPTANIO_RESOURCE_ID")));
  const url = new URL(path, "https://api.cryptanio.com");

  const headers = {
    "Authorization": "Bearer " + env("CRYPTANIO_API_KEY"),
    "Accept": "application/json",
  };
  const response = await fetch(url, {
    method: "GET", headers, redirect: "manual",
    signal: AbortSignal.timeout(30_000),
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
  if (response.body) {
    for await (const chunk of response.body) process.stdout.write(chunk);
  }
} catch (error) {
  console.error(error.message);
  process.exitCode = 1;
}
Скачать пример

Ответы и ошибки

200 Успешный результат.
ПолеТипОбязательноеОписание
checkout_urlstringНетПлатёжная страница Cryptanio. При создании инвойса с выбором способа плательщиком и идентичном повторе возвращается интерактивная ссылка: по ней можно выбрать способ до обнаружения перевода. При создании с готовыми реквизитами и во всех GET/списках ссылка отдельная, только для чтения. Передавайте ссылку только нужному плательщику; она не открывает аккаунт или API-ключ. Подтверждайте оплату через API инвойса или проверенный webhook, а не переход браузера.
uri
idstringДаНепрозрачный идентификатор; сохраняйте как строку.
minLength: 1
statusstringДаpending — ожидает оплату; seen — обнаружено; partial — частичная; paid — оплачено; underpaid/overpaid/late — требуется решение; expired — срок истёк; canceled — отменён.
pending, seen, paid, underpaid, partial, overpaid, expired, late, canceled
project_idstringДаНепрозрачный идентификатор; сохраняйте как строку.
minLength: 1
referencestringНетНомер заказа.
customerobjectНет
productobjectНет
payerobjectНет
metadataobjectНетДо 20 пар, JSON не более 8192 байт. Не передавайте секреты.
invoice_currencystringНетВалюта котировки заказа.
invoice_amountstringНетТочная десятичная сумма строкой; не используйте float.
pattern: ^[0-9]+(?:\.[0-9]+)?$
chainstringДаКод сети.
assetstringДаПлатёжный актив.
addressstringДаАдрес для оплаты.
payment_routeobjectНетОбязательный реквизит блокчейн-платежа из автоматического источника: tag, memo, комментарий TON или reference Solana Pay. Сохраняйте его вместе с адресом получателя; номер заказа reference является отдельным полем.
payment_uristringНетЗапрос Solana Pay с получателем, точной суммой, mint поддерживаемого токена и обязательным reference. Для платёжного QR используйте этот URI вместо обычного адреса.
uri
amountstring | stringДаФактическая сумма к отправке; может отличаться от asked для различения инвойсов. Пустая до выбора способа.
amount_rawstring | stringДаЦелое число минимальных единиц строкой. Пустая до выбора способа.
askedstring | stringДаИсходно запрошенная криптосумма. Пустая до выбора способа.
decimalsintegerДаЧисло десятичных знаков актива.
minimum: 0
tolerancestringНетДопуск в минимальных единицах; обратите внимание на отличие от request.tolerance.
pattern: ^[0-9]+$
sandboxbooleanДаТестовый инвойс не подтверждает реальный blockchain-платёж.
needs_decisionbooleanНетТребуется решение для underpaid, overpaid или late.
paidstringНетПолученная сумма в минимальных единицах.
pattern: ^[0-9]+$
tx_idstringНетИдентификатор платежа.
paid_atstringНетДата и время UTC в RFC 3339.
date-time
expires_atstringДаДата и время UTC в RFC 3339.
date-time
created_atstringДаДата и время UTC в RFC 3339.
date-time
200 application/json
{
  "id": "2100",
  "status": "pending",
  "project_id": "2002",
  "reference": "order-42",
  "chain": "ethereum",
  "asset": "USDC",
  "address": "0x52908400098527886E0F7030069857D2E4169EE7",
  "amount": "12.5",
  "amount_raw": "12500000",
  "asked": "12.5",
  "decimals": 6,
  "sandbox": true,
  "expires_at": "2026-10-06T11:00:00Z",
  "created_at": "2026-10-06T10:00:00Z"
}
401 Нет корректного активного API-ключа (unauthorized).
ПолеТипОбязательноеОписание
errorobjectДа
401 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
403 Ключ не разрешает операцию, проект, услугу или IP; email не подтверждён.
ПолеТипОбязательноеОписание
errorobjectДа
403 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
404 Объект не найден в доступной ключу области (not_found).
ПолеТипОбязательноеОписание
errorobjectДа
404 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
429 Слишком много запросов (rate_limited); повторить после Retry-After.
ПолеТипОбязательноеОписание
errorobjectДа
429 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
500 Внутренняя ошибка (internal).
ПолеТипОбязательноеОписание
errorobjectДа
500 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
503 Временная недоступность (unavailable); возможен повтор с задержкой.
ПолеТипОбязательноеОписание
errorobjectДа
503 application/json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}

Как исправлять ошибки и безопасно повторять запросы

Вложенные объекты

Invoice

ПолеТипОбязательноеОписание
checkout_urlstringНетПлатёжная страница Cryptanio. При создании инвойса с выбором способа плательщиком и идентичном повторе возвращается интерактивная ссылка: по ней можно выбрать способ до обнаружения перевода. При создании с готовыми реквизитами и во всех GET/списках ссылка отдельная, только для чтения. Передавайте ссылку только нужному плательщику; она не открывает аккаунт или API-ключ. Подтверждайте оплату через API инвойса или проверенный webhook, а не переход браузера.
uri
idstringДаНепрозрачный идентификатор; сохраняйте как строку.
minLength: 1
statusstringДаpending — ожидает оплату; seen — обнаружено; partial — частичная; paid — оплачено; underpaid/overpaid/late — требуется решение; expired — срок истёк; canceled — отменён.
pending, seen, paid, underpaid, partial, overpaid, expired, late, canceled
project_idstringДаНепрозрачный идентификатор; сохраняйте как строку.
minLength: 1
referencestringНетНомер заказа.
customerobjectНет
productobjectНет
payerobjectНет
metadataobjectНетДо 20 пар, JSON не более 8192 байт. Не передавайте секреты.
invoice_currencystringНетВалюта котировки заказа.
invoice_amountstringНетТочная десятичная сумма строкой; не используйте float.
pattern: ^[0-9]+(?:\.[0-9]+)?$
chainstringДаКод сети.
assetstringДаПлатёжный актив.
addressstringДаАдрес для оплаты.
payment_routeobjectНетОбязательный реквизит блокчейн-платежа из автоматического источника: tag, memo, комментарий TON или reference Solana Pay. Сохраняйте его вместе с адресом получателя; номер заказа reference является отдельным полем.
payment_uristringНетЗапрос Solana Pay с получателем, точной суммой, mint поддерживаемого токена и обязательным reference. Для платёжного QR используйте этот URI вместо обычного адреса.
uri
amountstring | stringДаФактическая сумма к отправке; может отличаться от asked для различения инвойсов. Пустая до выбора способа.
amount_rawstring | stringДаЦелое число минимальных единиц строкой. Пустая до выбора способа.
askedstring | stringДаИсходно запрошенная криптосумма. Пустая до выбора способа.
decimalsintegerДаЧисло десятичных знаков актива.
minimum: 0
tolerancestringНетДопуск в минимальных единицах; обратите внимание на отличие от request.tolerance.
pattern: ^[0-9]+$
sandboxbooleanДаТестовый инвойс не подтверждает реальный blockchain-платёж.
needs_decisionbooleanНетТребуется решение для underpaid, overpaid или late.
paidstringНетПолученная сумма в минимальных единицах.
pattern: ^[0-9]+$
tx_idstringНетИдентификатор платежа.
paid_atstringНетДата и время UTC в RFC 3339.
date-time
expires_atstringДаДата и время UTC в RFC 3339.
date-time
created_atstringДаДата и время UTC в RFC 3339.
date-time
ID

Непрозрачный идентификатор. Формат не гарантирован; не преобразуйте в число.

string Непрозрачный идентификатор. Формат не гарантирован; не преобразуйте в число.

InvoiceStatus

pending — ожидает оплату; seen — обнаружено; partial — частичная; paid — оплачено; underpaid/overpaid/late — требуется решение; expired — срок истёк; canceled — отменён.

string pending — ожидает оплату; seen — обнаружено; partial — частичная; paid — оплачено; underpaid/overpaid/late — требуется решение; expired — срок истёк; canceled — отменён.

Customer

ПолеТипОбязательноеОписание
idstringДаИдентификатор покупателя в вашей системе.
maxLength: 120
Product

ПолеТипОбязательноеОписание
idstringНетИдентификатор товара в вашей системе.
maxLength: 120
namestringНетНазвание товара.
maxLength: 200
quantityintegerНетКоличество единиц.
minimum: 1; maximum: 1000000
Payer

ПолеТипОбязательноеОписание
commentstringДаКомментарий плательщика.
maxLength: 500
InvoiceMetadata

До 20 пар, JSON не более 8192 байт. Не передавайте секреты.

object До 20 пар, JSON не более 8192 байт. Не передавайте секреты.

Decimal

string

RawAmount

string

Error

ПолеТипОбязательноеОписание
errorobjectДа