Vexaloom Labs

Jobicy Remote Job Listings Scraper

Search remote job listings from Jobicy by keyword, region, and seniority level. Returns job title, company, salary range, job type, category, and a direct application link for each role.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
modestringoptionalSearch the live Jobicy feed, fetch specific job URLs/IDs, or check stored job IDs. Leave blank for search.
keywordstringoptionalFull-text search across Jobicy job content (3-50 characters). Leave blank to browse. Examples: python, marketing, product designer.
geostringoptionalKeep jobs open to this location or region. Jobicy treats worldwide roles as eligible for every location. Legacy display names such as United States or worldwide are mapped in code. Jobicy lists Malaysia in its taxonomy but its jobs API rejects that slug, so Malaysia is not offered.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalSearch the live Jobicy feed, fetch specific job URLs/IDs, or check stored job IDs. Leave blank for search.
keywordstringoptionalFull-text search across Jobicy job content (3-50 characters). Leave blank to browse. Examples: python, marketing, product designer.
geostringoptionalKeep jobs open to this location or region. Jobicy treats worldwide roles as eligible for every location. Legacy display names such as United States or worldwide are mapped in code. Jobicy lists Malaysia in its taxonomy but its jobs API rejects that slug, so Malaysia is not offered.
industrystringoptionalKeep jobs in one Jobicy category. Leave blank for all categories.
jobTypestringoptionalKeep one employment type. Leave blank for all types.
jobLevelstringoptionalKeep one seniority level. Leave blank for all levels. Legacy Any is accepted and keeps listings Jobicy labels Any.
postedWithinDaysintegeroptionalKeep jobs published in the last N days. 0 means no date limit. Jobicy exposes the last 7 days.
salaryDisclosedOnlybooleanoptionalKeep only listings where Jobicy publishes a salary range.
minAnnualSalaryUsdintegeroptionalKeep USD listings whose annualised maximum salary meets this figure. Hourly pay is annualised at 2,080 hours; monthly pay at 12 months. 0 disables this filter.
excludeKeywordsarrayoptionalDrop jobs whose title or company contains any of these terms (case-insensitive).
onlyActivebooleanoptionalCheck each listing's current status with Jobicy and keep only active jobs.
includeDetailsbooleanoptionalFetch each job page for its exact expiry date, company website and applicant countries. Adds requests; unavailable pages are skipped.
jobUrlsarrayoptionalJobicy job URLs or numeric job IDs. Used only with mode byUrls or status.
maxItemsintegeroptionalMaximum job listings to return (1-5,000). Jobicy's live window usually contains about 1,000-1,500 jobs.

Download the published input schema

View complete JSON
{
  "description": "Choose the live Jobicy 7-day feed, specific job URLs, or listing-status checks.",
  "properties": {
    "excludeKeywords": {
      "default": [],
      "description": "Drop jobs whose title or company contains any of these terms (case-insensitive).",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "title": "Exclude Keywords",
      "type": "array"
    },
    "geo": {
      "default": "",
      "description": "Keep jobs open to this location or region. Jobicy treats worldwide roles as eligible for every location. Legacy display names such as United States or worldwide are mapped in code. Jobicy lists Malaysia in its taxonomy but its jobs API rejects that slug, so Malaysia is not offered.",
      "editor": "select",
      "enumSuggestedValues": [
        "",
        "anywhere",
        "apac",
        "emea",
        "latam",
        "argentina",
        "australia",
        "austria",
        "belgium",
        "brazil",
        "bulgaria",
        "canada",
        "china",
        "costa-rica",
        "croatia",
        "cyprus",
        "czechia",
        "denmark",
        "estonia",
        "europe",
        "finland",
        "france",
        "germany",
        "greece",
        "hong-kong",
        "hungary",
        "ireland",
        "israel",
        "italy",
        "japan",
        "latvia",
        "lithuania",
        "mexico",
        "netherlands",
        "new-zealand",
        "norway",
        "philippines",
        "poland",
        "portugal",
        "romania",
        "serbia",
        "singapore",
        "slovakia",
        "slovenia",
        "south-korea",
        "spain",
        "sweden",
        "switzerland",
        "thailand",
        "turkiye",
        "united-arab-emirates",
        "uk",
        "ukraine",
        "usa",
        "vietnam"
      ],
      "enumTitles": [
        "Any location",
        "Anywhere",
        "APAC",
        "EMEA",
        "LATAM",
        "Argentina",
        "Australia",
        "Austria",
        "Belgium",
        "Brazil",
        "Bulgaria",
        "Canada",
        "China",
        "Costa Rica",
        "Croatia",
        "Cyprus",
        "Czechia",
        "Denmark",
        "Estonia",
        "Europe",
        "Finland",
        "France",
        "Germany",
        "Greece",
        "Hong Kong",
        "Hungary",
        "Ireland",
        "Israel",
        "Italy",
        "Japan",
        "Latvia",
        "Lithuania",
        "Mexico",
        "Netherlands",
        "New Zealand",
        "Norway",
        "Philippines",
        "Poland",
        "Portugal",
        "Romania",
        "Serbia",
        "Singapore",
        "Slovakia",
        "Slovenia",
        "South Korea",
        "Spain",
        "Sweden",
        "Switzerland",
        "Thailand",
        "Türkiye",
        "United Arab Emirates",
        "UK",
        "Ukraine",
        "USA",
        "Vietnam"
      ],
      "title": "Location",
      "type": "string"
    },
    "includeDetails": {
      "default": false,
      "description": "Fetch each job page for its exact expiry date, company website and applicant countries. Adds requests; unavailable pages are skipped.",
      "title": "Include Detail-Page Fields",
      "type": "boolean"
    },
    "industry": {
      "default": "",
      "description": "Keep jobs in one Jobicy category. Leave blank for all categories.",
      "editor": "select",
      "enum": [
        "",
        "admin-support",
        "business",
        "copywriting",
        "design-multimedia",
        "supporting",
        "cybersecurity",
        "data-science",
        "admin",
        "education",
        "accounting-finance",
        "healthcare",
        "hr",
        "legal",
        "marketing",
        "management",
        "project-management",
        "qa-testing",
        "seller",
        "seo",
        "engineering",
        "technical-support",
        "web-app-design"
      ],
      "enumTitles": [
        "Any industry",
        "Admin & Virtual Assistance",
        "Business Development",
        "Content & Editorial",
        "Creative & Design",
        "Customer Support & Success",
        "Cybersecurity",
        "Data Science & Analytics",
        "DevOps & Infrastructure",
        "Education & E-learning",
        "Finance & Accounting",
        "Healthcare & Medical",
        "HR & Recruiting",
        "Legal & Compliance",
        "Marketing & Sales",
        "Product & Operations",
        "Project & Program Management",
        "QA & Testing",
        "Sales",
        "SEO",
        "Software Engineering",
        "Technical Support",
        "Web, UI & UX Design"
      ],
      "title": "Industry",
      "type": "string"
    },
    "jobLevel": {
      "default": "",
      "description": "Keep one seniority level. Leave blank for all levels. Legacy Any is accepted and keeps listings Jobicy labels Any.",
      "editor": "select",
      "enumSuggestedValues": [
        "",
        "Entry-Level",
        "Junior",
        "Midweight",
        "Senior",
        "Director",
        "Internship"
      ],
      "enumTitles": [
        "Any level",
        "Entry-Level",
        "Junior",
        "Midweight",
        "Senior",
        "Director",
        "Internship"
      ],
      "title": "Seniority Level",
      "type": "string"
    },
    "jobType": {
      "default": "",
      "description": "Keep one employment type. Leave blank for all types.",
      "editor": "select",
      "enum": [
        "",
        "Full-Time",
        "Part-Time",
        "Contract",
        "Internship"
      ],
      "enumTitles": [
        "Any type",
        "Full-Time",
        "Part-Time",
        "Contract",
        "Internship"
      ],
      "title": "Job Type",
      "type": "string"
    },
    "jobUrls": {
      "default": [],
      "description": "Jobicy job URLs or numeric job IDs. Used only with mode byUrls or status.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "title": "Job URLs or IDs",
      "type": "array"
    },
    "keyword": {
      "default": "",
      "description": "Full-text search across Jobicy job content (3-50 characters). Leave blank to browse. Examples: python, marketing, product designer.",
      "editor": "textfield",
      "prefill": "",
      "title": "Search Keyword",
      "type": "string"
    },
    "maxItems": {
      "default": 50,
      "description": "Maximum job listings to return (1-5,000). Jobicy's live window usually contains about 1,000-1,500 jobs.",
      "editor": "number",
      "maximum": 5000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max Items",
      "type": "integer"
    },
    "minAnnualSalaryUsd": {
      "default": 0,
      "description": "Keep USD listings whose annualised maximum salary meets this figure. Hourly pay is annualised at 2,080 hours; monthly pay at 12 months. 0 disables this filter.",
      "editor": "number",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum Annual Salary (USD)",
      "type": "integer"
    },
    "mode": {
      "default": "search",
      "description": "Search the live Jobicy feed, fetch specific job URLs/IDs, or check stored job IDs. Leave blank for search.",
      "editor": "select",
      "enumSuggestedValues": [
        "search",
        "byUrls",
        "status"
      ],
      "enumTitles": [
        "Search the live Jobicy feed",
        "Fetch specific job URLs or IDs",
        "Check stored job IDs"
      ],
      "prefill": "search",
      "title": "Mode",
      "type": "string"
    },
    "onlyActive": {
      "default": false,
      "description": "Check each listing's current status with Jobicy and keep only active jobs.",
      "title": "Only Active Listings",
      "type": "boolean"
    },
    "postedWithinDays": {
      "default": 0,
      "description": "Keep jobs published in the last N days. 0 means no date limit. Jobicy exposes the last 7 days.",
      "editor": "number",
      "maximum": 7,
      "minimum": 0,
      "title": "Posted Within (Days)",
      "type": "integer"
    },
    "salaryDisclosedOnly": {
      "default": false,
      "description": "Keep only listings where Jobicy publishes a salary range.",
      "title": "Only Jobs With Published Salary",
      "type": "boolean"
    }
  },
  "schemaVersion": 1,
  "title": "Jobicy Remote Jobs Scraper Input",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
remoteJobsstringoptionalDataset containing the scraped Jobicy remote-job and listing-status records.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Jobicy remote jobs with full descriptions, industries, job types, seniority, locations, salary (and annualised USD figures), optional expiry/company website/applicant countries, and live listing status.",
  "properties": {
    "remoteJobs": {
      "description": "Dataset containing the scraped Jobicy remote-job and listing-status records.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Jobicy Remote Jobs",
      "type": "string"
    }
  },
  "title": "Jobicy Remote Jobs Scraper Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "views": {
    "overview": {
      "display": {
        "component": "table",
        "properties": {}
      },
      "title": "Remote Jobs",
      "transformation": {
        "fields": [
          "title",
          "company",
          "location",
          "jobTypes",
          "jobLevel",
          "salaryMin",
          "salaryMax",
          "salaryCurrency",
          "publishedAt",
          "jobUrl"
        ]
      }
    },
    "statuses": {
      "display": {
        "component": "table",
        "properties": {}
      },
      "title": "Job Statuses",
      "transformation": {
        "fields": [
          "id",
          "listingStatus",
          "statusCheckedAt"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

Jobicy Remote Jobs Scraper — Full 7-Day Feed & Filters

Jobicy publishes a rolling window of remote roles, and this actor reads the whole window rather than the first page. Search by keyword, location, industry, employment type, seniority, publication date or pay, and export complete job descriptions with structured salary, company and eligibility data. No login, API key or proxy is needed.

What this actor does

  • Reads the complete current Jobicy feed — every listing in the rolling 7-day window, not a fixed sample.
  • Filters by keyword, 54 supported locations, 22 industries, job type, seniority, publication date and salary.
  • Returns the full plain-text description, excerpt, industries, job types, seniority, location, country eligibility and company logo.
  • Keeps structured salary values and adds annualised figures, so hourly, monthly and yearly ranges are easier to compare.
  • Optionally fetches each job page for the exact expiry date, company website and applicant countries, and can check whether listings are still active.
  • Omits empty fields rather than returning placeholders or invented data.

Output per job

  • id — Jobicy's numeric job ID
  • jobSlug — Jobicy listing slug
  • title — job title
  • company — hiring company
  • companyLogo — company logo URL
  • companyUrl — company website (with includeDetails)
  • jobUrl — canonical Jobicy listing URL
  • category — industries joined with ; (legacy field)
  • industries[] — industry labels
  • jobType — employment types joined with ; (legacy field)
  • jobTypes[] — employment type labels
  • jobLevel — Jobicy's seniority value
  • location — the job's remote eligibility text
  • countries[] — countries parsed from the eligibility text
  • isWorldwide — true when the role is open anywhere
  • excerpt — short listing summary
  • description — full plain-text job description
  • salaryMin, salaryMax — published salary bounds
  • salaryCurrency, salaryPeriod — pay currency and period
  • annualSalaryMin, annualSalaryMax — annualised pay, when a period is published
  • publishedAt — publication timestamp
  • ageDays — days since publication
  • expiresAt — listing expiry date (with includeDetails)
  • applicantCountries[] — eligible applicant countries (with includeDetails)
  • listingStatus — active when checked (with onlyActive)
  • statusCheckedAt — when the status was checked
  • tags[] — the listing's industries
  • recordType — job
  • source — jobicy
  • scrapedAt — when the record was collected

Output per status check

Mode status returns one record per requested job ID:

  • id — Jobicy job ID
  • listingStatus — active, closed or unknown
  • statusCheckedAt — when Jobicy checked the listing
  • recordType — jobStatus
  • source — jobicy
  • scrapedAt — when the record was collected

Input

Field Type Default Description
mode string search search the live feed, fetch byUrls, or check status
keyword string – Full-text Jobicy search, 3-50 characters
geo string – Location or region slug; worldwide roles match every location. Legacy names such as United States are mapped; Jobicy lists Malaysia but its jobs API rejects that filter, so Malaysia is not offered.
industry string – One Jobicy category
jobType string – Full-Time, Part-Time, Contract or Internship
jobLevel string – Entry-Level, Junior, Midweight, Senior, Director or Internship; legacy Any keeps listings labeled Any
postedWithinDays integer 0 Keep jobs published in the last N days; 0 = no date limit
salaryDisclosedOnly boolean false Keep only jobs with a published salary
minAnnualSalaryUsd integer 0 Minimum annualised USD salary; other currencies are excluded
excludeKeywords array [] Drop jobs whose title or company contains these terms
onlyActive boolean false Keep only listings Jobicy reports as active
includeDetails boolean false Add expiry, company website and applicant countries
jobUrls array [] Jobicy URLs or numeric IDs (mode byUrls / status)
maxItems integer 50 Maximum job listings to return (1-5,000)

Mode-scoped fields are read only in their intended mode. The daily prefill uses search with maxItems 3.

Example: all current jobs

{
  "mode": "search",
  "maxItems": 100
}

Example: senior Python roles open to applicants in the USA

{
  "mode": "search",
  "keyword": "python",
  "geo": "usa",
  "jobLevel": "Senior",
  "jobType": "Full-Time",
  "maxItems": 50
}

Example: paid roles with detail data

{
  "mode": "search",
  "industry": "engineering",
  "salaryDisclosedOnly": true,
  "minAnnualSalaryUsd": 120000,
  "includeDetails": true,
  "maxItems": 30
}

Example: fetch specific listings and check stored IDs

{
  "mode": "byUrls",
  "jobUrls": [
    "https://jobicy.com/jobs/156858-senior-software-engineer-fundraising-remote",
    "156864"
  ],
  "maxItems": 10
}
{
  "mode": "status",
  "jobUrls": ["156858", "156864", "147122"]
}

Use cases

  • Recruiters — build a daily shortlist of fresh remote roles by function, region and seniority.
  • Job boards and newsletters — feed complete, structured listings into a site, digest or alerts.
  • Compensation research — compare published salary ranges across industries and locations.
  • Talent-market analysis — track remote hiring by category, type, level and country eligibility.
  • Job seekers — export only roles that are open to their location and still active.

FAQ

Where does the data come from? Jobicy's public job feed and public job pages. No Jobicy account, login or API key is required. Each run reads Jobicy live; publishedAt and ageDays show freshness.

Is this affiliated with Jobicy? No. This is an independent third-party actor that reads publicly available Jobicy listings.

How many jobs can one run return? The complete current 7-day window, up to maxItems (maximum 5,000). The window usually contains roughly 1,000-1,500 roles; when it is exhausted, the run says so instead of returning invented data.

Why is salary missing on some jobs? Only about half of current Jobicy listings publish structured pay. Missing salary fields are omitted, never estimated. A small number of source listings also contain unusual salary values; they are passed through unchanged for transparency.

What is the difference between location and countries? location is Jobicy's own eligibility text. countries[] is the same text split into country names, and isWorldwide flags roles open anywhere.

Why is Malaysia not in the location list? Jobicy's own location taxonomy lists Malaysia, but its jobs API rejects geo=malaysia with HTTP 400. The actor therefore offers the 54 usable locations. If a legacy task sends Malaysia, the filter is ignored with a clear status message instead of stopping the run.

When should I enable includeDetails? Enable it when you need the exact expiry date, company website or applicant countries. It fetches each job page and can be slower; if a page is unavailable, the job is still returned with its feed fields and the optional fields are omitted.

What does onlyActive do? It asks Jobicy for each listing's current status and keeps only active jobs. Use mode status when you want to check stored IDs without re-scraping the listings.

Does the actor return the employer's own application link? No. Jobicy's public feed returns the Jobicy listing URL, and the employer application step is handled on Jobicy's site. The actor never substitutes an unrelated or invented apply URL.

Can I fetch a job that is older than seven days? The search feed only covers the last seven days. If you already have a Jobicy job URL that is still live, mode byUrls can open it directly; mode status can check stored IDs outside the window.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build jVhcKYfKlFmoj7cg0. Documentation is regenerated from the default published build; private drafts are not included.