Payments
Initialize a Payment
Create a payment session and receive a hosted checkout URL to redirect your customer.
Initialize a Payment
POST /v1/transactions/initialize
Creates a payment session and returns a hosted checkout URL. Redirect your customer to checkoutUrl to complete the payment.
Use sk_test_… for sandbox, sk_live_… for production. The mode is inferred
from the key — no separate config needed.
Request
raw HTTP
npm install @e-pay/nodepip install epaycomposer require epay-et/php-sdkgo get github.com/epay-et/go-sdkcurl https://api.e-pay.et/v1/transactions/initialize \
-X POST \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-H "x-idempotency-key: order_123" \
-d '{
"amount": "250.00",
"currencyCode": "ETB",
"customerPhone": "+251911234567",
"merchantReference": "order_123",
"returnUrl": "https://yourstore.com/order/123/complete"
}'import { Epay } from '@e-pay/node';
const epay = new Epay({ apiKey: process.env.EPAY_SECRET_KEY });
const session = await epay.payments.initialize(
{
amount: '250.00',
currencyCode: 'ETB',
customerPhone: '+251911234567',
merchantReference: 'order_123',
returnUrl: 'https://yourstore.com/order/123/complete',
},
{ idempotencyKey: 'order_123' },
);
// session.reference, session.checkoutUrl, session.expiresAt
redirect(session.checkoutUrl);
const res = await fetch('https://api.e-pay.et/v1/transactions/initialize', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EPAY_SECRET_KEY}`,
'Content-Type': 'application/json',
'x-idempotency-key': 'order_123',
},
body: JSON.stringify({
amount: '250.00',
currencyCode: 'ETB',
customerPhone: '+251911234567',
merchantReference: 'order_123',
returnUrl: 'https://yourstore.com/order/123/complete',
}),
});
if (!res.ok) throw new Error(`ePay ${res.status}: ${await res.text()}`);
const { reference, checkoutUrl, expiresAt } = await res.json();from epay import Epay
epay = Epay() # reads EPAY_SECRET_KEY
session = epay.payments.initialize(
amount="250.00",
currency_code="ETB",
customer_phone="+251911234567",
merchant_reference="order_123",
return_url="https://yourstore.com/order/123/complete",
idempotency_key="order_123",
)
# session["reference"], session["checkoutUrl"], session["expiresAt"]
redirect(session["checkoutUrl"])
import os
import requests
res = requests.post(
"https://api.e-pay.et/v1/transactions/initialize",
headers={
"Authorization": f"Bearer {os.environ['EPAY_SECRET_KEY']}",
"x-idempotency-key": "order_123",
},
json={
"amount": "250.00",
"currencyCode": "ETB",
"customerPhone": "+251911234567",
"merchantReference": "order_123",
"returnUrl": "https://yourstore.com/order/123/complete",
},
timeout=30,
)
res.raise_for_status()
session = res.json()
reference = session["reference"]
checkout_url = session["checkoutUrl"]use Epay\Epay;
$epay = new Epay(); // reads EPAY_SECRET_KEY
$session = $epay->payments->initialize([
'amount' => '250.00',
'currencyCode' => 'ETB',
'customerPhone' => '+251911234567',
'merchantReference' => 'order_123',
'returnUrl' => 'https://yourstore.com/order/123/complete',
], idempotencyKey: 'order_123');
// $session['reference'], $session['checkoutUrl'], $session['expiresAt']
header('Location: ' . $session['checkoutUrl']);
$ch = curl_init('https://api.e-pay.et/v1/transactions/initialize');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('EPAY_SECRET_KEY'),
'Content-Type: application/json',
'x-idempotency-key: order_123',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => '250.00',
'currencyCode' => 'ETB',
'customerPhone' => '+251911234567',
'merchantReference' => 'order_123',
'returnUrl' => 'https://yourstore.com/order/123/complete',
]),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException("ePay {$status}: {$body}");
}
$session = json_decode($body, true);client, err := epay.NewClient() // reads EPAY_SECRET_KEY
if err != nil {
return err
}
session, err := client.Payments.Initialize(ctx, epay.InitializeParams{
Amount: "250.00",
CurrencyCode: "ETB",
CustomerPhone: "+251911234567",
MerchantReference: "order_123",
ReturnURL: "https://yourstore.com/order/123/complete",
IdempotencyKey: "order_123",
})
if err != nil {
return err
}
// session.Reference, session.CheckoutURL, session.ExpiresAt
http.Redirect(w, r, session.CheckoutURL, http.StatusSeeOther)
payload, _ := json.Marshal(map[string]string{
"amount": "250.00",
"currencyCode": "ETB",
"customerPhone": "+251911234567",
"merchantReference": "order_123",
"returnUrl": "https://yourstore.com/order/123/complete",
})
req, _ := http.NewRequestWithContext(ctx, http.MethodPost,
"https://api.e-pay.et/v1/transactions/initialize", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("EPAY_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-idempotency-key", "order_123")
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode >= 400 {
return fmt.Errorf("ePay %d", res.StatusCode)
}
var session struct {
Reference string `json:"reference"`
CheckoutURL string `json:"checkoutUrl"`
ExpiresAt string `json:"expiresAt"`
}
if err := json.NewDecoder(res.Body).Decode(&session); err != nil {
return err
}Response
{
"reference": "PAB12CD3420260813",
"checkoutUrl": "https://checkout.epayethiopia.com/pay/PAB12CD3420260813",
"status": "success",
"expiresAt": "2026-08-13T12:30:00.000Z"
}Headers
Prop
Type
Body
Prop
Type
Response
Prop
Type
Errors
| Status | Description |
|---|---|
400 | Invalid amount value or unrecognized currencyCode. |
401 | Missing or invalid API key. |
404 | No payment source found for your account — contact support. |
429 | Rate limit exceeded. |
Next: Verify a Payment — confirm completion before fulfilling an order.