Import jobs from CSV or XML
Bulk import jobs from a CSV or XML file with AI column mapping, location resolution, and multi-layer deduplication.
A
JUpload a spreadsheet or XML feed and Cavuno maps columns, resolves locations, deduplicates against existing listings, and posts the batch in the background. This is the path for migrations, ATS exports, and employers the scraper cannot backfill.
For an always-on feed URL that stays in sync on a schedule, see Recurring XML feeds.
Before you begin
Prepare a UTF-8 CSV with a header row or a well-formed XML feed no larger than 10 MB. Include stable application URLs or external IDs where the source provides them, and begin with a representative sample containing the locations, descriptions, and optional fields you need mapped.
Open the importer
- Go to Jobs in the sidebar
- Click Import
- Upload a
.csvor.xmlfile (max 10 MB)
The import runs in the background. You can leave the page while it processes.
File formats
CSV
Use a standard CSV with a header row, UTF-8 encoding, and comma delimiters. Column names do not need to match Cavuno field names. AI maps them on the first upload from a given source and reuses that mapping on later uploads when the header fingerprint matches.
Common columns include title, company, location, description, salary, employment type, application URL, and external ID. Unrecognized columns can still be mapped if the AI recognizes them, or left unmapped.
XML
Drop in a flat job feed (<source><job>…</job></source>) or an RSS-style channel feed (<rss><channel><item>…</item></channel></rss>). Nested elements become dotted paths (salary.min), attributes become @-prefixed keys, and namespace prefixes are stripped so <gj:title> reads as title. HTML inside CDATA is preserved through sanitization.
What happens on import
- AI column mapping: header (or XML field) names map to Cavuno job fields. Repeat uploads from the same shape reuse the previous mapping
- Location resolution: locations geocode to canonical cities, regions, and countries so browse pages stay consistent
- Deduplication: three layers: application URL, external ID / reference number, then company + normalized title, location, and description fingerprint. Re-import updates the existing listing instead of creating a duplicate
- Background processing: large files process without blocking the UI. Progress streams as rows land
- Automatic expiry: imported jobs expire if the apply link is dead. See Expired jobs
When to use import vs backfill
| Goal | Use |
|---|---|
| Migrate from another board or ATS export | One-shot CSV/XML import |
| Keep a partner or aggregator feed in sync | Recurring XML feed |
| Continuously pull from company careers pages | Backfill |
| Company careers page is custom or LinkedIn-only | One-shot or recurring import of their export |
Verify the import
Compare the created, updated, and skipped counts, then open representative listings from Jobs to check company, location, description, status, and application URL. Re-import a small unchanged sample and confirm it updates or matches the existing jobs rather than creating duplicates.
Troubleshooting
- The importer maps a field incorrectly: correct the source header where possible and retry with a small sample; keep the sample and observed mapping when contacting support.
- A row is skipped: check required job data, the application URL, and whether the job already matches an existing listing.
- A location is unexpected: inspect the original location string and use an unambiguous city, region, and country in the source file.
- The batch appears stuck: keep the file name and approximate upload time, then contact support rather than repeatedly uploading the full batch.
Related guides
- Recurring XML feeds: Schedule pulls from a public feed URL
- CSV import and export: Companies and job alert subscribers
- Configure backfill: Aggregation from careers pages
- Job moderation: How imports interact with approval settings