How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
manatalin Career board slugs or URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Get public Manatal jobs from known careers-page.com boards. Read full job descriptions and apply links, or track job changes between complete snapshots. Start with {"tenants":["manatal"]}. Pricing is $0.04 per run plus $0.0045 per saved job row; empty and unchanged runs pay only the start fee.
Who uses it
Recruitment agencies
Track job lists that agencies publish on Manatal.
Sales teams
Use new roles at a company as a hiring signal.
Job board owners
Export jobs from known boards with links back.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.04 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Job record saved | $0.0045 | One unique current job or detected job change saved to the Dataset. |
Examples
- One job: about $0.04.
- 1,000 jobs: about $4.54.
- Every day 100 jobs, for 30 days: about $14.70 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 1,100 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
How many boards can I check?
Up to 3 known boards and 315 jobs per run.
Do empty runs cost money?
Only the start fee. No row fee is charged when nothing is saved.
Can I use a single job link?
No. Use a board name like manatal or the full board URL.
Does the title filter make the scan smaller?
No. The tool reads the full board first, then filters titles.
Details
Step by step on Apify
- Open Input and add
manatalto Career board slugs or URLs. - Keep
modeasscrapeandmaxResultsas315. - Set a maximum cost of at least $0.20 for this example.
- Click Start.
- Open Output and the Dataset. Check
title,source_job_idanddescription_text. - Check
OUTPUT.statusand each board status before using the results.
Use cases
| Task | Mode | Key fields |
|---|---|---|
| Build an export for known company boards | scrape | title, description_text, url |
| Check hiring signals | monitor | tenant, change_type, observed_at |
| Follow job edits | monitor | source_job_id, content_hash, description_text |
| Track agency job lists | scrape | company_name, department, location |
Tips for better results
- Start monitor mode without a run ID. The first run becomes your baseline.
- Copy the run ID of a complete run. Use it in the next monitor run.
- Clean the HTML in job texts before you show them on your site.
Limits and good to know
A source list can change while pages are read. Count changes, missing pages and conflicting duplicates prevent a complete snapshot. Equal-count source changes during a scan may remain undetected: the source does not offer an atomic snapshot. A page size or deadline failure also prevents a valid monitor baseline. Job descriptions are public source text and can include HTML; sanitize it before displaying it in your own website.
- Up to 3 known boards and 315 source jobs in total per run. Live checks covered 315 jobs from 3 boards
- 256 MB memory and a 90-second internal source deadline. A separate 120-second process limit also bounds initialization, storage and shutdown. A forced stop can leave missing terminal records; check run status
- At most 20 HTTP attempts, 2 retries per temporary failure, 2 MiB per response and 8 MiB total response data
- All boards are read before output filtering. More source jobs can hit the scan limit even if the filter matches none
complete: all boards and matching output are complete. An empty successful board uses this statuspartial: a board, source page, output limit or charge limit stopped a full result. Check the board reasonsnot_found: the requested board returned 404. The run fails if all boards are missingerror: invalid input, source, snapshot or storage failure. It does not mean there are no jobs
Troubleshooting
| What you see | What to check | Next action |
|---|---|---|
not_found | Board slug and public board URL | Check the careers-page.com URL and correct the slug. |
Empty Dataset, complete | Filter or no changes | Read RUN_SUMMARY and CHANGES.counts. |
partial, RESULT_LIMIT | maxResults | Use 315 or a narrower filter; start a new run. |
partial, CHARGE_LIMIT | Maximum cost | Allow start fee plus enough row events; run again. |
SCAN_LIMIT | Total source jobs | Use fewer or smaller boards. A title filter will not reduce source work. |
INCOMPATIBLE_SNAPSHOT | Same Actor, boards, complete flag | Pick a complete successful baseline. |
PREVIOUS_RUN_NOT_COMPATIBLE | Previous run status and owner access | Use a successful run of this Actor. |
error or missing records | Source availability or storage | Check logs; retry in a new bounded run. Do not use it as a baseline. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"tenant": "manatal",
"company_name": "Manatal Co LTD",
"source_job_id": "L8597V4V",
"title": "Business Development Internship (12PM - 9PM)",
"department": "Customer Success",
"location": "Bangkok, Bangkok, Thailand",
"employment_type": "full_time",
"url": "https://www.careers-page.com/manatal/job/L8597V4V",
"apply_url": "https://www.careers-page.com/manatal/job/L8597V4V/apply",
"change_type": "current"
}Use it from code
Actor ID: cliqtomedia/manatal-jobs-monitor-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/manatal-jobs-monitor-scraper").call(run_input={
"tenants": [
"manatal"
],
"mode": "scrape"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~manatal-jobs-monitor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tenants": ["manatal"], "mode": "scrape"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/manatal-jobs-monitor-scraper")
result = tool.invoke({"run_input": {"tenants": ["manatal"], "mode": "scrape"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (24)
| Field | Type |
|---|---|
tenant | string |
company_name | string |
source_platform | string |
source_job_id | string |
source_numeric_id | integer |
title | string |
department | string |
location | string |
city | string |
state | string |
country | string |
is_remote | boolean |
employment_type | string |
url | string |
apply_url | string |
posted_at | string |
source_url | string |
record_type | string |
source | string |
observed_at | string |
description_html | string |
description_text | string |
content_hash | string |
change_type | string |
Input settings (5)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Career board slugs or URLs required | tenants | array | ["manatal"] |
| Mode | mode | string | "scrape" |
| Previous complete run ID | previousRunId | string | |
| Maximum output rows | maxResults | integer | 315 |
| Title contains | titleContains | string | "" |
