Pientegra API
Backend-to-Backend API

Create Withdrawal Request

POST /external/withdrawals ile kullanıcı payout talebi oluştur.

Partner backend → operator review → signed webhook
POST /api/v1/external/withdrawals

Bu endpoint Backend-to-Backend API kategorisindedir. Partner site, kullanıcı withdrawal istediğinde bu endpoint'i server-side çağırır. Pientegra withdrawal kaydını PENDING_REVIEW durumunda oluşturur. Operasyon ekibi panelde onay, gönderim veya red aksiyonu alır; sonuç webhook ile site backend'ine iletilir.

Withdrawal flow'da kullanıcı redirect edilmez. Bu endpoint sadece kayıt oluşturur; money movement sonucu withdrawal.sent, withdrawal.rejected veya withdrawal.returned webhook'u ile finalize edilir.

Withdrawal tarafındaki kullanıcı deneyimi için Withdrawal Experience sayfasına bakın.

Headers

HeaderRequiredAçıklama
AuthorizationEvetBearer <raw-api-key> formatında API key.
Idempotency-KeyEvetBu create operation için benzersiz UUID v4/v7.
Content-TypeEvetapplication/json

Request body

{
  "externalUserId": "user-12345",
  "externalUserLabel": "Ahmet Y.",
  "amount": "250000",
  "currency": "TRY",
  "targetIban": "TR320010009999901234567890",
  "targetHolderName": "Ahmet Yılmaz"
}
FieldTypeRequiredAçıklama
externalUserIdstringEvetPartner site tarafındaki kullanıcı ID'si.
externalUserLabelstringHayırOperatör panelinde görünen kısa kullanıcı etiketi.
amountstring veya numberEvetWithdrawal tutarı minor unit olarak.
currencystringHayırVarsayılan TRY. Bugün aktif currency TRY'dir.
targetIbanstringEvetBoşluksuz IBAN. Pattern: ^[A-Z0-9]{15,34}$.
targetHolderNamestringEvetAlıcı hesap sahibi adı.
webhookUrlstringHayırContract'ta kabul edilir; current delivery target için site-level webhook config esas alınmalıdır.

Response

{
  "withdrawalId": "01927b3c-9c1f-7a3a-9c4f-8a3e1f8b1c00",
  "referenceNo": "W-2026-0000123"
}
FieldAçıklama
withdrawalIdWithdrawal kaydının stable UUID'si. Webhook payload'ında withdrawal.id olarak gelir.
referenceNoOperasyon ekibinin panelde arayabileceği human-readable referans.

Balance handling

Withdrawal entegrasyonunda iki model yaygındır:

ModelSite tarafı aksiyon
Pre-reserveKullanıcı withdrawal istediğinde bakiyeyi reserve et; withdrawal.sent ile finalize et; withdrawal.rejected veya withdrawal.returned ile release/refund yap.
Final debitRequest sırasında bakiye değiştirme; sadece withdrawal.sent geldikten sonra debit et.

Hangi modeli kullanırsanız kullanın, final state için webhook'u source of truth kabul edin. Synchronous response para gönderildi anlamına gelmez.

Status lifecycle

PENDING_REVIEW
  ├─ APPROVED
  │    └─ SENT
  │         └─ RETURNED
  └─ REJECTED
StatusAnlam
PENDING_REVIEWWithdrawal kaydı alındı, operator review bekliyor.
APPROVEDOperator onayladı; gönderim hazırlanıyor.
SENTPara bankadan çıktı. Site için successful final state.
REJECTEDOperator request'i reddetti.
RETURNEDPara gönderildi ancak banka tarafından iade edildi.

Pientegra operasyon panelinde split payout gibi internal state'ler bulunabilir; External API contract'ında final integration kararları yukarıdaki event'ler üzerinden verilmelidir.

TypeScript example

Create withdrawal
import { randomUUID } from 'node:crypto';

type CreateWithdrawalInput = {
  externalUserId: string;
  externalUserLabel?: string;
  amount: string;
  targetIban: string;
  targetHolderName: string;
};

export async function createWithdrawal(input: CreateWithdrawalInput) {
  const response = await fetch(`${process.env.PIENTEGRA_API_BASE}/external/withdrawals`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.PIENTEGRA_API_KEY!}`,
      'Idempotency-Key': randomUUID(),
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ ...input, currency: 'TRY' }),
  });

  const body = await response.json();
  if (!response.ok) {
    throw new Error(`Pientegra ${body.error}: ${body.message}`);
  }

  return body as {
    withdrawalId: string;
    referenceNo: string;
  };
}

Error cases

HTTPerrorTipik sebep
400validation_failedIBAN formatı geçersiz, required field eksik veya partner provisioning tamamlanmamış.
401unauthorizedAPI key geçersiz, inactive veya expired.
409idempotency_key_reuse_with_different_bodyAynı key farklı body ile tekrar kullanıldı.
409duplicate_idempotency_keyAynı key ile request halen in-flight.
429rate_limitedRate limit aşıldı.

Tam liste için Error Reference.

On this page