Blue-collar job search
Search US trade, warehouse, and service listings (data sources including Indeed) by company, keyword, and location.
Blue-collar job search
We built a separate search for US hourly and trade roles — warehouse, forklift, manufacturing, field service — the listings that don't show up well in a LinkedIn-style req search. The results look like what you'd browse on Indeed, and similar boards such as ZipRecruiter, Snagajob, or CareerBuilder: title, company, location, pay when the posting lists it, and a URL to the full listing.
We consider job boards including Indeed among the data sources for this API. We do not ask you to log into those sites.
This is not Job search (jobPostingSearch). That
family is structured professional postings (title, seniority, modality,
LinkedIn job URL). Blue-collar search is a different contract: keyword +
location + company slug, US-only, billed per call.
What it does
- Resolve a company (optional) from a name like Caterpillar or Amazon, or
a domain like
walmart.com, into acompanySlug. - Search listings with at least one of
companySlug,query, orlocation. - Read cards — title, company, location, listing URL, optional salary parse, optional estimated post date.
- Page with
nextPageTokenwhen you searched by company slug.
Typical prompt this answers: "Warehouse worker jobs in Texas" or "open roles at Caterpillar."
Operations
| Job | Operation | HTTP | When to use |
|---|---|---|---|
| Resolve company | blueCollarResolveCompany | POST /v1/blue-collar-jobs/resolve-company | Turn a name/domain into companySlug |
| Search listings | blueCollarJobsSearch | POST /v1/blue-collar-jobs/search | Fetch listing cards |
OpenAPI: blueCollarJobsSearch, blueCollarResolveCompany.
Rate limit: 300 requests / minute. Recommended client timeouts: 30s
resolve, 60s search. There is no count endpoint — use
estimatedJobCount as a rough total only.
Call functions from @fiberai/sdk. Zod request schemas live on
@fiberai/sdk/zod.
import {
blueCollarJobsSearch,
blueCollarResolveCompany,
} from "@fiberai/sdk";
import type {
BlueCollarJobsSearchData,
BlueCollarResolveCompanyData,
} from "@fiberai/sdk";
import {
zBlueCollarJobsSearchData,
zBlueCollarResolveCompanyData,
} from "@fiberai/sdk/zod";
const resolveRequest: BlueCollarResolveCompanyData =
zBlueCollarResolveCompanyData.parse({
body: {
apiKey: process.env.FIBER_API_KEY!,
companyName: "Caterpillar",
domain: "caterpillar.com",
},
});
const resolved: Awaited<ReturnType<typeof blueCollarResolveCompany>> =
await blueCollarResolveCompany(resolveRequest);
const slug: string | undefined = resolved.data?.output.slug;
const searchRequest: BlueCollarJobsSearchData = zBlueCollarJobsSearchData.parse({
body: {
apiKey: process.env.FIBER_API_KEY!,
companySlug: slug,
query: "warehouse worker",
location: "Texas",
},
});
const page: Awaited<ReturnType<typeof blueCollarJobsSearch>> =
await blueCollarJobsSearch(searchRequest);
console.log("Listings:", page.data?.output.jobs.length);
console.log("Estimate:", page.data?.output.estimatedJobCount);
console.log("Next page:", page.data?.output.nextPageToken);
console.log("Cost:", page.data?.chargeInfo);Search inputs
At least one of companySlug, query, or location must be non-empty
(400 if all are missing).
| Field | What to send |
|---|---|
companySlug | From blueCollarResolveCompany. Company-only search lists that employer's board |
query | Title or keyword, e.g. forklift operator, CDL driver |
location | US city, state, or region, e.g. Philadelphia, PA, Texas |
nextPageToken | Opaque token from the previous search response |
You can combine them (company + keyword, keyword + city, all three).
Resolve company
Send companyName and/or domain (at least one). Response: slug,
companyName, optional jobCount (approximate open listings).
A company that does not resolve returns HTTP 404 and still charges
for the attempt (chargeInfo is on the 404 body). Transient 500s refund.
What a listing contains
Each jobs[] item: id, title, companyName, location, url,
optional description, optional estimatedPostedAt (ISO date), optional
salary:
salary field | Meaning |
|---|---|
text | As shown on the listing ($18 - $22 an hour) |
local | Parsed min/max in the listed currency, when parseable |
usd | USD min/max when the listing is in USD |
period | hourly | daily | monthly | yearly |
Pagination
nextPageToken is supported on company-slug searches. Keyword/location
searches return one deep page; passing a token without companySlug returns
400.
The token is opaque and must match the current search params. Paginate until
nextPageToken is null. Later pages can return fewer jobs than earlier
ones. Each page is a separate 2-credit call.
Using it effectively
- Resolve well-known employers (Amazon, Walmart, Caterpillar) before a
company-board walk so
companySlugis one we can match. - Keep
locationto US strings the job boards understand. Non-US locations are not supported. - Treat
estimatedJobCountas a hint, not a billable count API. - Honor HTTP 429. 503 means try again shortly.
chargeInfois authoritative.
Use cases
- Staffing / light industrial: warehouse and machine-operator volume in a metro.
- Field sales into plants: who is hiring maintenance or CDL roles at a named manufacturer.
- Local GTM: service businesses hiring in a state, then Kitchen Sink
- Contact Reveal on the company you care about.
Credits
| Operation | Default credits |
|---|---|
blueCollarJobsSearch | 2 per search call (including empty pages) |
blueCollarResolveCompany | 2 per resolve attempt (including 404) |
See Billing & credits.
Related: Job search · SDKs · MCP