3rd-party Formats › Compare and Recycle
Compare and Recycle feed format
If you already produce a feed for the Compare and Recycle buyback platform, you can submit the same file to PriceFirst with no changes. A dedicated parser handles the format differences automatically — PriceFirst normalises it to the standard PriceFirst model.
This format has a different column schema than the PriceFirst format and — importantly — has no Category column. Instead, category routing is handled for you when the feed is activated by your PriceFirst integrator.
It inherits every shared feed rule (HTTPS, Device ID cap, status enforcement, 50p rounding, etc.).
Column schema
The file is typically tab-separated (the parser also accepts commas or semicolons). Column order is flexible and the header row is case-sensitive.
Required columns
| Column | Maps to | Rule |
|---|---|---|
| product_id | Device ID | Unique per marchant, 1–128 characters. Duplicates within a single CSV are rejected. |
| product | Model | Non-empty. Becomes the product title. Also used for category detection and brand guessing. |
| price | Price | Numeric, greater than 0, rounded to the nearest 50p. |
Optional columns
| Column | Maps to | Rule |
|---|---|---|
| network | Network | Carrier from the network whitelist. Blank / none / n/a / wifi → stored with no network attribute (Wi-Fi-only). |
| condition | Condition | Must map to one of the 4 canonical conditions (alias map below). If omitted or blank, the row is rejected with invalid_condition — there is no default. |
| link | — | URL to the product page. Informational only — not stored. |
How missing PriceFirst columns are resolved
| PriceFirst column | How it's resolved |
|---|---|
| Brand | Detected from the product name using keyword matching (e.g. "iPhone" → apple, "Galaxy" → samsung). Falls back to unknown. |
| Category | Detected from the product name and routed to the correct PriceFirst category automatically. |
| Storage | Extracted from the product name (e.g. iPhone 15 Pro 128GB → 128GB). |
| Status | All rows default to active. |
| Image | Not present in this format. |
| Last Updated | Not present in this format. |
Category detection
The parser reads each row's product column and determines the category from keywords in the name. Only rows matching your PriceFirst category are imported — mismatched rows (e.g. iPads in a Mobile Phones feed) are silently skipped.
Detection keywords
| Category | Keywords | Brand hints |
|---|---|---|
| mobile phones | iphone, samsung, galaxy, galaxy s, galaxy z, galaxy a, galaxy note, galaxy fold, galaxy fe, galaxy m, galaxy j, pixel, oneplus, xiaomi, redmi, poco, realme, huawei, honor, oppo, nokia, motorola, moto, sony xperia, nothing phone, vivo, infinix, tecno, asus rog, zte, blackberry, smartphone, mobile phone, cell phone | iphone→apple, galaxy→samsung, pixel→google, moto→motorola, etc. |
| ipad | ipad, ipad pro, ipad air, ipad mini | ipad→apple, etc. |
| tablets | galaxy tab, samsung tab, surface pro, surface go, surface, lenovo tab, matepad, fire tablet, kindle, tablet | galaxy tab→samsung, samsung tab→samsung, surface→microsoft, matepad→huawei, etc. |
Products that don't match any keyword (e.g. Apple Watch, PlayStation, MacBook) are rejected when no target category is set, or silently skipped when a target category is configured but the row doesn't match it. Names containing watch are deliberately excluded from the mobile phones category (e.g. Samsung Galaxy Watch 8 is not imported as a phone).
Networks (whitelist + optional)
The network column is optional. Blank, none, n/a, wifi, na, or no network all mean the device has no network — the row is stored without a network attribute so it can match Wi-Fi-only variants.
- With network — send one of the whitelisted carrier slugs below. Anything else is rejected with
invalid_network. - Without network — leave blank or use any of the recognised sentinels above.
| Allowed values for cellular devices |
|---|
| unlocked |
| other |
| ee |
| o2 |
| three |
| vodafone |
| giffgaff |
| tesco mobile |
| virgin |
| orange |
| t-mobile |
Conditions (canonical variants)
The parser maps the condition column to one of the four canonical PriceFirst conditions — new, good, fair, broken. The aliases below are normalised case-insensitively (whitespace and hyphens are ignored, so EXCELLENT, Brand-New and non working all resolve). Anything not on the map — including an empty or missing cell — rejects the row with invalid_condition. There is no default.
| Canonical (stored) | Accepted partner values |
|---|---|
| new | new, brand new |
| good | good, working, used, excellent, flawless |
| fair | fair, poor, moderate, average |
| broken | broken, cracked, faulty, non working, not working, damaged |
Sample CSV (tab-separated)
product_id product link price network condition
PF-MOB-0001 iPhone 15 Pro 128GB https://sell.example.com/iphone15 450 unlocked excellent
PF-MOB-0002 iPhone 14 256GB https://sell.example.com/iphone14 320 o2 good
PF-IPAD-0001 iPad Pro 11 inch https://sell.example.com/ipadpro 800 none excellent
PF-IPAD-0002 iPad Air 256GB https://sell.example.com/ipadair 600 goodIn the sample above, the iPhone rows are imported when the configured category is Mobile Phones, and the iPad rows are imported when it's iPad. Rows from the other category are skipped.
Attribute normalisation (what's stored)
| Attribute | Source column | Normalisation |
|---|---|---|
| brand | product | Detected from keywords in the product name; falls back to unknown. |
| storage | product | Extracted from capacity in the product name (e.g. 128GB, 1TB). |
| network | network | Carrier slug from the whitelist, or omitted entirely for Wi-Fi-only rows. |
| condition | condition | Mapped to a canonical condition and stored lowercased (excellent → good). |
Validate your feed with the Feed Validator before going live — select CSV Format → Compare and Recycle to test with this parser. It runs the same rules as live ingest in dry-run mode and returns per-row errors with line numbers and codes.