Fiber AI
Search & discovery

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

  1. Resolve a company (optional) from a name like Caterpillar or Amazon, or a domain like walmart.com, into a companySlug.
  2. Search listings with at least one of companySlug, query, or location.
  3. Read cards — title, company, location, listing URL, optional salary parse, optional estimated post date.
  4. Page with nextPageToken when you searched by company slug.

Typical prompt this answers: "Warehouse worker jobs in Texas" or "open roles at Caterpillar."

Operations

JobOperationHTTPWhen to use
Resolve companyblueCollarResolveCompanyPOST /v1/blue-collar-jobs/resolve-companyTurn a name/domain into companySlug
Search listingsblueCollarJobsSearchPOST /v1/blue-collar-jobs/searchFetch 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).

FieldWhat to send
companySlugFrom blueCollarResolveCompany. Company-only search lists that employer's board
queryTitle or keyword, e.g. forklift operator, CDL driver
locationUS city, state, or region, e.g. Philadelphia, PA, Texas
nextPageTokenOpaque 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 fieldMeaning
textAs shown on the listing ($18 - $22 an hour)
localParsed min/max in the listed currency, when parseable
usdUSD min/max when the listing is in USD
periodhourly | 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 companySlug is one we can match.
  • Keep location to US strings the job boards understand. Non-US locations are not supported.
  • Treat estimatedJobCount as a hint, not a billable count API.
  • Honor HTTP 429. 503 means try again shortly.
  • chargeInfo is 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

Credits

OperationDefault credits
blueCollarJobsSearch2 per search call (including empty pages)
blueCollarResolveCompany2 per resolve attempt (including 404)

See Billing & credits.

Related: Job search · SDKs · MCP

On this page