Quick start
Register a sale with a single POST request.
bash
curl https://vcr.am/api/v1/sales \
-H "X-API-Key: $VCR_AM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"cashier": { "id": 1 },
"items": [{
"offer": { "externalId": "SKU-001" },
"department": { "id": 1 },
"quantity": "1",
"price": "20000",
"unit": "pc"
}],
"amount": { "nonCash": "20000" },
"buyer": {
"type": "individual",
"receipt": { "email": "buyer@example.com", "language": "en" }
}
}'Start without tax credentials
A sandbox register is issued its registration number the moment you create it — no certificate exchange with the tax authority, nothing to wait for. Same base URL, same endpoints, same key mechanics; only the receipts differ, marked TEST and never filed.
- 1In the dashboard open Virtual Cash Registers, click Create VCR and pick "Sandbox cash register". Create as many as you need.
- 2Issue an API key on that register. A key belongs to one register, so a key taken from a production one keeps answering 403.
- 3Call the same endpoints at the same base URL. When you are ready for real fiscalization, create a production register and swap the key.
Built for production integrations
REST over JSON
Stateless JSON endpoints you can call from any language, framework or runtime.
Typed Node.js & PHP SDKs
End-to-end typed clients on npm and Packagist, ready to drop into your Node.js or PHP server code.
API-key authentication
Scoped, rotatable API keys managed from your dashboard.
Complete cash-register API
Sales, prepayments, refunds and receipts through a single consistent surface.
What your system must provide
Before integrating, make sure each sale carries the data SRC requires.
Classifier code
Commodity code for goods or activity code for services.
Measurement unit
kg, pcs, m², hour, service, work, etc.
Department ID
Where the sale lands in your register — and the tax regime printed on the receipt. Optional: omit it and the item takes its offer's own department.
Cashier ID
The person registering the sale.
Authentication
Every request must include your API key in the X-API-Key header. The one exception is GET /exchange-rate, which is public and needs no key.
X-API-Key: your_api_keyGenerate and rotate API keys in your cash register settings.
Keep your API key private
Never expose it in client-side code, public repositories or shared logs. If it leaks, rotate it immediately from your cash register settings.
Errors
Errors use standard HTTP status codes and a JSON body with the details.
| Status | Name | When it happens |
|---|---|---|
400 | Bad request | Malformed payload or schema validation failed. |
401 | Unauthorized | Missing or invalid API key. |
403 | Forbidden | The register cannot file documents yet: no registration number, or not activated at the tax authority. |
404 | Not found | The requested resource doesn't exist. |
500 | Internal error | Unexpected failure on our side. Retry with exponential backoff. |
Continue building
API explorer
Interactive OpenAPI explorer.
Node.js / TypeScript
Next.js, NestJS, Express, Bun, Deno, plain Node.js
PHP
Symfony, WordPress, Bitrix, plain PHP
WooCommerce
WordPress + WooCommerce store