Skip to main content
POST
/
jobs
curl --request POST \
  --url https://api.kardow.com/jobs \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "title": "Backend Engineer",
  "description": "Build internal and public APIs.",
  "company_name": "Acme"
}
'
{
  "data": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "title": "<string>",
    "slug": "<string>",
    "status": "<string>",
    "created_at": "2023-11-07T05:31:56Z",
    "company_logo_url": "<string>"
  },
  "meta": {
    "organization_id": 123,
    "url": "<string>"
  }
}
Use this endpoint when an external system needs to publish jobs directly into Kardow.

Required Fields

title
string
required
Job title.
description
string
required
Full job description. HTML is accepted.
company_name
string
required
Hiring company name.

Application method

how_to_apply
string
Where candidates apply — an external URL, an email address, or a phone number. Pair with how_to_apply_method.
how_to_apply_method
string
Controls how Kardow presents the apply button. One of:
ValueWhen to use
form-externalhow_to_apply is a link to an external application form or ATS (most common)
websitehow_to_apply is a general company or job page
emailhow_to_apply is an email address
phonehow_to_apply is a phone number
formKardow hosts the application form — no URL needed
If omitted, Kardow auto-detects from the how_to_apply value.

Common optional fields

job_type
string
One of full-time, part-time, contract, internship, temporary, or casual.
location
string
Freeform location such as Remote, Paris, or San Francisco, CA.
is_remote
boolean
Set to true for remote roles.
salary_min
number
Minimum salary amount.
salary_max
number
Maximum salary amount.
salary_currency
string
Currency code such as USD.
salary_period
string
One of hourly, daily, weekly, monthly, or yearly.
contact_email
string
Recruiter or HR contact email (not the apply destination — use how_to_apply for that).
status
string
default:"pending"
One of pending, active, expired, or draft.

Examples

The most common case: your ATS or careers page hosts the form.
cURL
curl --request POST \
  --url https://api.kardow.com/jobs \
  --header "Content-Type: application/json" \
  --header "x-api-key: your-api-key-here" \
  --data '{
    "title": "Backend Engineer",
    "description": "Build internal and public APIs.",
    "company_name": "Acme",
    "how_to_apply": "https://jobs.acme.com/backend-engineer",
    "how_to_apply_method": "form-external"
  }'

Apply via email

cURL
curl --request POST \
  --url https://api.kardow.com/jobs \
  --header "Content-Type: application/json" \
  --header "x-api-key: your-api-key-here" \
  --data '{
    "title": "Office Manager",
    "description": "Run day-to-day office operations.",
    "company_name": "Acme",
    "how_to_apply": "jobs@acme.com",
    "how_to_apply_method": "email"
  }'

Remote role with salary details

cURL
curl --request POST \
  --url https://api.kardow.com/jobs \
  --header "Content-Type: application/json" \
  --header "x-api-key: your-api-key-here" \
  --data '{
    "title": "Senior Product Designer",
    "description": "Lead product design across web and mobile.",
    "company_name": "Acme",
    "location": "Remote",
    "is_remote": true,
    "job_type": "full-time",
    "how_to_apply": "https://jobs.acme.com/designer",
    "how_to_apply_method": "form-external",
    "salary_min": 90000,
    "salary_max": 120000,
    "salary_currency": "USD",
    "salary_period": "yearly",
    "contact_email": "jobs@acme.com"
  }'

JavaScript example

const response = await fetch("https://api.kardow.com/jobs", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": process.env.KARDOW_API_KEY,
  },
  body: JSON.stringify({
    title: "Senior Software Engineer",
    description: "Build product features across the stack.",
    company_name: "Acme",
    location: "Remote",
    is_remote: true,
    job_type: "full-time",
    how_to_apply: "https://jobs.acme.com/senior-swe",
    how_to_apply_method: "form-external",
    contact_email: "jobs@acme.com",
  }),
});

const result = await response.json();
console.log(result.data.id);

Response Shape

data.id
string
required
Newly created job UUID.
data.slug
string
required
Job slug.
data.status
string
required
Current job status.
meta.organization_id
number
required
Organization that owns the job.
meta.url
string
required
Relative URL for the created job.

Example response

{
  "data": {
    "id": "4d1b6fe8-688f-467c-b233-b5d6a51ce1cb",
    "title": "Backend Engineer",
    "slug": "backend-engineer",
    "status": "pending",
    "created_at": "2026-03-10T12:00:00.000Z",
    "company_logo_url": null
  },
  "meta": {
    "organization_id": 42,
    "url": "/jobs/backend-engineer"
  }
}

Authorizations

x-api-key
string
header
required

API key for authentication. Get yours from Settings > API Keys in the Kardow dashboard.

Body

application/json
title
string
required
description
string
required
company_name
string
required
how_to_apply
string

Where candidates apply — an external URL (e.g. https://acme.com/apply), an email address, or a phone number. Pair with how_to_apply_method.

how_to_apply_method
enum<string>

How candidates apply. form-external = link to external ATS/form (most common), website = general job page, email = email address, phone = phone number, form = Kardow hosts the form.

Available options:
form-external,
website,
email,
phone,
form
is_remote
boolean
is_highlighted
boolean
is_sticky
boolean
location
string
location_restricted
boolean
category_id
string<uuid>
job_type
enum<string>
Available options:
full-time,
part-time,
contract,
internship,
temporary,
casual
company_website
string<uri>
company_logo_url
string<uri>
salary_min
number
salary_max
number
salary_currency
string
salary_period
enum<string>
Available options:
hourly,
daily,
weekly,
monthly,
yearly
contact_email
string<email>
expires_at
string<date-time>
status
enum<string>
Available options:
pending,
active,
expired,
draft

Response

Job created

data
object
meta
object