Welcome to the Paynet Developer Portal! Our platform is an aggregator of service providers and merchants, providing convenient ways to accept payments.
We offer 3 connection options. Use the diagram below to determine the appropriate option.
| โ Universal Billing | โ๏ธ UWS Connector | ๐ง Custom Connector | |
|---|---|---|---|
| Development | โ Not required | โ Required (JSON-RPC API) | โ Not required (done by Paynet) |
| Description | Paynet collects data itself, accepts payment and notifies the merchant via Telegram bot or Foyda. | You implement an API according to the Paynet standard (GetInformation, PerformTransaction, etc.). | You provide your existing API, Paynet develops the integration itself. |
| Who it suits | Merchants without an IT team and their own API. | Companies with IT infrastructure, ready to implement a standardized API. | Large corporate clients with an established API. |
| Automation | Manual (notifications) | Full (API-to-API) | Full (API-to-API) |
โ Universal Billing โ no development:
โ๏ธ UWS Connector โ API implementation required:
serviceId (filled out in the "Technical interaction procedure" form)[!NOTE] What is
serviceId?serviceIdis a static internal identifier of your service, which you come up with yourself and provide to us in the "Technical interaction procedure" document. It is NOT the client's phone number or personal account number (this data is passed in thefieldsarray). One partner can provide multiple services, andserviceIdhelps Paynet understand exactly which service the client is paying for.
| Model | NOT suitable if... |
|---|---|
| Universal Billing | You need automatic crediting to the client's balance, automatic dispatch of goods, or integration with your ERP/CRM. In this case, choose UWS. |
| UWS Connector | You do not have an IT team or a server to host the API. In this case, choose Universal Billing. |
| Custom Connector | You are a startup or small business without an established API and business volumes. In this case, choose Universal Billing or UWS. |
[!IMPORTANT] Architectural Paradigm (Unidirectionality) UWS integration works on a Push/Pull model, where Paynet always acts as the client, and your billing as the server. You do not make requests to the Paynet API. All interactions (including checks and cancellations) are initiated exclusively from Paynet servers to your Endpoint.
Main scenario of a successful payment:
Scenario 1: Network Timeout:
Scenario 2: Transaction Cancellation (CancelTransaction):
Paynet processes all logic independently and only notifies the merchant.
[!WARNING] Errors in these points are the most frequent cause of failures during the testing phase.
UTF-8 encoding. It is mandatory to use Content-Type: application/json and Accept: application/json.1000000.YYYY-MM-dd HH:mm:ss. Time zone โ GMT+5 (Uzbekistan).[!CAUTION] The only exception to the date format: the
timestampparameter in theCheckTransactionrequest arrives in the formatEEE MMM dd HH:mm:ss z yyyy, e.g.Mon Jun 16 06:12:41 UZT 2021. This format is fixed historically (many providers already operate with it) and will not change โ your parser must support it. All other dates, includingtimestampinCancelTransactionand all responses from your server, use the standard formatYYYY-MM-dd HH:mm:ss.
HTTP 401 Unauthorized (and not 200 OK with an error).ChangePassword method, Paynet must change the password upon the first successful connection to your billing. If the method is not implemented, the password is transmitted separately via any secure channels.213.230.106.112/28 and 213.230.65.80/28.Financial transactions require strict consistency:
transactionId): Each transaction from Paynet has a unique transactionId. The partner's billing must not allow double debits for the same transactionId: return error 201 for a duplicate โ after that, Paynet will call CheckTransaction to learn the original result. In case of network failures, Paynet may repeat the request or call the CheckTransaction method. In response to a successful operation, the partner returns its internal number providerTrnId.GetStatement method to get a list of successful payments on your side and compares them with its database. A register of accepted payments is also sent to the partner's email.The specification is available in the file OpenAPI (UWS) in English.yaml. It includes a description of all JSON-RPC 2.0 methods: GetInformation, PerformTransaction, CheckTransaction, CancelTransaction, GetStatement, ChangePassword (optional), as well as strict JSON schemas, error codes, and formats.
To start accepting payments via the universal connector (UWS), follow these steps:
GetInformation, PerformTransaction, CheckTransaction, CancelTransaction, GetStatement) according to the specification.Provide the Paynet manager with the following information:
https://api.yourdomain.uz/uws)serviceIds and their namesBefore launching, standard test cases must be executed:
GetInformation): Emulation of successful subscriber search and emulation of 302 (Client not found) error.PerformTransaction): Successful top-up of the subscriber's balance.PerformTransaction): Emulation of 413 (Invalid amount) or 101 (Quota exhausted) error.CancelTransaction): Execution of a test payment and its full cancellation. Refund of funds (partial refunds are not technically supported). Emulation of errors 77 (client has already spent the funds), 306 (reporting period closed) and 203 (transaction not found).CheckTransaction): Checking the status of an existing transaction (state 1) and a non-existent one (state 3, a success envelope โ not an error). Be sure to test parsing of timestamp in the EEE MMM dd HH:mm:ss z yyyy format.After successfully passing all tests, an act of technical readiness is signed, and your services become available for payment to millions of Paynet users!
When a business error occurs, the partner's billing returns a JSON-RPC response with an error object containing code and message.
[!IMPORTANT] All codes in this section (
201,412,413, etc.) are Paynet error codes at the JSON-RPC level, not HTTP statuses. They are frequently mistaken for HTTP codes: in fact they are returned inside theerrorobject in the response body, while the HTTP status of the response itself stays200 OK. The only exception is authentication: invalid login/password returnsHTTP 401 Unauthorized(see the note on error412below).
Use this table to understand which error to return depending on your business case:
| Business Situation | Recommended Paynet Error Code |
|---|---|
| Problems with the client / data entry | |
| Client entered an invalid device number / personal account | 301, 302, 304 (Number/Client/Product not found) |
| User wallet is not identified | 113 |
Problems with services (serviceId) |
|
Non-existent serviceId passed |
305 (Service not found) |
| Service is temporarily down on your side | 100 (Service temporarily unsupported) |
| Limits and amounts | |
| Amount exceeds the maximum operation limit | 415 |
| Client's daily limit exceeded | 141 |
| Client's monthly limit exceeded | 140 |
| Client passed an invalid amount (does not match the tariff) | 413 |
| Business restrictions | |
| Client is in your blacklist / payment prohibition | 501 (Transactions forbidden) |
| Cancellation and transaction statuses | |
| Paynet is trying to cancel a transaction that is already cancelled | 202 (Transaction already cancelled) |
| Paynet cancels a transaction, but the client has already spent the funds | 77 (Insufficient funds for cancellation) |
| You decline the refund: closing documents issued, reporting period closed (e.g., paid in January โ refund in March) | 306 (Allowed cancellation period expired) |
| Paynet cancels a transaction that did not exist | 203 (Transaction not found) |
Paynet asks for the status (CheckTransaction) of a transaction that did not exist |
Not an error! Return a result with transactionState: 3 |
Paynet sends a duplicate transaction (PerformTransaction) |
201 (Transaction already exists) โ Paynet will then call CheckTransaction |
| Other | |
| Request from an IP address outside the Paynet whitelist | 601 (Access denied) โ better to block at the firewall level |
| Unknown/unsupported command value | 603 (Incorrect command code) |
| Required service parameter not passed | 411; specific parameter error โ 401โ410 (parameter numbering is defined by your service and fixed in the questionnaire) |
| Date/time in an unrecognizable format | 414 |
[!NOTE] About error
412(Invalid login or password): authentication is performed exclusively at the HTTP level โ returnHTTP 401 Unauthorizedfor invalid credentials, not a JSON-RPC error. Code412is a legacy from early protocol versions and is not used in new integrations.
| Paynet Error Code | Description |
|---|---|
| 0 | Processed successfully |
| 77 | Insufficient funds on the client's account to cancel the payment |
| 100 | Service temporarily unsupported |
| 101 | Quota exhausted |
| 102 | System error |
| 103 | Unknown error |
| 113 | Wallet not identified |
| 140 | The monthly limit is exceeded for this account |
| 141 | The daily limit is exceeded for this account |
| 201 | Transaction already exists |
| 202 | Transaction already cancelled |
| 203 | Transaction not found |
| 301 | Number does not exist |
| 302 | Client not found |
| 304 | Product not found |
| 305 | Service not found |
| 306 | The allowed transaction cancellation period has expired (reporting period closed โ the partner declines the refund) |
| 401 - 410 | Parameter validation error 1 - 10 |
| 411 | One or more required parameters not specified |
| 412 | Invalid login or password |
| 413 | Invalid amount |
| 414 | Invalid date and time format |
| 415 | Amount exceeds maximum limit |
| 501 | Transactions forbidden for this payer |
| 601 | Access denied |
| 603 | Incorrect command code |
JSON-RPC Protocol Errors:
| Error Code | Description |
|---|---|
| -32300 | Error occurs if the request method is not POST |
| -32700 | JSON parse error ("id": null is allowed in the response) |
| -32600 | Required fields missing in RPC request or invalid type |
| -32601 | Requested method not found |
| -32602 | Required parameter fields missing (protocol level; business equivalent โ 411) |
| -32603 | System (internal error) |
[!NOTE] Code
0("Processed successfully") is a status value; it is never returned inside theerrorobject.
| Date | Version | Changes |
|---|---|---|
| 01.04.2022 | 1.0 | Initial version of the UWS specification |
| 20.09.2022 | 1.1 | Updated version |
| 28.11.2023 | 3.3 | CheckTransaction: time parameter โ timestamp |
| 07.05.2025 | 3.4 | CheckTransaction: timestamp format clarified (EEE MMM dd HH:mm:ss z yyyy). Current version |
The portal and the OpenAPI specification conform to UWS v3.4 dated 07.05.2025 with clarifications from the Paynet core team: error code 306 added (allowed cancellation period expired), the TLS v1.3 requirement fixed, and the status field in the GetInformation response confirmed as mandatory.