Endpoint reference
Every public API endpoint, its parameters, and its exact response shape.
All endpoints are GET, under https://api.ardent.africa/public/v1. List endpoints
return { data, page, limit, total }. Detail endpoints return the resource object.
Send x-api-key for the higher rate tier (optional).
A machine-readable OpenAPI 3.1 spec of everything below is served
at https://api.ardent.africa/public/v1/openapi.json.
Common list parameters:
| Param | Type | Default | Notes |
|---|---|---|---|
page | integer | 1 | 1-based page number |
limit | integer | 20 | max 50 |
All endpoints (generated)
Generated from the live /public/v1 API contract. Response shapes and examples are documented per resource in the sections below.
| Method | Path | Handler |
|---|---|---|
| GET | /public/v1/events | List events |
| GET | /public/v1/events/:slug | Get event |
| GET | /public/v1/jobs | List jobs |
| GET | /public/v1/jobs/:slug | Get job |
| GET | /public/v1/marketplace/services | List services |
| GET | /public/v1/marketplace/services/:id | Get service |
| GET | /public/v1/marketplace/categories | List categories |
| GET | /public/v1/openapi.json | Get open api |
| GET | /public/v1/reviews/entities | List entities |
| GET | /public/v1/reviews/entities/:slug | Get entity |
| GET | /public/v1/actors | List actors |
| GET | /public/v1/actors/:handle | Get actor |
| GET | /public/v1/posts | List posts |
| GET | /public/v1/posts/:id | Get post |
| GET | /public/v1/groups | List groups |
| GET | /public/v1/groups/:slug | Get group |
| GET | /public/v1/campaigns | List campaigns |
| GET | /public/v1/campaigns/:slug | Get campaign |
| GET | /public/v1/petitions | List petitions |
| GET | /public/v1/petitions/:slug | Get petition |
| GET | /public/v1/blog | List blog |
| GET | /public/v1/blog/:slug | Get blog post |
| GET | /public/v1/profiles/:username | Get profile |
| GET | /public/v1/stats | Get stats |
Campaigns
GET/public/v1/campaigns
Lists active and won fundraising campaigns. Extra params: category, country
(target country code, for example GH).
curl "https://api.ardent.africa/public/v1/campaigns?limit=2&category=Education"{
"data": [
{
"id": "c7ee417f-...",
"slug": "clean-water-for-tamale",
"title": "Clean water for Tamale",
"description": "...",
"category": "Education",
"status": "active",
"goal_amount": 50000,
"raised_amount": 12500,
"image_url": "https://.../image.jpg",
"country": "Ghana",
"target_country": "GH",
"target_country_name": "Ghana",
"progress": { "raised_amount": 12500, "goal_amount": 50000, "percent": 25 },
"goal_reached_at": null,
"deadline": null,
"created_at": "2026-06-13T23:31:27.767Z"
}
],
"page": 1,
"limit": 2,
"total": 6
}/public/v1/campaigns/:slug
A single campaign, plus its public updates. Same fields as above, with an updates
array (id, title, content (sanitized HTML), media_urls, created_at).
{
"id": "c7ee417f-...",
"slug": "clean-water-for-tamale",
"title": "Clean water for Tamale",
"progress": { "raised_amount": 12500, "goal_amount": 50000, "percent": 25 },
"updates": [
{ "id": "...", "title": "Drilling begins", "content": "<p>...</p>", "media_urls": [], "created_at": "2026-06-14T..." }
]
}There are no creator, donor, or internal fields. Only active or won campaigns are
returned; anything else gives 404.
Marketplace
GET/public/v1/marketplace/services
Lists active marketplace listings. Extra params: q (full-text search), listing_type
(service or goods), category (category slug), location.
curl "https://api.ardent.africa/public/v1/marketplace/services?limit=2&listing_type=service"{
"data": [
{
"id": "9b1e...",
"slug": "wedding-photography-accra",
"title": "Wedding photography in Accra",
"description": "...",
"listing_type": "service",
"category_slugs": ["photography"],
"price_min_pesewas": 150000,
"price_max_pesewas": 500000,
"currency": "GHS",
"location": "Accra",
"rating": 4.8,
"review_count": 23,
"is_verified": true,
"is_featured": false,
"cover_url": "https://.../cover.jpg",
"supports_campaign_id": null,
"created_at": "2026-06-14T..."
}
],
"page": 1,
"limit": 2,
"total": 12
}/public/v1/marketplace/services/:id
A single active listing. Adds public packages (each name, price_pesewas,
currency, description, delivery_days), portfolio_urls, and languages. Provider
contact details and identity are never returned.
{
"id": "9b1e...",
"slug": "wedding-photography-accra",
"title": "Wedding photography in Accra",
"rating": 4.8,
"review_count": 23,
"packages": [
{ "name": "Half day", "price_pesewas": 150000, "currency": "GHS", "description": "...", "delivery_days": 7 }
],
"portfolio_urls": ["https://.../1.jpg"],
"languages": ["English"]
}/public/v1/marketplace/categories
The active marketplace category taxonomy.
{
"data": [
{ "id": "...", "slug": "photography", "name": "Photography", "kind": "service" }
]
}Events
GET/public/v1/events
Lists published events. Extra params: q (full-text search), event_type, category,
location, is_paid (true/false), is_online (true/false), date_from,
date_to.
curl "https://api.ardent.africa/public/v1/events?limit=2&is_paid=true"{
"data": [
{
"id": "4f2c...",
"slug": "accra-tech-summit-2026",
"title": "Accra Tech Summit 2026",
"description": "...",
"event_type": "conference",
"category": "Technology",
"start_date": "2026-09-12T09:00:00Z",
"end_date": "2026-09-12T17:00:00Z",
"timezone": "Africa/Accra",
"location": "Accra International Conference Centre",
"is_online": false,
"image_url": "https://.../event.jpg",
"is_paid": true,
"currency": "GHS",
"tags": ["tech", "startups"],
"is_featured": true,
"created_at": "2026-06-14T..."
}
],
"page": 1,
"limit": 2,
"total": 7
}/public/v1/events/:slug
A single published event, plus public content blocks (agenda, speakers, sponsors,
gallery). For paid events it also returns ticket_tiers, each with name, description,
price_pesewas, currency, and an is_available flag. Raw inventory counts, promo
codes, organizer details, and online joining links are never returned.
{
"slug": "accra-tech-summit-2026",
"title": "Accra Tech Summit 2026",
"is_paid": true,
"currency": "GHS",
"agenda": [],
"speakers": [],
"sponsors": [],
"gallery": [],
"ticket_tiers": [
{ "id": "...", "name": "Early bird", "description": "...", "price_pesewas": 20000, "currency": "GHS", "is_available": true }
]
}An unpublished or unknown slug gives 404.
Jobs
GET/public/v1/jobs
Lists open job postings. Extra params: q (full-text search), employment_type,
workplace_type (onsite / hybrid / remote), seniority, location, category.
Featured postings come first, then the newest.
curl "https://api.ardent.africa/public/v1/jobs?limit=2&workplace_type=remote"{
"data": [
{
"id": "...",
"slug": "senior-nurse-accra",
"title": "Senior Nurse",
"description": "...",
"employment_type": "full_time",
"workplace_type": "onsite",
"seniority": "senior",
"location": "Accra",
"salary_min_pesewas": 500000,
"salary_max_pesewas": 800000,
"salary_currency": "GHS",
"salary_period": "month",
"salary_hidden": false,
"skills": ["nursing"],
"application_deadline": null,
"is_featured": true,
"published_at": "2026-07-01T00:00:00Z",
"created_at": "2026-07-01T00:00:00Z"
}
],
"page": 1,
"limit": 2,
"total": 37
}When an employer chooses to hide pay, salary_hidden is true and both salary bounds come
back null. The API respects that choice, not just the website.
/public/v1/jobs/{slug}
Adds responsibilities, requirements, benefits, and the hiring employer
(id, slug, name, logo_url, industry, location, is_verified). A closed or
unknown slug gives 404.
There is no candidate or application endpoint, and there never will be. A job posting is public; the people applying to it are not. Nothing here exposes applicants, applications, screening answers, messages, interviews, offers, or fees. Employers get applicant detail through their authenticated dashboard, not through this API.
Petitions
GET/public/v1/petitions
Lists active petitions. Extra params: category, country.
{
"data": [
{
"id": "6844cb10-...",
"slug": "pass-the-affirmative-action-bill",
"title": "Pass the Affirmative Action Bill",
"description": "...",
"category": "Governance",
"status": "active",
"petition_target": 10000,
"signatures_count": 3421,
"target_country": "GH",
"target_country_name": "Ghana",
"country": "Ghana",
"image_url": null,
"progress": { "signatures_count": 3421, "petition_target": 10000, "percent": 34 },
"created_at": "2026-06-10T..."
}
],
"page": 1,
"limit": 20,
"total": 4
}/public/v1/petitions/:slug
A single petition, plus aggregate momentum. Adds momentum.signatures_last_7_days.
Signer names, emails, and comments are never returned.
{
"slug": "pass-the-affirmative-action-bill",
"signatures_count": 3421,
"progress": { "signatures_count": 3421, "petition_target": 10000, "percent": 34 },
"momentum": { "signatures_last_7_days": 188 }
}Blog
GET/public/v1/blog
Lists published posts. Extra param: category (category id).
{
"data": [
{
"title": "How tipping works",
"slug": "how-tipping-works",
"excerpt": "A short explainer",
"published_at": "2026-06-13T23:54:21.892Z",
"featured_image_url": null,
"blog_categories": { "name": "Product", "slug": "product" }
}
],
"page": 1,
"limit": 20,
"total": 1
}/public/v1/blog/:slug
A single published post. content is sanitized HTML.
{
"title": "How tipping works",
"slug": "how-tipping-works",
"excerpt": "A short explainer",
"content": "<p>Sanitized HTML body.</p>",
"published_at": "2026-06-13T23:54:21.892Z",
"featured_image_url": null,
"category": { "name": "Product", "slug": "product" }
}Profiles
GET/public/v1/profiles/:username
A public supporter profile (only where the user has enabled a public profile). Returns aggregate signature count. Never returns email, phone, or internal ids.
{
"username": "ama",
"full_name": "Ama O.",
"bio": "Supporter of education causes",
"avatar_url": "https://.../avatar.jpg",
"country": "Ghana",
"account_type": "personal",
"signatures_count": 12
}A username with no public profile gives 404.
Stats
GET/public/v1/stats
Platform-level aggregates. No per-user or donor data.
{
"total_active_campaigns": 10,
"total_campaigns": 11,
"countries_reached": 1,
"total_funds_raised": 288460,
"total_signatures": 51
}Last updated: 3 August 2026
