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 resolve to one of the 7 base conditions (whitelist below). If omitted, defaults to good. |
| 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, pixel, oneplus, xiaomi, huawei, oppo, nokia, motorola, sony xperia, smartphone, mobile phone, cell phone, redmi, poco, realme, honor, nothing phone | iphone→apple, galaxy→samsung, pixel→google, etc. |
| ipad | ipad, ipad pro, ipad air, ipad mini, tablet, galaxy tab, surface pro, surface go, lenovo tab, fire tablet | ipad→apple, galaxy tab→samsung, surface→microsoft, etc. |
Products that don't match any keyword (e.g. Apple Watch) are rejected when no target category is set, or silently skipped when a target category is configured but the row doesn't match it.
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 (whitelist)
Values are case-insensitive but matched exactly — there is no alias map. If the condition column is empty or missing, the parser defaults to good.
| Allowed values |
|---|
| new |
| excellent |
| very good |
| good |
| fair |
| poor |
| broken |
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 | Lowercased and resolved to one of the base conditions. Defaults to 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.