DEV Community

Cover image for How to Scrape Computrabajo Job Postings in LatAm Without a Paid API
Tim Zinin
Tim Zinin

Posted on Originally published at apify.com

How to Scrape Computrabajo Job Postings in LatAm Without a Paid API

The problem

Latin American job data — Mexico, Colombia, Chile, Argentina, Peru — usually arrives as exports: an employer's ATS dump, a recruiting partner's feed, a licensed regional batch. Those exports are messy in the same ways every time: duplicate postings, malformed timestamps, missing licence statements, and no stable way to tell whether a row was actually delivered and billed.

Scraping a job board directly is the obvious alternative, but it raises rights and fragility questions — and for Computrabajo specifically, the historical Store slug now belongs to a different kind of tool entirely. The painful part is rarely getting the data; it is turning it into clean, provenance-linked, review-ready records.

What the actor does

The Licensed LatAm Job Export Normalizer (the actor behind the computrabajo-jobs slug) is explicit about what it is today: it does not call Computrabajo or any other job board in export mode, makes zero source network requests, and is not affiliated with Computrabajo. Instead it:

  • Normalizes authorized exports: 1–100 structured job records you own or are licensed to use (buyer_owned_job_export, employer_authorized_export, ats_authorized_export, other_licensed_job_export), validated against a closed schema — unknown fields, bad types, impossible timestamps and control characters are rejected from paid work.
  • Deduplicates before billing on case-insensitive sourceName + sourceJobId, with a free diagnostic reporting suppression.
  • Preserves provenance on every row: source name, source URL, licence statement, retrieval timestamp and transformation disclosure are required fields, never optional.
  • Adds review machinery: stable deterministic IDs, input and row digests for idempotent ingestion, freshness computed from the buyer-supplied retrieval time, a deterministic contract-completeness confidence score with explicit gaps, a human-review summary and priority — and safeToAutomate: false on every row.
  • Reconciles the run: a KVS OUTPUT receipt records requested, unique, duplicate, invalid, delivered, paid, free, withheld and unknown counts, with an exact +1 named-event check per paid row.

Legacy country:query inputs still parse but produce a free migration diagnostic — no board is queried. An optional sourceMode: "live" observes exactly one bounded public Computrabajo search page, clearly labelled actor_fetched_public_page, without inheriting export-mode authorization.

Example: input and output

The documented minimal licensed-export input:

{
  "schemaVersion": "2.0",
  "authorization": "I confirm I may process and commercially use these job records.",
  "sourceContext": "employer_authorized_export",
  "batchName": "latam-sales-review",
  "freshnessHours": 168,
  "jobs": [
    {
      "sourceCountry": "mx",
      "sourceQuery": "ventas",
      "sourceJobId": "demo-sales-001",
      "title": "Account Executive",
      "company": "Example Employer SA de CV",
      "companyRating": null,
      "location": "Ciudad de México",
      "postedAt": "2026-08-12T09:00:00.000Z",
      "url": "https://careers.example.com/jobs/demo-sales-001",
      "employmentType": "Full-time",
      "descriptionSnippet": "Buyer-supplied summary of the role.",
      "sourceName": "Example employer ATS export",
      "sourceUrl": "https://careers.example.com/exports/jobs",
      "sourceLicense": "Employer-authorized export for recruiting operations.",
      "sourceRetrievedAt": "2026-08-12T10:00:00.000Z",
      "changesMade": "Selected fields and normalized whitespace."
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

A delivered row (licensed_job_record), excerpted from the README's checked example:

{
  "recordType": "licensed_job_record",
  "stableId": "licensed-job:…",
  "found": true,
  "title": "Account Executive",
  "company": "Example Employer SA de CV",
  "location": "Ciudad de México",
  "freshness": { "status": "fresh", "basis": "buyer_supplied_source_retrieval_time" },
  "change": { "status": "not_measured" },
  "decision": { "outcome": "review_required", "priority": "normal", "safeToAutomate": false },
  "billing": { "billingEligible": true, "eventName": "result-found", "settlementSource": "current_run_kvs_output" }
}
Enter fullscreen mode Exit fullscreen mode

Pricing and the free limit

Pay-per-event: $0.005 per run start plus $0.002 per delivered normalized job record. Migration, invalid-record and duplicate diagnostics are free. Per the README's own table, 100 delivered records cost $0.205. Apify's free plan gives $5 of usage credits per month, so $5 covers about 24 such runs — roughly 2,400 normalized records.

Try it

Confirm the rights statement, map one authorized record, and reconcile the OUTPUT receipt before scaling the batch: Licensed LatAm Job Export Normalizer

For AI agents and MCP

The actor takes a closed JSON contract and returns schema-enforced rows plus a machine-readable OUTPUT receipt, callable from the Apify API, the SDKs, or the hosted Apify MCP server documented in the README. An agent can key idempotent ingestion on stableId and the row digest, route rows by freshness.status and decision.priority, and reconcile spend from the receipt's named-event counters — while safeToAutomate: false keeps every record in a human review queue.

Top comments (0)