Meku Jobs — developer guide
List a Meku business's open jobs on its own website, and let people apply on a page Meku runs. The business writes the job once in Meku Business, under Staff → Hiring, and chooses whether it goes on its website, on Meku Jobs (the jobs board in the Meku app), or both.
You list the jobs. Meku takes the application. You never collect a name, a phone number or a CV, and you never store one.
Your site Meku
───────── ────
GET /storefront/jobs ─────► the open jobs on this website
GET /storefront/jobs/{code} ─────► one job, with its apply address
your "Apply" link ─────► meku.co.tz/jobs/{code}?via=site
the applicant answers the questions,
confirms their phone, attaches a CV
the business shortlists, rejects or hires
- Base URL:
https://api.meku.co.tz/api/v1 - The keys are the same ones you read products with — §1 of the Meku
Checkout guide, at
/developers/meku-checkout, says which key belongs where. Send the key asAuthorization: Bearer <key>, and use the secret key from a server. - Money is whole Tanzanian shillings (integers).
400000is TZS 400,000. - Every response is the usual envelope:
{ "success": true, "data": …, "error": null, "meta": null }.
Nobody pays to apply. There is no fee anywhere in this API, and Meku's apply page carries one fixed line: Meku never asks you to pay to apply. If a business asks you for money for a job, report the job. Say the same on your own page. Asking an applicant for money is the shape of the common job scam, and a site that asks for it will be reported.
1. The jobs on this website
GET /storefront/jobs
Authorization: Bearer sk_live_…
Every job that is open and that the business put on its website, newest first. There are no query parameters and no pages: a business has a handful of jobs, not a catalogue.
A job the business put only on Meku Jobs is not in this list. A job whose closing date has passed is not either.
{
"success": true,
"data": [
{
"id": "7c1e…",
"code": "k7m2qp",
"title": "Pharmacy Assistant",
"employment_type": "full_time",
"town": "Dar es Salaam",
"salary_min": 400000,
"salary_max": 550000,
"salary_basis": "monthly",
"positions": 2,
"closes_on": "2026-11-30",
"published_at": "2026-10-16T08:00:00Z",
"business": {
"name": "Dx Care Pharmacy", "slug": "dx-care-pharmacy",
"logo_url": "https://s3.meku.co.tz/…/logo.jpg",
"verified": true, "category_slug": "pharmacy"
},
"description": "Serve customers at the counter…",
"requirements": [
{ "key": "weekends", "kind": "yes_no",
"label": "Can work on weekends", "question": "Can you work on weekends?" },
{ "key": "experience_years", "kind": "years",
"label": "Years doing this work",
"question": "How many years have you done this kind of work?" }
],
"requirement_min": { "experience_years": 2 },
"on_website": true,
"on_meku_jobs": true,
"open": true,
"apply_url": "https://meku.co.tz/jobs/k7m2qp?via=site",
"structured_data": { "@context": "https://schema.org/", "@type": "JobPosting", "…": "…" }
}
],
"error": null
}
| Field | |
|---|---|
code |
the job's short public id. It is what apply_url and the careers link carry, and it is the one to put in your own address for the job. Use it, not id |
employment_type |
full_time · part_time · casual · contract |
town |
where the work is. A business with branches posts the job at the branch that is hiring |
salary_min, salary_max, salary_basis |
whole shillings, and monthly · daily · hourly. Both figures are the same number when the business named one figure, and both are null when it named none — show nothing then, not a zero and not a dash |
positions |
how many people this job hires. Usually 1 |
closes_on |
a date, or null when the business set none. Meku closes the job on that day |
published_at |
when the business published it |
description |
plain text with line breaks, typed by the business. Show it as text, never as HTML |
requirements |
what the job needs. The questions are Meku's, not the business's (below) |
requirement_min |
the years a years requirement needs, by key. { "experience_years": 2 } means two years |
open |
whether it is still taking applications. Always true in this list; it can be false on one job read directly (§2) |
apply_url |
where your "Apply" link goes (§3) |
structured_data |
schema.org JobPosting, ready to paste into the page (§4) |
business |
the business, as Meku holds it. verified is whether Meku has verified it |
A distance_km field is in the response and is null here. It is how far a
job is from a person looking, which only Meku Jobs asks.
The requirements are Meku's own list, and the business only chooses which
apply. It cannot write its own question. The Employment and Labour
Relations Act counts an applicant as an employee, so the discrimination rules
reach the application form, and a free question box is how a question nobody
may ask gets asked. Show label as what the job needs, and leave question
to the apply page, which asks it.
2. One job
GET /storefront/jobs/k7m2qp
Authorization: Bearer sk_live_…
The same object, for the job with that code. Use it for the page a visitor
lands on, so a job that was taken down answers for itself.
- A job that belongs to another business, or that this business did not put on its website, answers 404. So does one that is still a draft.
- A job the business has closed still answers 200, with
open: false. Show the job and say it is closed instead of a 404: the address may be in somebody's WhatsApp message or in Google's results, and a closed job explains itself better than a missing page.
3. Applying
apply_url is Meku's hosted apply page — link to it, and build no form.
It asks for a name, a phone number and the requirement answers, confirms the
phone with a code, and takes a CV if the applicant has one. That keeps the
upload, the phone code, the privacy notice and the checks against spam in one
place Meku maintains, and it means no CV and no phone number ever reaches
your server.
The address already carries ?via=site, which is how the business sees in
Meku Business that the application came from its own website. Keep the query
string exactly as it is given.
An applicant does not need a Meku account: the page confirms their phone number and that is all. Afterwards it offers to keep their details for next time, which is their choice, not the business's and not yours.
The business's own careers link is https://meku.co.tz/jobs/{code},
without the ?via=site. The business pastes it on WhatsApp or Instagram, and
every business also has a careers page at
https://meku.co.tz/store/{slug}/jobs, which lists every open job whichever
channel it is on. A business with no website of its own can hire with those
alone.
4. Getting the job into Google
structured_data is the schema.org JobPosting for that job, composed by
Meku from the same fields. Put it in the page as JSON-LD and the job becomes
eligible for Google's job search, where people in Tanzania look for work:
<script type="application/ld+json">
{ … the structured_data object, exactly as the API gave it … }
</script>
Serve it as it comes. It carries the title, the description, the posting date,
the employment type, the business, the town, the closing date and the salary
in the shapes Google expects, and url points at the job's page on Meku. Do
not edit it to point at your own page: Google checks that the address it is
given can be applied on, and Meku's page can.
A job page is worth rendering on the server for the same reason. A page whose job appears only after JavaScript has run is a page Google may index without the job in it.
5. What to show, and what not to
- Show nothing when there are no jobs. An empty list is the ordinary state of a careers page. Say that there is nothing open at the moment, and nothing more; an invented "send us your CV anyway" address collects people's details with nobody to read them.
- Do not collect applications yourself — not a form, not an email address, not a WhatsApp number for CVs. The business answers applicants in Meku Business, and an application that arrives any other way is one it cannot shortlist, reject or hire from, and one no retention rule reaches.
- Do not cache a job for long. A business closes a job the hour it is
filled, and
openandcloses_onare the only two things a stale page gets wrong in a way that wastes somebody's afternoon. - Keep the business's words.
descriptionis what the business typed. Shorten it on a list if you must, but do not rewrite it: it is the business speaking to the person it may employ.
6. What Meku guarantees
- Nobody pays to apply. There is no fee in this API and there is none on the apply page.
- One application per person per job. A second submission returns the first, so a double tap or a retry never makes two.
- An application is a snapshot. What the business receives is what the applicant sent, and a later change to their saved details does not rewrite it.
- Every message to an applicant is Meku's own wording, so a business cannot write an SMS that sounds like a demand for money. The business's own note to an applicant is shown on the applicant's status page, signed with the business's name.
- The personal details have an end. An application that was rejected, withdrawn or never answered has its CV and contact details deleted a year after the answer.