/v2/orders/{order_id}/refund

Buyurtma uchun mablag‘ni qaytarish so‘rovi.

Metod asinxron hisoblanadi.

Qaytarish jarayoni sxemasi

Cheklovlar

Siz to‘lovni to‘liq yoki qisman qaytarishingiz mumkin.

Qaytarishlar quyidagi paymentStatus holatlaridan birida bo‘lgan to‘lovlar uchun mavjud:

  • CAPTURED – buyurtma muvaffaqiyatli to‘langan, mablag‘ to‘lovchining hisobidan yechilgan;
  • PARTIALLY_REFUNDED – buyurtma bo‘yicha mablag‘ning bir qismi qaytarilgan.

Qaytarish muvaffaqiyatli bajarilgandan so‘ng, to‘lovning paymentStatus holati quyidagicha o‘zgaradi:

  • REFUNDED – agar to‘liq qaytarish amalga oshirilgan bo‘lsa;
  • PARTIALLY_REFUNDED – agar qaytarishdan keyin buyurtmada hali ham mahsulotlar qolgan bo‘lsa.

Joriy kun uchun qaytarilgan mablag‘lar summasi keyingi ish kunida hamkorga buyurtma bo‘yicha to‘lanadigan summadan ushlab qolinadi.

Misol: do‘koningizda 1000 soʻm buyurtma amalga oshirildi va 200 soʻm qaytarildi. Keyingi ish kunida siz 800 soʻm miqdorida to‘lovni olasiz (1000 − 200).

Bitta buyurtma bo‘yicha bir vaqtning o‘zida bir nechta qaytarishni amalga oshirib bo‘lmaydi.

Takroriy so‘rovni yuborishdan oldin joriy qaytarish operatsiyasi yakunlanganini tekshiring: status qiymati SUCCESS yoki FAIL bo‘lishi kerak.

Aks holda siz ANOTHER_OPERATION_IN_PROGRESS xatosi bilan 409 Conflict javobini olasiz.

Qaytarish holatidagi o‘zgarishlarni /webhook orqali, shuningdek quyidagi so‘rovlar yordamida kuzatish mumkin:

Qaytarish statusini tekshirish misoli

/operations/{external_operation_id}/ metodi orqali externalOperationId bo‘yicha joriy qaytarish operatsiyasining holatini tekshirish mumkin.

Agar operatsiya hali yakunlanmagan bo‘lsa, masalan: "status": "PENDING". Bu holatda qaytarish uchun takroriy so‘rov yuborish mumkin emas.

Javob namunasi
{
  "code": 200,
  "status": "success",
  "data": {
    "operation": {
      "operationId": "52b3c4a8-528b-45eb-a57f-8f808f65d28f",
      "operationType": "REFUND",
      "orderId": "OrderS-2038",
      "amount": "250.00",
      "pointsAmount": null,
      "status": "PENDING", // возврат в процессе
      "reason": null,
      "params": { "motive": null, "branch_id": null, "manager_id": null },
      "externalOperationId": "OrderS-2038",
      "created": "2025-03-14T14:58:45.850206+03:00",
      "updated": "2025-03-14T14:58:45.850206+03:00"
    }
  }
}

/operations/{external_operation_id}/ metodi yordamida buyurtmaning barcha tafsilotlarini tekshirish mumkin.

Quyidagi misolda qaytarish operatsiyasi muvaffaqiyatli yakunlangan – "status": "SUCCESS", to‘lov esa "paymentStatus": "PARTIALLY_REFUNDED" holatida. Qaytarish uchun takroriy so‘rov yuborish mumkin.

Javob namunasi
{
  "code": 200,
  "status": "success",
  "data": {
    "operations": [
      {
        "operationId": "52b3c4a8-528b-45eb-a57f-8f808f65d28f",
        "operationType": "REFUND",
        "orderId": "OrderS-2038",
        "amount": "250.00",
        "status": "SUCCESS", // возврат успешно завершен
        "reason": null,
        "params": { "motive": null, "branch_id": null, "manager_id": null },
        "externalOperationId": "OrderS-2038",
        "created": "2025-03-14T14:58:45.850206+03:00",
        "updated": "2025-03-14T14:58:46.084886+03:00",
        "approvalCode": null
      },
      {
        "operationId": "9c763cfb-dcf6-4056-be8f-ca9e2e61d772",
        "operationType": "AUTHORIZE",
        "orderId": "OrderS-2038",
        "amount": "500.00",
        "status": "SUCCESS",
        "reason": null,
        "params": {},
        "externalOperationId": null,
        "created": "2025-03-14T14:58:07.161667+03:00",
        "updated": "2025-03-14T14:58:07.414886+03:00",
        "approvalCode": null
      }
    ],
    "order": {
      "currencyCode": "RUB",
      "cart": {
        "items": [
          {
            "productId": "p2",
            "quantity": { "count": "1", "available": null, "label": null },
            "type": "UNSPECIFIED",
            "title": "Яндекс.Станция Мини",
            "description": null,
            "total": "250",
            "subtotal": null,
            "discountedUnitPrice": "250",
            "unitPrice": null,
            "measurements": null,
            "finalPrice": "250",
            "pointsAmount": null,
            "features": null
          }
        ],
        "total": { "amount": "250", "pointsAmount": null, "label": null },
        "cartId": "1eed9a9827e68ba8981d9961c1237624fabc19cda05044b574e06302e83c7549",
        "externalId": null,
        "coupons": null,
        "discounts": null,
        "measurements": null
      },
      "merchantId": "76cc0f5c-91c4-40f2-9794-64a64c3c6011",
      "orderAmount": "250.00",
      "orderId": "OrderS-2038",
      "paymentMethod": { "methodType": "CARD", "cardLast4": "0412", "cardNetwork": "MASTERCARD" },
      "shippingMethod": null,
      "metadata": null,
      "created": "2025-03-14T14:58:03.699930+03:00",
      "updated": "2025-03-14T14:58:46.084886+03:00",
      "paymentStatus": "PARTIALLY_REFUNDED", // платеж частично возвращен
      "reason": null,
      "paymentUrl": "https://sandbox.pay.yandex.uz/l/I1RnP9",
      "isPrepayment": false,
      "splitCode": null
    },
    "delivery": null
  }
}

Qaytarish turlari

To‘lovni to‘liq yoki qisman qaytarish mumkin.

To‘liq qaytarishni amalga oshirish uchun buyurtma summasiga teng bo‘lgan faqat refundAmount parametrini yuboring.

Qisman qaytarishni amalga oshirish uchun qaytariladigan summaga teng refundAmount qiymatini yuboring va qaytarilayotgan mahsulotlar hamda xizmatlardan iborat savatni qo‘shing. Savatni quyidagi usullardan biri orqali shakllantirish mumkin:

  • 1-usul: Qaytarishdan keyingi savat holatini ko‘rsatish.

    Buning uchun targetCart maydonidan foydalaning – bu qaytarish amalga oshirilgandan keyin xaridorda qolishi kerak bo‘lgan yakuniy savatdir. Agar bu maydon ko‘rsatilmagan bo‘lsa, savat to‘liq qaytarilmoqda deb hisoblanadi.

    targetShipping maydoni faqat Yandex Pay Checkout uchun qo‘llaniladi. Boshqa holatlarda ushbu maydonni bo‘sh qoldirish kerak. Agar bu maydon ko‘rsatilmagan bo‘lsa, yetkazish narxi ham to‘liq qaytariladi deb hisoblanadi.

  • 2-usul: Qaytariladigan mahsulotlarni ko‘rsatish

    refundCart maydonidan foydalaning – unda qaytarilayotgan pozitsiyalar haqida ma’lumot beriladi: qaytarilayotgan mahsulotlar soni yoki aniq mahsulot narxini kamaytirish kerak bo‘lgan summa. Agar ushbu maydon ko‘rsatilmagan bo‘lsa, qaytarish butun savat bo‘yicha amalga oshiriladi.

Sharh

refundCartdan foydalanganda operatsiya identifikatori – externalOperationIdni ko‘rsating. U idempotentlik tokeni vazifasini bajaradi va takroriy qaytarishlar xavfini oldini olishga yordam beradi.

Qaytarish misollari

Keling, orderId = Order-123 bo‘lgan buyurtma va quyidagi savat misolida ko‘rib chiqamiz.

{
  "items": [
    {
      "productId": "id-1",
      "price": "50",
      "title": "Sharikli ruchka",
      "quantity": {
        "count": "10"
      }
    },
    {
      "productId": "id-2",
      "price": "200",
      "title": "Bloknot",
      "quantity": {
        "count": "2"
      }
    }
  ]
}

To‘liq qaytarish

http POST https://sandbox.pay.yandex.uz/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" 'refundAmount:="900.00"'

Qisman qaytarish

Mahsulot birliklarini qaytarish

Faraz qilaylik, ikkita sharikli ruchkani qaytarish kerak. Bu quyidagi so‘rov orqali amalga oshiriladi:

http POST https://sandbox.pay.yandex.uz/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'targetCart[items][0]:={"productId": "id-1", "quantityCount": "8"}' \
  'targetCart[items][1]:={"productId": "id-2", "quantityCount": "2"}' \
  'refundAmount:="100.00"'

Ushbu misolda:

  • Sharikli ruchkalar soni 2 taga kamaydi – ya’ni 10 donadan 8 donaga tushdi.
  • So‘rovda price maydoni ko‘rsatilmagan, ammo uni ko‘rsatish ruxsat etiladi.
  • Bloknot pozitsiyasida quantityCount o‘zgarmagan, shuning uchun uni ko‘rsatmaslik ham mumkin edi.

Pulning bir qismini qaytarish

Faraz qilaylik, har bir bloknot uchun 30 soʻm miqdorida mablag‘ni qaytarish kerak. Bu pozitsiya narxini kamaytirish orqali amalga oshiriladi.

http POST https://sandbox.pay.yandex.uz/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'targetCart[items]:=[{"productId": "id-1"}, {"productId": "id-2", "price": "170"}]' \
  'refundAmount:="60.00"'

Ushbu misolda:

  • Bloknot narxi 30 soʻmga kamaydi – ya’ni 200 dan 170 soʻmgacha tushdi;
  • Shu tariqa jami 60 soʻm miqdorida qaytarish amalga oshiriladi, chunki bloknotlar 2 ta edi.
  • quantityCount maydonlari ko‘rsatilmagan, biroq zarur bo‘lsa ularning oldingi qiymatlarini ko‘rsatish mumkin.

Qaytarilayotgan mahsulot miqdorini ko‘rsatgan holda qaytarish

Faraz qilaylik, ikkita sharikli ruchkani qaytarish kerak. Bu quyidagi so‘rov orqali amalga oshiriladi:

http POST https://sandbox.pay.yandex.uz/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'refundCart[items][0]:={"productId": "id-1", "quantityCount": "2"}' \
  'refundAmount:="100.00"'

Ushbu misolda:

  • Sharikli ruchkalar soni 2 taga kamaydi – ya’ni 10 donadan 8 donaga tushdi.
  • So‘rovda price maydoni ko‘rsatilmagan, ammo uni ko‘rsatish to‘liq ruxsat etilgan edi.

Mahsulot narxining qaysi qismini qaytarish kerakligi ko‘rsatilgan holdagi qaytarish

Faraz qilaylik, har bir bloknot uchun 30 soʻm miqdorida mablag‘ni qaytarish kerak. Bu pozitsiya narxini kamaytirish orqali amalga oshiriladi.

http POST https://sandbox.pay.yandex.uz/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'refundCart[items]:=[{"productId": "id-1"}, {"productId": "id-2", "price": "30"}]' \
  'refundAmount:="60.00"'

Ushbu misolda:

  • Bloknot narxi 30 ga kamaydi – 200 soʻmdan 170 soʻmgacha.
  • Shu tariqa jami 60 soʻm miqdorida qaytarish amalga oshiriladi, chunki bloknotlar 2 ta edi.
  • quantityCount maydonlari ko‘rsatilmagan, biroq zarur bo‘lsa ularning oldingi qiymatlarini ko‘rsatish mumkin.

Request

POST

https://pay.yandex.uz/api/merchant/v2/orders/{order_id}/refund

Production

POST

https://sandbox.pay.yandex.uz/api/merchant/v2/orders/{order_id}/refund

Sandbox

Path parameters

Name

Description

order_id

Type: string

Buyurtma yaratilganda /orders so‘rovida yuborilgan sotuvchi tizimidagi buyurtma ID raqami.

Max length: 2048

Example: ``

Body

application/json
{
  "branchId": "example",
  "externalOperationId": "example",
  "managerId": "example",
  "motive": "example",
  "refundAmount": "123.45",
  "refundCart": {
    "items": [
      {
        "price": "123.45",
        "productId": "example",
        "quantityCount": "123.45"
      }
    ]
  },
  "targetCart": null,
  "targetShipping": {
    "amount": "123.45"
  }
}

Name

Description

refundAmount

Type: string<double>

Qaytariladigan summa.

Example: 123.45

branchId

Type: string

Savdo nuqtasi identifikatori

Max length: 2048

Example: example

externalOperationId

Type: string

Sotuvchi tizimidagi qaytarish operatsiyasi identifikatori. U noyob bo‘lishi kerak.

Ushbu parametrni kiriting – qaytarish operatsiyasi holatini /operations/{external_operation_id} metodi orqali kuzatish imkoniyatiga ega bo‘lasiz.

Agar operatsiya hali yakunlanmagan bo‘lsa (ya’ni qayta ishlanayotgan yoki to‘xtatilgan holatda bo‘lsa), unda xuddi shu argumentlar va aynan shu externalOperationId qiymati bilan qaytarish metodini qayta chaqirish idempotent hisoblanadi – javobda o‘sha operatsiyaning o‘zi qaytariladi. Aks holda xatolik qaytariladi.

Agar qaytarish jarayoni muvaffaqiyatli ishga tushirilgan bo‘lsa, shu externalOperationId bilan metodni qayta chaqirish quyidagi xatoni qaytaradi: reasonCode: "DUPLICATE_EXTERNAL_OPERATION_ID".

Max length: 2048

Example: example

managerId

Type: string

Menejer identifikatori

Max length: 2048

Example: example

motive

Type: string

Qaytarish sababi

Max length: 2048

Example: example

refundCart

All of 1 type
  • Type: TargetCart

    Example
    {
      "items": [
        {
          "price": "123.45",
          "productId": "example",
          "quantityCount": "123.45"
        }
      ]
    }
    

Qaytarilishi kerak bo‘lgan savat pozitsiyalarini tavsiflaydi. Bu parametrni targetCart maydoni bilan bir vaqtda ko‘rsatish mumkin emas. Shuningdek, ushbu parametr bilan birga externalOperationId operatsiya identifikatorini yuborish tavsiya etiladi, chunki u idempotentlik tokeni hisoblanadi.

Example
{
  "items": [
    {
      "price": "123.45",
      "productId": "example",
      "quantityCount": "123.45"
    }
  ]
}

targetCart

All of 1 type
  • Type: TargetCart

    Example
    {
      "items": [
        {
          "price": "123.45",
          "productId": "example",
          "quantityCount": "123.45"
        }
      ]
    }
    

Qaytarish amalga oshirilgandan keyingi savatning yakuniy holatini tavsiflaydi. Agar bu maydon ko‘rsatilmasa, savat to‘liq qaytarilgan deb hisoblanadi. Uni refundCart maydoni bilan bir vaqtda ko‘rsatish mumkin emas.

Example
{
  "items": [
    {
      "price": "123.45",
      "productId": "example",
      "quantityCount": "123.45"
    }
  ]
}

targetShipping

All of 1 type

Faqat Yandex Pay Checkout uchun qo‘llaniladi. Boshqa holatlarda ushbu maydonni bo‘sh qoldirish kerak.

Qaytarish amalga oshirilgandan keyingi yetkazishning yakuniy holatini tavsiflaydi. Agar bu maydon ko‘rsatilmagan bo‘lsa yoki qiymati nullga teng bo‘lsa, yetkazish narxi to‘liq qaytarilgan deb hisoblanadi.

Example
{
  "amount": "123.45"
}

TargetCartItem

Name

Description

productId

Type: string

Buyurtma yaratilgan paytdagi savatdagi pozitsiya identifikatori. Agar dastlabki savatda mavjud bo‘lmagan identifikator yuborilsa – xatolik yuz beradi.

Max length: 2048

Example: example

price

Type: string<double>

Operatsiya bajarilgandan keyingi mahsulot/xizmatning bir dona narxi. Agar operatsiya natijasida bitta mahsulot narxi kamaytirilsa, ushbu parametrni ko‘rsatish zarur. Bu parametr mahsulot uchun pulning faqat bir qismini qaytarish yoki buyurtmani tasdiqlash jarayonida foydali bo‘lishi mumkin. Agar so‘rovda ushbu maydon ko‘rsatilmasa, mahsulot narxi o‘zgarmagan deb hisoblanadi.

Example: 123.45

quantityCount

Type: string<double>

Qaytarish operatsiyasi uchun mahsulot birliklari soni.

Qiymat ishlatilayotgan savat turiga bog‘liq:

  • agar targetCart ishlatilsa, quantityCount – qaytarishdan keyin qoladigan mahsulot soni (masalan: 5 dona bor edi, 3 ko‘rsatildi → 2 dona qoladi);
  • agar refundCart ishlatilsa, quantityCount – qaytariladigan mahsulotlar soni (masalan: 5 dona bor edi, 3 ko‘rsatildi → 3 dona qaytariladi).

Agar maydon ko‘rsatilmasa, mahsulot miqdori o‘zgarmaydi.

Example: 123.45

Example
{
  "price": "123.45",
  "productId": "example",
  "quantityCount": "123.45"
}

TargetCart

Name

Description

items

Type: TargetCartItem[]

Example
[
  {
    "price": "123.45",
    "productId": "example",
    "quantityCount": "123.45"
  }
]
Example
{
  "items": [
    {
      "price": "123.45",
      "productId": "example",
      "quantityCount": "123.45"
    }
  ]
}

TargetShipping

Name

Description

amount

Type: string<double>

Operatsiya bajarilgandan keyingi yetkazish narxi.

Example: 123.45

Example
{
  "amount": "123.45"
}

Responses

200 OK

Body

application/json
{
  "code": 200,
  "data": {
    "operation": {
      "amount": "123.45",
      "created": "2025-01-01T00:00:00Z",
      "externalOperationId": "example",
      "operationId": "123e4567-e89b-12d3-a456-426614174000",
      "operationType": "AUTHORIZE",
      "orderId": "example",
      "params": {},
      "pointsAmount": "123.45",
      "reason": "example",
      "status": "PENDING",
      "updated": "2025-01-01T00:00:00Z"
    }
  },
  "status": "success"
}

Name

Description

code

Type: unknown

Default: 200

data

Type: OperationResponseData

Example
{
  "operation": {
    "amount": "123.45",
    "created": "2025-01-01T00:00:00Z",
    "externalOperationId": "example",
    "operationId": "123e4567-e89b-12d3-a456-426614174000",
    "operationType": "AUTHORIZE",
    "orderId": "example",
    "params": {},
    "pointsAmount": "123.45",
    "reason": "example",
    "status": "PENDING",
    "updated": "2025-01-01T00:00:00Z"
  }
}

status

Type: string

Default: success

Const: success

Operation

Name

Description

amount

Type: string<double>

Operatsiya summasi fiat valyutada

Example: 123.45

operationId

Type: string<uuid>

Max length: 2048

Example: 123e4567-e89b-12d3-a456-426614174000

operationType

Type: string

Enum: AUTHORIZE, BIND_CARD, REFUND, CAPTURE, VOID, RECURRING, PREPAYMENT, SUBMIT

orderId

Type: string

Max length: 2048

Example: example

created

Type: string<date-time>

Operatsiya yaratilgan sana va vaqt (ISO 8601)

Example: 2025-01-01T00:00:00Z

externalOperationId

Type: string

Sotuvchi tomonidagi tranzaksiya identifikatori

Max length: 2048

Example: example

params

Type: object

Example
{}

pointsAmount

Type: string<double>

O‘zbekistonda mavjud emas.

Example: 123.45

reason

Type: string

Xatolik sababi

Max length: 2048

Example: example

status

Type: string

Default: PENDING

Enum: PENDING, SUCCESS, FAIL

updated

Type: string<date-time>

Operatsiya yangilangan sana va vaqt (ISO 8601)

Example: 2025-01-01T00:00:00Z

Example
{
  "amount": "123.45",
  "created": "2025-01-01T00:00:00Z",
  "externalOperationId": "example",
  "operationId": "123e4567-e89b-12d3-a456-426614174000",
  "operationType": "AUTHORIZE",
  "orderId": "example",
  "params": {},
  "pointsAmount": "123.45",
  "reason": "example",
  "status": "PENDING",
  "updated": "2025-01-01T00:00:00Z"
}

OperationResponseData

Name

Description

operation

Type: Operation

Example
{
  "amount": "123.45",
  "created": "2025-01-01T00:00:00Z",
  "externalOperationId": "example",
  "operationId": "123e4567-e89b-12d3-a456-426614174000",
  "operationType": "AUTHORIZE",
  "orderId": "example",
  "params": {},
  "pointsAmount": "123.45",
  "reason": "example",
  "status": "PENDING",
  "updated": "2025-01-01T00:00:00Z"
}
Example
{
  "operation": {
    "amount": "123.45",
    "created": "2025-01-01T00:00:00Z",
    "externalOperationId": "example",
    "operationId": "123e4567-e89b-12d3-a456-426614174000",
    "operationType": "AUTHORIZE",
    "orderId": "example",
    "params": {},
    "pointsAmount": "123.45",
    "reason": "example",
    "status": "PENDING",
    "updated": "2025-01-01T00:00:00Z"
  }
}