Rippling Jobs Monitor & Scraper avatar

Rippling Jobs Monitor & Scraper

Pricing

from $1.60 / 1,000 saved job rows

Go to Apify Store
Rippling Jobs Monitor & Scraper

Rippling Jobs Monitor & Scraper

Collect jobs from public Rippling boards with dates, pay and optional descriptions. Track new, changed and closed listings. Export jobs and read clear scan status.

Pricing

from $1.60 / 1,000 saved job rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Categories

Share

Read public Rippling job boards and build a clear record of hiring activity. This Actor returns job titles, locations, dates, pay ranges and optional full descriptions. It can also save new, changed and closed listings from repeat scans.

Start with {"boards":["utility"]}. A run costs $0.035 plus $0.0016 per saved job row. The start fee also applies when there are no matching jobs or no changes. A stopped scan is marked partial.

Public Rippling jobs and listing changes

Table of contents

What it does

Add Rippling board names or links. The Actor reads each public board, joins rows for the same job and applies your filters. It reads one detail record for each current job it saves. This gives the company name, posting date, stated pay and employment type.

The Actor uses public HTTP data. You do not need a Rippling login, API key or proxy. It reads company job postings. It does not read private recruiting data or send job applications.

In monitor mode, it compares the title, department and all listing locations with the last complete scan. A change only to pay or description is not detected. See Schedules and monitoring.

Data you get

DataExampleWhen it can be empty
Job title and apply linkDirector of AIRequired for each saved current job
CompanyUTILITYBoard name is used if details cannot be read
All locationsRemote (United States)The board may give no location
Work arrangementhybridSource may omit the type; several types give mixed
Posting date2025-08-28T14:44:37.790ZMissing or failed detail record
Stated payUSD, yearly minimum and maximumCompany gives no pay
Full descriptionPlain text of company and role sectionsOff by default
Listing changeNEW, UPDATED, EXPIREDMonitor mode is off
Scan and row statuscomplete, partialAlways read the summary for board errors

Unknown data stays null. Dates are not guessed. Text descriptions remove email addresses, phone numbers and personal profile URLs. The Actor returns no contact fields. All locations are sorted, so the first location can differ from the order on the company's page.

Quick start

  1. Open Input. The form has utility in Rippling job boards as a prefill.
  2. Keep Maximum saved jobs at 100. Leave monitor mode off for your first run.
  3. Use 256 MB memory and a timeout of 180 seconds. Set a maximum charge such as $0.30.
  4. Click Start.
  5. Open Output → Jobs. Check title, company.name, postedAt and url.
  6. Open Scan summary. Check status, rowCount and the board statuses.

The checked Utility board returned 10 unique jobs. Live jobs can change. To use another company, follow an apply link on its careers page. In https://ats.rippling.com/utility/jobs, the board name is utility.

Input fields

boards is required. An empty object fails before any source request. The form prefill is a starting example, not a runtime default. Unknown input keys are rejected.

KeyTypeDefaultAllowed valuesEffectRecommendation
boardsstring[]Required; form prefill ["utility"]1–10 entries; board name up to 100 characters, or HTTPS ats.rippling.com link up to 250 charactersSelects company boards. Exact duplicate boards are read once. Names keep their case.Copy the name from a real apply link.
keywordsstring[][]Up to 20 phrases, 1–100 characters eachTitle contains all words of any one phrase, in any order, without case matching.Use "backend engineer", not a whole job description.
locationsstring[][]Up to 20 texts, 1–100 characters eachAny location name, city, state, country, country code or workplace type contains the text.Use "US", "London" or "Remote"; type is based on source fields.
departmentsstring[][]Up to 20 texts, 1–100 characters eachTop-level department contains any text.Copy a board department, such as "Engineering".
maxResultsinteger1001–300Limits all saved rows, including expired rows.Choose enough room for a whole monitor scan.
includeDescriptionbooleanfalsetrue / falseAdds plain description text. It adds no detail requests: each saved current job already needs one.Turn on when you need the text.
incrementalbooleanfalsetrue / falseSaves listing changes and remembers complete scans.Turn on for repeat monitoring.
stateKeystring""0–60 letters, numbers, _ or -Names monitor memory. Empty derives a name from boards and filters.Use a new name when you change boards or filters.
emitExpiredbooleantruetrue / falseIn monitor mode, saves rows for jobs missing from a complete scan.Keep on for closure alerts.
emitUnchangedbooleanfalsetrue / falseIn monitor mode, also saves and charges for unchanged jobs.Keep off for a change-only feed.
maxRequestsinteger3201–320Limits source attempts, including list pages, details and retries.Keep the default for full boards.
maxSecondsinteger12010–120Limits source work time. The Actor then saves its summary.Keep the Actor timeout longer than this value.

Filters within one array use OR. keywords, locations and departments use AND with each other. Empty filter arrays keep all jobs.

A link with a locale, such as /en-US/utility/jobs, is accepted. A link to one posting reads the whole board. URLs must have the exact HTTPS host ats.rippling.com and no credentials, port, query or fragment. Remove tracking text such as ?utm_source=... first. Company domains such as utility.agency are not board names.

A small maxResults can reduce detail requests. Filters still require reading complete board lists, even when no title matches. A scan with more matches than the result cap is partial and does not update monitor memory.

Input examples

Read one board with descriptions

{"boards":["utility"],"maxResults":100,"includeDescription":true}

The checked run returned 10 jobs. Each had a company name, posting date and description. Pay can be null.

Read selected roles

{"boards":["rippling"],"keywords":["Business Operations"],"maxResults":100}

The checked run returned two roles. A title filter can return zero rows after a full list scan. The start fee still applies.

Watch listing changes

{"boards":["utility"],"maxResults":100,"incremental":true,"stateKey":"utility-watch"}

The first complete run saves each job as NEW. A repeat scan with no listing changes returns zero rows. Both runs have a start fee.

Output example

This is a real row from the checked Utility run, with descriptions off.

{
"schemaVersion": "job.v1",
"id": "rippling:global:71035fd3-bff0-4450-b213-281637a07e6c",
"source": "rippling",
"market": "global",
"sourceJobId": "71035fd3-bff0-4450-b213-281637a07e6c",
"url": "https://ats.rippling.com/utility/jobs/71035fd3-bff0-4450-b213-281637a07e6c",
"title": "Director of AI",
"company": {
"name": "UTILITY",
"sourceCompanyId": "utility",
"url": "https://ats.rippling.com/utility/jobs"
},
"advertiser": {
"name": "UTILITY",
"sourceAdvertiserId": "utility"
},
"location": {
"raw": "Remote (United States)",
"suburb": null,
"city": "New York",
"region": "New York",
"postcode": null,
"country": "US"
},
"locations": [
{
"name": "Remote (United States)",
"city": "New York",
"state": "New York",
"country": "United States",
"countryCode": "US",
"workplaceType": "HYBRID"
}
],
"workArrangement": "hybrid",
"employmentTypes": [
"full_time"
],
"salary": {
"raw": null,
"min": null,
"max": null,
"currency": null,
"period": null,
"includesSuper": null
},
"classifications": [
{
"category": "Engineering",
"subcategory": null
}
],
"teaser": null,
"bulletPoints": [],
"postedAt": "2025-08-28T14:44:37.790Z",
"updatedAt": null,
"expiresAt": null,
"isPromoted": false,
"description": null,
"changeType": null,
"firstSeenAt": null,
"contentHash": "18bcb2c8eb4159484287e81d13d8a07d468c3faa35747f9411f647fa7e539c9d",
"scrapedAt": "2026-10-04T05:12:02.460Z",
"boardSlug": "utility",
"status": "complete",
"errors": []
}

Output fields

Each saved job has every top-level key below. Extra locations are kept in locations.

FieldType / can be nullExampleMeaning
schemaVersionstring; nojob.v1Core job field version
idstring; norippling:global:71035fd3-bff0-4450-b213-281637a07e6cStable Rippling job key
sourcestring; noripplingData source
marketstring; noglobalCompany board scope
sourceJobIdstring; no71035fd3-bff0-4450-b213-281637a07e6cRippling UUID
urlstring; nohttps://ats.rippling.com/utility/jobs/71035fd3-bff0-4450-b213-281637a07e6cCanonical posting / apply page
titlestring; noDirector of AITrimmed job title
company.namestring; noUTILITYDetail company name; board name if unavailable
company.sourceCompanyIdstring; noutilityBoard name
company.urlstring; nohttps://ats.rippling.com/utility/jobsPublic company board
advertiser.namestring; noUTILITYSame company name
advertiser.sourceAdvertiserIdstring; noutilitySame board name
location.rawstring or nullRemote (United States)All stated location names, joined with a vertical bar
location.citystring or nullNew YorkCity in the first sorted location
location.regionstring or nullNew YorkState or region in that location
location.countrystring or nullUSSource country code
location.suburb, location.postcodestring or null; currently nullnullNot supplied by this route
locationsobject[]; no[{"name":"Remote","countryCode":"US"}]All distinct source locations; each includes name, city, state, country, countryCode, workplaceType, each string or null
workArrangementstring or nullhybridremote, hybrid, on_site, mixed, or null; source type, not a guess from title
employmentTypesstring[]; no["full_time"]Known full_time, part_time, contract, internship or temporary types; unknown gives []
salary.rawstring or null170,000 - 250,000 USD per year (US)Stated ranges in all currencies
salary.min, salary.maxnumber or null170000, 250000Bounds for the first location's currency, or first pay range if no match; currencies are not mixed
salary.currency, salary.periodstring or nullUSD, yearCurrency as stated; source frequency in lower case
salary.includesSuperboolean or null; currently nullnullNot supplied
classificationsobject[]; no[{"category":"Engineering","subcategory":null}]Top-level department; category is string, subcategory is string or null
teaserstring or null; currently nullnullNot supplied
bulletPointsstring[]; no[]Separate bullet field is not extracted
postedAtUTC date string or null2025-08-28T14:44:37.790ZPosting creation date in Rippling
updatedAt, expiresAtdate string or null; currently nullnullNo source update/expiry date is returned
isPromotedboolean; nofalseNo promotion field is extracted
descriptionobject or nullnullNull when off or details unavailable; otherwise text, html and contactsRedacted keys
description.textstring; no when object existsJoin the Utility Team!Plain company and role text, up to 40,000 characters; empty if source text is empty
description.htmlstring or null; always nullnullHTML is not returned
description.contactsRedactedboolean; notrueContact redaction is always enabled
changeTypestring or nullNEWNEW, UPDATED, EXPIRED, REAPPEARED, UNCHANGED; null outside monitor mode
firstSeenAtUTC date string or null2026-10-04T05:00:00ZFirst monitor observation; stored after a complete scan; null outside monitor mode
contentHashstring; noSHA-256 hex valueHash of title, department and sorted locations
scrapedAtUTC date string; no2026-10-04T05:00:00ZTime this scan produced the row
boardSlugstring; noutilityBoard used for this row
statusstring; nocompletecomplete or partial for this row; not the whole run
errorsstring[]; no[]Safe error codes, such as DETAIL_NOT_FOUND or DESCRIPTION_TRUNCATED

Dataset and key-value store

SurfaceFieldsMeaning
Default DatasetJob rows aboveCurrent jobs and optional monitor change rows. Export JSON, CSV or Excel.
OUTPUTstatus, rowCount, summaryRecord, datasetIdLinks scan status to the Dataset and RUN_SUMMARY. Invalid input may omit datasetId.
RUN_SUMMARYstatus, reason, rowCount, boards, uniqueJobs, matched, requests, retries, responseBytes, outputBytes, elapsedSeconds, limits, stateCommitted, changes, startedAt, finishedAt, sourceCommit, buildId, datasetIdScan counters, bounds, board outcomes and release identity. An early runtime failure may have only status and reason.
CHANGESChange type → countSaved change rows by type; {} outside monitor mode or with no rows.

boards in the summary has board, status, sourceRows, uniqueJobs, matched and errors. Counts are integers. stateCommitted is boolean. limits gives maxResults, maxRequests, maxSeconds and maxResponseBytes. Times are UTC strings; elapsedSeconds is a number. reason is null or a safe code. IDs and version fields are strings. Errors are arrays of codes, not source payloads.

Price and examples

Pay per event: $0.035 per run start + $0.0016 per saved Dataset row ($1.60 per 1,000 rows). These are flat prices across plans. Platform usage is included in the event price for customers. A private run by the owner can show platform costs instead of a customer payment.

Saved rowsRunsEvent price
01$0.035
11$0.0366
101$0.051
1001$0.195
3001$0.515
1,000At least 4$1.74 with exactly 4 starts

The row limit is 300 per run. The 1,000-row example is a price calculation across separate boards or scopes. It is not a 1,000-row single-run capacity claim. Splitting one board by a result cap does not give pagination; repeat runs use the same stable order.

The start fee is paid with an empty board, filters with no matches or a monitor with no changes. A partial run charges for rows already saved. Error and cancelled runs may also have a start fee and saved-row fees. Rows that were not saved are not result events. No manual result charge is added on top of the Dataset event.

A maximum charge can stop output before your result cap. Use at least $0.035 to start and leave room for rows. For example, $0.04 leaves room for three rows. The Actor marks a charge stop partial and keeps prior monitor memory. Storage and charging are separate platform services; an interrupted write is not a guarantee of exactly-once delivery.

Use cases

  • Build a job feed from a known list of employers. Use sourceJobId and boardSlug to join rows across scans.
  • Track company hiring activity. Read titles, departments, country codes and stated pay.
  • Watch new roles and closed listings. Use incremental mode and act on changeType.
  • Review role text. Turn on includeDescription and keep null values for missing facts.

Schedules and monitoring

Choose incremental:true for repeat runs. Keep boards and filters fixed. An empty stateKey is derived from this scope. A named key with a different scope fails with STATE_SCOPE_OR_STORAGE_ERROR; use a new key instead.

ChangeMeaning
NEWNo previous record in this monitor
UPDATEDTitle, department or listing locations changed
EXPIREDMissing from a complete scan; saved once while its tombstone stays in memory
REAPPEAREDReturns after being marked expired
UNCHANGEDSame listing; saved only if emitUnchanged is true

The first complete scan creates memory. Unchanged jobs need no detail request when emitUnchanged:false. Changes only to description, pay, employment type or posting date are not checked. A partial scan does not change memory and never reports expired jobs. Its saved rows can appear and be charged again when you retry.

Memory holds up to 300 entries and 1 MiB, including recent expired records. Old expired records may be dropped to make room; a later return then appears as NEW. Each row is at most 64 KiB and total saved output is at most 8 MiB. These bounds can make a scan partial before the result count limit.

Run one scan at a time for a monitor key. Overlapping runs, manual memory edits and migration/resurrection are not supported for change delivery. In Apify, you can set your own schedule. This Actor does not create one for you. Leave enough time between runs for the previous scan to finish.

API, MCP and integrations

Use the Apify JavaScript client. Keep your token in an environment variable.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cliqtomedia/rippling-jobs-monitor-scraper').call(
{ boards: ['utility'], maxResults: 100 },
{ build: 'latest', memory: 256, timeout: 180, maxTotalChargeUsd: 0.30 }
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('RUN_SUMMARY');
console.log(items.length, summary?.value.status);

AI tools can call a published Actor through Apify's MCP server. Use the same input keys and spending cap. Access depends on your Apify account and the Actor's visibility.

Read Dataset rows through the API or connect your own Make, Zapier or n8n flow. Use the summary before acting on closed-job alerts. Export nested fields as JSON when you need all locations and pay details. This release checks the Apify API and storage surfaces; individual external integrations are not part of the acceptance test.

Limits and partial results

The live acceptance scan read 10 boards and saved 300 unique jobs. The source had more matches, so the result was correctly marked partial. The highest live test with full descriptions is 10 jobs. Larger runs with descriptions can meet byte or time limits sooner. These are measured samples, not a promise of fixed time for every board.

Hard limits: 10 input entries, 300 saved rows, 320 source attempts, 120 seconds of source work, 12 MiB of response bodies, 64 KiB per row and 8 MiB total output. Lists have a separate limit of 20 pages and 20,000 location rows per board. A run uses at most five source requests per second. It retries 429 and server/network failures up to twice, with backoff and Retry-After. Requests time out after at most 15 seconds. Use 256 MB memory and an Actor timeout up to 240 seconds; larger settings fail before source work.

Summary statusMeaningWhat to do
completeEvery requested board and needed detail completed; zero matches is validUse rows and change events
partialA board/detail failed, a posting disappeared, or a count/time/byte/charge limit stopped outputUse saved rows, read reasons, retry with a smaller scope
not_foundEvery board returned not foundCheck spelling and case
errorNo usable board, invalid input/state/runtime settings, or a storage failureRead the summary; the Actor run fails

A description can be trimmed at 40,000 characters; that row and scan are partial. Detail failure keeps listing fields in a partial row, with missing detail fields null. Board failures are listed in the summary, not sold as job rows. Public endpoint changes can require a parser update. The Actor is an independent tool, not endorsed by Rippling.

Troubleshooting

SymptomLikely reasonCheck and action
Zero jobs, completeFilters found no matches, board is empty, or monitor saw no changesCheck matched/uniqueJobs and CHANGES; try without filters
Zero jobs, not_foundBoard name or case is wrong, or board closedCopy a current apply link
partialA cap or source problemRead reason and boards/errors; reduce boards or raise a cap within its allowed range
STATE_SCOPE_OR_STORAGE_ERRORSame monitor name with different boards/filters, or storage unavailableUse a new stateKey for a new scope
RUNTIME_LIMITSMore than 256 MB memory or no finite positive timeoutUse 256 MB and 180 seconds
INVALID_INPUTUnknown key, wrong type or out-of-range valueUse an example above and check the field table
Description is nullSetting off or details unavailableTurn on includeDescription and read row errors
Date or salary is nullSource has no fact or detail failedKeep null; check the public job page

FAQ

Can I enter a company website? Use its Rippling board name or ats.rippling.com link. This Actor does not discover boards from company domains.

Are descriptions extra? There is no extra description event or extra detail request. Large text still uses time and byte limits.

Can I detect a pay-only edit? No. Monitoring compares listing fields. To read current pay, run a normal scan.

Is an unchanged monitor run free? The start fee applies. No saved rows means no row events.

Does partial mean the jobs are false? Saved rows can still be useful. It means the whole requested scan did not finish. Check each row's status as well.

Can I use the same monitor key in two schedules? Run them at different times, with the same scope. Overlapping runs are not supported.

What is the stable key? sourceJobId is the UUID; use boardSlug + ':' + sourceJobId when joining several boards.

Support

Open the Actor's Issues tab. Include the run ID, the public board name and the result you expected. Do not send tokens, private recruiting data or candidate details.