{
  "openapi": "3.1.0",
  "info": {
    "title": "LintasPay Open API",
    "description": "LintasPay payment API for Indonesia (IDR). All endpoints are `POST` with a JSON body and must be signed with SHA256withRSA — see the [documentation](/docs/signing). Responses are signed by LintasPay; verify them with the LintasPay public key. In Swagger, use the **Sign requests** panel to sign automatically.",
    "license": {
      "name": ""
    },
    "version": "0.1.0"
  },
  "servers": [
    {
      "url": "/",
      "description": "This server (sandbox)"
    },
    {
      "url": "https://test.lintaspay.xyz",
      "description": "Sandbox"
    },
    {
      "url": "https://lintaspay.xyz",
      "description": "Production"
    }
  ],
  "paths": {
    "/data/bank-list": {
      "post": {
        "tags": [
          "General"
        ],
        "summary": "Bank list",
        "description": "Lists the banks / virtual accounts (`type = 1`) or e-wallets (`type = 2`) you can pay out to. Use `bank_id` as `bankId`.",
        "operationId": "bankList",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BankListRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/finance/query-balance": {
      "post": {
        "tags": [
          "General"
        ],
        "summary": "Query balance",
        "description": "Returns the account balance. May be disabled for your merchant account (code `10011430`).",
        "operationId": "queryBalance",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BalanceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BalanceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/pay-in/create": {
      "post": {
        "tags": [
          "Pay-in"
        ],
        "summary": "Create pay-in order",
        "description": "Creates a collection order and returns the `payCode` (VA number, QRIS string or payment URL) the payer uses.\nThe result is delivered to your `notifyUrl` when the order succeeds or fails.",
        "operationId": "payinCreate",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayinCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayinCreateResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/pay-in/inquiry": {
      "post": {
        "tags": [
          "Pay-in"
        ],
        "summary": "Query pay-in order",
        "description": "Returns the latest status of a pay-in order. Use `orderNo` (preferred) or your `mchOrderNo`.",
        "operationId": "payinInquiry",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InquiryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayinInquiryResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/pay-out/create": {
      "post": {
        "tags": [
          "Payout"
        ],
        "summary": "Create payout",
        "description": "Sends money to a bank account, virtual account or e-wallet. **A successful response only means the payout was\naccepted** — treat it as final only when `orderStatus` is `4` (success) or `5` (failed). If the call times out,\nquery it (or retry with the *same* `mchOrderNo`) — never create a new payout for the same intent.",
        "operationId": "payoutCreate",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayoutCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoutCreateResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/pay-out/inquiry": {
      "post": {
        "tags": [
          "Payout"
        ],
        "summary": "Query payout",
        "description": "Returns the latest status of a payout. Use it to confirm any payout whose outcome you have not seen.",
        "operationId": "payoutInquiry",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InquiryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoutInquiryResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    },
    "/pay-out/verify-bank-account": {
      "post": {
        "tags": [
          "Payout"
        ],
        "summary": "Verify bank account",
        "description": "Checks that an account exists and returns the holder's name, so you can confirm it before paying out.\n`mchOrderNo` can never be reused, whatever the outcome. Fees are billed monthly.",
        "operationId": "verifyBankAccount",
        "parameters": [
          {
            "name": "lintaspay-request-id",
            "in": "header",
            "description": "Unique request id, `[A-Za-z0-9_-]`, max 64. Required — Swagger fills it in for you.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyAccountRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Envelope; check `code`",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerifyAccountResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "signature": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AdditionalInfo": {
        "type": "object",
        "description": "Payer details for a successful pay-in (when the channel provides them).",
        "properties": {
          "paymentNtb": {
            "type": [
              "string",
              "null"
            ],
            "example": "NTB20261014103512"
          },
          "senderName": {
            "type": [
              "string",
              "null"
            ],
            "example": "BUDI SANTOSO"
          },
          "sourceAccountNo": {
            "type": [
              "string",
              "null"
            ],
            "example": "0123456789"
          },
          "sourceBankName": {
            "type": [
              "string",
              "null"
            ],
            "example": "BNI"
          }
        }
      },
      "BalanceData": {
        "type": "object",
        "description": "Account balance.",
        "required": [
          "merchantId",
          "availableBalance",
          "frozenBalance",
          "pendingSettlementAmount",
          "totalBalance",
          "currency"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "availableBalance": {
            "type": "string",
            "example": "619984.00"
          },
          "frozenBalance": {
            "type": "string",
            "example": "0.00"
          },
          "pendingSettlementAmount": {
            "type": "string",
            "example": "15000.00"
          },
          "totalBalance": {
            "type": "string",
            "example": "634984.00"
          },
          "currency": {
            "type": "string",
            "example": "IDR"
          }
        }
      },
      "BalanceRequest": {
        "type": "object",
        "description": "Empty object.",
        "example": {}
      },
      "BalanceResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/BalanceData"
              }
            ]
          }
        }
      },
      "Bank": {
        "type": "object",
        "description": "One bank or wallet.",
        "required": [
          "bank_id",
          "bank_name",
          "type"
        ],
        "properties": {
          "bank_id": {
            "type": "integer",
            "format": "int64",
            "description": "Use as `bankId`.",
            "example": 1
          },
          "bank_name": {
            "type": "string",
            "example": "BANK BCA"
          },
          "type": {
            "type": "integer",
            "format": "int64",
            "description": "`1` bank/VA, `2` e-wallet.",
            "example": 1
          }
        }
      },
      "BankListData": {
        "type": "object",
        "description": "Bank list.",
        "required": [
          "total",
          "list"
        ],
        "properties": {
          "total": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "list": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bank"
            }
          }
        }
      },
      "BankListRequest": {
        "type": "object",
        "description": "List supported banks / wallets.",
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "integer",
            "format": "int64",
            "description": "`1` banks & virtual accounts, `2` e-wallets.",
            "example": 1
          }
        },
        "example": {
          "type": 1
        }
      },
      "BankListResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/BankListData"
              }
            ]
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "description": "Error envelope.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "example": 10011304
          },
          "message": {
            "type": "string",
            "example": "Signature verification failed"
          },
          "data": {
            "type": [
              "object",
              "null"
            ]
          }
        },
        "example": {
          "code": 10011304,
          "message": "Signature verification failed",
          "data": null
        }
      },
      "InquiryRequest": {
        "type": "object",
        "description": "Query an order. Provide `orderNo` or `mchOrderNo` (orderNo preferred).",
        "required": [
          "nonceStr"
        ],
        "properties": {
          "nonceStr": {
            "type": "string",
            "description": "Random string, max 64 chars.",
            "example": "5f1c2a9e8b7d4c3a",
            "maxLength": 64
          },
          "orderNo": {
            "type": "string",
            "description": "LintasPay order number returned by create.",
            "example": "LPIN2026101410300512AB34CD56EF"
          },
          "mchOrderNo": {
            "type": "string",
            "description": "Your order number.",
            "example": "M202610140001"
          }
        },
        "example": {
          "nonceStr": "5f1c2a9e8b7d4c3a",
          "orderNo": "LPIN2026101410300512AB34CD56EF"
        }
      },
      "NotifyAck": {
        "type": "object",
        "description": "What your notify URL must return.",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "example": "SUCCESS"
          }
        },
        "example": {
          "status": "SUCCESS"
        }
      },
      "PayinCreateData": {
        "type": "object",
        "description": "Pay-in order created.",
        "required": [
          "merchantId",
          "merchantOrderNo",
          "orderNo",
          "payCode",
          "amount",
          "orderFee",
          "expireAt"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "description": "Your merchant id.",
            "example": 100001
          },
          "merchantOrderNo": {
            "type": "string",
            "description": "Your order number.",
            "example": "M202610140001"
          },
          "orderNo": {
            "type": "string",
            "description": "LintasPay order number.",
            "example": "LPIN2026101410300512AB34CD56EF"
          },
          "payCode": {
            "type": "string",
            "description": "What the payer uses to pay: VA number, QRIS string, or payment URL (DANA).",
            "example": "8808123456789012"
          },
          "amount": {
            "type": "string",
            "description": "Order amount.",
            "example": "10000"
          },
          "orderFee": {
            "type": "string",
            "description": "Fee charged for this order (2 decimals).",
            "example": "4500.00"
          },
          "expireAt": {
            "type": "string",
            "description": "Expiry time (GMT+7).",
            "example": "2026-10-14T11:30:05+07:00"
          }
        }
      },
      "PayinCreateRequest": {
        "type": "object",
        "description": "Create a pay-in (collection) order.",
        "required": [
          "productCode",
          "currency",
          "amount",
          "mchOrderNo",
          "remark",
          "userName"
        ],
        "properties": {
          "productCode": {
            "type": "integer",
            "format": "int64",
            "description": "Payment product. See *Appendix → Pay-in product codes* (e.g. 11 = BNI VA, 31 = QRIS, 41 = DANA).",
            "example": 11
          },
          "currency": {
            "type": "string",
            "description": "Currency. Only `IDR`.",
            "example": "IDR"
          },
          "amount": {
            "type": "string",
            "description": "Amount in IDR, integer string. Minimum 10000.",
            "example": "10000"
          },
          "mchOrderNo": {
            "type": "string",
            "description": "Your unique order number, max 64 chars. Unique per merchant; reusable only if the order was rejected.",
            "example": "M202610140001",
            "maxLength": 64
          },
          "remark": {
            "type": "string",
            "description": "Remark in English, max 255 chars.",
            "example": "Order 1001",
            "maxLength": 255
          },
          "userName": {
            "type": "string",
            "description": "Payer name: letters, digits, spaces, hyphens; max 255. **For DANA (41) this must be the payer's phone number.**",
            "example": "Budi Santoso",
            "maxLength": 255
          },
          "notifyUrl": {
            "type": "string",
            "description": "Your callback URL (max 255). Falls back to the default notify URL configured for your merchant account.",
            "example": "https://merchant.example.com/notify/payin",
            "maxLength": 255
          },
          "expireTime": {
            "type": "string",
            "description": "Seconds until the order expires. QRIS max 1800; VA default 3600; convenience store max 86400.",
            "example": "3600"
          },
          "userPhone": {
            "type": "string",
            "description": "Payer phone, digits only, max 20.",
            "example": "081234567890"
          },
          "userEmail": {
            "type": "string",
            "description": "Payer email.",
            "example": "budi@example.com"
          },
          "payReturnUrl": {
            "type": "string",
            "description": "Where to send the payer after paying (DANA), max 255.",
            "example": "https://merchant.example.com/paid"
          }
        },
        "example": {
          "productCode": 11,
          "currency": "IDR",
          "amount": "10000",
          "mchOrderNo": "M202610140001",
          "remark": "Order 1001",
          "userName": "Budi Santoso",
          "notifyUrl": "https://merchant.example.com/notify/payin",
          "expireTime": "3600",
          "userPhone": "081234567890",
          "userEmail": "budi@example.com"
        }
      },
      "PayinCreateResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PayinCreateData"
              }
            ]
          }
        }
      },
      "PayinInquiryData": {
        "type": "object",
        "description": "Pay-in order details.",
        "required": [
          "merchantId",
          "mchOrderNo",
          "orderNo",
          "amount",
          "fee",
          "completionTime",
          "orderStatus",
          "payCode",
          "productCode"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "mchOrderNo": {
            "type": "string",
            "example": "M202610140001"
          },
          "orderNo": {
            "type": "string",
            "example": "LPIN2026101410300512AB34CD56EF"
          },
          "amount": {
            "type": "string",
            "example": "10000"
          },
          "fee": {
            "type": "string",
            "description": "Fee charged (2 decimals).",
            "example": "4500.00"
          },
          "completionTime": {
            "type": "string",
            "description": "When the order reached its final state (GMT+7), empty while pending.",
            "example": "2026-10-14T10:35:12+07:00"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`1` paying, `2` success (final), `3` failed (final).",
            "example": 2
          },
          "payCode": {
            "type": "string",
            "example": "8808123456789012"
          },
          "productCode": {
            "type": "integer",
            "format": "int64",
            "example": 11
          }
        }
      },
      "PayinInquiryResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PayinInquiryData"
              }
            ]
          }
        }
      },
      "PayinNotify": {
        "type": "object",
        "description": "Pay-in notification. Sent once when the order reaches a final state. Reply HTTP 200 `{\"status\":\"SUCCESS\"}` within 5 s.",
        "required": [
          "amount",
          "completionTime",
          "fee",
          "mchOrderNo",
          "merchantId",
          "nonceStr",
          "orderNo",
          "orderStatus",
          "payCode",
          "productCode",
          "settleDate"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "example": "10000"
          },
          "completionTime": {
            "type": "string",
            "example": "2026-10-14T10:35:12+07:00"
          },
          "fee": {
            "type": "string",
            "example": "4500.00"
          },
          "mchOrderNo": {
            "type": "string",
            "example": "M202610140001"
          },
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "nonceStr": {
            "type": "string",
            "example": "a1b2c3d4e5f60718"
          },
          "orderNo": {
            "type": "string",
            "example": "LPIN2026101410300512AB34CD56EF"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`2` success, `3` failed.",
            "example": 2
          },
          "payCode": {
            "type": "string",
            "example": "8808123456789012"
          },
          "productCode": {
            "type": "integer",
            "format": "int64",
            "example": 11
          },
          "settleDate": {
            "type": "string",
            "example": "2026-10-15"
          },
          "additionalInfo": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AdditionalInfo"
              }
            ]
          }
        }
      },
      "PayoutCreateData": {
        "type": "object",
        "description": "Payout accepted.",
        "required": [
          "merchantId",
          "merchantOrderNo",
          "orderNo",
          "amount",
          "orderFee",
          "orderStatus"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "merchantOrderNo": {
            "type": "string",
            "example": "P202610140001"
          },
          "orderNo": {
            "type": "string",
            "example": "LPOUT2026101410300512AB34CD56EF"
          },
          "amount": {
            "type": "string",
            "example": "10000"
          },
          "orderFee": {
            "type": "string",
            "example": "6500.00"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`1` created, `2` routing, `3` processing, `4` success (final), `5` failed (final).\n**Only 4 and 5 are final** — see *Payout final-state rule*.",
            "example": 1
          }
        }
      },
      "PayoutCreateRequest": {
        "type": "object",
        "description": "Create a payout (disbursement).",
        "required": [
          "accountName",
          "accountNo",
          "accountType",
          "amount",
          "bankId",
          "currency",
          "mchOrderNo",
          "remark"
        ],
        "properties": {
          "accountName": {
            "type": "string",
            "description": "Beneficiary name, 1–64 chars: letters, digits, spaces and `.,'-_`.",
            "example": "Siti Rahayu",
            "maxLength": 64
          },
          "accountNo": {
            "type": "string",
            "description": "Beneficiary account number. E-wallets: phone number starting 08 / 8 / 628 / 6208.",
            "example": "1234567891011"
          },
          "accountType": {
            "type": "string",
            "description": "`1` bank account, `2` virtual account, `3` e-wallet, `4` bank online.",
            "example": "1"
          },
          "amount": {
            "type": "string",
            "description": "Amount in IDR, integer string.",
            "example": "10000"
          },
          "bankId": {
            "type": "string",
            "description": "Bank / wallet id from `/data/bank-list`.",
            "example": "1"
          },
          "currency": {
            "type": "string",
            "description": "Only `IDR`.",
            "example": "IDR"
          },
          "mchOrderNo": {
            "type": "string",
            "description": "Your unique order number, max 64. **Retry with the same number** — never create a second payout for one intent.",
            "example": "P202610140001",
            "maxLength": 64
          },
          "notifyUrl": {
            "type": "string",
            "description": "Your callback URL. Optional if a default notify URL is configured for your merchant account.",
            "example": "https://merchant.example.com/notify/payout",
            "maxLength": 255
          },
          "remark": {
            "type": "string",
            "description": "Letters, digits and spaces; max 40.",
            "example": "payout order",
            "maxLength": 40
          },
          "beneficiaryPhone": {
            "type": "string",
            "description": "Beneficiary phone.",
            "example": "6281234567890"
          },
          "beneficiaryEmail": {
            "type": "string",
            "description": "Beneficiary email.",
            "example": "siti@example.com"
          }
        },
        "example": {
          "accountName": "Siti Rahayu",
          "accountNo": "1234567891011",
          "accountType": "1",
          "amount": "10000",
          "bankId": "1",
          "currency": "IDR",
          "mchOrderNo": "P202610140001",
          "notifyUrl": "https://merchant.example.com/notify/payout",
          "remark": "payout order",
          "beneficiaryPhone": "6281234567890",
          "beneficiaryEmail": "siti@example.com"
        }
      },
      "PayoutCreateResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PayoutCreateData"
              }
            ]
          }
        }
      },
      "PayoutInquiryData": {
        "type": "object",
        "description": "Payout details.",
        "required": [
          "merchantId",
          "mchOrderNo",
          "orderNo",
          "amount",
          "fee",
          "orderStatus",
          "completionTime",
          "failedReason"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "mchOrderNo": {
            "type": "string",
            "example": "P202610140001"
          },
          "orderNo": {
            "type": "string",
            "example": "LPOUT2026101410300512AB34CD56EF"
          },
          "amount": {
            "type": "string",
            "example": "10000.00"
          },
          "fee": {
            "type": "string",
            "example": "6500.00"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`1` created, `2` routing, `3` processing, `4` success (final), `5` failed (final).",
            "example": 4
          },
          "completionTime": {
            "type": "string",
            "example": "2026-10-14T10:42:28+07:00"
          },
          "failedReason": {
            "type": "string",
            "description": "Reason when `orderStatus = 5`.",
            "example": ""
          }
        }
      },
      "PayoutInquiryResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PayoutInquiryData"
              }
            ]
          }
        }
      },
      "PayoutNotify": {
        "type": "object",
        "description": "Payout notification. Sent once when the payout reaches 4 (success) or 5 (failed). Reply HTTP 200 `{\"status\":\"SUCCESS\"}` within 5 s.",
        "required": [
          "merchantId",
          "mchOrderNo",
          "orderNo",
          "amount",
          "fee",
          "orderStatus",
          "completionTime",
          "failedReason"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "mchOrderNo": {
            "type": "string",
            "example": "P202610140001"
          },
          "orderNo": {
            "type": "string",
            "example": "LPOUT2026101410300512AB34CD56EF"
          },
          "amount": {
            "type": "string",
            "example": "10000.00"
          },
          "fee": {
            "type": "string",
            "example": "6500.00"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`4` success, `5` failed.",
            "example": 4
          },
          "completionTime": {
            "type": "string",
            "example": "2026-10-14T10:42:28+07:00"
          },
          "failedReason": {
            "type": "string",
            "example": ""
          }
        }
      },
      "VerifyAccountData": {
        "type": "object",
        "description": "Verification result.",
        "required": [
          "merchantId",
          "merchantOrderNo",
          "orderNo",
          "amount",
          "orderFee",
          "orderStatus",
          "accountNo",
          "accountName"
        ],
        "properties": {
          "merchantId": {
            "type": "integer",
            "format": "int64",
            "example": 100001
          },
          "merchantOrderNo": {
            "type": "string",
            "example": "V202610140001"
          },
          "orderNo": {
            "type": "string",
            "example": "LPVER2026101410300512AB34CD56EF"
          },
          "amount": {
            "type": "string",
            "description": "Always `\"0\"`.",
            "example": "0"
          },
          "orderFee": {
            "type": "string",
            "description": "Fee for this verification (billed monthly).",
            "example": "1000.00"
          },
          "orderStatus": {
            "type": "integer",
            "format": "int64",
            "description": "`2` VERIFIED (accountName is the real holder name), `3` UNVERIFIED (accountName empty).",
            "example": 2
          },
          "accountNo": {
            "type": "string",
            "example": "1234567891011"
          },
          "accountName": {
            "type": "string",
            "example": "SITI RAHAYU"
          }
        }
      },
      "VerifyAccountRequest": {
        "type": "object",
        "description": "Verify a bank / VA / e-wallet account and get the holder's name.",
        "required": [
          "mchOrderNo",
          "accountNo",
          "bankId"
        ],
        "properties": {
          "mchOrderNo": {
            "type": "string",
            "description": "Unique order number, max 64. **Never reusable**, whatever the outcome.",
            "example": "V202610140001",
            "maxLength": 64
          },
          "accountNo": {
            "type": "string",
            "description": "Bank: 1–30 digits. VA: 12–28 digits. E-wallet: phone number starting 08 / 8 / 628 / 6208.",
            "example": "1234567891011"
          },
          "bankId": {
            "type": "string",
            "description": "Bank id from `/data/bank-list`.",
            "example": "1"
          },
          "accountType": {
            "type": "string",
            "description": "`1` bank (default), `2` VA, `3` e-wallet.",
            "example": "1"
          }
        },
        "example": {
          "mchOrderNo": "V202610140001",
          "accountNo": "1234567891011",
          "bankId": "1",
          "accountType": "1"
        }
      },
      "VerifyAccountResponse": {
        "type": "object",
        "description": "Response envelope. `code = 0` means success; otherwise see *Error codes*.",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "format": "int64",
            "description": "`0` = success.",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "success"
          },
          "data": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/VerifyAccountData"
              }
            ]
          }
        }
      }
    },
    "securitySchemes": {
      "signature": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization",
        "description": "`LINTASPAY-SHA256withRSA app_id=…,nonce=…,timestamp=…,sign=…` — computed per request."
      }
    }
  },
  "tags": [
    {
      "name": "Pay-in",
      "description": "Collect money from payers (virtual account, QRIS, e-wallet, convenience store)."
    },
    {
      "name": "Payout",
      "description": "Send money to bank accounts and e-wallets."
    },
    {
      "name": "General",
      "description": "Balance and reference data."
    }
  ]
}