Developer Guide: Paynet Integration

Payment Ecosystem of Uzbekistan ยท Developer Portal
v3.4 ยท June 2026

Developer Guide: Paynet Integration (Developer Portal)

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.

1. Choosing Integration Type

How to choose? (Decision Tree)

flowchart TD START["๐Ÿค” How do you want to\naccept payments?"] --> Q1{"Do you have your own\nAPI / IT team?"} Q1 -->|"โŒ No"| UB["โœ… Universal Billing\nโ€” No development โ€”\nPaynet does everything itself"] Q1 -->|"โœ… Yes"| Q2{"Are you ready to implement\nan API according to Paynet standards?"} Q2 -->|"โœ… Yes"| UWS["โš™๏ธ UWS Connector\nโ€” Medium complexity โ€”\nYou implement a JSON-RPC API"] Q2 -->|"โŒ No, we have our own API"| CUSTOM["๐Ÿ”ง Custom Connector\nโ€” Paynet adapts to you โ€”\nRequires a business case"] style UB fill:#d1fae5,stroke:#1EB863,stroke-width:3px,color:#082E12 style UWS fill:#e0e7ff,stroke:#6366f1,stroke-width:2px,color:#1e1b4b style CUSTOM fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f

Model Comparison

โœ… 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)

What is required from you for each model

โœ… Universal Billing โ€” no development:

โš™๏ธ UWS Connector โ€” API implementation required:

[!NOTE] What is serviceId? serviceId is 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 the fields array). One partner can provide multiple services, and serviceId helps Paynet understand exactly which service the client is paying for.

โš ๏ธ This is NOT your option if...

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.

2. Architecture and Processes (Sequence Diagrams)

[!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.

Integration via UWS (Universal Connector)

Main scenario of a successful payment:

sequenceDiagram autonumber actor Client participant Paynet as Paynet (PAC) participant Partner as Partner Billing (UWS) Client->>Paynet: Data entry (Subscriber ID, amount) Paynet->>Partner: POST /uws (method: GetInformation) Partner-->>Paynet: Subscriber data (Full name, Balance) Paynet-->>Client: Confirmation screen Client->>Paynet: Payment confirmation Paynet->>Partner: POST /uws (method: PerformTransaction) Partner-->>Paynet: Transaction successful (providerTrnId) Paynet-->>Client: Payment receipt

Scenario 1: Network Timeout:

sequenceDiagram autonumber participant Paynet as Paynet (PAC) participant Partner as Partner Billing (UWS) Paynet->>Partner: POST /uws (method: PerformTransaction) Note over Paynet, Partner: Network failure or timeout > 500ms Paynet--xPartner: (Response not received) Paynet->>Partner: POST /uws (method: CheckTransaction) Partner-->>Paynet: transactionState: 1 (Successful) Note over Paynet: Paynet synchronizes status

Scenario 2: Transaction Cancellation (CancelTransaction):

sequenceDiagram autonumber participant Paynet as Paynet (PAC) participant Partner as Partner Billing (UWS) Paynet->>Partner: POST /uws (method: CancelTransaction) Note over Partner: The cancellation decision is the partner's business logic alt Partner performs the refund Partner-->>Paynet: transactionState: 2 (Cancelled) else Client has already spent the funds Partner-->>Paynet: JSON-RPC 2.0 Error (77: Insufficient funds for cancellation) else Reporting period closed (closing documents issued) Partner-->>Paynet: JSON-RPC 2.0 Error (306: Cancellation period expired) else Transaction not found Partner-->>Paynet: JSON-RPC 2.0 Error (203: Transaction not found) end

Universal Billing

Paynet processes all logic independently and only notifies the merchant.

sequenceDiagram autonumber actor Client participant Paynet as Paynet (PAC / Foyda) participant Merchant as Telegram bot / Dashboard Client->>Paynet: Enters data into payment form (customizable fields) Paynet-->>Client: Data format validation Client->>Paynet: Service payment Paynet->>Paynet: Payment registration in the system Paynet->>Merchant: Successful payment notification (Foyda / Telegram) Paynet-->>Client: Issue receipt

3. Data Requirements, Security and Idempotency

3.1 Data Formats and Currency

[!WARNING] Errors in these points are the most frequent cause of failures during the testing phase.

[!CAUTION] The only exception to the date format: the timestamp parameter in the CheckTransaction request arrives in the format EEE 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, including timestamp in CancelTransaction and all responses from your server, use the standard format YYYY-MM-dd HH:mm:ss.

3.2 Authorization and Security

3.3 Idempotency and Timeouts

Financial transactions require strict consistency:


4. Operations: Reconciliation and SLA


5. OpenAPI Specification for UWS

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.


6. Onboarding and Testing Guide (UWS)

To start accepting payments via the universal connector (UWS), follow these steps:

Step 1: Infrastructure Preparation

Step 2: Application Completion (Questionnaire)

Provide the Paynet manager with the following information:

Step 3: Testing and Test Cases

Before launching, standard test cases must be executed:

  1. Subscriber verification (GetInformation): Emulation of successful subscriber search and emulation of 302 (Client not found) error.
  2. Payment execution (PerformTransaction): Successful top-up of the subscriber's balance.
  3. Limits (PerformTransaction): Emulation of 413 (Invalid amount) or 101 (Quota exhausted) error.
  4. Cancellation (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).
  5. Status check (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.

Step 4: Launch into Production (Go-Live)

After successfully passing all tests, an act of technical readiness is signed, and your services become available for payment to millions of Paynet users!


7. Paynet Error Codes Reference

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 the error object in the response body, while the HTTP status of the response itself stays 200 OK. The only exception is authentication: invalid login/password returns HTTP 401 Unauthorized (see the note on error 412 below).

Business Error Mapping Table

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 โ€” return HTTP 401 Unauthorized for invalid credentials, not a JSON-RPC error. Code 412 is a legacy from early protocol versions and is not used in new integrations.

Full Paynet Error Codes Reference

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 the error object.


8. Version History

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.