API reference

REST API for managing jobs, companies, applications, and more

Try-it requests use a Bearer token you paste yourself. Generate a key from Settings → API Keys. Tokens stay in your browser.View OpenAPI on GitHubDownload OpenAPI
v1.0.0
OpenAPI 3.0.3

Cavuno v1 REST API

The Cavuno API is organized around REST. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.

Base URL

Production: https://api.cavuno.com/v1

All API requests must be made over HTTPS. Calls made over plain HTTP will fail.

Authentication

The Cavuno API uses API keys to authenticate requests. You can view and manage your API keys in the Cavuno dashboard, under Settings → Developer → API keys.

Cavuno API keys have the prefix cavuno_live_. Your API keys carry many privileges, so be sure to keep them secure. Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.

Authentication to the API is performed via Bearer auth. Provide your API key as the bearer token in the Authorization header:

curl https://api.cavuno.com/v1/jobs \
  -H "Authorization: Bearer YOUR_SECRET_API_KEY"

API requests without authentication will fail.

Rate limits

The Cavuno API has rate limits in place to ensure stability and reliability. By default, API keys are limited to 100 requests per minute. If you exceed your limit, requests return an HTTP 429 response with a Retry-After header indicating when you can try again.

If you have a use case that needs a higher limit, contact support.

Idempotency

The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a job fails due to a network connection error, you can safely retry the request with the same idempotency key, and we'll guarantee that only one job is created.

To perform an idempotent request, provide an additional Idempotency-Key header on any POST, PATCH, or DELETE request:

curl https://api.cavuno.com/v1/jobs \
  -X POST \
  -H "Authorization: Bearer cavuno_live_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Senior Engineer" }'

Errors

Cavuno uses conventional HTTP response codes to indicate the success or failure of an API request. In general: codes in the 2xx range indicate success, codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted), and codes in the 5xx range indicate an error with Cavuno's servers (these are rare).

Error responses include a JSON body with details:

{
  "error": {
    "code": "validation_bad_request",
    "message": "Field 'title' is required.",
    "requestId": "req_..."
  }
}

Some errors carry an additional details field with structured context, such as per-field validation issues.

When contacting support about a failed request, include the requestId value. It is the fastest way for us to find your request in our logs.

Server:https://api.cavuno.com/v1

Production

Client Libraries

Jobs

List jobs

Returns a list of your jobs. The jobs are returned sorted by creation date, with the most recently created jobs appearing first.

Query Parameters
  • cursor
    Type: string
    min length:  
    1

    An opaque pagination cursor returned in the nextCursor field of a previous response. Pass it back to fetch the next page of results.

  • limit
    Type: integer
    min:  
    1
    max:  
    100

    A limit on the number of objects to be returned. Limit can range between 1 and 100.

  • status
    Type: string enum

    Only return jobs matching the given status. One of draft, published, expired, or archived.

    values
    • draft
    • published
    • expired
    • archived
  • companyId
    Type: string
    min length:  
    1

    Only return jobs at the company with the given ID.

  • applicationUrl
    Type: string
    min length:  
    1
    max length:  
    2048

    Only return jobs matching this application URL. URLs are normalized server-side (casing, tracking params, etc.) so equivalent links match. Useful for deduplication lookups.

  • externalId
    Type: string
    min length:  
    1
    max length:  
    255

    Only return jobs with this externalId. Useful for deduplication lookups when reposting from an ATS.

Responses
  • application/json
  • application/json
Request Example for get/jobs
curl https://api.cavuno.com/v1/jobs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "object": "list",
  "url": "/v1/jobs",
  "hasMore": true,
  "nextCursor": null,
  "data": [
    {
      "id": "string",
      "object": "job",
      "title": "string",
      "slug": null,
      "status": "draft",
      "companyId": null,
      "employmentType": "full_time",
      "remoteOption": "on_site",
      "seniority": "entry_level",
      "salaryMin": null,
      "salaryMax": null,
      "salaryCurrency": null,
      "salaryTimeframe": "per_year",
      "isFeatured": true,
      "publishedAt": null,
      "expiresAt": null,
      "createdAt": "string",
      "updatedAt": "string",
      "revision": 0,
      "skills": [
        "string"
      ],
      "categories": [
        "string"
      ],
      "externalId": null,
      "customFieldValues": {
        "additionalProperty": "string"
      },
      "links": {
        "admin": "https://example.com"
      }
    }
  ]
}

Create a job

Creates a new job in draft status. The request is idempotent when an Idempotency-Key header is supplied. Reposts of existing jobs return 409 jobs_already_exists with the matching job ID.

Body·
required
application/json
  • applicationUrl
    Type: string
    min length:  
    1
    max length:  
    2048
    required

    Where candidates apply. Accepts an HTTPS URL, a mailto: URI, or a bare email address (which is normalized to mailto: form).

  • description
    Type: string
    min length:  
    1
    max length:  
    25000
    required

    Long-form description of the role. Up to 25,000 characters.

  • title
    Type: string
    min length:  
    1
    max length:  
    200
    required

    The job title.

  • categories
    Type: array string[] …100
    min length:  
    1

    Up to 100 canonical category slugs from GET /v1/taxonomies/categories. Every slug must exist in this account.

  • company
    Type: object ·

    An inline company payload, resolved via find-or-create before the job is created. Required unless you supply companyId — exactly one of the two must be present, and supplying both is an error.

  • companyId
    Type: string
    min length:  
    1

    The ID of an existing company. Required unless you supply company — exactly one of the two must be present, and supplying both is an error.

  • customFieldValues
    Type: object

    Board-defined custom-field values, keyed by the field key (definitions, including type and option keys, are published at GET /v1/settings/job-form). Writes are additive: on PATCH a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on POST this initializes the bag. Send a key with an intentional-empty value (null, "", or []) to clear it (""/null clear any type; [] clears a multi_select); false and 0 are kept as real values. Values must match the field type and single_select/multi_select must use defined option keys (not labels); a wrong-typed value is rejected (custom_field_wrong_type), never silently cleared. Unknown keys are ignored. The stored bag never contains null/empty values.

  • educationRequirements
    Type: array string[] enum

    Required education credentials. Each value is one of high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree, or no_requirements.

    values
    • high_school
    • associate_degree
    • bachelor_degree
    • professional_certificate
    • postgraduate_degree
    • no_requirements
  • employmentType
    Type: string enum

    Employment type of the role.

    values
    • full_time
    • part_time
    • contract
    • internship
    • temporary
    • volunteer
    • other
  • experienceInPlaceOfEducation
    Type: boolean

    If true, equivalent experience may substitute for the listed education requirements.

  • experienceMonths
    Type: integer
    min:  
    0

    Minimum required experience, expressed in months.

  • expiresAt

    Job expiry as a Unix epoch in milliseconds. On create, omitted or null defaults to 30 days from creation. On PATCH, pass null to clear an existing expiry. Past timestamps remove the job from the public board.

    • Type: integer
      min:  
      0

      Job expiry as a Unix epoch in milliseconds. On create, omitted or null defaults to 30 days from creation. On PATCH, pass null to clear an existing expiry. Past timestamps remove the job from the public board.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/jobs
curl https://api.cavuno.com/v1/jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "companyId": "",
  "description": "",
  "slug": "",
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "remotePermits": [
    {
      "type": "worldwide",
      "value": ""
    }
  ],
  "remoteTimezones": [
    {
      "type": "all",
      "value": "",
      "plusMinus": 0
    }
  ],
  "remoteSponsorship": "yes",
  "seniority": "entry_level",
  "applicationUrl": "",
  "salaryMin": 0,
  "salaryMax": 0,
  "salaryCurrency": "",
  "salaryTimeframe": "per_year",
  "skills": [
    ""
  ],
  "categories": [
    ""
  ],
  "isFeatured": true,
  "expiresAt": 0,
  "publishedAt": 0,
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": 0,
  "experienceInPlaceOfEducation": true,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": 0,
  "officeLocations": [
    {
      "locality": "",
      "city": "",
      "region": "",
      "country": ""
    }
  ],
  "externalId": "",
  "customFieldValues": {
    "additionalProperty": ""
  },
  "title": "",
  "company": {
    "name": "",
    "website": "",
    "summary": "",
    "matchByName": true,
    "createIfMissing": true
  },
  "status": "draft"
}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Retrieve a job

Retrieves the details of an existing job. You only need to supply the unique job ID that was returned upon job creation.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Responses
  • application/json
  • application/json
Request Example for get/jobs/{id}
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Update a job

Updates the specified job by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Pass expiresAt: null to clear the expiry.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Body·
application/json
  • applicationUrl
    Type: string
    min length:  
    1
    max length:  
    2048

    Where candidates apply. Accepts an HTTPS URL, a mailto: URI, or a bare email address (which is normalized to mailto: form).

  • categories
    Type: array string[] …100
    min length:  
    1

    Up to 100 canonical category slugs from GET /v1/taxonomies/categories. Every slug must exist in this account.

  • companyId
    Type: string

    Identifier of the company the job belongs to.

  • customFieldValues
    Type: object

    Board-defined custom-field values, keyed by the field key (definitions, including type and option keys, are published at GET /v1/settings/job-form). Writes are additive: on PATCH a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on POST this initializes the bag. Send a key with an intentional-empty value (null, "", or []) to clear it (""/null clear any type; [] clears a multi_select); false and 0 are kept as real values. Values must match the field type and single_select/multi_select must use defined option keys (not labels); a wrong-typed value is rejected (custom_field_wrong_type), never silently cleared. Unknown keys are ignored. The stored bag never contains null/empty values.

  • description
    Type: string
    max length:  
    25000

    Long-form description of the role. Up to 25,000 characters.

  • educationRequirements
    Type: array string[] enum

    Required education credentials. Each value is one of high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree, or no_requirements.

    values
    • high_school
    • associate_degree
    • bachelor_degree
    • professional_certificate
    • postgraduate_degree
    • no_requirements
  • employmentType
    Type: string enum

    Employment type of the role.

    values
    • full_time
    • part_time
    • contract
    • internship
    • temporary
    • volunteer
    • other
  • experienceInPlaceOfEducation
    Type: boolean

    If true, equivalent experience may substitute for the listed education requirements.

  • experienceMonths
    Type: integer
    min:  
    0

    Minimum required experience, expressed in months.

  • expiresAt

    Job expiry as a Unix epoch in milliseconds. On create, omitted or null defaults to 30 days from creation. On PATCH, pass null to clear an existing expiry. Past timestamps remove the job from the public board.

    • Type: integer
      min:  
      0

      Job expiry as a Unix epoch in milliseconds. On create, omitted or null defaults to 30 days from creation. On PATCH, pass null to clear an existing expiry. Past timestamps remove the job from the public board.

  • externalId
    Type: string | null
    min length:  
    1
    max length:  
    255

    An external identifier for the job from your own system, such as an ATS requisition ID. Pass null to clear the stored value; omitted means unchanged.

  • inOfficeFrequency
    Type: number
    min:  
    0

    How often the candidate must be in-office over inOfficePeriod.

Responses
  • application/json
  • application/json
  • application/json
Request Example for patch/jobs/{id}
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3 \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "companyId": "",
  "description": "",
  "slug": "",
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "remotePermits": [
    {
      "type": "worldwide",
      "value": ""
    }
  ],
  "remoteTimezones": [
    {
      "type": "all",
      "value": "",
      "plusMinus": 0
    }
  ],
  "remoteSponsorship": "yes",
  "seniority": "entry_level",
  "applicationUrl": "",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "skills": [
    ""
  ],
  "categories": [
    ""
  ],
  "isFeatured": true,
  "expiresAt": 0,
  "publishedAt": 0,
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": 0,
  "experienceInPlaceOfEducation": true,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": 0,
  "officeLocations": [
    {
      "locality": "",
      "city": "",
      "region": "",
      "country": ""
    }
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": ""
  },
  "title": ""
}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Delete a job

Permanently deletes a job. It cannot be undone. Saved jobs, orders, and any associated search-index entries are also removed.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Responses
  • 204

    Successful response.

  • application/json
Request Example for delete/jobs/{id}
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
No Body

Publish a job

Publishes a draft or expired job, making it visible on the public board. Plan and quota limits are enforced. expiresAt accepts an ISO 8601 string to set a new expiry, null to clear, or may be omitted. When omitted, a stored future expiry is preserved; a stored past expiry (e.g. set by a prior expire call) is cleared automatically so a republished job is never published with a stale past timestamp.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Body·
application/json
  • expiresAt
    Type: string | null Format: date-time

    New expiry as an ISO 8601 datetime. Pass null to clear the expiry. When omitted, the server preserves the existing expiry if it is still in the future; a stored expiry in the past (e.g. left over from a prior expire call) is cleared automatically so a republished job does not land in an immediately-invisible state.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/jobs/{id}/publish
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3/publish \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "expiresAt": null
}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Pause a job

Returns a published job to draft status. The job is removed from the public board until it is published again.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/jobs/{id}/pause
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3/pause \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Expire a job

Marks a published job as expired. The status is set to expired and expiresAt is set to the current time. Expired jobs are removed from the public board and can be reopened by publishing them again.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/jobs/{id}/expire
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3/expire \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Duplicate a job

Creates a new draft job by copying the fields of an existing job. The slug of the new job is generated with a copy-of- prefix to keep it unique.

Path Parameters
  • id
    Type: string
    min length:  
    1
    required

    The job's opaque object id: the id field returned by the job endpoints (e.g. j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3). This is NOT the slug or title; passing a slug like senior-backend-engineer returns 404. To look up a job by title or slug, use GET /v1/jobs or POST /v1/jobs/search and read the returned id.

Body·
application/json
Empty object
Responses
  • application/json
  • application/json
Request Example for post/jobs/{id}/duplicate
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3/duplicate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "remoteOption": "on_site",
  "seniority": "entry_level",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryTimeframe": "per_year",
  "isFeatured": true,
  "publishedAt": null,
  "expiresAt": null,
  "createdAt": "string",
  "updatedAt": "string",
  "revision": 0,
  "skills": [
    "string"
  ],
  "categories": [
    "string"
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": "string"
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "remoteWorldwide": null,
  "remoteTimezones": [
    {
      "type": "string",
      "value": "string",
      "plusMinus": 1
    }
  ],
  "remoteAllowedTzOffsets": [
    1
  ],
  "remoteWorkPermitCountryCodes": [
    "string"
  ],
  "remoteWorkPermitSubdivisionCodes": [
    "string"
  ],
  "remoteSponsorship": "yes",
  "educationRequirements": [
    "high_school"
  ],
  "experienceMonths": null,
  "experienceInPlaceOfEducation": null,
  "inOfficePeriod": "per_week",
  "inOfficeFrequency": null,
  "company": {
    "id": "string",
    "name": null,
    "slug": null,
    "logoUrl": null,
    "website": null
  },
  "officeLocations": [
    {
      "countryCode": null,
      "country": null,
      "locality": null,
      "city": null,
      "region": null,
      "regionCode": null,
      "postalCode": null,
      "displayName": null
    }
  ]
}

Search jobs

Searches your jobs using a free-text query and faceted filters. Results are returned sorted by creation date, with the most recently created jobs appearing first. Multi-value filters match jobs in any of the supplied values; range filters accept gte and lte bounds. Each filter array accepts up to 10 values.

Body·
application/json
  • cursor
    Type: string
    min length:  
    1

    An opaque pagination cursor returned in the nextCursor field of a previous response. Pass it back to fetch the next page of results.

  • filters
    Type: object

    Optional faceted filters to narrow search results. Multi-value filters match jobs in any of the supplied values; range filters accept gte and lte bounds.

  • limit
    Type: integer
    min:  
    1
    max:  
    100

    A limit on the number of objects to be returned. Limit can range between 1 and 100.

  • query
    Type: string
    max length:  
    200

    Free-text search query matched against job title and description. Up to 200 characters.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/jobs/search
curl https://api.cavuno.com/v1/jobs/search \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "query": "",
  "filters": {
    "status": [
      "draft"
    ],
    "companyId": [
      ""
    ],
    "remoteOption": [
      "on_site"
    ],
    "employmentType": [
      "full_time"
    ],
    "seniority": [
      "entry_level"
    ],
    "skills": [
      ""
    ],
    "categories": [
      ""
    ],
    "publishedAt": {
      "gte": "",
      "lte": ""
    }
  },
  "cursor": "",
  "limit": 20
}'
{
  "object": "search_result",
  "url": "/v1/jobs/search",
  "hasMore": true,
  "nextCursor": null,
  "data": [
    {
      "id": "string",
      "object": "job",
      "title": "string",
      "slug": null,
      "status": "draft",
      "companyId": null,
      "employmentType": "full_time",
      "remoteOption": "on_site",
      "seniority": "entry_level",
      "salaryMin": null,
      "salaryMax": null,
      "salaryCurrency": null,
      "salaryTimeframe": "per_year",
      "isFeatured": true,
      "publishedAt": null,
      "expiresAt": null,
      "createdAt": "string",
      "updatedAt": "string",
      "revision": 0,
      "skills": [
        "string"
      ],
      "categories": [
        "string"
      ],
      "externalId": null,
      "customFieldValues": {
        "additionalProperty": "string"
      },
      "links": {
        "admin": "https://example.com"
      }
    }
  ]
}

Run a batch of job operations

Runs up to 100 job operations in a single request. Supported sub-operations are create (POST), update (PATCH), delete (DELETE), publish, pause, expire, and duplicate. Each sub-operation runs independently; the response is HTTP 200 for any well-formed batch, and the per-operation outcome is reported on each entry of the data array.

Body·
required
application/json
  • operations
    Type: array 1…100
    required

    Array of sub-operations to execute. Each entry runs independently and reports its result on the corresponding entry of the response data array. Sub-operation id values must be unique within the batch. Up to 100 entries.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/jobs/batch
curl https://api.cavuno.com/v1/jobs/batch \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "operations": [
    {
      "id": "",
      "method": "POST",
      "body": null,
      "action": "",
      "resourceId": ""
    }
  ]
}'
{
  "object": "batch_result",
  "data": [
    {
      "id": "string",
      "status": 1,
      "data": null,
      "error": {
        "code": "string",
        "message": "string",
        "details": null
      }
    }
  ]
}

Export jobs

Exports the account’s jobs. format=json returns an inline list of export rows (max 10,000; fields mirror the CSV columns, camelCase). format=csv (default) returns 202 with an exports.generate operation — poll it, then download the CSV from GET /v1/operations/{id}/download once it succeeds. Requires jobs.read.

Query Parameters
  • format
    Type: string enum

    Export format. json streams an inline list of job export rows (capped at 10,000 rows); csv (default) starts an async exports.generate operation.

    values
    • csv
    • json
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/jobs/export
curl https://api.cavuno.com/v1/jobs/export \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "object": "list",
  "url": "/v1/jobs/export",
  "hasMore": true,
  "nextCursor": null,
  "data": [
    {
      "id": "string"
    }
  ]
}

Remote taxonomies (Collapsed)

Reference values accepted by the remote-permit and remote-timezone job fields.

Operator (Collapsed)

Current operator identity: Board binding, actor type, live role, and effective permissions/scopes.

Operator Operations

Members (Collapsed)

Invitations (Collapsed)

Candidates (Collapsed)

Candidates registered on your board: list, view, delete.

Billing (Collapsed)

Your account's platform subscription, entitlements, checkout, upgrade, and Stripe Connect status.

Plans (Collapsed)

Job-posting plans sold on your board: create, publish, price, and features.

Sales-led plans (Collapsed)

Coupons (Collapsed)

Transactions (Collapsed)

Unified billing ledger: job-posting orders and employer-subscription transactions.

Employer subscriptions (Collapsed)

Employer job-posting subscriptions on your board.

Paywall (Collapsed)

Candidate-access paywall configuration, offers, and subscription state.

Blog authors (Collapsed)

Blog tags (Collapsed)

Imports (Collapsed)

Bulk job imports: upload, map fields, confirm, and track progress.

Analytics (Collapsed)

Typed Board homepage analytics: overview metrics and traffic tables.

Usage (Collapsed)

Your account's actionable product capacity (used, limit, remaining).

Usage Operations

Media (Collapsed)

Domains (Collapsed)

Add, list, remove, and verify custom domains.

Marketing permissions (Collapsed)

Read marketing-email consent decisions off the board user records, and withdraw on request.

Redirects (Collapsed)

Create, list, update, and delete board redirect rules.

Operations (Collapsed)

Track long-running asynchronous operations.

Models