Reference

Jobs

Posting and managing jobs for a company your app manages. API key only.

List a company’s jobs

GET/v1/companies/{companyId}/jobs

API keyjobs:read

Lists jobs for a company your app manages, newest first. Archived jobs are excluded unless you ask for them with status=archived.

Path parameters

FieldTypeDescription
companyIdrequiredstring

The Tabbio company id.

Query parameters

FieldTypeDescription
pageinteger

1-based page number. Defaults to 1.

pageSizeinteger

Items per page, 1 to 100. Defaults to 25.

statusstring

Filter by lifecycle status. Omit to list everything but archived jobs.

One of draft, active, closed, archived

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    One page of jobs.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    This company is not managed by your app.

Request
curl https://server.tabbio.com/v1/companies/$COMPANY_ID/jobs \
  -H "Authorization: Bearer $TABBIO_API_KEY"
Response 200
{
  "data": [
    {
      "id": "job_5c19d8",
      "companyId": "com_7b31c4",
      "title": "Regional Operations Manager",
      "description": "Own the regional operations function end to end across the Gulf network, from the Dubai and Riyadh hubs through to last mile delivery.",
      "status": "active",
      "workMode": "onsite",
      "employment": "full_time",
      "seniority": "senior",
      "department": "Operations",
      "city": "Dubai",
      "country": "United Arab Emirates",
      "location": "Dubai, United Arab Emirates",
      "salary": {
        "min": 25000,
        "max": 35000,
        "currency": "AED",
        "period": "monthly"
      },
      "salaryVisible": true,
      "distribution": "tabbio_and_company",
      "responsibilities": [
        "Run the daily operation across three hubs",
        "Own the regional cost per shipment"
      ],
      "requirements": [
        "Seven years running regional logistics operations",
        "Experience with temperature controlled freight"
      ],
      "niceToHave": [
        "Working Arabic and English"
      ],
      "benefits": [
        "Health cover for you and your dependants"
      ],
      "screeningQuestions": [
        {
          "id": "q_experience_years",
          "prompt": "How many years of regional operations experience do you have?",
          "type": "number",
          "required": true,
          "order": 0,
          "source": "default",
          "defaultKey": "experience_years"
        }
      ],
      "eligibility": {
        "candidateLocation": "uae",
        "experienceYears": "7_plus",
        "language": "english_or_arabic",
        "workEligibility": "eligible_or_sponsorship"
      },
      "applicationCount": 12,
      "postedAt": "2026-08-20T06:00:00.000Z",
      "createdAt": "2026-08-19T14:32:07.000Z",
      "updatedAt": "2026-08-28T09:11:44.000Z"
    },
    {
      "id": "job_1e04a7",
      "companyId": "com_7b31c4",
      "title": "Warehouse Supervisor",
      "description": "Run the night shift at the Dubai cold store, covering goods in, put away and dispatch.",
      "status": "draft",
      "workMode": "onsite",
      "employment": "full_time",
      "seniority": "mid",
      "department": "Operations",
      "city": "Dubai",
      "country": "United Arab Emirates",
      "location": "Dubai, United Arab Emirates",
      "salary": null,
      "salaryVisible": true,
      "distribution": "tabbio_and_company",
      "responsibilities": [
        "Run the night shift at the Dubai cold store"
      ],
      "requirements": [
        "Three years supervising a warehouse team"
      ],
      "niceToHave": [],
      "benefits": [],
      "screeningQuestions": [],
      "eligibility": null,
      "applicationCount": 0,
      "postedAt": null,
      "createdAt": "2026-08-27T10:18:52.000Z",
      "updatedAt": "2026-08-27T10:18:52.000Z"
    }
  ],
  "error": null,
  "meta": {
    "page": 1,
    "pageSize": 25,
    "total": 2,
    "totalPages": 1
  }
}

Post a job

POST/v1/companies/{companyId}/jobs

API keyjobs:write

Creates a job for a company your app manages. saveAs defaults to draft; send "live" to publish immediately, which requires the full publish contract (location, salary and screening rules) to be satisfied. Send an Idempotency-Key header to make a retry safe: the header wins over an idempotencyKey in the body.

Path parameters

FieldTypeDescription
companyIdrequiredstring

The Tabbio company id.

Headers

FieldTypeDescription
Idempotency-Keystring

Your own key for this create. Retrying with the same key returns the job the first attempt created instead of posting a duplicate.

Request body

Sent as application/json.

FieldTypeDescription
idempotencyKeystring
saveAsrequiredstring

One of draft, live

basicsrequiredobject
titlerequiredstring
departmentstring
countrystring
citystring
workModerequiredstring

One of onsite, hybrid, remote

employmentrequiredstring

One of full_time, part_time, contract, internship

seniorityrequiredstring

One of entry, mid, senior, lead, executive

contentrequiredobject
summaryrequiredstring
responsibilitiesrequiredstring[]
requirementsrequiredstring[]
niceToHavestring[]
benefitsstring[]
compensationobject
minnumber
maxnumber
currencyrequiredstring
periodrequiredstring

One of monthly, yearly

visiblerequiredboolean
eligibilityobject
candidateLocationstring

One of any, in_country, in_city, in_region, open_to_relocation, uae, dubai, abu_dhabi, gcc, uae_relocation

experienceYearsstring

One of any, 1_plus, 3_plus, 5_plus, 7_plus, 10_plus

languagestring

One of any, english, arabic, english_and_arabic, english_or_arabic

workEligibilitystring

One of any, eligible, eligible_or_sponsorship, sponsorship_required

workforceProgrammeobject
valuerequiredstring

One of none, emirati, saudi, qatari, kuwaiti, bahraini, omani, gcc, other, emiratisation, saudization

notestring
acknowledgedboolean
questionsobject[]
idstring
promptrequiredstring
typerequiredstring

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredrequiredboolean
orderinteger
optionsstring[]
sourcestring

One of default, custom

defaultKeystring

One of education, experience_years, expected_salary, availability

distributionrequiredstring

One of tabbio_and_company, tabbio_only, company_page_only, hidden

confidentialobject
enabledrequiredboolean
publicLabelstring

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 201

    The created job.

  • 400

    The body failed validation or the publish contract.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    This company is not managed by your app.

Request
curl -X POST https://server.tabbio.com/v1/companies/$COMPANY_ID/jobs \
  -H "Authorization: Bearer $TABBIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "saveAs": "draft",
  "basics": {
    "title": "Regional Operations Manager",
    "department": "Operations",
    "country": "United Arab Emirates",
    "city": "Dubai",
    "workMode": "onsite",
    "employment": "full_time",
    "seniority": "senior"
  },
  "content": {
    "summary": "Own the regional operations function end to end across the Gulf network.",
    "responsibilities": [
      "Run the daily operation across three hubs",
      "Own the regional cost per shipment"
    ],
    "requirements": [
      "Seven years running regional logistics operations",
      "Experience with temperature controlled freight"
    ],
    "niceToHave": [
      "Working Arabic and English"
    ],
    "benefits": [
      "Health cover for you and your dependants"
    ]
  },
  "compensation": {
    "min": 25000,
    "max": 35000,
    "currency": "AED",
    "period": "monthly",
    "visible": true
  },
  "questions": [
    {
      "prompt": "How many years of regional operations experience do you have?",
      "type": "number",
      "required": true
    }
  ],
  "distribution": "tabbio_and_company"
}'
Response 201
{
  "data": {
    "id": "job_5c19d8",
    "companyId": "com_7b31c4",
    "title": "Regional Operations Manager",
    "description": "Own the regional operations function end to end across the Gulf network, from the Dubai and Riyadh hubs through to last mile delivery.",
    "status": "draft",
    "workMode": "onsite",
    "employment": "full_time",
    "seniority": "senior",
    "department": "Operations",
    "city": "Dubai",
    "country": "United Arab Emirates",
    "location": "Dubai, United Arab Emirates",
    "salary": {
      "min": 25000,
      "max": 35000,
      "currency": "AED",
      "period": "monthly"
    },
    "salaryVisible": true,
    "distribution": "tabbio_and_company",
    "responsibilities": [
      "Run the daily operation across three hubs",
      "Own the regional cost per shipment"
    ],
    "requirements": [
      "Seven years running regional logistics operations",
      "Experience with temperature controlled freight"
    ],
    "niceToHave": [
      "Working Arabic and English"
    ],
    "benefits": [
      "Health cover for you and your dependants"
    ],
    "screeningQuestions": [
      {
        "id": "q_experience_years",
        "prompt": "How many years of regional operations experience do you have?",
        "type": "number",
        "required": true,
        "order": 0,
        "source": "default",
        "defaultKey": "experience_years"
      }
    ],
    "eligibility": {
      "candidateLocation": "uae",
      "experienceYears": "7_plus",
      "language": "english_or_arabic",
      "workEligibility": "eligible_or_sponsorship"
    },
    "applicationCount": 0,
    "postedAt": null,
    "createdAt": "2026-08-19T14:32:07.000Z",
    "updatedAt": "2026-08-19T14:32:07.000Z"
  },
  "error": null,
  "meta": null
}

Get a job

GET/v1/jobs/{jobId}

API keyjobs:read

Reads one job in the employer view, so a draft you just created comes back rather than 404ing the way the candidate-facing board would. A job belonging to a company your app does not manage answers 403; an id that matches nothing answers 404.

Path parameters

FieldTypeDescription
jobIdrequiredstring

The Tabbio job id.

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    The job.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    The job belongs to a company your app does not manage, or the key is missing the scope.

  • 404

    No job with this id.

Request
curl https://server.tabbio.com/v1/jobs/$JOB_ID \
  -H "Authorization: Bearer $TABBIO_API_KEY"
Response 200
{
  "data": {
    "id": "job_5c19d8",
    "companyId": "com_7b31c4",
    "title": "Regional Operations Manager",
    "description": "Own the regional operations function end to end across the Gulf network, from the Dubai and Riyadh hubs through to last mile delivery.",
    "status": "active",
    "workMode": "onsite",
    "employment": "full_time",
    "seniority": "senior",
    "department": "Operations",
    "city": "Dubai",
    "country": "United Arab Emirates",
    "location": "Dubai, United Arab Emirates",
    "salary": {
      "min": 25000,
      "max": 35000,
      "currency": "AED",
      "period": "monthly"
    },
    "salaryVisible": true,
    "distribution": "tabbio_and_company",
    "responsibilities": [
      "Run the daily operation across three hubs",
      "Own the regional cost per shipment"
    ],
    "requirements": [
      "Seven years running regional logistics operations",
      "Experience with temperature controlled freight"
    ],
    "niceToHave": [
      "Working Arabic and English"
    ],
    "benefits": [
      "Health cover for you and your dependants"
    ],
    "screeningQuestions": [
      {
        "id": "q_experience_years",
        "prompt": "How many years of regional operations experience do you have?",
        "type": "number",
        "required": true,
        "order": 0,
        "source": "default",
        "defaultKey": "experience_years"
      }
    ],
    "eligibility": {
      "candidateLocation": "uae",
      "experienceYears": "7_plus",
      "language": "english_or_arabic",
      "workEligibility": "eligible_or_sponsorship"
    },
    "applicationCount": 12,
    "postedAt": "2026-08-20T06:00:00.000Z",
    "createdAt": "2026-08-19T14:32:07.000Z",
    "updatedAt": "2026-08-28T09:11:44.000Z"
  },
  "error": null,
  "meta": null
}

Update a job

PATCH/v1/jobs/{jobId}

API keyjobs:write

Updates the sections you send. A live job stays live and must keep satisfying the publish contract; an archived job cannot be edited.

Path parameters

FieldTypeDescription
jobIdrequiredstring

The Tabbio job id.

Request body

Sent as application/json.

FieldTypeDescription
basicsobject
titlerequiredstring
departmentstring
countrystring
citystring
workModerequiredstring

One of onsite, hybrid, remote

employmentrequiredstring

One of full_time, part_time, contract, internship

seniorityrequiredstring

One of entry, mid, senior, lead, executive

contentobject
summaryrequiredstring
responsibilitiesrequiredstring[]
requirementsrequiredstring[]
niceToHavestring[]
benefitsstring[]
compensationobject or null
minnumber
maxnumber
currencyrequiredstring
periodrequiredstring

One of monthly, yearly

visiblerequiredboolean
eligibilityobject
candidateLocationstring

One of any, in_country, in_city, in_region, open_to_relocation, uae, dubai, abu_dhabi, gcc, uae_relocation

experienceYearsstring

One of any, 1_plus, 3_plus, 5_plus, 7_plus, 10_plus

languagestring

One of any, english, arabic, english_and_arabic, english_or_arabic

workEligibilitystring

One of any, eligible, eligible_or_sponsorship, sponsorship_required

workforceProgrammeobject
valuerequiredstring

One of none, emirati, saudi, qatari, kuwaiti, bahraini, omani, gcc, other, emiratisation, saudization

notestring
acknowledgedboolean
questionsobject[]
idstring
promptrequiredstring
typerequiredstring

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredrequiredboolean
orderinteger
optionsstring[]
sourcestring

One of default, custom

defaultKeystring

One of education, experience_years, expected_salary, availability

distributionstring

One of tabbio_and_company, tabbio_only, company_page_only, hidden

confidentialobject
enabledrequiredboolean
publicLabelstring

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    The updated job.

  • 400

    The body failed validation or the publish contract.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    The job belongs to a company your app does not manage, or the key is missing the scope.

  • 404

    No job with this id.

Request
curl -X PATCH https://server.tabbio.com/v1/jobs/$JOB_ID \
  -H "Authorization: Bearer $TABBIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "compensation": {
    "min": 27000,
    "max": 38000,
    "currency": "AED",
    "period": "monthly",
    "visible": true
  }
}'
Response 200
{
  "data": {
    "id": "job_5c19d8",
    "companyId": "com_7b31c4",
    "title": "Regional Operations Manager",
    "description": "Own the regional operations function end to end across the Gulf network, from the Dubai and Riyadh hubs through to last mile delivery.",
    "status": "active",
    "workMode": "onsite",
    "employment": "full_time",
    "seniority": "senior",
    "department": "Operations",
    "city": "Dubai",
    "country": "United Arab Emirates",
    "location": "Dubai, United Arab Emirates",
    "salary": {
      "min": 27000,
      "max": 38000,
      "currency": "AED",
      "period": "monthly"
    },
    "salaryVisible": true,
    "distribution": "tabbio_and_company",
    "responsibilities": [
      "Run the daily operation across three hubs",
      "Own the regional cost per shipment"
    ],
    "requirements": [
      "Seven years running regional logistics operations",
      "Experience with temperature controlled freight"
    ],
    "niceToHave": [
      "Working Arabic and English"
    ],
    "benefits": [
      "Health cover for you and your dependants"
    ],
    "screeningQuestions": [
      {
        "id": "q_experience_years",
        "prompt": "How many years of regional operations experience do you have?",
        "type": "number",
        "required": true,
        "order": 0,
        "source": "default",
        "defaultKey": "experience_years"
      }
    ],
    "eligibility": {
      "candidateLocation": "uae",
      "experienceYears": "7_plus",
      "language": "english_or_arabic",
      "workEligibility": "eligible_or_sponsorship"
    },
    "applicationCount": 12,
    "postedAt": "2026-08-20T06:00:00.000Z",
    "createdAt": "2026-08-19T14:32:07.000Z",
    "updatedAt": "2026-08-29T07:26:31.000Z"
  },
  "error": null,
  "meta": null
}

Archive a job

POST/v1/jobs/{jobId}/archive

API keyjobs:write

Removes a draft or closed job from everyday management. Archiving is never a shortcut for unpublishing: close a live job first.

Path parameters

FieldTypeDescription
jobIdrequiredstring

The Tabbio job id.

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    The archived job.

  • 400

    A live job must be closed before it can be archived.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    The job belongs to a company your app does not manage, or the key is missing the scope.

  • 404

    No job with this id.

Request
curl -X POST https://server.tabbio.com/v1/jobs/$JOB_ID/archive \
  -H "Authorization: Bearer $TABBIO_API_KEY"
Response 200
{
  "data": {
    "id": "<id>",
    "companyId": "<companyId>",
    "title": "<title>",
    "description": "<description>",
    "status": "<status>",
    "workMode": "<workMode>",
    "employment": "<employment>",
    "seniority": "<seniority>",
    "department": "<department>",
    "city": "<city>",
    "country": "<country>",
    "location": "<location>",
    "salary": {
      "min": 0,
      "max": 0,
      "currency": "<currency>",
      "period": "monthly"
    },
    "salaryVisible": false,
    "distribution": "<distribution>",
    "responsibilities": [
      "<responsibilities>"
    ],
    "requirements": [
      "<requirements>"
    ],
    "niceToHave": [
      "<niceToHave>"
    ],
    "benefits": [
      "<benefits>"
    ],
    "screeningQuestions": [
      {
        "id": "<id>",
        "prompt": "<prompt>",
        "type": "yes_no",
        "required": false,
        "order": 0,
        "options": [
          "<options>"
        ],
        "source": "default",
        "defaultKey": "<defaultKey>"
      }
    ],
    "eligibility": {
      "candidateLocation": "<candidateLocation>",
      "experienceYears": "<experienceYears>",
      "language": "<language>",
      "workEligibility": "<workEligibility>"
    },
    "applicationCount": 0,
    "postedAt": "<postedAt>",
    "createdAt": "<createdAt>",
    "updatedAt": "<updatedAt>"
  },
  "error": null,
  "meta": null
}

Close a job

POST/v1/jobs/{jobId}/close

API keyjobs:write

Takes a live job off every public surface. Applications already received are kept, and the job can be published again later.

Path parameters

FieldTypeDescription
jobIdrequiredstring

The Tabbio job id.

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    The closed job.

  • 400

    Only a live job can be closed.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    The job belongs to a company your app does not manage, or the key is missing the scope.

  • 404

    No job with this id.

Request
curl -X POST https://server.tabbio.com/v1/jobs/$JOB_ID/close \
  -H "Authorization: Bearer $TABBIO_API_KEY"
Response 200
{
  "data": {
    "id": "<id>",
    "companyId": "<companyId>",
    "title": "<title>",
    "description": "<description>",
    "status": "<status>",
    "workMode": "<workMode>",
    "employment": "<employment>",
    "seniority": "<seniority>",
    "department": "<department>",
    "city": "<city>",
    "country": "<country>",
    "location": "<location>",
    "salary": {
      "min": 0,
      "max": 0,
      "currency": "<currency>",
      "period": "monthly"
    },
    "salaryVisible": false,
    "distribution": "<distribution>",
    "responsibilities": [
      "<responsibilities>"
    ],
    "requirements": [
      "<requirements>"
    ],
    "niceToHave": [
      "<niceToHave>"
    ],
    "benefits": [
      "<benefits>"
    ],
    "screeningQuestions": [
      {
        "id": "<id>",
        "prompt": "<prompt>",
        "type": "yes_no",
        "required": false,
        "order": 0,
        "options": [
          "<options>"
        ],
        "source": "default",
        "defaultKey": "<defaultKey>"
      }
    ],
    "eligibility": {
      "candidateLocation": "<candidateLocation>",
      "experienceYears": "<experienceYears>",
      "language": "<language>",
      "workEligibility": "<workEligibility>"
    },
    "applicationCount": 0,
    "postedAt": "<postedAt>",
    "createdAt": "<createdAt>",
    "updatedAt": "<updatedAt>"
  },
  "error": null,
  "meta": null
}

Publish a job

POST/v1/jobs/{jobId}/publish

API keyjobs:write

Takes a draft or closed job live. The job must satisfy the publish contract; a job that is already live is refused.

Path parameters

FieldTypeDescription
jobIdrequiredstring

The Tabbio job id.

Response

These fields sit inside data.

FieldTypeDescription
idalwaysstring

The Tabbio job id.

companyIdalwaysstring

The company this job belongs to.

titlealwaysstring

Job title.

descriptionalwaysstring or null

The full job description.

statusalwaysstring

draft, active, closed or archived. Only active jobs are live.

workModealwaysstring or null

onsite, hybrid or remote.

employmentalwaysstring or null

Mirrors basics.employment on create: full_time, part_time, contract or internship.

seniorityalwaysstring or null

Mirrors basics.seniority on create: entry, mid, senior, lead or executive.

departmentalwaysstring or null

Team or function.

cityalwaysstring or null

City, when the role is not fully remote.

countryalwaysstring or null

Country.

locationalwaysstring or null

City and country as one printed line.

salaryalwaysobject or null

The pay range. Null when none was set.

minnumber

Bottom of the range.

maxnumber

Top of the range.

currencystring

ISO currency code, such as AED.

periodstring

Whether the range is per month or per year.

One of monthly, yearly

salaryVisiblealwaysboolean

Whether candidates see the range. You always see it.

distributionalwaysstring

Where the job is listed: tabbio_and_company, tabbio_only, company_page_only or hidden. Confidential roles are always tabbio_only: a masked employer is never listed on their own company page.

responsibilitiesalwaysstring[]

What the role does.

requirementsalwaysstring[]

What the role needs.

niceToHavealwaysstring[]

Optional extras.

benefitsalwaysstring[]

What the employer offers.

screeningQuestionsalwaysobject[]

Questions every applicant answers.

idalwaysstring

Stable id. Answers refer to it.

promptalwaysstring

The question the candidate sees.

typealwaysstring

How the answer is collected.

One of yes_no, multiple_choice, short_answer, long_answer, number

requiredalwaysboolean

Whether the candidate must answer.

orderinteger

Where it sits in the form.

optionsstring[]

The choices, for multiple_choice questions.

sourcestring

Whether Tabbio suggested the question or you wrote it.

One of default, custom

defaultKeystring

Which suggested question this is, for the default ones.

eligibilityalwaysobject or null

Who may apply. Null when no rules were set.

candidateLocationstring

Where candidates must be based.

experienceYearsstring

Minimum experience band.

languagestring

Language requirement.

workEligibilitystring

Work authorization requirement.

applicationCountalwaysinteger

How many people have applied so far.

postedAtalwaysstring or null

When the job first went live. Null while it is a draft.

createdAtalwaysstring

When the job was created.

updatedAtalwaysstring

When it last changed.

Status codes

  • 200

    The published job.

  • 400

    The job cannot be published from its current status.

  • 401

    The API key is missing, expired, or revoked.

  • 403

    The job belongs to a company your app does not manage, or the key is missing the scope.

  • 404

    No job with this id.

Request
curl -X POST https://server.tabbio.com/v1/jobs/$JOB_ID/publish \
  -H "Authorization: Bearer $TABBIO_API_KEY"
Response 200
{
  "data": {
    "id": "<id>",
    "companyId": "<companyId>",
    "title": "<title>",
    "description": "<description>",
    "status": "<status>",
    "workMode": "<workMode>",
    "employment": "<employment>",
    "seniority": "<seniority>",
    "department": "<department>",
    "city": "<city>",
    "country": "<country>",
    "location": "<location>",
    "salary": {
      "min": 0,
      "max": 0,
      "currency": "<currency>",
      "period": "monthly"
    },
    "salaryVisible": false,
    "distribution": "<distribution>",
    "responsibilities": [
      "<responsibilities>"
    ],
    "requirements": [
      "<requirements>"
    ],
    "niceToHave": [
      "<niceToHave>"
    ],
    "benefits": [
      "<benefits>"
    ],
    "screeningQuestions": [
      {
        "id": "<id>",
        "prompt": "<prompt>",
        "type": "yes_no",
        "required": false,
        "order": 0,
        "options": [
          "<options>"
        ],
        "source": "default",
        "defaultKey": "<defaultKey>"
      }
    ],
    "eligibility": {
      "candidateLocation": "<candidateLocation>",
      "experienceYears": "<experienceYears>",
      "language": "<language>",
      "workEligibility": "<workEligibility>"
    },
    "applicationCount": 0,
    "postedAt": "<postedAt>",
    "createdAt": "<createdAt>",
    "updatedAt": "<updatedAt>"
  },
  "error": null,
  "meta": null
}

Base URL https://server.tabbio.com. Every response outside the token endpoint uses the { data, error, meta } envelope.