Update a job
Changed onUpdates 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.
Request
- Base URL: https://api.cavuno.com/v1
- URL: https://api.cavuno.com/v1/jobs/{id}
- Auth: HTTP bearer
Path parameters
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.
Request body
Identifier of the company the job belongs to.
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.
URL-friendly slug for the job. Auto-generated from title when omitted.
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.
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.
Whether the role is on-site, hybrid, or fully remote. Omitted means unchanged; null returns 400 because a job's workplace type can be changed but not cleared. Never valid on its own: 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). Sending it alone returns 400.
Whether the employer sponsors visas for remote candidates. One of yes, no, or unknown.
Seniority level of the role. Pass null to clear the stored value; omitted means unchanged.
Where candidates apply. Accepts an HTTPS URL, a mailto: URI, or a bare email address (which is normalized to mailto: form).
Minimum salary, in salaryCurrency units. Pass null to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have salaryCurrency and salaryTimeframe whenever salaryMin or salaryMax is set; otherwise 400. Requests that send no salary field are not checked.
Maximum salary, in salaryCurrency units. Pass null to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have salaryCurrency and salaryTimeframe whenever salaryMin or salaryMax is set; otherwise 400. Requests that send no salary field are not checked.
Three-letter ISO 4217 currency code for salaryMin and salaryMax. Pass null to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have salaryCurrency and salaryTimeframe whenever salaryMin or salaryMax is set; otherwise 400. Requests that send no salary field are not checked.
Period the salaryMin and salaryMax figures are quoted against. Pass null to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have salaryCurrency and salaryTimeframe whenever salaryMin or salaryMax is set; otherwise 400. Requests that send no salary field are not checked.
Up to 100 canonical skill slugs from GET /v1/taxonomies/skills. Every slug must exist in this account.
Up to 100 canonical category slugs from GET /v1/taxonomies/categories. Every slug must exist in this account.
Whether the job appears in featured slots on the public board.
Time at which the job was first published, as a Unix epoch in milliseconds. When omitted on create with status: "published", the server stamps the current time. Useful for bulk-importing historical jobs while preserving original publication dates. PATCH may overwrite an existing value but cannot clear it.
Required education credentials. Each value is one of high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree, or no_requirements.
Minimum required experience, expressed in months.
If true, equivalent experience may substitute for the listed education requirements.
Period denominator for inOfficeFrequency.
How often the candidate must be in-office over inOfficePeriod.
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.
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.
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.
The job title.
Response
Successful response.
Unique identifier for the object. Use this value as the {id} path parameter for the job endpoints (e.g. GET /v1/jobs/{id}).
String representing the object's type. Objects of the same type share the same value.
The job title.
URL-friendly slug used in public board URLs, or null if no slug is set.
Current status of the job. One of draft, published, expired, archived, or pending_approval. A pending_approval job is waiting for an operator to approve it: approve with POST /v1/jobs/:id/publish, reject with DELETE /v1/jobs/:id. It is not public, like a draft.
Identifier of the company the job belongs to, or null if no company is attached.
Employment type of the role, or null if not specified. For a job with a custom employment type, this is the Google equivalent of the custom type.
Whether the role is on-site, hybrid, or fully remote. null only on older jobs saved without one; create requires it and PATCH cannot clear it.
Seniority level of the role, or null if not specified.
Minimum salary in salaryCurrency units, or null if not specified.
Maximum salary in salaryCurrency units, or null if not specified.
Three-letter ISO 4217 currency code for the salary range, or null if no salary is specified.
Period the salary range is quoted against, or null if no salary is specified.
Whether the job appears in featured slots on the public board.
Time at which the job was first published, or null if not yet published. ISO 8601 datetime.
Time at which the job expires as an ISO 8601 datetime. null can appear when the expiry requirement does not apply, including for drafts and sponsored jobs; ordinary published jobs always have an expiry.
Time at which the job was created. ISO 8601 datetime.
Time at which the job was last updated. ISO 8601 datetime.
Monotonic Job lifecycle revision used to reconcile webhook events. Legacy rows are 0 until the rollout backfill runs.
Canonical skill slugs assigned to the job.
Canonical category slugs assigned to the job.
External identifier supplied by the caller on create, used for deduplication via GET /v1/jobs?externalId=.... null when no external identifier was set.
Board-defined custom-field values for this job, keyed by the field key (the definitions are published at GET /v1/settings/job-form). Each value is returned as stored: a string (short_text / long_text / a single_select option key), a string array (multi_select option keys), a boolean, or a number. Always an object: {} when the job has no custom-field values, never null or a missing field. Only real values are stored, so this never contains null or empty values.
Operator-facing collection record IDs keyed by job collection field. Always an object; values are arrays even for single-select fields.
Long-form description of the role (HTML), or null if not specified.
Where candidates apply, or null if not specified. An HTTPS URL or mailto: URI.
Read-only: derived from remotePermits. true only when the authored selection is a single {type:"worldwide"} entry.
Read-only: derived from remoteTimezones (per-country/per-region offset fan-out). UTC hour offsets used by the job-search index.
Read-only: derived from remotePermits (hierarchical groups fan out to alpha2 sets; subdivisions auto-add the parent country). ISO 3166-1 alpha-2 codes.
Read-only: derived from remotePermits (subdivision entries only). ISO 3166-2 codes.
Whether the employer sponsors visas for remote candidates. One of yes, no, or unknown.
Required education credentials. Each value is one of high_school, associate_degree, bachelor_degree, professional_certificate, postgraduate_degree, or no_requirements.
Minimum required experience in months, or null if not specified.
If true, equivalent experience may substitute for the listed education requirements. null if not specified.
Period denominator for inOfficeFrequency, or null if not specified.
How often the candidate must be in-office over inOfficePeriod, or null if not specified.
Changes
- info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status
- info