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.

Plan upgrade hints

When an Operator API request is refused because of the board's Cavuno plan, the error also carries an upgrade object. It names the capability that blocked the request, the cheapest self-serve plan that unlocks it (when that can be told), and the hosted billing endpoints that start the upgrade:

{
  "error": {
    "code": "settings_plan_required_for_branding_removal",
    "message": "Removing Cavuno branding requires a plan that includes branding removal.",
    "requestId": "req_...",
    "upgrade": {
      "capability": "canRemoveBranding",
      "requiredPlan": "basic",
      "checkout": { "method": "POST", "path": "/v1/billing/checkout" },
      "changePlan": { "method": "POST", "path": "/v1/billing/upgrade" }
    }
  }
}

Call GET /v1/billing/subscription first. With no active subscription, use checkout; with one, use changePlan. Send { "planKey": "<requiredPlan>" } and give the returned url to a person: both endpoints return a hosted page where a person confirms the purchase. Nothing is charged until they do. Each path is relative to the API origin (https://api.cavuno.com), like Location headers and list url fields, so do not join it to a base URL that already ends in /v1. Both endpoints need a key with billing.manage; a key without it should hand the person the dashboard's billing page instead. Board API errors never carry this field.

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.

Reporting problems

AI agents can report anything that got in the way of a task: a missing capability, unclear documentation, a surprising response, an unhelpful error, a bug or slow performance. POST /v1/feedback accepts Agent Feedback Protocol v0.1 reports, with or without an API key, and API error responses link to it in a Link: <https://api.cavuno.com/v1/feedback>; rel="agent-feedback" header. The discovery document is at https://api.cavuno.com/.well-known/agent-feedback.

curl https://api.cavuno.com/v1/feedback \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{ "type": "missing_capability", "goal": "What you were trying to do", "message": "What got in the way", "agent": { "name": "my-agent", "model": "model-name" } }'

type, goal and message are required. Each account or visitor can send 20 reports every 5 minutes. Never include credentials or personal data. Send the report, then continue with your task.

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, archived, or pending_approval (awaiting operator approval). draft does not include jobs awaiting approval.

    values
    • draft
    • published
    • expired
    • archived
    • pending_approval
  • 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",
      "customEmploymentType": {
        "key": "string",
        "label": "string"
      },
      "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"
      },
      "collectionValues": {
        "additionalProperty": [
          "string"
        ]
      },
      "proposedCompany": {
        "name": "string",
        "website": null
      },
      "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. Always set externalId (the source job URL or ATS requisition ID) so reposts are detected reliably. When the 409 has details.matched_on: "application_url", another job on your account uses the same applicationUrl; details.matching_jobs lists up to 5 of them. If the new job is a different role that shares that application destination (one ATS page or one inbox), retry with allowSharedApplicationUrl: true. The retry is a different request body, so send a new Idempotency-Key if you used one. remoteOption is required, and a salaryMin or salaryMax requires both salaryCurrency and salaryTimeframe; a missing one returns 400 validation_bad_request naming the field.

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, as HTML. Up to 25,000 characters. The HTML is sanitized on write: tags and attributes outside the supported formatting set (paragraphs, headings, lists, links, inline emphasis) are removed. Plain text without HTML tags is converted to paragraphs.

  • remoteOption
    Type: string enum
    required

    Required. Whether the role is on-site, hybrid, or fully remote: one of on_site, hybrid, remote. Omitting it or sending null returns 400. It is not valid on its own either: on_site and hybrid require at least one officeLocations entry, and remote requires remotePermits (use [{"type":"worldwide","value":"worldwide"}] for anywhere; remoteTimezones then auto-derives on POST).

    values
    • on_site
    • hybrid
    • remote
  • title
    Type: string
    min length:  
    1
    max length:  
    200
    required

    The job title.

  • allowSharedApplicationUrl
    Type: boolean

    Set to true to create this job even though another job on your account already uses the same applicationUrl (for example, several roles that share one ATS page or one application inbox). Only skips the application-URL duplicate check; a matching externalId or an identical job (same company, title, location and description) still returns 409 jobs_already_exists. Defaults to false.

  • 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.

  • collectionOverrides
    Type: array object[] · …500

    Per-job wording for selected collection entries, only on fields whose definition has allowOverrides. At most one item per selected entry; an item for an entry that is not selected on the job is rejected with 400 jobs_constraint_violation. The list replaces the job's stored overrides: on PATCH omit it to keep them and send [] to clear them all. Deselecting an entry through collectionValues drops its override.

  • collectionValues
    Type: object

    Collection-reference selections keyed by the configured job collection field key. Values are arrays of record IDs, including for single-select fields. On PATCH omitted keys are preserved; send null or an empty array to clear a field. Keys for fields whose collection is archived are ignored, and their stored selections are kept.

  • 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.

  • customEmploymentType
    Type: string | null
    min length:  
    1
    max length:  
    100

    Key of one of the board's custom employment types (GET /v1/settings/job-form → employmentType.customTypes). The job is saved with the Google equivalent of that type as its built-in employmentType, which is what Google for Jobs and feeds see. An unknown key, a type the board no longer offers (offered: false), or an employmentType that differs from its Google equivalent returns 400 jobs_constraint_violation. Pass null to clear the custom type and keep the built-in; omitted means unchanged.

  • 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.

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",
  "customEmploymentType": null,
  "remoteOption": "on_site",
  "remotePermits": [
    {
      "type": "worldwide",
      "value": "",
      "code": ""
    }
  ],
  "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": [
    {
      "query": ""
    }
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": ""
  },
  "collectionValues": {
    "additionalProperty": [
      ""
    ]
  },
  "collectionOverrides": [
    {
      "fieldKey": "",
      "recordId": "",
      "title": "",
      "description": ""
    }
  ],
  "title": "",
  "company": {
    "name": "",
    "website": null,
    "summary": null,
    "matchByName": true,
    "createIfMissing": true
  },
  "status": "draft",
  "allowSharedApplicationUrl": true
}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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 explicit expiry. An ordinary published job then receives the board's defaultJobDurationDays from its publication time (30 days when unset); drafts and sponsored jobs may remain without an 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.

  • collectionOverrides
    Type: array object[] · …500

    Per-job wording for selected collection entries, only on fields whose definition has allowOverrides. At most one item per selected entry; an item for an entry that is not selected on the job is rejected with 400 jobs_constraint_violation. The list replaces the job's stored overrides: on PATCH omit it to keep them and send [] to clear them all. Deselecting an entry through collectionValues drops its override.

  • collectionValues
    Type: object

    Collection-reference selections keyed by the configured job collection field key. Values are arrays of record IDs, including for single-select fields. On PATCH omitted keys are preserved; send null or an empty array to clear a field. Keys for fields whose collection is archived are ignored, and their stored selections are kept.

  • companyId
    Type: string

    Identifier of the company the job belongs to.

  • customEmploymentType
    Type: string | null
    min length:  
    1
    max length:  
    100

    Key of one of the board's custom employment types (GET /v1/settings/job-form → employmentType.customTypes). The job is saved with the Google equivalent of that type as its built-in employmentType, which is what Google for Jobs and feeds see. An unknown key, a type the board no longer offers (offered: false), or an employmentType that differs from its Google equivalent returns 400 jobs_constraint_violation. Pass null to clear the custom type and keep the built-in; omitted means unchanged.

  • 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, as HTML. Up to 25,000 characters. The HTML is sanitized on write: tags and attributes outside the supported formatting set (paragraphs, headings, lists, links, inline emphasis) are removed. Plain text without HTML tags is converted to paragraphs.

  • 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. When customEmploymentType is also sent, this must be the Google equivalent of that custom type (or be omitted: the server sets it). Sending a built-in type without customEmploymentType clears any custom type on the job.

    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.

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",
  "customEmploymentType": null,
  "remoteOption": "on_site",
  "remotePermits": [
    {
      "type": "worldwide",
      "value": "",
      "code": ""
    }
  ],
  "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": [
    {
      "query": ""
    }
  ],
  "externalId": null,
  "customFieldValues": {
    "additionalProperty": ""
  },
  "collectionValues": {
    "additionalProperty": [
      ""
    ]
  },
  "collectionOverrides": [
    {
      "fieldKey": "",
      "recordId": "",
      "title": "",
      "description": ""
    }
  ],
  "title": ""
}'
{
  "id": "string",
  "object": "job",
  "title": "string",
  "slug": null,
  "status": "draft",
  "companyId": null,
  "employmentType": "full_time",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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 an explicit expiry, null to clear the explicit expiry, or may be omitted to preserve an existing expiry. An ordinary published job without an explicit expiry receives the board's defaultJobDurationDays from its publication time (30 days when unset). Sponsored jobs may have no 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
  • expiresAt
    Type: string | null Format: date-time

    New explicit expiry as an ISO 8601 datetime. Pass null to clear the explicit expiry, or omit the field to preserve an existing expiry. An ordinary published job without an explicit expiry receives the board's defaultJobDurationDays from its publication time (30 days when unset). Sponsored jobs may have no expiry.

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",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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",
  "customEmploymentType": {
    "key": "string",
    "label": "string"
  },
  "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"
  },
  "collectionValues": {
    "additionalProperty": [
      "string"
    ]
  },
  "proposedCompany": {
    "name": "string",
    "website": null
  },
  "links": {
    "public": null,
    "admin": "https://example.com"
  },
  "resolvedCollectionFields": [
    {
      "key": "string",
      "label": "string",
      "entries": [
        {
          "id": "string",
          "name": "string",
          "slug": "string",
          "logoUrl": "string",
          "title": "string",
          "description": null,
          "titleOverride": null,
          "descriptionOverride": null,
          "fields": [
            {
              "key": "string",
              "label": "string",
              "type": "short_text",
              "helpText": "string",
              "options": [
                {
                  "key": "string",
                  "label": "string"
                }
              ]
            }
          ],
          "values": {
            "additionalProperty": "string"
          },
          "references": {
            "additionalProperty": [
              {
                "id": "string",
                "name": "string",
                "slug": "string",
                "fields": [
                  {
                    "key": "[Max Depth Exceeded]",
                    "label": "[Max Depth Exceeded]",
                    "type": "[Max Depth Exceeded]",
                    "helpText": "[Max Depth Exceeded]",
                    "options": "[Max Depth Exceeded]"
                  }
                ],
                "values": {
                  "additionalProperty": "[Max Depth Exceeded]"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "description": null,
  "applicationUrl": null,
  "remotePermits": [
    {
      "type": "string",
      "value": "string",
      "code": "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
    }
  ]
}

List applications for a job

​

Returns the applications made to one job, newest first. Requires candidates.read.

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.

Query Parameters
  • cursor
    Type: string
    min length:  
    1

    Pagination cursor.

  • limit
    Type: integer
    min:  
    1
    max:  
    100

    Page size (1–100, default 50).

  • stage
    Type: string
    min length:  
    1

    Only applications in this stage: a system stage value (for example review or hired) or a custom stage id. applied and review are the same column, so either returns rows whose stage is applied or review.

Responses
  • application/json
  • application/json
Request Example for get/jobs/{id}/applications
curl https://api.cavuno.com/v1/jobs/j8k2q7d4b9r3m6x0p5t1v7w2y9z4c8n3/applications \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "object": "list",
  "url": "/v1/jobs/{id}/applications",
  "hasMore": true,
  "nextCursor": null,
  "data": [
    {
      "id": "string",
      "object": "application",
      "jobId": "string",
      "candidateId": null,
      "isGuest": true,
      "name": null,
      "email": null,
      "stage": "string",
      "stageLabel": "string",
      "source": "string",
      "hasResume": true,
      "appliedAt": "string"
    }
  ]
}

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"
    ],
    "customEmploymentType": [
      ""
    ],
    "seniority": [
      "entry_level"
    ],
    "skills": [
      ""
    ],
    "categories": [
      ""
    ],
    "publishedAt": {
      "gte": "",
      "lte": ""
    },
    "customFields": [
      {
        "key": "",
        "values": [
          ""
        ]
      }
    ]
  },
  "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",
      "customEmploymentType": {
        "key": "string",
        "label": "string"
      },
      "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"
      },
      "collectionValues": {
        "additionalProperty": [
          "string"
        ]
      },
      "proposedCompany": {
        "name": "string",
        "website": null
      },
      "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,
        "upgrade": {
          "capability": "activeJobsLimit",
          "requiredPlan": "starter",
          "checkout": {
            "method": "POST",
            "path": "/v1/billing/checkout"
          },
          "changePlan": {
            "method": "POST",
            "path": "/v1/billing/upgrade"
          }
        }
      }
    }
  ]
}

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"
    }
  ]
}

Get job statistics

​

Return statistics about the Board’s published jobs: the exact published count against the plan limit, jobs per country, jobs per work arrangement, and how many jobs have no employment type, which Google for Jobs reads from the job’s structured data. The per-job statistics read up to 5,000 jobs; sample says whether they cover every published job.

Responses
  • application/json
  • application/json
Request Example for get/jobs/stats
curl https://api.cavuno.com/v1/jobs/stats \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "object": "job_stats",
  "publishedCount": 0,
  "activeJobLimit": null,
  "byCountry": [
    {
      "countryCode": "string",
      "name": "string",
      "count": 0
    }
  ],
  "byRemoteOption": [
    {
      "remoteOption": null,
      "count": 0
    }
  ],
  "missingEmploymentTypeCount": 0,
  "missingEmploymentTypeExamples": [
    {
      "id": "string",
      "title": "string"
    }
  ],
  "sample": {
    "scanned": 0,
    "complete": true
  }
}

Remote taxonomies (Collapsed)

​

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

Page content (Collapsed)

​

Intro copy on category and location pages: retrieve, set, and delete.

Operator (Collapsed)

​

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

Operator Operations

Members (Collapsed)

​

Invitations (Collapsed)

​

Billing (Collapsed)

​

Sales-led plans (Collapsed)

​

Transactions (Collapsed)

​

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.

Job feeds (Collapsed)

​

Recurring XML job feeds pulled from a URL on a schedule: connect, map fields, re-detect, and track runs.

Distribution (Collapsed)

​

XML feeds of your published jobs for job aggregators (Indeed, Jooble, Careerjet, Jora, Jobrapido, or a custom format), and the Cavuno distribution opt-in.

Usage (Collapsed)

​

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

Usage Operations

Email templates (Collapsed)

​

Customize the subject, preview text, and body of the emails your board sends.

Media (Collapsed)

​

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.

Audit logs (Collapsed)

​

Read your account audit-log entries.

Agent feedback (Collapsed)

​

Report a problem an AI agent hit with the API, CLI, MCP server or SDK (Agent Feedback Protocol v0.1).

Agent feedback Operations

Models