Create a watch
Create a watch. Watch a company domain (`type: company`) or a saved search filter (`type: search`).
Cost: FreeCreating a watch is free. Each job.opened event the watch delivers costs 1 credit, unless you already paid for that job; other events are free.
const url = 'https://api.betterjobs.cc/v1/watches';const options = { method: 'POST', headers: { 'BetterJobs-Version': '2026-10-01', 'Idempotency-Key': '7b8f2c4e-1a3d-4f5b-9c6e-0d2a4b6c8e1f', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"type":"company","domain":"acme-robotics.example","webhook_url":"https://hooks.northwind.example/betterjobs","events":["job.opened","job.closed","company.hiring_started","company.hiring_stopped"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.betterjobs.cc/v1/watches \ --header 'Authorization: Bearer <token>' \ --header 'BetterJobs-Version: 2026-10-01' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: 7b8f2c4e-1a3d-4f5b-9c6e-0d2a4b6c8e1f' \ --data '{ "type": "company", "domain": "acme-robotics.example", "webhook_url": "https://hooks.northwind.example/betterjobs", "events": [ "job.opened", "job.closed", "company.hiring_started", "company.hiring_stopped" ] }'Watch a company domain (type: company) or a saved search filter (type: search).
Matching events are delivered to webhook_url and appear in GET /events.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Header Parameters
Section titled “Header Parameters”Example
2026-10-01Date-pinned API version. Changes within a version are additive only. Defaults to your account’s pinned version.
Example
7b8f2c4e-1a3d-4f5b-9c6e-0d2a4b6c8e1fUnique key (for example a UUID). Retrying with the same key and body returns the first response and never charges twice. Same key with a different body returns 409 idempotency_conflict.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Required when type is company.
Filter grammar with suffix operators. Unknown fields return 400 unknown_filter.
object
Match any of these title keywords.
Exclude titles containing any of these.
ISO 3166-1 alpha-2 codes.
Jobs first seen within this many days.
true remote only, false non-remote only, null or omitted = any.
Keep jobs whose salary.min is at least this value (yearly, in the job’s currency). Jobs with salary null are excluded when set.
Include jobs with status: closed.
Event types to deliver. Defaults to all job and company events.
Examples
Watch one company
{ "type": "company", "domain": "acme-robotics.example", "webhook_url": "https://hooks.northwind.example/betterjobs", "events": [ "job.opened", "job.closed", "company.hiring_started", "company.hiring_stopped" ]}Watch a saved search
{ "type": "search", "filters": { "title_or": [ "Head of RevOps" ], "country_code_or": [ "DE", "AT", "CH" ] }, "webhook_url": "https://hooks.northwind.example/betterjobs", "events": [ "job.opened" ]}Responses
Section titled “ Responses ”Watch created.
object
Filter grammar with suffix operators. Unknown fields return 400 unknown_filter.
object
Match any of these title keywords.
Exclude titles containing any of these.
ISO 3166-1 alpha-2 codes.
Jobs first seen within this many days.
true remote only, false non-remote only, null or omitted = any.
Keep jobs whose salary.min is at least this value (yearly, in the job’s currency). Jobs with salary null are excluded when set.
Include jobs with status: closed.
Examples
Company watch
{ "id": "wat_6Np3QyR8tU", "type": "company", "domain": "acme-robotics.example", "filters": null, "webhook_url": "https://hooks.northwind.example/betterjobs", "events": [ "job.opened", "job.closed", "company.hiring_started", "company.hiring_stopped" ], "status": "active", "created_at": "2026-10-11T08:00:00Z"}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Invalid request (invalid_request) or unknown filter field (unknown_filter).
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
unknown_filter
{ "error": { "type": "invalid_request_error", "code": "unknown_filter", "message": "Unknown filter field 'job_title_or'. Did you mean 'title_or'?", "param": "filters.job_title_or", "doc_url": "https://docs.betterjobs.cc/platform/errors/#unknown_filter", "request_id": "req_4Bn8CxV2zA" }}invalid_request
{ "error": { "type": "invalid_request_error", "code": "invalid_request", "message": "limit must be between 1 and 100.", "param": "limit", "doc_url": "https://docs.betterjobs.cc/platform/errors/#invalid_request", "request_id": "req_2Cm7DwB1yZ" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Missing or invalid API key.
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
{ "error": { "type": "authentication_error", "code": "unauthorized", "message": "Missing or invalid API key. Send 'Authorization Bearer bj_live_...'.", "doc_url": "https://docs.betterjobs.cc/platform/errors/#unauthorized", "request_id": "req_5Dl6EvN0xY" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Your plan does not include this feature or provider.
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
{ "error": { "type": "permission_error", "code": "plan_required", "message": "Provider 'coresignal' is not enabled on your plan. Pro and above include all six providers.", "required_plan": "pro", "upgrade_url": "https://betterjobs.cc/pricing", "doc_url": "https://docs.betterjobs.cc/platform/errors/#plan_required", "request_id": "req_7Fj4GtL8vW" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Same Idempotency-Key reused with a different body.
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
{ "error": { "type": "conflict_error", "code": "idempotency_conflict", "message": "Idempotency-Key '7b8f2c4e-1a3d-4f5b-9c6e-0d2a4b6c8e1f' was used with a different request body.", "doc_url": "https://docs.betterjobs.cc/platform/errors/#idempotency_conflict", "request_id": "req_9Hh2IrJ6tU" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Too many requests. Wait Retry-After seconds.
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
{ "error": { "type": "rate_limit_error", "code": "rate_limited", "message": "Rate limit exceeded. Retry after 12 seconds.", "doc_url": "https://docs.betterjobs.cc/platform/errors/#rate_limited", "request_id": "req_0Ig1JqH5sT" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.
Example
12Seconds to wait before retrying.
Example
60Requests allowed in the current window.
Example
59Requests left in the current window.
Example
42Seconds until the window resets.
Something failed on our side. Safe to retry with the same Idempotency-Key.
object
object
Present on insufficient_credits.
Present on insufficient_credits and plan_required.
Offending field on invalid_request and unknown_filter.
Examples
{ "error": { "type": "api_error", "code": "internal_error", "message": "Unexpected error. Retry with the same Idempotency-Key; you will not be charged twice.", "doc_url": "https://docs.betterjobs.cc/platform/errors/#internal_error", "request_id": "req_1Jf0KpG4rS" }}Headers
Section titled “Headers”Example
req_7Hc2LmQ9xTUnique id for this request. Quote it to support.