---
title: "Create a job feed"
method: POST
path: "/job-feeds"
tags: ["Job feeds"]
---

# Create a job feed

`POST /job-feeds`

## Request

- Base URL: `https://api.cavuno.com/v1`
- URL: `https://api.cavuno.com/v1/job-feeds`
- Auth: HTTP bearer

Connects an XML job feed URL (for example an ATS or Indeed-style feed). The URL is fetched once to check it serves XML before it is saved. The first run starts straight away and detects the field mapping; until it finishes the feed is `pending_mapping` and `mapping` is `null`. Poll `GET /job-feeds/{id}`.

## Request body

- CreateJobFeedBody
  - `url` string, uri, required: The XML feed URL. Checked before it is saved: Cavuno fetches it once and refuses a blocked, unreachable or non-XML URL.
  - `name` string: Display name. Defaults to a name derived from the URL host.
  - `intervalHours` union: Hours between pulls.
    - 1
    - 3
    - 6
    - 12
    - 24
  - `expireMissing` boolean: Expire a job once it is missing from two successful runs in a row.
  - `jobLimit` integer, nullable: Most jobs this feed may have published at once. `null` means no per-feed cap (plan and Board limits still apply).

## Response `201`

The created job feed.

- JobFeedDetail
  - `id` string, required
  - `object` 'job_feed', required
  - `name` string, required
  - `url` string, required
  - `status` 'pending_mapping' | 'active' | 'failing' | 'needs_review', required: `pending_mapping`: the first run (or a re-detection) has not produced a mapping yet. `failing`: recent runs failed (see `lastError`). `needs_review`: runs are held until the mapping is fixed or re-detected.
  - `enabled` boolean, required
  - `intervalHours` number, required
  - `expireMissing` boolean, required
  - `jobLimit` number, nullable, required
  - `applyUrlAttribution` union, required: Outbound apply-URL attribution for this feed's jobs. `inherit` uses the Board setting.
    - object
      - `mode` 'inherit', required
    - object
      - `mode` 'off', required
    - object
      - `mode` 'append', required
      - `params` ApplyUrlParamTemplate[], required
        - `key` string, required
        - `valueTemplate` string, required
  - `lastRunAt` string, nullable, required
  - `nextRunAt` string, nullable, required: When the next pull is due. `null` while the feed is disabled.
  - `lastError` string, nullable, required
  - `consecutiveFailures` number, required
  - `createdAt` string, required
  - `mapping` object, nullable, required: Typed, operator-reviewable mapping. `null` until the first run (or a re-detection) has detected one.
    - `fieldMappings` object[], required
      - `sourceColumn` string, required
      - `targetField` string, required
      - `confidence` number, required
      - `notes` string
    - `valueTransforms` object[], required
      - `sourceColumn` string, required
      - `targetField` string, required
      - `map` object, required
      - `fallback` string
    - `defaults` object, required
      - `employmentType` string
      - `remoteOption` string
      - `currency` string
      - `descriptionFormat` string
    - `fieldsNeedingReview` string[], required: Job fields whose detected mapping should be checked.
    - `sourceColumns` object[], required: Columns seen in the feed, with a few sample values.
      - `name` string, required
      - `samples` string[], required

## Other responses

- `400`: Invalid request.
- `409`: The Board already has its maximum job feeds.
- `422`: The feed URL failed the pre-save check.
- `429`: Too many feed URL checks.

## Changes

- **2026-10-20** `cee1c2d567e5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/job-feeds/post.md)

---

[API](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api.md) · [All operations](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/revisions/d5974dabff14?raw)
