Integrate real-time schedules, seat booking, and mobile money payments into your system in minutes.
A full-stack booking platform powering routes across Cameroon.
Query upcoming departures, filter by company or date, retrieve real-time seat availability.
Create, confirm, and cancel bookings. Handle seat assignment, expiry, and lifecycle states.
Initiate MTN MoMo and Orange Money charges. Track status and reconcile timed-out transactions.
Register passengers, onboard operators, manage roles, and handle approval workflows.
Download PDF boarding passes, verify QR-coded tickets, and regenerate receipts.
Pull revenue summaries, booking counts, and export CSV data for any date range.
Three requests to go from zero to a confirmed booking.
Obtain a JWT token. Send it as Authorization: Bearer <token> on every authenticated request.
Call the public search endpoint (no auth). Returns upcoming departures with fare, seats, and company info.
POST the schedule ID to /bookings, then POST to /bookings/{id}/pay with a valid MTN or Orange number.
curl -X POST "https://wakkaapi.benorinetechnologies.com/api/v1/auth/register" \ -H "Content-Type: application/json" \ -d '{"first_name":"Alice","last_name":"Mbarga","email":"alice@example.cm", "phone_number":"677123456","password":"Secure1!", "password_confirmation":"Secure1!", "terms_accepted":true,"privacy_accepted":true}'
curl "https://wakkaapi.benorinetechnologies.com/api/v1/search/schedules?origin=Douala&destination=Yaound%C3%A9&departure_date=2026-07-01"
curl -X POST "https://wakkaapi.benorinetechnologies.com/api/v1/bookings/42/pay" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ "phone": "677123456" }'
phone for payments must be an MTN (65X, 67X, 68X) or Orange (69X) Cameroon number.
WakkaBus uses JWT. Tokens expire after 60 minutes; refresh within 48 hours.
| Method | Endpoint | Description | Auth |
|---|---|---|---|
| POST | /api/v1/auth/register | Register passenger | No |
| POST | /api/v1/auth/login | Obtain JWT | No |
| POST | /api/v1/refresh | Refresh expiring token | Yes |
| POST | /api/v1/logout | Invalidate token | Yes |
| GET | /api/v1/user | Current user | Yes |
All responses: { success, data, message, timestamp }
| Method | Endpoint | Description |
|---|---|---|
| Search (public) | ||
| GET | /api/v1/search/schedules | Search departures by origin, destination, date |
| GET | /api/v1/search/upcoming | All upcoming departures within N days |
| GET | /api/v1/browse/routes | All active routes |
| GET | /api/v1/schedules/{id}/availability | Seat map and available count |
| Bookings | ||
| POST | /api/v1/bookings | Create booking |
| GET | /api/v1/bookings | List passenger bookings |
| POST | /api/v1/bookings/{id}/pay | Initiate mobile money payment |
| POST | /api/v1/bookings/{id}/cancel | Cancel booking |
| GET | /api/v1/bookings/{id}/receipt.pdf | Download boarding pass PDF |
| Tickets & Platform | ||
| POST | /api/v1/tickets/verify | Verify ticket by QR or booking reference |
| GET | /api/v1/dashboard/admin | Revenue and booking KPIs |
| GET | /api/v1/reports/bookings | CSV export of bookings |
| GET | /api/v1/health | System health check |
| GET | /api/v1/config | Public platform config |
For system administrators deploying WakkaBus in production.
PHP 8.3+, MySQL 8.0+, Composer 2.x, HTTPS domain, SMTP server (port 465, SSL).
Copy .env.example → .env. Set APP_KEY, JWT_SECRET, DB credentials, MAIL_SCHEME=smtps.
Run php artisan migrate --force. Optionally seed with php artisan db:seed.
Set QUEUE_CONNECTION=database. Add cron: * * * * * php artisan queue:work --stop-when-empty --max-time=55
After every deploy: php artisan config:cache && php artisan route:cache
Hit GET /api/v1/health — HTTP 200 all systems pass, 503 on failure.
APP_ENV=production APP_DEBUG=false APP_URL=https://your-api-domain.cm FRONTEND_URL=https://your-frontend-domain.cm DB_CONNECTION=mysql QUEUE_CONNECTION=database MAIL_SCHEME=smtps MAIL_PORT=465 JWT_TTL=60 JWT_BLACKLIST_ENABLED=true
Every response uses a consistent envelope.
{ "success": true, "message": "Booking created.",
"data": { /* resource */ }, "timestamp": "2026-07-01T08:00:00Z" }
{ "success": false, "responseCode": 422,
"message": "Validation failed.",
"errors": { "phone": ["Must be MTN or Orange."] } }