1. Transaction Documents
Kobble
  • Introduction
  • API Fundamentals
    • Idempotency
    • Rate Limits
    • Healthcheck
      GET
  • Authorization
    • Authorization
    • Get access token
      POST
  • Beneficiaries
    • List all beneficiaries
      GET
    • Get beneficiary by ID
      GET
    • Create beneficiary
      POST
    • Create Payid beneficiary
      POST
    • Update beneficiary
      PATCH
  • Cards
    • Cards API
    • Card Creation Flow — Developer Guide & Onboarding
    • Get all cards
      GET
    • Create a new card
      POST
    • Get card by ID
      GET
    • Update card status
      PATCH
    • Replace or renew card
      POST
    • Generate card secret
      POST
    • Generate MeaWallet widget session token
      POST
  • Card Programs
    • Card Programs API
    • Get all programs
      GET
    • Create a new program
      POST
    • Get program by ID
      GET
  • Clients
    • Clients API
    • Get all clients
    • Get client by ID
    • Create a new client
    • Update client status
  • Endusers
    • Endusers API
    • Usage of Metadata on Endusers
    • Get all endusers
    • Create a new enduser
    • Get enduser by ID
    • Update enduser
    • Create a stakeholder
    • List stakeholders
    • Update stakeholder
  • Transactions
    • Transactions API
    • Get all transactions
    • Create a transaction
    • Get transaction by ID
    • Create manual credit transaction
    • Create manual debit transaction
  • Wallets
    • Wallets API
    • Get all wallets
    • Create a new wallet
    • Get wallet by ID
    • Update wallet
  • Relays
    • Relays API
    • Create subscription
  • Webhooks
    • Webhooks API
    • Webhook Signature Verification
    • Create a webhook
    • Report completed
    • Get all webhooks
    • Delete a webhook
  • Wallet Statements
    • Request a wallet statement
    • List wallet statements
    • Get a wallet statement
    • Get a wallet statement download URL
  • Card Art
    • Get a card art upload URL
    • Register a card art
    • List card arts
    • Get a card art
    • Update a card art
    • Activate a card art
    • Archive a card art
  • Verifications
    • List verifications for a subject
    • Create a verification
    • Get a Sum Sub SDK session token
    • Get verification by ID
    • Record a client-asserted outcome
  • Transaction Documents
    • Request a presigned upload for a supporting document
      POST
    • List the supporting documents on a transaction
      GET
  • Schemas
    • Schemas
    • CardWidgetSessionTokenResponse
    • 202 Accepted
    • Webhook
    • 201 Created
    • Relay
    • Create Beneficiary with bank details
    • Client
    • Beneficiary
    • Card
    • CardCreateInputDto
    • CardStatusUpdateDto
    • CardRenewReplaceInputDto
    • Program
    • MetadataKobbleDebit1
    • ProgramCreateInputDto
    • Person
    • Company
    • Enduser
    • Enduser Create Person Input
    • Enduser Create Company Input
    • Metadata
    • Enduser Create Input DTO
    • Transaction
    • TransactionCreateManualCreditInputDto
    • TransactionDocumentType
    • TransactionDocumentStatus
    • TransactionDocumentCreateInput
    • WalletUpdateInputDto
    • TransactionDocumentUpload
    • WalletStatement
    • TransactionDocument
    • TransactionCreateInputDto
    • Wallet
    • ReportCompletedEntity
    • WalletCreateInputDto
    • ReportCompletedNotification
    • CardArt
    • CardArtDetail
    • WebhookNotification
    • CardArtUploadUrlInput
    • CardArtUploadUrlResponse
    • CardArtCreateInput
    • CardArtPatchInput
    • Error
    • RelayCreateResponse
    • ScreeningSummary
    • Verification
    • VerificationPartyLink
    • VerificationSessionToken
    • Address
    • Stakeholder
    • StakeholderCreateInput
    • StakeholderUpdateInput
  1. Transaction Documents

Request a presigned upload for a supporting document

POST
/customers/v1/transactions/{id}/documents
Attach a supporting document (invoice, contract, agreement, remittance advice or other evidence) to a transaction you own and receive a presigned upload for it. Accepted on any transaction of yours, RECEIVE and SEND alike; a document never gates or delays a payment.
Upload flow. (1) Compute the file's SHA-256 and base64-encode it (the S3 x-amz-checksum-sha256 wire format). (2) POST filename, content_type, file_size (exact byte length), checksum and document_type; the response is 201 with status PENDING, upload_url, upload_expires_at and required_headers. (3) HTTP PUT the raw file bytes to upload_url before upload_expires_at, carrying exactly the three required_headers (Content-Type, Content-Length, x-amz-checksum-sha256) with the values returned and no other signed headers; storage rejects a PUT whose headers differ or whose body does not hash to the declared checksum. (4) GET /customers/v1/transactions/{id}/documents: the next list call that finds the object with the declared checksum flips the document to AVAILABLE.
upload_url is valid until upload_expires_at (15 minutes by default; treat the timestamp as the upper bound and request a new upload if it lapses). Presigned URLs are not single-use: within the window the URL can be PUT again, but only with the identical bytes to the same location, because the checksum, length and content type are bound into the signature. Treat it as a secret and do not share it.
Not idempotent. This endpoint does not honour Idempotency-Key; every POST reserves a new document, so a retry creates a second record. At most 20 documents per transaction: the 21st POST is rejected with 400 (Transaction already has 20 documents; the cap is 20 per transaction), so do not retry a POST whose 201 you already received. filename is stored sanitised to [A-Za-z0-9._-] and capped at 128 characters. Files are retained for the configured period (5 years by default, see retention_until) and are never served back through the API.

Request

Path Params

Header Params

Body Params application/json

Example
{
    "filename": "invoice-4471.pdf",
    "content_type": "application/pdf",
    "file_size": 184322,
    "checksum": "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=",
    "document_type": "INVOICE"
}

Request Code Samples

Shell
JavaScript
Java
Swift
Go
PHP
Python
HTTP
C
C#
Objective-C
Ruby
OCaml
Dart
R
Request Request Example
Shell
JavaScript
Java
Swift
curl --location '/customers/v1/transactions//documents' \
--header 'x-client-id;' \
--header 'Content-Type: application/json' \
--data '{
    "filename": "invoice-4471.pdf",
    "content_type": "application/pdf",
    "file_size": 184322,
    "checksum": "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=",
    "document_type": "INVOICE"
}'

Responses

🟢201Created
application/json
Upload reserved. PUT the file to upload_url with exactly required_headers before upload_expires_at; the document stays PENDING until a list call verifies the stored object.
Bodyapplication/json

Example
{
    "id": "5c1f0a3e-8d2b-4f6a-9e07-2b3c4d5e6f70",
    "status": "PENDING",
    "upload_url": "https://example-bucket.s3.ap-southeast-2.amazonaws.com/.../invoice-4471.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost%3Bx-amz-checksum-sha256&X-Amz-Signature=...",
    "upload_expires_at": "2026-09-18T01:15:00.000Z",
    "required_headers": {
        "Content-Type": "application/pdf",
        "Content-Length": "184322",
        "x-amz-checksum-sha256": "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg="
    }
}
🟠400Bad Request
🟠401Unauthorized
🟠403Forbidden
🟠404Record Not Found
Modified at 2026-09-24 11:55:30
Previous
Record a client-asserted outcome
Next
List the supporting documents on a transaction
Built with