Developers

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 as Authorization: Bearer <key>, and use the secret key from a server.
  • Money is whole Tanzanian shillings (integers). 400000 is 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 open and closes_on are the only two things a stale page gets wrong in a way that wastes somebody's afternoon.
  • Keep the business's words. description is 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.