> ## Documentation Index
> Fetch the complete documentation index at: https://docs.muhasip.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Banka hareketini cariye veya faturaya işle

> status=0 olan banka hareketini contact veya invoice türünde onaylar ve ödeme kaydı oluşturur.

<Note>
  Mali işlem sonucunu ve varsa `operationId` değerini saklayın. Zaman aşımında veya `review_required` durumunda otomatik
  tekrar yapmayın. Tamamlanmış tekrar cevabı ilk cevabın bütün gövdesini yeniden sunmaz. [İşlem
  takibi](/rehberler/islem-takibi)
</Note>

## Ne yapar?

status=0 olan banka hareketini contact veya invoice türünde onaylar ve ödeme kaydı oluşturur. contact türünde id, mevcut cari kimliği veya yeni cari adı olabilir. invoice türünde id ve contactsId zorunludur; cari, fatura, para birimi ve ödeme yönü banka hareketiyle eşleşmelidir.

Para birimi boşsa TRY kabul edilir; uyuşmazlık 400 döndürür. IBAN ilgili cariye kaydedilir. Fatura açık, daha önce ödeme almamış ve hareketin tam tutarıyla kapanabilir olmalıdır.

Kısmi, önceden ödenmiş veya kapalı fatura 422 döndürür. Döviz hareketinde kaydedilmiş pozitif kur gerekir; TRY dışında kur=1 veya fatura kuruyla uyuşmazlık 422 döndürür. Kur farkı hesaplama ve kısmi kapama desteklenmez.

İşlem makbuzunu saklayın; replayed=true ilk cevabın bütün içeriğini tekrarlamaz. Aynı firmada çakışan banka onayı, fatura veya pazaryeri aktarımı 409 döndürebilir. Sonuç belirsizse yeniden onaylamadan işlem durumunu ve oluşan kayıtları inceleyin; okuma istekleri kullanılabilir.

## Ön koşullar ve izin

Etkin API anahtarı ve `muhasip:bank:write` izni gerekir.

İlişkili kayıtlar aynı firmaya ait olmalıdır. Erişim ayarları için [kimlik ve izinler](/baslangic/kimlik-ve-izinler) rehberini inceleyin.

[İstek ve cevap şemalarını indirin](/openapi.json).

## İstek örnekleri

Örnekler temsilîdir. Kimlikleri, belge tarihlerini ve iş verisini kendi yetkili kayıtlarınızla değiştirin. Node.js örnekleri **Node.js 20 veya üzeri** içindir; PHP örnekleri cURL uzantısını kullanır. Hiçbiri otomatik tekrar yapmaz.

<Tabs>
  <Tab title="cariyeOdeme">
    <CodeGroup>
      ```bash cURL theme={null}
      curl --request PATCH 'https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval' \
        --user "$MUHASIP_API_USER_ID:$MUHASIP_API_SECRET" \
        --header 'Accept: */*' \
        --header 'Content-Type: application/json' \
        --data-binary @- <<'JSON'
      {
        "type": "contact",
        "id": "64b000000000000000000002",
        "contactsId": "64b000000000000000000002"
      }
      JSON
      ```

      ```php PHP theme={null}
      <?php
      $apiUserId = getenv('MUHASIP_API_USER_ID');
      $secretKey = getenv('MUHASIP_API_SECRET');
      if (!$apiUserId || !$secretKey) {
          throw new RuntimeException('API kimlik bilgileri eksik.');
      }
      $headers = ['Accept: */*', 'Content-Type: application/json'];
      $body = <<<'JSON'
      {
        "type": "contact",
        "id": "64b000000000000000000002",
        "contactsId": "64b000000000000000000002"
      }
      JSON;
      $handle = curl_init('https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval');
      curl_setopt_array($handle, [
          CURLOPT_CUSTOMREQUEST => 'PATCH',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_FOLLOWLOCATION => false,
          CURLOPT_HTTPHEADER => $headers,
          CURLOPT_CONNECTTIMEOUT => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
          CURLOPT_USERPWD => $apiUserId . ':' . $secretKey,
          CURLOPT_POSTFIELDS => $body,
      ]);
      $response = curl_exec($handle);
      $httpStatus = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
      curl_close($handle);
      if ($response === false) {
          throw new RuntimeException('Bağlantı tamamlanamadı; mali işlemi otomatik tekrarlamayın.');
      }
      if ($httpStatus < 200 || $httpStatus >= 300) {
          throw new RuntimeException('HTTP ' . $httpStatus . '; kaynak hata açıklamasını değerlendirin.');
      }
      // $response gövdesini bu işlemin cevap biçimine göre işleyin; ham cevabı loglamayın.
      echo 'HTTP ' . $httpStatus . PHP_EOL;
      ```

      ```javascript Node.js theme={null}
      async function main() {
        const apiUserId = process.env.MUHASIP_API_USER_ID
        const secretKey = process.env.MUHASIP_API_SECRET
        if (!apiUserId || !secretKey) throw new Error("API kimlik bilgileri eksik.")
        const response = await fetch("https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval", {
          method: "PATCH",
          redirect: "manual",
          headers: {
            Accept: "*/*",
            Authorization: "Basic " + Buffer.from(`${apiUserId}:${secretKey}`).toString("base64"),
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            type: "contact",
            id: "64b000000000000000000002",
            contactsId: "64b000000000000000000002"
          }),
          signal: AbortSignal.timeout(30000)
        })
        const data = await response.arrayBuffer()
        if (!response.ok) throw new Error(`HTTP ${response.status}; kaynak hata açıklamasını değerlendirin.`)
        // data gövdesini bu işlemin cevap biçimine göre işleyin; ham cevabı loglamayın.
        console.log("HTTP", response.status)
      }

      main().catch(() => {
        console.error("İstek tamamlanamadı; mali işlemi otomatik tekrarlamayın.")
        process.exitCode = 1
      })
      ```
    </CodeGroup>
  </Tab>

  <Tab title="faturayaMahsup">
    <CodeGroup>
      ```bash cURL theme={null}
      curl --request PATCH 'https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval' \
        --user "$MUHASIP_API_USER_ID:$MUHASIP_API_SECRET" \
        --header 'Accept: */*' \
        --header 'Content-Type: application/json' \
        --data-binary @- <<'JSON'
      {
        "type": "invoice",
        "id": "64b000000000000000000003",
        "contactsId": "64b000000000000000000002"
      }
      JSON
      ```

      ```php PHP theme={null}
      <?php
      $apiUserId = getenv('MUHASIP_API_USER_ID');
      $secretKey = getenv('MUHASIP_API_SECRET');
      if (!$apiUserId || !$secretKey) {
          throw new RuntimeException('API kimlik bilgileri eksik.');
      }
      $headers = ['Accept: */*', 'Content-Type: application/json'];
      $body = <<<'JSON'
      {
        "type": "invoice",
        "id": "64b000000000000000000003",
        "contactsId": "64b000000000000000000002"
      }
      JSON;
      $handle = curl_init('https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval');
      curl_setopt_array($handle, [
          CURLOPT_CUSTOMREQUEST => 'PATCH',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_FOLLOWLOCATION => false,
          CURLOPT_HTTPHEADER => $headers,
          CURLOPT_CONNECTTIMEOUT => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
          CURLOPT_USERPWD => $apiUserId . ':' . $secretKey,
          CURLOPT_POSTFIELDS => $body,
      ]);
      $response = curl_exec($handle);
      $httpStatus = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
      curl_close($handle);
      if ($response === false) {
          throw new RuntimeException('Bağlantı tamamlanamadı; mali işlemi otomatik tekrarlamayın.');
      }
      if ($httpStatus < 200 || $httpStatus >= 300) {
          throw new RuntimeException('HTTP ' . $httpStatus . '; kaynak hata açıklamasını değerlendirin.');
      }
      // $response gövdesini bu işlemin cevap biçimine göre işleyin; ham cevabı loglamayın.
      echo 'HTTP ' . $httpStatus . PHP_EOL;
      ```

      ```javascript Node.js theme={null}
      async function main() {
        const apiUserId = process.env.MUHASIP_API_USER_ID
        const secretKey = process.env.MUHASIP_API_SECRET
        if (!apiUserId || !secretKey) throw new Error("API kimlik bilgileri eksik.")
        const response = await fetch("https://api.muhasip.pro/apps/bank/transaction/64b000000000000000000001/approval", {
          method: "PATCH",
          redirect: "manual",
          headers: {
            Accept: "*/*",
            Authorization: "Basic " + Buffer.from(`${apiUserId}:${secretKey}`).toString("base64"),
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            type: "invoice",
            id: "64b000000000000000000003",
            contactsId: "64b000000000000000000002"
          }),
          signal: AbortSignal.timeout(30000)
        })
        const data = await response.arrayBuffer()
        if (!response.ok) throw new Error(`HTTP ${response.status}; kaynak hata açıklamasını değerlendirin.`)
        // data gövdesini bu işlemin cevap biçimine göre işleyin; ham cevabı loglamayın.
        console.log("HTTP", response.status)
      }

      main().catch(() => {
        console.error("İstek tamamlanamadı; mali işlemi otomatik tekrarlamayın.")
        process.exitCode = 1
      })
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Cevabı değerlendirin

Önce HTTP durumunu, ardından bu kaynağın `status` ve sonuç alanlarını değerlendirin. Bütün uçlar aynı sonuç zarfını veya oluşturma için `201` kodunu kullanmaz.

Temsilî başarılı cevap; gerçek hizmet çağrısından alınmamıştır:

```json theme={null}
{
  "status": true,
  "createData": {
    "bankId": "64b000000000000000000001",
    "accountsId": "64b000000000000000000002",
    "contactsId": "64b000000000000000000002",
    "amount": 1000,
    "currencyCode": "TRY",
    "exchangeRate": 1,
    "out": false
  },
  "operation": {
    "operationId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "type": "bank.approve",
    "state": "succeeded",
    "reviewRequired": false,
    "retryable": false,
    "result": {
      "resultId": "507f1f77bcf86cd799439011"
    },
    "statusUrl": "/apps/operations/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "createdAt": "2026-10-18T09:00:00.000Z",
    "updatedAt": "2026-10-18T09:00:01.000Z"
  }
}
```

`replayed:true` varsa cevap güvenli makbuz ve sonuç kimlikleriyle sınırlı olabilir. İlk HTML/PDF veya mali gövdeyi tekrar beklemeyin. `reviewRequired:true` veya `retryable:false` yeni bir mali çağrı izni değildir.

## Hata durumunda

| HTTP | Bu işlemde anlamı | İzlenecek adım |
| - | - | - |
| 400 | İstek alanları geçersiz. | Alan adını, türünü ve zorunluluğunu kontrol edin; değişmeyen hatalı isteği tekrar göndermeyin. |
| 401 | API kimliği/parolası, erişim süresi veya firma doğrulanamadı. | Anahtar kimliğini, gizli değeri, erişim süresini ve firma erişimini kontrol edin. |
| 403 | API izni, IP kısıtı veya kayıt erişimi uygun değil. | Anahtarın izinlerini, IP kısıtını ve kayıt kimliğini kontrol edin. |
| 404 | Kayıt bulunamadı veya bu erişim bağlamında kullanılamıyor. | Hedef kimliğini ve aynı firmaya ait olduğunu doğrulayın; bu cevap başka firmanın kaydını açmaz. |
| 409 | İstek, devam eden işlemle veya kayıt durumuyla çakışıyor. | Mevcut işlem ve hedefi inceleyin. Kilit veya içerik çatışmasını yeni anahtarla aşmaya çalışmayın. |
| 422 | İstek iş kuralına uymuyor veya işlem reddedildi. | Ret nedenini kontrol edin. Alanlar hatalıysa düzeltin; desteklenmeyen işlemi yeniden göndermeyin. |
| 429 | Ortak istek sınırı aşıldı; sayısal status alanı kullanılır. | Varsa Retry-After bilgisini değerlendirin. Mali çağrıyı otomatik yeniden göndermeyin. |
| 500 | İşlem gerçekleştirilemedi. | İşlem sonucunu inceleyin; bağlantı/hata oluşması mali etkinin hiç başlamadığını kanıtlamaz. |
| 502 | Hizmet yanıtı alınamadı veya mali sonuç kesinleşmedi. | İşlem makbuzunu ve ilgili belge/ödemeyi inceleyin. Belirsiz mali sonucu yeniden göndermeyin. |
| 503 | İşlem kaydına veya gerekli hizmete erişilemiyor. | Varsa işlem kimliğiyle durumu okuyun; kayıt veya hizmet hatasından otomatik tekrar sonucu çıkarmayın. |

Ağ kesintisi, zaman aşımı veya JSON olmayan cevap mali etkinin oluşmadığını kanıtlamaz. Ham istek/cevapları genel loglara yazmayın. [Hata yönetimi](/rehberler/hata-yonetimi)

## Sonraki adım

İşlem makbuzunu saklayın; durum adresinden kontrol edin ve sonuç kimliklerini ilgili belge/tahsilat/siparişle eşleştirin. reviewRequired=true ise yeniden göndermeden manuel inceleyin.

[Kaynak akışı](/rehberler/kaynaklar/banka) · [İşlem takibi](/rehberler/islem-takibi) · [Kapsam ve sınırlamalar](/rehberler/kapsam-ve-sinirlamalar)


## OpenAPI

````yaml openapi.json PATCH /apps/bank/transaction/{id}/approval
openapi: 3.0.3
info:
  title: Muhasip API
  version: 2026-10-18.1
  description: >-
    Fatura, banka, POS ve tahsilat, GİB e-Arşiv, pazaryeri, online işlemler,
    görevler, ajanda ve takvim entegrasyonları. İşlem alanları, izinler, istek
    ve cevap örnekleri ile hata yönetimi.
servers:
  - url: https://api.muhasip.pro
    description: Muhasip API
security:
  - BasicAuth: []
tags:
  - name: Uygulamalar
  - name: Görev yönetimi
  - name: Ajanda ve takvim
  - name: Fatura
    description: Fatura bağlantısı, belge işlemleri ve muhasebeye aktarım.
  - name: Banka
    description: >-
      Banka hesapları, hareketler, mahsup ve mevcut çalışma alanı alt
      kaynakları.
  - name: POS ve tahsilat
    description: POS hesapları, komisyonlar ve tahsilat bağlantıları.
  - name: GİB e-Arşiv
    description: GİB hesabı, sorgu, taslak ve SMS imzalama.
  - name: Pazaryeri
    description: Trendyol bağlantısı ve sipariş aktarımı.
  - name: Online işlemler
    description: Online işlem ekranı yapılandırması.
  - name: İşlem takibi
    description: Mali işlem durumu ve tekrar çağrı makbuzları.
paths:
  /apps/bank/transaction/{id}/approval:
    patch:
      tags:
        - Banka
      summary: Banka hareketini cariye veya faturaya işle
      description: >-
        status=0 olan banka hareketini contact veya invoice türünde onaylar ve
        ödeme kaydı oluşturur. contact türünde id, mevcut cari kimliği veya yeni
        cari adı olabilir. invoice türünde id ve contactsId zorunludur; cari,
        fatura, para birimi ve ödeme yönü banka hareketiyle eşleşmelidir. Para
        birimi boşsa TRY kabul edilir; uyuşmazlık 400 döndürür. IBAN ilgili
        cariye kaydedilir. Fatura açık, daha önce ödeme almamış ve hareketin tam
        tutarıyla kapanabilir olmalıdır. Kısmi, önceden ödenmiş veya kapalı
        fatura 422 döndürür. Döviz hareketinde kaydedilmiş pozitif kur gerekir;
        TRY dışında kur=1 veya fatura kuruyla uyuşmazlık 422 döndürür. Kur farkı
        hesaplama ve kısmi kapama desteklenmez. İşlem makbuzunu saklayın;
        replayed=true ilk cevabın bütün içeriğini tekrarlamaz. Aynı firmada
        çakışan banka onayı, fatura veya pazaryeri aktarımı 409 döndürebilir.
        Sonuç belirsizse yeniden onaylamadan işlem durumunu ve oluşan kayıtları
        inceleyin; okuma istekleri kullanılabilir.
      operationId: financeApproveBankTransaction
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
            description: 24 haneli kayıt kimliği; firma API kimliğinden belirlenir.
          description: İşlem yapılacak kayıt kimliği.
          example: 64b000000000000000000001
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FinanceBankApprovalRequest'
            examples:
              cariyeOdeme:
                summary: Mevcut cariye ödeme
                value:
                  type: contact
                  id: 64b000000000000000000002
                  contactsId: 64b000000000000000000002
              faturayaMahsup:
                summary: Faturaya mahsup; contactsId zorunlu
                value:
                  type: invoice
                  id: 64b000000000000000000003
                  contactsId: 64b000000000000000000002
      responses:
        '200':
          description: İşlem tamamlandı. Örnek değerler temsilîdir.
          content:
            application/json:
              schema:
                anyOf:
                  - allOf:
                      - type: object
                        properties:
                          status:
                            type: boolean
                          createData:
                            type: object
                            properties:
                              accountsId:
                                type: string
                                pattern: ^[a-fA-F0-9]{24}$
                                description: >-
                                  24 haneli kayıt kimliği; firma API kimliğinden
                                  belirlenir.
                              bankId:
                                type: string
                                pattern: ^[a-fA-F0-9]{24}$
                                description: >-
                                  24 haneli kayıt kimliği; firma API kimliğinden
                                  belirlenir.
                              out:
                                type: boolean
                              paymentDate:
                                type: string
                                format: date-time
                              amount:
                                type: number
                              currencyCode:
                                type: string
                              exchangeRate:
                                type: number
                              contactsId:
                                type: string
                                pattern: ^[a-fA-F0-9]{24}$
                                description: >-
                                  24 haneli kayıt kimliği; firma API kimliğinden
                                  belirlenir.
                              transactionsId:
                                type: string
                                pattern: ^[a-fA-F0-9]{24}$
                                description: >-
                                  24 haneli kayıt kimliği; firma API kimliğinden
                                  belirlenir.
                              description:
                                type: string
                            additionalProperties: true
                        required:
                          - status
                          - createData
                        additionalProperties: true
                      - type: object
                        properties:
                          operation:
                            $ref: '#/components/schemas/ApiOperation'
                          operations:
                            type: array
                            items:
                              $ref: '#/components/schemas/ApiOperation'
                          replayed:
                            type: boolean
                  - $ref: '#/components/schemas/ApiOperationReplay'
                description: >-
                  İlk çağrı kaynağa özgü yanıtı ve işlem makbuzunu; tamamlanmış
                  tekrar yalnız güvenli makbuzu ve uygun sonuç kimliklerini
                  döndürür.
              example:
                status: true
                createData:
                  bankId: 64b000000000000000000001
                  accountsId: 64b000000000000000000002
                  contactsId: 64b000000000000000000002
                  amount: 1000
                  currencyCode: TRY
                  exchangeRate: 1
                  out: false
                operation:
                  operationId: >-
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                  type: bank.approve
                  state: succeeded
                  reviewRequired: false
                  retryable: false
                  result:
                    resultId: 507f1f77bcf86cd799439011
                  statusUrl: >-
                    /apps/operations/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                  createdAt: '2026-10-18T09:00:00.000Z'
                  updatedAt: '2026-10-18T09:00:01.000Z'
        '400':
          description: İstek alanları geçersiz.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                status: false
                message: İstek alanları geçersiz.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: >-
            İşlem koruması veya mali sonuç; kaynak varyantının koşullarını
            değerlendirin.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiOperationError'
              example:
                status: false
                code: OPERATION_IN_PROGRESS
                message: İşlem sonucunu durum adresinden kontrol ediniz.
                retryable: false
        '422':
          description: >-
            İşlem koruması veya mali sonuç; kaynak varyantının koşullarını
            değerlendirin.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiOperationError'
              example:
                status: false
                code: OPERATION_REJECTED
                message: İşlem sonucunu durum adresinden kontrol ediniz.
                retryable: false
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          description: İşlem gerçekleştirilemedi.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                status: false
                message: İşlem gerçekleştirilemedi.
        '502':
          description: >-
            İşlem koruması veya mali sonuç; kaynak varyantının koşullarını
            değerlendirin.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiOperationError'
              example:
                status: false
                code: UPSTREAM_RESULT_UNCERTAIN
                message: İşlem sonucunu durum adresinden kontrol ediniz.
                retryable: false
        '503':
          description: >-
            İşlem koruması veya mali sonuç; kaynak varyantının koşullarını
            değerlendirin.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiOperationError'
              example:
                status: false
                code: OPERATION_RECORD_UNAVAILABLE
                message: İşlem sonucunu durum adresinden kontrol ediniz.
                retryable: false
components:
  schemas:
    FinanceBankApprovalRequest:
      description: contact ve invoice varyantlarında zorunlu alanlar farklıdır.
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - contact
              description: 'contact: cariye ödeme; invoice: belirli faturaya mahsup.'
            id:
              type: string
              description: >-
                contact: firmadaki cari kimliği veya yeni cari adı; invoice:
                fatura kimliği.
          required:
            - type
            - id
          additionalProperties: true
        - type: object
          properties:
            type:
              type: string
              enum:
                - invoice
              description: 'contact: cariye ödeme; invoice: belirli faturaya mahsup.'
            id:
              type: string
              description: >-
                contact: firmadaki cari kimliği veya yeni cari adı; invoice:
                fatura kimliği.
            contactsId:
              type: string
              pattern: ^[a-fA-F0-9]{24}$
              description: Seçilen faturanın cari kimliğiyle birebir eşleşmelidir.
          required:
            - type
            - id
            - contactsId
          additionalProperties: true
    ApiOperation:
      type: object
      properties:
        operationId:
          type: string
          pattern: ^[a-f0-9]{64}$
        type:
          type: string
        state:
          type: string
          enum:
            - claimed
            - dispatching
            - provider_accepted
            - succeeded
            - rejected
            - failed_before_dispatch
            - review_required
        reviewRequired:
          type: boolean
        retryable:
          type: boolean
        result:
          $ref: '#/components/schemas/ApiOperationReceipt'
        statusUrl:
          type: string
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 tarih-saat.
        updatedAt:
          type: string
          format: date-time
          description: ISO 8601 tarih-saat.
      required:
        - operationId
        - type
        - state
        - reviewRequired
        - retryable
        - result
        - statusUrl
        - createdAt
        - updatedAt
    ApiOperationReplay:
      type: object
      properties:
        status:
          type: boolean
        replayed:
          type: boolean
          enum:
            - true
        operation:
          $ref: '#/components/schemas/ApiOperation'
        operations:
          type: array
          items:
            $ref: '#/components/schemas/ApiOperation'
        resultId:
          type: string
        transactionId:
          type: string
        uuid:
          type: string
        id:
          type: string
        providerId:
          type: string
        documentId:
          type: string
        paymentId:
          type: string
        orderId:
          type: string
        uuids:
          type: array
          items:
            type: string
      required:
        - status
        - replayed
        - operation
        - operations
      additionalProperties: false
    Error:
      type: object
      properties:
        status:
          type: boolean
        code:
          type: string
        message:
          type: string
        description:
          type: string
        retryable:
          type: boolean
        reviewRequired:
          type: boolean
        operationId:
          type: string
      required:
        - status
      additionalProperties: true
    ApiOperationError:
      type: object
      properties:
        status:
          type: boolean
        code:
          type: string
        message:
          type: string
        retryable:
          type: boolean
        reviewRequired:
          type: boolean
        operation:
          $ref: '#/components/schemas/ApiOperation'
        operationId:
          type: string
      required:
        - status
      additionalProperties: true
    ApiOperationReceipt:
      type: object
      properties:
        resultId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        transactionId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        uuid:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        id:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        providerId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        documentId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        paymentId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        orderId:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[A-Za-z0-9_.:-]+$
        uuids:
          type: array
          items:
            type: string
            maxLength: 200
            pattern: ^[A-Za-z0-9_.:-]+$
          maxItems: 100
      additionalProperties: false
    RateLimitError:
      type: object
      properties:
        status:
          type: integer
          enum:
            - 429
        error:
          type: string
        message:
          type: string
      required:
        - status
        - error
        - message
  responses:
    Unauthorized:
      description: API kimliği/parolası, erişim süresi veya firma doğrulanamadı.
      headers:
        WWW-Authenticate:
          schema:
            type: string
          description: Basic realm="Muhasip API", charset="UTF-8"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: false
            code: UNAUTHORIZED
            message: API kimlik bilgileri doğrulanamadı.
    Forbidden:
      description: Ürün, IP, modül izni veya kaynak kapsamı uygun değil.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: false
            message: Ürün, IP, modül izni veya kaynak kapsamı uygun değil.
    NotFound:
      description: Kayıt bulunamadı veya bu erişim bağlamında kullanılamıyor.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            status: false
    RateLimited:
      description: Ortak istek sınırı aşıldı; sayısal status alanı kullanılır.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitError'
          example:
            status: 429
            error: Too Many Requests
            message: Rate limit exceeded. Please try again later.
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: >-
        Kullanıcı adı apiUserId, parola secretKey. Aktif ve süresi geçmemiş API
        kullanıcısı ve uygun firma gerekir.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.