> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/speedyapply/JobSpy/llms.txt
> Use this file to discover all available pages before exploring further.

# Exporting data

> Export scrape_jobs() results to CSV, Excel, JSON, Parquet, and more.

`scrape_jobs()` returns a standard [Pandas DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html). You can use any pandas export method to save results to disk.

## DataFrame columns

Results are always returned in the following column order:

| Column                  | Description                                                     |
| ----------------------- | --------------------------------------------------------------- |
| `id`                    | Internal job ID                                                 |
| `site`                  | Source job board                                                |
| `job_url`               | URL to the job listing                                          |
| `job_url_direct`        | Direct application URL (if available)                           |
| `title`                 | Job title                                                       |
| `company`               | Company name                                                    |
| `location`              | City, state, and/or country                                     |
| `date_posted`           | Date the job was posted                                         |
| `job_type`              | Employment type (e.g. `fulltime`, `contract`)                   |
| `salary_source`         | `direct_data` or `description`                                  |
| `interval`              | Pay interval (`yearly`, `monthly`, `weekly`, `daily`, `hourly`) |
| `min_amount`            | Minimum salary/pay                                              |
| `max_amount`            | Maximum salary/pay                                              |
| `currency`              | Currency code (e.g. `USD`)                                      |
| `is_remote`             | Whether the job is remote                                       |
| `job_level`             | Seniority level (LinkedIn only)                                 |
| `job_function`          | Job function category (LinkedIn only)                           |
| `listing_type`          | Listing type                                                    |
| `emails`                | Contact emails extracted from description                       |
| `description`           | Full job description                                            |
| `company_industry`      | Industry (LinkedIn and Indeed)                                  |
| `company_url`           | Company profile URL                                             |
| `company_logo`          | Company logo URL (Indeed)                                       |
| `company_url_direct`    | Direct company website URL                                      |
| `company_addresses`     | Company office addresses (Indeed)                               |
| `company_num_employees` | Employee count label (Indeed)                                   |
| `company_revenue`       | Revenue label (Indeed)                                          |
| `company_description`   | Company description (Indeed)                                    |
| `skills`                | Required skills (Naukri)                                        |
| `experience_range`      | Experience required (Naukri)                                    |
| `company_rating`        | Company rating (Naukri)                                         |
| `company_reviews_count` | Number of company reviews (Naukri)                              |
| `vacancy_count`         | Number of open positions (Naukri)                               |
| `work_from_home_type`   | WFH type, e.g. `Hybrid`, `Remote` (Naukri)                      |

## Export formats

<CodeGroup>
  ```python CSV theme={null}
  import csv
  from jobspy import scrape_jobs

  jobs = scrape_jobs(
      site_name=["indeed", "linkedin"],
      search_term="software engineer",
      location="Austin, TX",
  )

  jobs.to_csv(
      "jobs.csv",
      quoting=csv.QUOTE_NONNUMERIC,
      escapechar="\\",
      index=False,
  )
  ```

  ```python Excel theme={null}
  from jobspy import scrape_jobs

  jobs = scrape_jobs(
      site_name=["indeed", "linkedin"],
      search_term="software engineer",
      location="Austin, TX",
  )

  jobs.to_excel("jobs.xlsx", index=False)
  ```

  ```python JSON theme={null}
  from jobspy import scrape_jobs

  jobs = scrape_jobs(
      site_name=["indeed", "linkedin"],
      search_term="software engineer",
      location="Austin, TX",
  )

  jobs.to_json("jobs.json", orient="records")
  ```

  ```python Parquet theme={null}
  from jobspy import scrape_jobs

  jobs = scrape_jobs(
      site_name=["indeed", "linkedin"],
      search_term="software engineer",
      location="Austin, TX",
  )

  jobs.to_parquet("jobs.parquet", index=False)
  ```
</CodeGroup>

## Selecting specific columns

You can select a subset of columns before exporting to keep files smaller.

```python theme={null}
import csv
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["indeed", "linkedin"],
    search_term="data analyst",
    location="New York, NY",
)

columns = ["site", "title", "company", "location", "job_url", "min_amount", "max_amount", "interval"]
jobs[columns].to_csv("jobs_slim.csv", quoting=csv.QUOTE_NONNUMERIC, escapechar="\\", index=False)
```

## Sorting results

The DataFrame is pre-sorted by `site` and `date_posted` (newest first). You can re-sort by any column.

```python theme={null}
# Sort by minimum salary, highest first
jobs_sorted = jobs.sort_values("min_amount", ascending=False)

# Sort by date posted, most recent first
jobs_sorted = jobs.sort_values("date_posted", ascending=False)
```

## Normalizing salary to annual figures

Job boards report salary in different intervals — some hourly, some monthly, some yearly. Use `enforce_annual_salary=True` to automatically convert all non-yearly wages to annual equivalents before they are returned.

```python theme={null}
from jobspy import scrape_jobs

jobs = scrape_jobs(
    site_name=["indeed", "zip_recruiter"],
    search_term="nurse",
    location="Houston, TX",
    enforce_annual_salary=True,  # all salary amounts converted to yearly
)

# Now min_amount and max_amount are comparable across all rows
print(jobs[["title", "company", "interval", "min_amount", "max_amount"]].head())
```

Conversion rates used internally:

| Interval | Multiplier |
| -------- | ---------- |
| Hourly   | × 2,080    |
| Weekly   | × 52       |
| Monthly  | × 12       |
| Daily    | × 260      |

## Controlling description format

Job descriptions can be returned as Markdown or HTML. Use the `description_format` parameter.

```python theme={null}
jobs = scrape_jobs(
    site_name="indeed",
    search_term="technical writer",
    location="Remote",
    description_format="markdown",  # default — human-readable
)

jobs_html = scrape_jobs(
    site_name="indeed",
    search_term="technical writer",
    location="Remote",
    description_format="html",  # raw HTML for rendering in a UI
)
```

Accepted values: `"markdown"` (default), `"html"`, or `"plain"` (plain text with HTML tags stripped).
