openapi: 3.1.0
info:
title: Kredivo Checkout API
version: v2
summary: Merchant-facing installment ("Buy Now, Pay Later") checkout API for Kredivo.
description: |
The Kredivo Checkout API lets an ecommerce store, marketplace, POS or EDC terminal offer
Kredivo installment payment at checkout.
Surfaces documented by Kredivo:
* **2-click Checkout** — merchant posts the cart, receives a `redirect_url`, and sends the
shopper to Kredivo to authenticate with phone + PIN + OTP.
* **0-click Checkout** — once a shopper is tokenized (`tokenize_user: true` /
`client_user_key`), later purchases are placed with the stored `user_token`.
* **QR Checkout** — dynamic (per-transaction) or static (per-store) QR for physical stores.
* **EDC Checkout** — checkout initiated from a physical EDC terminal, with reversal support.
* **Additional APIs** — transaction status, full/partial cancellation, and an installment
and interest calculator.
Every operation authenticates with the per-merchant `server_key` carried **in the JSON
request body**, not in a header. Transaction outcomes arrive asynchronously as an HTTP POST
to the merchant's `push_uri`; the merchant confirms by calling `GET /kredivo/v2/update`
with the `transaction_id` and `signature_key` from the notification.
This description was generated by the API Evangelist enrichment pipeline from Kredivo's
published developer documentation at https://doc.kredivo.com/. It is a faithful
transcription of the documented request/response surface — it is not published by Kredivo.
contact:
name: Kredivo Merchant Operations
email: merchops@finaccel.co
url: https://doc.kredivo.com/
termsOfService: https://kredivo.com/p/in/tos.html
x-generated: '2026-07-19'
x-method: generated
x-source: https://doc.kredivo.com/
externalDocs:
description: Kredivo developer documentation
url: https://doc.kredivo.com/
servers:
- url: https://sandbox.kredivo.com
description: Sandbox. Published server key and test account are documented under Environment Setup.
- url: https://{productionHost}
description: |
Production. Kredivo does not publish the production endpoint; merchants must request it from
merchops@kredivo.com before going live.
variables:
productionHost:
default: production-endpoint-provided-by-kredivo
description: Production host supplied by Kredivo merchant operations.
tags:
- name: Checkout
description: Initiating a Kredivo installment checkout (2-click, 0-click, QR, EDC).
- name: Confirmation
description: Confirming a transaction after a push notification.
- name: Tokenization
description: Managing tokenized (0-click) shoppers and their credit limits.
- name: Transactions
description: Status, cancellation and reversal of transactions.
- name: Calculator
description: Installment, interest and service-fee breakdown.
paths:
/kredivo/v2/checkout_url:
post:
operationId: createCheckoutUrl
tags:
- Checkout
summary: Initiate a 2-click or 0-click checkout
description: |
Creates a Kredivo checkout for the supplied cart and returns a `redirect_url` the merchant
sends the shopper to. Set `tokenize_user: true` with a `client_user_key` to tokenize the
shopper for later 0-click purchases; supply an existing `user_token` to attempt a 0-click
purchase. If the `user_token` is invalid the response still carries a `redirect_url` that
the merchant should follow to fall back to regular 2-click checkout.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CheckoutRequest'
examples:
twoClick:
summary: 2-click checkout
value:
server_key: MEJ4FLRc74UU64cxCF8Z3HYSpPctD7
payment_type: 30_days
client_user_key: rangge@finaccel.co
transaction_details:
amount: 6505000
order_id: KD14721
items:
- id: BB12345678
name: iPhone 5S
price: 6000000
type: Smartphone
url: http://merchant.com/cellphones/iphone5s_64g
quantity: 1
- id: taxfee
name: Tax Fee
price: 1000
quantity: 1
customer_details:
first_name: Rangge
last_name: Septyo
email: rangge@finaccel.co
phone: '081513114262'
push_uri: https://www.merchantcallback.com/notify
back_to_store_uri: https://merchant.com/store
zeroClick:
summary: 0-click checkout with a stored user token
value:
server_key: MEJ4FLRc74UU64cxCF8Z3HYSpPctD7
payment_type: 30_days
tokenize_user: false
client_user_key: rangge@finaccel.co
user_token: XXXX-XXXX
transaction_details:
amount: 6505000
order_id: KD14721
items:
- id: BB12345678
name: iPhone 5S
price: 6000000
type: Smartphone
url: http://merchant.com/cellphones/iphone5s_64g
quantity: 1
customer_details:
first_name: Rangge
email: rangge@finaccel.co
phone: '081513114262'
push_uri: https://www.merchantcallback.com/notify
back_to_store_uri: https://merchant.com/store
responses:
'200':
description: |
Checkout created, or an application-level error. Kredivo signals success and failure
through the `status` field of the body rather than the HTTP status code.
content:
application/json:
schema:
$ref: '#/components/schemas/CheckoutResponse'
examples:
ok:
value:
status: OK
message: ''
redirect_url: https://sandbox.kredivo.com/kredivo/v2/signin?tk=XXX
error:
value:
status: ERROR
error:
code: null
message: Invalid merchant
kind: deprecated
/kredivo/v2/update:
get:
operationId: confirmTransaction
tags:
- Confirmation
summary: Confirm a transaction from a push notification
description: |
Called by the merchant in response to a push notification delivered to `push_uri`, to
validate that the notification really originated from Kredivo and to read the authoritative
transaction state. Both the `transaction_id` and the `signature_key` come from the
notification payload.
parameters:
- name: transaction_id
in: query
required: true
description: Transaction ID given by Kredivo.
schema:
type: string
example: bb0380d7-2688-4e73-a668-997f3fc5cbec
- name: signature_key
in: query
required: true
description: Signature key used to validate that the notification originated from Kredivo.
schema:
type: string
responses:
'200':
description: Authoritative transaction state.
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionStatus'
examples:
settled:
value:
status: OK
legal_name: TANDRA
fraud_status: accept
order_id: KD125262
transaction_time: 1501846094
amount: '1500100.00'
payment_type: 30_days
transaction_status: settlement
message: Confirmed order status. Valid!
transaction_id: fadee4e5-99a2-48d6-952d-007f3fa508e8
/kredivo/v2/deactive_user_token:
post:
operationId: deactivateUserToken
tags:
- Tokenization
summary: Deactivate a tokenized user
description: |
Invalidates a `user_token`, ending 0-click eligibility for that shopper. A shopper can also
deactivate a tokenized account from the Kredivo app, in which case Kredivo sends a push
notification to a merchant endpoint registered with Kredivo so the merchant can invalidate
the token on its side.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UserTokenRequest'
example:
server_key: ABCD-XXXX-1234
user_token: XXXX-YYYY
responses:
'200':
description: Token deactivation result.
content:
application/json:
schema:
$ref: '#/components/schemas/UserTokenResponse'
examples:
ok:
value:
Status: OK
user_token: XXXX-YYYY
is_active: false
remarks: deactive user successful
invalidToken:
value:
status: ERROR
error:
kind: deprecated
message: Invalid user_token
code: null
/kredivo/v2/get_user_credit_details:
post:
operationId: getUserCreditDetails
tags:
- Tokenization
summary: Get a tokenized user's remaining credit limit
description: |
Returns the remaining limit, account status and account type of a tokenized shopper, broken
down per installment tenure. Requires a valid `user_token`.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UserTokenRequest'
example:
server_key: ABCD-XXXX-1234
user_token: XXXX-YYYY
responses:
'200':
description: Shopper identity and per-tenure remaining credit limits.
content:
application/json:
schema:
$ref: '#/components/schemas/UserCreditDetailsResponse'
example:
Status: OK
user_details:
legal_name: Rangge Septyo
mobile_number: 62812xxxx0581
user_credit_details:
account_status: 1
account_type: 2
credit_limit_details:
- payment_type: 30_days
remaining_user_limit: '1500000'
- payment_type: 3_months
remaining_user_limit: '4500000'
/offline/v1/init_checkout:
post:
operationId: initOfflineCheckout
tags:
- Checkout
summary: Initiate a QR or EDC checkout
description: |
Initiates an offline (physical store) checkout. With `source: "QR"` Kredivo returns a
dynamic QR code — as an image URL or as a string, selected by `qr_type` — that the shopper
scans in the Kredivo app. With `source: "EDC Mobile"` the checkout is initiated from an EDC
terminal against the shopper's `mobile_number`.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OfflineCheckoutRequest'
examples:
qr:
summary: Dynamic QR checkout
value:
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7x
amount: 70000
source: QR
qr_type: IMAGE
order_id: 548tIt83saeN
sub_merchant_id: KFCSenayanCity
push_uri: https://www.merchantcallback.com/notify
items:
- id: '001'
name: Product Name
price: 50000
quantity: 1
edc:
summary: EDC terminal checkout
value:
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7
sub_merchant_id: KFCSenayanCity
source: EDC Mobile
push_uri: https://merchant.com/pushnotif
order_id: '12345678912'
amount: 15000
mobile_number: +62-85210549044
terminal_id: WDCMERCHANT0001
responses:
'200':
description: Offline checkout initiated.
content:
application/json:
schema:
$ref: '#/components/schemas/OfflineCheckoutResponse'
example:
status: OK
message: ''
transaction_id: bcda87e2-e87b-4b7f-add4-206bb4c1d72c
order_id: '12345678912'
/offline/v1/reversal_transaction:
post:
operationId: reverseOfflineTransaction
tags:
- Transactions
summary: Reverse an offline (EDC) transaction
description: Reverses an offline transaction that has not completed, identified by `order_id`.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReversalRequest'
example:
order_id: '12345678912'
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7
responses:
'200':
description: Reversal result.
content:
application/json:
schema:
$ref: '#/components/schemas/SimpleStatusResponse'
examples:
ok:
value:
message: ''
status: OK
error:
value:
message: ''
status: ERROR
/kredivo/transaction/status:
post:
operationId: checkTransactionStatus
tags:
- Transactions
summary: Check a transaction's status by order ID
description: |
Polls the authoritative state of a transaction by merchant `order_id`. Documented as the
fallback when a push notification to `push_uri` fails to arrive.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionStatusRequest'
example:
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7
order_id: KB-0c40f395
responses:
'200':
description: Transaction state.
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionStatus'
example:
fraud_status: accept
transaction_time: 1637743030
order_id: KB-0c40f395
external_userid: S9JRJ2bGiS4d
status: OK
legal_name: Rangge
message: Transaction is settlement
amount: '75000.00'
discount_amount: 0
transaction_id: 7401e873-ea77-455e-9f31-4ca2268304dc
payment_type: 30_days
transaction_status: settlement
/kredivo/v2/cancel_transaction:
post:
operationId: cancelTransaction
tags:
- Transactions
summary: Cancel a transaction in full or in part
description: |
Cancels a transaction. Omitting `cancellation_amount`, or passing an amount equal to the
transaction amount, is a full cancellation; a smaller amount is a partial cancellation. An
amount larger than the remaining cancellable amount, or zero or negative, is rejected.
`cancellation_id` is the merchant-supplied idempotency key for this operation: one order ID
may carry several cancellation IDs. When no `cancellation_id` is sent, Kredivo uses the pair
(`order_id`, `cancellation_amount`) as the uniqueness key, and rejects a repeat of that same
pair if less than one hour has elapsed since the previous request.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CancelTransactionRequest'
example:
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7
transaction_id: 2be7d9ea-ccba-4743-8b92-0f1fc3ec358d
cancellation_amount: 5000
cancellation_reason: Out of stock
cancelled_by: Althea
cancellation_date: '1512032053'
order_id: KB-0123456
cancellation_id: '1234567'
responses:
'200':
description: Cancellation result.
content:
application/json:
schema:
$ref: '#/components/schemas/SimpleStatusResponse'
examples:
ok:
value:
status: OK
message: Succes cancelling transaction by amount
amountTooLarge:
value:
status: ERROR
error:
code: 2415
message: Cancellation amount bigger than remaining transaction amount that can be cancelled
kind: deprecated
alreadyCancelled:
value:
status: ERROR
error:
code: 1009
message: Transaksi sudah dibatalkan.
kind: deprecated
/kredivo/v2/payments:
post:
operationId: calculatePayments
tags:
- Calculator
summary: Calculate installment options for a cart
description: |
Returns the available payment types for a cart with their full cost breakdown — tenure,
interest rate, service fee, monthly installment and total amount — so the merchant can
render Kredivo's installment options before checkout.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentsRequest'
example:
server_key: 8tLHIx8V0N6KtnSpS9Nbd6zROFFJH7
user_token: XXX-XXX
amount: 2400000
items:
- id: BB12345678
name: iPhone 5S
price: 2400000
url: http://merchant.com/cellphones/iphone5s_64g
type: Smartphone
quantity: 1
responses:
'200':
description: Available installment options.
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentsResponse'
example:
payments:
- id: 30_days
name: Bayar dalam 30 hari
tenure: 1
amount: 2424000
raw_amount: 2424000.0
raw_monthly_installment: 2423999.801457357
service_fee: 24000
interest_rate: '0'
rate: 0.0
message: Available payment types are listed.
status: OK
components:
securitySchemes:
serverKey:
type: apiKey
in: header
name: server_key
description: |
NOTE ON MODELLING: Kredivo does not use a header or an HTTP auth scheme. The per-merchant
`server_key` is sent as a **field in the JSON request body** of every operation, which
OpenAPI cannot express as a security scheme. This entry documents the credential so tooling
can see it; the body field `server_key` on each request schema is the real carrier. See
authentication/kredivo-authentication.yml.
x-actual-location: request-body
x-actual-field: server_key
schemas:
ProductItem:
type: object
description: |
A cart line. Beyond real SKUs, Kredivo reserves the ids `shippingfee`, `adminfee`, `taxfee`,
`discount`, `additionalfee`, `insurancefee` and `mixpayment` for non-product lines.
required:
- id
- name
- price
- quantity
properties:
id:
type: string
description: SKU, or one of the reserved fee/discount ids.
name:
type: string
price:
type: number
format: double
type:
type: string
description: Product category.
url:
type: string
description: Product URL on the merchant site.
image_url:
type: string
quantity:
type: integer
parent_type:
type: string
enum:
- SELLER
- ITEM
parent_id:
type: string
description: Seller or item id this line belongs to.
Address:
type: object
required:
- first_name
- address
- city
- postal_code
- phone
- country_code
properties:
first_name:
type: string
last_name:
type: string
address:
type: string
city:
type: string
postal_code:
type: string
phone:
type: string
country_code:
type: string
example: IDN
Customer:
type: object
required:
- first_name
- email
- phone
properties:
first_name:
type: string
last_name:
type: string
email:
type: string
format: email
phone:
type: string
Seller:
type: object
description: A marketplace seller. Required when the merchant is a marketplace.
required:
- id
- name
- email
- url
- address
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
url:
type: string
legal_id:
type: string
address:
$ref: '#/components/schemas/Address'
Metadata:
type: object
description: Device and network signals used by Kredivo's fraud detection system.
properties:
ip_address:
type: string
user_agent:
type: string
device_id:
type: string
imsi:
type: string
TransactionDetails:
type: object
required:
- order_id
- amount
- items
properties:
order_id:
type: string
description: Order id given by the merchant.
amount:
type: number
format: double
items:
type: array
items:
$ref: '#/components/schemas/ProductItem'
PaymentType:
type: string
description: Installment tenure chosen by the shopper.
enum:
- 30_days
- 3_months
- 6_months
- 9_months
- 12_months
- 18_months
- 24_months
CheckoutRequest:
type: object
required:
- server_key
- payment_type
- transaction_details
- customer_details
- push_uri
- back_to_store_uri
properties:
server_key:
type: string
description: Per-merchant key generated by Kredivo.
payment_type:
$ref: '#/components/schemas/PaymentType'
tokenize_user:
type: boolean
description: Set true to tokenize the shopper for later 0-click checkout.
client_user_key:
type: string
description: Merchant-side identifier for the shopper. Required when tokenize_user is true.
user_token:
type: string
description: Existing token for a 0-click checkout.
transaction_details:
$ref: '#/components/schemas/TransactionDetails'
customer_details:
$ref: '#/components/schemas/Customer'
sellers:
type: array
description: Required for marketplaces.
items:
$ref: '#/components/schemas/Seller'
billing_address:
$ref: '#/components/schemas/Address'
shipping_address:
$ref: '#/components/schemas/Address'
metadata:
$ref: '#/components/schemas/Metadata'
push_uri:
type: string
description: Merchant endpoint that receives the asynchronous transaction push notification.
user_cancel_uri:
type: string
back_to_store_uri:
type: string
expiration_time:
type: string
description: Epoch seconds. Defaults to 24 hours.
ErrorDetail:
type: object
description: Kredivo's error envelope. Note the API returns HTTP 200 with status ERROR.
properties:
kind:
type: string
description: Type of error.
code:
type:
- integer
- 'null'
description: Numeric error code. May be null.
message:
type: string
CheckoutResponse:
type: object
properties:
status:
type: string
enum:
- OK
- ERROR
message:
type: string
redirect_url:
type: string
description: |
URL to send the shopper to. Omitted when a 0-click checkout completed without shopper
interaction; present on an invalid user_token so the merchant can fall back to 2-click.
error:
$ref: '#/components/schemas/ErrorDetail'
TransactionStatus:
type: object
properties:
status:
type: string
enum:
- OK
- ERROR
message:
type: string
legal_name:
type: string
external_userid:
type: string
order_id:
type: string
transaction_id:
type: string
transaction_time:
type: integer
description: UNIX epoch timestamp.
amount:
type: string
discount_amount:
type: number
payment_type:
$ref: '#/components/schemas/PaymentType'
sub_merchant_id:
type: string
user_token:
type: string
transaction_status:
type: string
description: |
settlement — transaction successful; pending — shopper has not completed the
transaction; deny — denied by Kredivo; cancel — cancelled by the merchant;
expire — shopper did not complete, transaction expired.
enum:
- settlement
- pending
- deny
- cancel
- expire
fraud_status:
type: string
description: |
accept — approved by the Fraud Detection System; deny — denied by FDS, the transaction
automatically fails.
enum:
- accept
- deny
error:
$ref: '#/components/schemas/ErrorDetail'
UserTokenRequest:
type: object
required:
- server_key
- user_token
properties:
server_key:
type: string
user_token:
type: string
UserTokenResponse:
type: object
properties:
Status:
type: string
status:
type: string
user_token:
type: string
is_active:
type: boolean
description: When false, Kredivo cannot provide user credit details for this token.
remarks:
type: string
error:
$ref: '#/components/schemas/ErrorDetail'
UserCreditDetailsResponse:
type: object
properties:
Status:
type: string
user_details:
type: object
properties:
legal_name:
type: string
mobile_number:
type: string
user_credit_details:
type: object
properties:
account_status:
type: integer
account_type:
type: integer
credit_limit_details:
type: array
items:
type: object
properties:
payment_type:
$ref: '#/components/schemas/PaymentType'
remaining_user_limit:
type: string
error:
$ref: '#/components/schemas/ErrorDetail'
OfflineCheckoutRequest:
type: object
required:
- server_key
- amount
- source
- order_id
- push_uri
properties:
server_key:
type: string
amount:
type: number
format: double
source:
type: string
description: QR for a dynamic QR checkout, "EDC Mobile" for an EDC terminal checkout.
enum:
- QR
- EDC Mobile
qr_type:
type: string
description: Requested QR representation. IMAGE returns a QR image URL.
enum:
- IMAGE
- STRING
order_id:
type: string
sub_merchant_id:
type: string
description: Identifier of the sub-merchant / outlet.
push_uri:
type: string
mobile_number:
type: string
description: Shopper phone number. Used by EDC checkout.
terminal_id:
type: string
description: Optional outlet EDC device identifier.
sellers:
$ref: '#/components/schemas/Seller'
items:
type: array
items:
$ref: '#/components/schemas/ProductItem'
OfflineCheckoutResponse:
type: object
properties:
status:
type: string
enum:
- OK
- ERROR
message:
type: string
transaction_id:
type: string
order_id:
type: string
qr_url:
type: string
description: QR code image URL, returned when qr_type is IMAGE.
qr_string:
type: string
description: QR code string representation, returned when qr_type is STRING.
error:
$ref: '#/components/schemas/ErrorDetail'
ReversalRequest:
type: object
required:
- server_key
- order_id
properties:
server_key:
type: string
order_id:
type: string
TransactionStatusRequest:
type: object
required:
- server_key
- order_id
properties:
server_key:
type: string
order_id:
type: string
CancelTransactionRequest:
type: object
required:
- server_key
- order_id
- transaction_id
properties:
server_key:
type: string
order_id:
type: string
transaction_id:
type: string
cancellation_id:
type: string
maxLength: 60
description: |
Merchant-supplied idempotency key for the cancellation. One order id may have multiple
cancellation ids. When omitted, (order_id, cancellation_amount) is the uniqueness key and
a repeat within one hour is rejected.
cancellation_amount:
type: integer
description: Omit or match the transaction amount for a full cancellation; smaller for partial.
cancellation_reason:
type: string
cancelled_by:
type: string
cancellation_date:
type: string
description: Epoch seconds.
SimpleStatusResponse:
type: object
properties:
status:
type: string
enum:
- OK
- ERROR
message:
type: string
error:
$ref: '#/components/schemas/ErrorDetail'
PaymentsRequest:
type: object
required:
- server_key
- amount
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kredivo/refs/heads/main/openapi/kredivo-checkout-openapi.yml