Embed your jobs on your own website.

List offish jobs on your company site and send applicants into the hiring pipeline.

Quick start.

Find your slug in Recruitment → Career site & job boards, then fetch the listing. Only open, published jobs on enabled career sites are public.

const response = await fetch('https://api.offish.works/public/careers/{slug}');
if (response.ok) {
  const { company, jobs } = await response.json();
  // Render job titles as text; link to each canonical job page.
}

Authentication.

No API key. These endpoints are public and read-only, except the apply form. Requests from any origin are allowed, without credentials.

Base URL: https://api.offish.works

Endpoints.

GET /public/careers/{slug}

Company info and list of open, published jobs

GET /public/careers/{slug}/jobs/{jobSlug}

One job with the full description

POST /public/careers/{slug}/jobs/{jobSlug}/apply

Submit an application (multipart form)

GET /public/careers/{slug}/linkedin.xml

LinkedIn Jobs XML feed (404 until enabled)

GET /public/careers/{slug}/indeed.xml

Indeed XML feed (404 until enabled)

404 means the slug is unknown, the career site is disabled, or the job is not public.

Response examples.

{
  "company": {
    "name": "Your organization",
    "slug": "your-slug"
  },
  "jobs": [
    {
      "slug": "your-job-slug",
      "title": "Job title",
      "employmentType": "REGULAR",
      "workplaceType": "HYBRID",
      "city": "Makati",
      "state": "Metro Manila",
      "country": "PH",
      "salary": null,
      "excerpt": "Job description excerpt"
    }
  ]
}

Link jobs to https://offish.works/careers/{slug}/jobs/{jobSlug}. Append ?source=website to attribute applications. A closed job has closed: true; hide the apply button.

Applications.

Submit multipart/form-data. First name and last name (up to 80 characters each), and a valid email are required. A résumé is optional: PDF, Word or text, up to 10 MB. Validation errors return 400 with a message array.

{ "ok": true, "id": "…", "message": "Application received." }

Rate limits.

Per client IP, in a sliding 10-minute window: 600 listing or job reads and 30 applications. Over the limit returns 429 with Retry-After. Cache listings for one minute. Feeds cache for five minutes with an ETag.

Download the complete integration guide, including every response field, application field and embed example.

Open interactive API referenceOpen recruitment settings