Purpose
Retrieve the most recently posted remote and hybrid jobs from Remote DXB (remotedxb.com), a UAE/Dubai-focused remote job board. Returns a structured, newest-first list of listings with title, company, location, work model, commitment, posted date, category, salary range, tags, and the canonical job-detail URL. This is a read-only skill — it lists/searches jobs and never applies. The optimal path requires no live browser: a single HTTP GET returns the full server-rendered job feed as JSON, because the site is a Laravel + Inertia.js app that embeds its page data in the HTML.
When to Use
- "Show me the latest / newest remote jobs in Dubai (or the UAE)."
- "What remote jobs were posted today on Remote DXB?"
- "Find completely-remote or hybrid roles in a category (engineering, marketing, sales, …)."
- "Search Remote DXB for jobs matching a keyword / location / tag."
- Building a feed or alert of fresh UAE remote/hybrid openings.
Workflow
The recommended method is a single browserless_agent call that navigates the homepage and reads the embedded JSON in-page — the latest jobs are sorted newest-first and embedded directly in the server-rendered HTML. No proxy, no login, no waiting for hydration.
gotohttps://www.remotedxb.com/and parse the#appscript in-page. Use thewww.host: the apexhttps://remotedxb.com/301-redirects towww(a real browser follows the redirect natively, but hittingwwwdirectly saves the hop). Cloudflare fronts the site but serves content normally to a plainbrowserless_agent— noproxyarg is needed (verified). One call does the whole job:{ "commands": [ { "method": "goto", "params": { "url": "https://www.remotedxb.com/", "waitUntil": "load", "timeout": 45000 } }, { "method": "evaluate", "params": { "content": "(()=>{ const el = document.getElementById('app'); const page = JSON.parse(el.getAttribute('data-page') || el.textContent); const p = page.props; const L = p.listings; return JSON.stringify({ total: L.total, current_page: L.current_page, last_page: L.last_page, per_page: L.per_page, next_page_url: L.next_page_url, jobs: L.data }); })()" } } ] }The
evaluatereturns the projected paginator under.value— no need to ship the raw HTML. (Same data is also available by sending anX-Inertia: truerequest header from a raw client, but the in-page#appread needs no custom headers.)Read the Inertia payload. The
#appelement carries the Inertiadata-pageobject;props.listingsis the Laravel paginator (theevaluateabove already projects it).Read
props.listings— a Laravel paginator:{ current_page, last_page, per_page (10), total, from, to, data[], next_page_url }.props.listings.datais already sorted newest-first bypostedDate— that array is the latest jobs.Map each item to your output shape (see Expected Output). Useful fields per listing:
id, title, companyName, companyLogo, location, primaryCountryCode, remoteStatus, remoteLabel, commitment, postedDate, category, categorySlug, salaryRange, tags, href, applyMethod, applyLink, applyEmail, excerpt, description(description is HTML).For more than 10 results, fetch
https://www.remotedxb.com/?page=2,?page=3, … (follownext_page_url). Each page returns the next 10 in the same newest-first order.To filter (all params combine), add query params whose names are the camelCase plural facet props with
[], using the slugs found in the homepage props (props.categories,props.locations,props.remoteStatuses,props.tags, etc.):?search=<text>— free-text keyword?categories[]=engineering-architecture?locations[]=dubai?remoteStatuses[]=completely-remote(orhybrid)?tags[]=ai,?experiences[]=<slug>,?commitments[]=<slug>,?salaryRanges[]=<slug>- Echoed back under
props.filters; unknown param names are silently ignored (full list returned,filters: []).
Snapshot fallback (only if the #app JSON read fails)
If the #app script is ever absent or its shape drifts, fall back to reading the rendered cards from the same browserless_agent call — a plain no-proxy agent is sufficient (no Cloudflare challenge, verified across runs):
{ "method": "goto", "params": { "url": "https://www.remotedxb.com/", "waitUntil": "load", "timeout": 45000 } }.{ "method": "snapshot" }— the 10 newest job cards are server-rendered and present immediately; no scroll or wait is required for the first page.- Read each card: title, company, location, work-model badge (Completely Remote / Hybrid), commitment (Full Time / Contract / Part Time), the "Today"/date label, and the
/job/<slug>--<id>link. - For more results, add another
gotoon?page=2, etc. Batching a page'sgoto+ read in one call is convenient (fewer round-trips); the session also persists across separate calls (keyed byproxy/profile), so splitting across calls works too.
Site-Specific Gotchas
- It's Laravel + Inertia.js, not WordPress. Detect via the
Vary: X-Inertiaresponse header. There is no/wp-jsonAPI. The "API" is simply the JSON embedded in every page's<script id="app" type="application/json">tag (and the same data is returned with anX-Inertia: truerequest header, but the embedded-script approach needs no custom headers). - Always use
www.—remotedxb.com→ 301 →www.remotedxb.com. A real browser follows the redirect natively, but pointinggotostraight atwwwsaves a round-trip. - A
proxyarg is NOT required despite the homepage being Cloudflare-fronted (a pre-run probe hinted proxies might be needed, but a plain no-proxybrowserless_agentreturns 200 with full content). Don't setproxyunless you actually start seeing a Cloudflare challenge. - Newest-first is the default sort on the homepage feed — no sort param needed for "latest jobs." Page 1 = the freshest listings.
- Pagination is 10 per page (
per_page: 10, ~2,000+ total listings, ~200 pages). Use?page=N/next_page_url. - Filter param names are camelCase plural with
[](categories[],locations[],remoteStatuses[],tags[], …). Barecategories=(no brackets) returns HTTP 500;category[](singular) andremote_status[](snake_case) are silently ignored and return the unfiltered list. - Job detail URL pattern is
/job/<slug>--<numericId>with a double dash before the id (e.g./job/medical-escort-a-r-t-ambulance-services-llc--195239). It is NOT/jobs/<id>—/jobs/<id>does not resolve to a listing. locationmay be a UAE emirate (Dubai, Abu Dhabi, Sharjah, Umm Al Quwain, …) orGLOBALfor worldwide-remote roles.applyEmailis oftenmailto:(empty) whenapplyMethodislink; the real apply target is thenapplyLink(e.g.https://www.remotedxb.com/apply/<code>).- Homepage props also carry the full facet vocabularies you can use to build filters:
props.categories(id/name/slug/count),props.locations,props.remoteStatuses,props.tags,props.experiences,props.commitments,props.salaryRanges,props.languages.
Expected Output
Latest-jobs feed (page 1, newest first):
{
"success": true,
"source": "https://www.remotedxb.com/",
"page": 1,
"per_page": 10,
"total": 2054,
"jobs": [
{
"id": 9067,
"title": "Medical Escort",
"company": "A R T Ambulance Services L.L.C.",
"location": "Dubai",
"remote_status": "Completely Remote",
"commitment": "Contract",
"category": "Healthcare & Telemedicine",
"salary_range": null,
"tags": [],
"posted_date": "2026-06-20T10:00:05+00:00",
"url": "https://www.remotedxb.com/job/medical-escort-a-r-t-ambulance-services-llc--195239",
"apply_link": "https://www.remotedxb.com/apply/NBY5A"
},
{
"id": 9060,
"title": "Print & Digital Sales, Marketing & Events Director",
"company": "Reflex Media",
"location": "GLOBAL",
"remote_status": "Completely Remote",
"commitment": "Full Time",
"category": "Sales & Business Development",
"posted_date": "2026-06-20T01:00:03+00:00",
"url": "https://www.remotedxb.com/job/print-digital-sales-marketing-events-director-reflex-media--194500"
}
],
"error_reasoning": null
}Filtered/empty result (e.g. a filter slug that matches nothing):
{
"success": true,
"source": "https://www.remotedxb.com/?experiences[]=entry-level",
"page": 1,
"total": 0,
"jobs": [],
"error_reasoning": null
}Failure (site unreachable / unexpected structure):
{
"success": false,
"jobs": [],
"error_reasoning": "Could not locate the <script id=\"app\"> Inertia payload in the response HTML."
}