DigiPay API Documentation

Integrate M-Pesa and card payments into your application

Quick Start

Initiate an M-Pesa STK Push in your preferred language. Replace your_api_key and your_api_secret with your credentials from the dashboard.

<?php
$ch = curl_init('https://digipay.co.ke/api/v1/payments/mpesa/initiate');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'X-Api-Key: your_api_key',
        'X-Api-Secret: your_api_secret',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'phone_number' => '254712345678',
        'amount'       => 1500.00,
        'reference'    => 'ORDER-001',
        'description'  => 'Payment for Order #001',
    ]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests

url = "https://digipay.co.ke/api/v1/payments/mpesa/initiate"
headers = {
    "Content-Type": "application/json",
    "X-Api-Key": "your_api_key",
    "X-Api-Secret": "your_api_secret",
}
payload = {
    "phone_number": "254712345678",
    "amount": 1500.00,
    "reference": "ORDER-001",
    "description": "Payment for Order #001",
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
# views.py
import requests
from django.http import JsonResponse

def initiate_payment(request):
    url = "https://digipay.co.ke/api/v1/payments/mpesa/initiate"
    headers = {
        "Content-Type": "application/json",
        "X-Api-Key": "your_api_key",
        "X-Api-Secret": "your_api_secret",
    }
    payload = {
        "phone_number": "254712345678",
        "amount": 1500.00,
        "reference": "ORDER-001",
        "description": "Payment for Order #001",
    }
    r = requests.post(url, json=payload, headers=headers)
    return JsonResponse(r.json(), safe=False)
import java.net.http.*;
import java.net.URI;

public class DigiPay {
    public static void main(String[] args) throws Exception {
        String json = """
        {
          "phone_number": "254712345678",
          "amount": 1500.00,
          "reference": "ORDER-001",
          "description": "Payment for Order #001"
        }""";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://digipay.co.ke/api/v1/payments/mpesa/initiate"))
            .header("Content-Type", "application/json")
            .header("X-Api-Key", "your_api_key")
            .header("X-Api-Secret", "your_api_secret")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
using System.Net.Http;
using System.Text;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", "your_api_key");
client.DefaultRequestHeaders.Add("X-Api-Secret", "your_api_secret");

var json = @"{
    ""phone_number"": ""254712345678"",
    ""amount"": 1500.00,
    ""reference"": ""ORDER-001"",
    ""description"": ""Payment for Order #001""
}";

var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
    "https://digipay.co.ke/api/v1/payments/mpesa/initiate", content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
require 'net/http'
require 'json'
require 'uri'

uri = URI('https://digipay.co.ke/api/v1/payments/mpesa/initiate')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['X-Api-Key'] = 'your_api_key'
request['X-Api-Secret'] = 'your_api_secret'
request.body = {
  phone_number: '254712345678',
  amount: 1500.00,
  reference: 'ORDER-001',
  description: 'Payment for Order #001'
}.to_json

response = http.request(request)
puts response.body
package main

import (
    "bytes"
    "fmt"
    "io"
    "net/http"
)

func main() {
    payload := []byte(`{
        "phone_number": "254712345678",
        "amount": 1500.00,
        "reference": "ORDER-001",
        "description": "Payment for Order #001"
    }`)

    req, _ := http.NewRequest("POST",
        "https://digipay.co.ke/api/v1/payments/mpesa/initiate",
        bytes.NewBuffer(payload))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("X-Api-Key", "your_api_key")
    req.Header.Set("X-Api-Secret", "your_api_secret")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
const response = await fetch(
  "https://digipay.co.ke/api/v1/payments/mpesa/initiate",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": "your_api_key",
      "X-Api-Secret": "your_api_secret",
    },
    body: JSON.stringify({
      phone_number: "254712345678",
      amount: 1500.0,
      reference: "ORDER-001",
      description: "Payment for Order #001",
    }),
  }
);

const data = await response.json();
console.log(data);

Authentication

Include your API credentials in request headers:

X-Api-Key: your_api_key_here
X-Api-Secret: your_api_secret_here

M-Pesa STK Push

POST /api/v1/payments/mpesa/initiate

Request
{
  "phone_number": "254712345678",
  "amount": 1500.00,
  "reference": "ORDER-001",
  "description": "Payment for Order #001"
}
Response
{
  "success": true,
  "data": {
    "transaction_reference": "TXN-A1B2C3D4E5F6",
    "status": "processing",
    "amount": 1500.00,
    "fee": 30.00,
    "net_amount": 1470.00
  }
}

Card Payment

POST /api/v1/payments/card/charge

Request
{
  "amount": 5000.00,
  "currency": "KES",
  "reference": "ORDER-002",
  "card_number": "4111111111111111",
  "expiry_month": "12",
  "expiry_year": "26",
  "cvv": "123",
  "card_holder_name": "James Mwangi"
}

Check Status

GET /api/v1/payments/status/{transaction_reference}

Webhooks

DigiPay sends a POST to your webhook URL when payments complete or fail:

{
  "event": "payment.completed",
  "data": {
    "transaction_reference": "TXN-A1B2C3D4E5F6",
    "merchant_reference": "ORDER-001",
    "amount": 1500.00,
    "fee_amount": 30.00,
    "net_amount": 1470.00,
    "status": "completed"
  }
}

Error Handling

CodeMeaning
401Invalid API credentials
403Merchant not active
422Validation error
500Server error

Transaction Fees

A flat 2% is deducted from each successful transaction.

AmountFeeYou Receive
KES 1,000KES 20KES 980
KES 10,000KES 200KES 9,800
KES 100,000KES 2,000KES 98,000
Ready to integrate?

Create an account to get your API credentials.

Create Free Account