Search open jobs (cacheable)
https://trawle.com/v1/jobs/searchThe same results and cursors as POST /v1/jobs/search. Pass query as a JSON-encoded JobQuery. Results never depend on cookies or viewer location. Use POST for queries too large for a URL.
Header x-api-key: Read-only API key from https://trawle.com/account#api-keys. 1,000 requests per daily window. Anonymous requests are also supported with a per-IP limit.
Query
querystringoptionalJSON-encoded JobQuery; default {}.
- Limits
- at most 6000 characters
cursorstringoptional- Limits
- 1 to 2000 characters
limitintegeroptional- Limits
- 1 to 100
postedSincestring<date-time>optional
200A page of jobs.SearchJobsResult
jobsarray<object> · JobSummaryrequired31 propertiesper item
idstringrequiredStable public id; never changes across scans.
- Example
019a3b6e-8f2c-7d41-9b0e-5c3f7a2d4e81
titlestringrequiredpostingIdstringoptionalThe concrete source posting whose facts and application link are shown.
postingCountintegeroptionalCurrently publishable source postings grouped into this job; not a headcount estimate.
- Limits
- at least 0
departmentstring | nulloptionalDepartment or team as supplied by the employer; null when not stated.
- Default
null
requirementsarray<string>optionalUp to three key must-have qualifications extracted from the posting. Preferred qualifications are excluded. Empty when not yet extracted or none are explicitly stated; not an exhaustive list.
- Default
[]- Limits
- at most 3 items, items: 1 to 160 characters
summarystring | nulloptionalOne-paragraph summary (generated).
- Default
null
experienceYearsobject | nulloptional- Default
null
2 properties
mininteger | nullrequiredmaxinteger | nullrequired
companyobject · CompanyRefrequired4 properties
slugstringrequired- Example
stripe
namestringrequired- Example
Stripe
domainstring | nullrequired- Example
stripe.com
isAgencybooleanrequiredA recruitment or staffing agency posting jobs for its clients, not its own. Job search leaves these out unless
agenciesis set.
roleobject | null · Refrequired2 properties
slugstringrequirednamestringrequired
familyobject | null · Refrequired2 properties
slugstringrequirednamestringrequired
locationsarray<object> · PlaceRefrequiredWhere the job is located (or, for remote jobs, who may apply), most specific first.
3 propertiesper item
idintegerrequiredGeoNames id (regions are negative).
namestringrequired- Example
Copenhagen
countrystring | nullrequiredISO 3166-1 alpha-2 country code; null for multi-country regions.
- Example
DK
workplacestring | nullrequired- One of
remotehybridonsite
remoteScopestring | nullrequiredFor remote jobs: who may apply, in words ("Anywhere", "United States only").
senioritystring | nullrequired- One of
internentrymidseniorleadprincipaldirectorvpexecutive
employmentTypestring | nullrequired- One of
full_timepart_timecontracttemporaryinternshipapprenticeshipseasonalvolunteer
salaryobject | null · SalaryrequiredPay as the employer listed it (not converted).
4 properties
mininteger | nullrequiredmaxinteger | nullrequiredcurrencystring | nullrequiredISO 4217 code.
- Example
EUR
periodstringrequired- One of
yearmonthweekdayhour
firstSeenAtstring<date-time>requiredFirst seen by Trawle under this id.
- Example
2026-10-31T06:12:00.000Z
lastSeenAtstring<date-time>requiredLast time a daily scan saw it open on the employer's site.
- Example
2026-10-31T06:12:00.000Z
postedAtstring<date-time> | nullrequired"Date posted" from the employer's ATS, when it has one. Often unreliable.
- Example
2026-10-31T06:12:00.000Z
openSincestring<date-time>requiredLegacy earliest observation of a similar posting. Not continuous time open or proof of the same requisition.
- Example
2026-10-31T06:12:00.000Z
repostCountintegerrequiredLegacy total of possible earlier postings plus reopenings. Use possibleRepostCount and reopenCount separately.
possibleRepostCountintegeroptionalreopenCountintegeroptionalhistoryStartedAtstring<date-time> | nulloptionalDetailed scan change capture began here. Earlier changes may be missing; null means capture has not started.
- Example
2026-10-31T06:12:00.000Z
lastListingChangeAtstring<date-time> | nulloptional- Example
2026-10-31T06:12:00.000Z
relatedPostingsarray<object>optionalUp to eight earlier matching postings, strongest evidence first. source_identity requires matching URL, ATS and requisition id on a confirmed board move. A similar title/location is only possible; never automatically merge decisions for it.
- Limits
- at most 8 items
4 propertiesper item
idstringrequiredtitlestringrequiredfirstSeenAtstring<date-time>required- Example
2026-10-31T06:12:00.000Z
confidencestringrequired- One of
source_identitypossible
closedAtstring<date-time> | nullrequiredWhen it disappeared; null while open.
- Example
2026-10-31T06:12:00.000Z
applyUrlstringrequiredThe employer's own posting (their ATS).
urlstringrequiredThis job on Trawle.
matchReasonsarray<object>optionalQuery-specific evidence returned by search, not a candidate fit score. Classification is not proof of an employer requirement. Absent outside search.
3 propertiesper item
labelstringrequiredevidencestringrequiredexplanationstringrequired
totalintegerrequiredMatches, capped at 10,000 (
totalCapped).totalCappedbooleanrequirednextCursorstring | nullrequiredNext page; null on the last.
selectedPlacesarray<object> · PlaceRefoptionalResolved query.places, independent of matching jobs. Includes country codes for location-aware currency defaults; unknown ids are omitted and multi-country regions have a null country.
3 propertiesper item
idintegerrequiredGeoNames id (regions are negative).
namestringrequired- Example
Copenhagen
countrystring | nullrequiredISO 3166-1 alpha-2 country code; null for multi-country regions.
- Example
DK
labelsobjectrequiredNames for the ids and slugs in the query, keyed
filter:value(places:2618425→Copenhagen). Excluded companies usecompanies:slugtoo. Unknown inclusions match nothing; unknown exclusions remove nothing. Unknown labels are absent.dataDatestring<date-time>requiredWhen the data was last refreshed (daily).
- Example
2026-10-31T06:12:00.000Z
nextSincestring<date-time>requiredSafe discovery boundary, not response time. Stable across cached pages and pagination. Save only after finishing all pages; pass unchanged as postedSince next run and deduplicate by job id because boundaries overlap. May remain unchanged while scans are incomplete; Unix epoch before a safe scan exists.
- Example
2026-10-31T06:12:00.000Z
400Invalid request: see error.issues and error.hint.Error
errorobjectrequired4 properties
codestringrequiredMachine-readable:
invalid_request,not_found,forbidden,rate_limited,internal.- Example
invalid_request
messagestringrequired- Example
places: expected an array of GeoNames ids
hintstringoptionalWhat to do next, e.g. which lookup to call first.
- Example
Resolve place names to ids with GET /v1/places?q=
issuesarray<object>optionalValidation problems, one per invalid field.
2 propertiesper item
pathstringrequiredmessagestringrequired
401Invalid, expired or revoked API key.Error
errorobjectrequired4 properties
codestringrequiredMachine-readable:
invalid_request,not_found,forbidden,rate_limited,internal.- Example
invalid_request
messagestringrequired- Example
places: expected an array of GeoNames ids
hintstringoptionalWhat to do next, e.g. which lookup to call first.
- Example
Resolve place names to ids with GET /v1/places?q=
issuesarray<object>optionalValidation problems, one per invalid field.
2 propertiesper item
pathstringrequiredmessagestringrequired
429Rate limit reached. Respect Retry-After and cache results.Error
errorobjectrequired4 properties
codestringrequiredMachine-readable:
invalid_request,not_found,forbidden,rate_limited,internal.- Example
invalid_request
messagestringrequired- Example
places: expected an array of GeoNames ids
hintstringoptionalWhat to do next, e.g. which lookup to call first.
- Example
Resolve place names to ids with GET /v1/places?q=
issuesarray<object>optionalValidation problems, one per invalid field.
2 propertiesper item
pathstringrequiredmessagestringrequired