Skip to content

HTTP Callback Requests

Africa's Talking sends POST callbacks to your application for delivery reports, incoming messages, payment notifications, USSD sessions, and voice events. This package ships with typed Laravel Form Requests that validate these callbacks and expose their data via named helper methods.

Available Request Classes

ClassCallback Type
AirtimeStatusRequestAirtime delivery status
AirtimeValidationRequestAirtime validation callback
BulkSmsOptOutRequestBulk SMS opt-out
IncomingMessageRequestIncoming SMS message
MessageDeliveryRequestSMS delivery report
MobileC2BValidationRequestMobile payment C2B validation
PaymentNotificationRequestPayment notification
SubscriptionRequestPremium SMS subscription
UssdEventRequestUSSD session event
UssdSessionRequestUSSD session data
VoiceCallRequestIncoming / active voice call
VoiceEventRequestVoice call event

All classes live under SamuelMwangiW\Africastalking\Http\Requests.

Common Helper Methods

Each request class exposes relevant helpers — no manual $request->input('key') needed:

MethodReturn TypeDescription
id()stringThe unique AT transaction/message ID
phone()stringThe caller or sender's phone number
userInput()stringUSSD user input text
status()stringFinal status of a transaction or message
deliveryFailed()booltrue if SMS or airtime delivery failed

Example: SMS Delivery Callback

Register a POST route for Africa's Talking to call when a message is delivered:

php
// routes/api.php
Route::post('/callbacks/sms/delivery', [MessageDeliveredController::class, '__invoke']);

Then handle it in your controller:

php
<?php

namespace App\Http\Controllers\Messaging;

use App\Models\Message;
use SamuelMwangiW\Africastalking\Http\Requests\MessageDeliveryRequest;

class MessageDeliveredController
{
    public function __invoke(MessageDeliveryRequest $request)
    {
        $message = Message::query()
            ->where('transaction_id', $request->id())
            ->firstOrFail();

        $message->update([
            'delivered_at' => now(),
            'status'       => $request->status(),
        ]);

        return response('OK');
    }
}

Example: Airtime Status Callback

php
<?php

namespace App\Http\Controllers\Airtime;

use App\Models\AirtimeTransaction;
use SamuelMwangiW\Africastalking\Http\Requests\AirtimeStatusRequest;

class AirtimeStatusController
{
    public function __invoke(AirtimeStatusRequest $request)
    {
        AirtimeTransaction::query()
            ->where('transaction_id', $request->id())
            ->update([
                'status'     => $request->status(),
                'failed'     => $request->deliveryFailed(),
                'updated_at' => now(),
            ]);

        return response('OK');
    }
}

Example: Incoming SMS Callback

php
<?php

namespace App\Http\Controllers\Messaging;

use App\Models\InboundMessage;
use SamuelMwangiW\Africastalking\Http\Requests\IncomingMessageRequest;

class IncomingSmsController
{
    public function __invoke(IncomingMessageRequest $request)
    {
        InboundMessage::create([
            'from'    => $request->phone(),
            'message' => $request->input('text'),
            'at_id'   => $request->id(),
        ]);

        return response('OK');
    }
}

TIP

Always return response('OK') (HTTP 200) from your callback controllers. Africa's Talking will retry the callback if it does not receive a 2xx response.