How to upload
- Sign in to your JobStak client portal.
- Go to CL Listings → Import XML/CSV.
- Choose a
.xmlor.csvfile and click Upload & Process. - Each listing is validated independently. Valid listings are added; invalid rows are skipped with a reason listed in your upload history.
Common fields (all listing types)
| Field | Required | Type | Notes |
|---|---|---|---|
external_reference_id | Recommended | string | Your unique ID. Used for deduplication on re-upload. |
listing_type | Required | enum | service | real_estate_rent | real_estate_sale |
title | Required | string (5–70) | Plain text. Avoid ALL CAPS and emoji-spam. |
description_html | Required | HTML / text | ≥ 20 characters of visible text after stripping tags. |
city | Required | string | Physical city of the listing (e.g. "Austin"). |
state_region | Required | string | State or region code (e.g. "TX"). |
contact_email | One required | Either contact_email or contact_phone must be provided. | |
contact_phone | One required | string | E.164 or local format. |
canonical_url | Optional | URL | Must be a valid http(s) URL if provided. |
city_markets | Required | list | Craigslist city slugs (e.g. austin, sfbay, newyork). One posting intent generated per city. |
Service fields
Required when listing_type = service.
| Field | Required | Type | Notes |
|---|---|---|---|
service_type | Required | string | e.g. cleaning, moving, lessons, handyman. |
price_type | Required | enum | fixed | hourly | starting_at | quote_required |
price_min | Conditional | number | Required unless price_type = quote_required. |
price_max | Optional | number | Must be ≥ price_min if provided. |
service_area_mode | Optional | enum | onsite | remote | mobile | hybrid |
service_radius_miles | Optional | number | Cannot be set when service_area_mode = remote. |
business_name | Optional | string | Shown in posting body. |
Real estate fields
Required when listing_type = real_estate_rent or real_estate_sale.
| Field | Required | Type | Notes |
|---|---|---|---|
listing_intent | Required | enum | Must be rent for real_estate_rent, sale for real_estate_sale. |
property_type | Required | string | e.g. apartment, house, condo, townhouse, room. |
price | Required | number > 0 | Monthly rent or sale price in USD. |
deposit | Optional | number ≥ 0 | Security deposit (rentals). |
sqft | Optional | integer | Square footage. |
bedrooms | Optional | integer | 0 = studio. |
bathrooms | Optional | number | Allows 0.5 increments. |
available_date | Optional | date | YYYY-MM-DD. |
pets_allowed | Optional | yes/no | |
furnished | Optional | yes/no |
Validation rules
- Title: 5–70 characters.
- Description: at least 20 characters of visible text after HTML tags are stripped.
- Contact: at least one of
contact_emailorcontact_phone; email must match standard email format. - canonical_url: must be a valid URL when present.
- Service price:
price_minrequired unlessprice_type = quote_required;price_max≥price_min. - Service area:
service_radius_milescannot be set whenservice_area_mode = remote. - Real estate price: > 0;
depositcannot be negative. - listing_intent must match
listing_type(rent ↔ rent, sale ↔ sale). - Deduplication: a listing with the same
external_reference_idas an existing one for your account is skipped. Posting intents are also deduplicated per city × section.
XML example
<?xml version="1.0" encoding="UTF-8"?>
<listings>
<listing>
<external_reference_id>SVC-001</external_reference_id>
<listing_type>service</listing_type>
<title>Eco-Friendly House Cleaning</title>
<description_html><![CDATA[<p>Weekly, bi-weekly, or one-time cleaning with non-toxic products. Insured & background-checked staff.</p>]]></description_html>
<city>Austin</city>
<state_region>TX</state_region>
<contact_email>hello@example.com</contact_email>
<contact_phone>+1-512-555-0142</contact_phone>
<service_type>cleaning</service_type>
<price_type>hourly</price_type>
<price_min>45</price_min>
<price_max>75</price_max>
<service_area_mode>onsite</service_area_mode>
<service_radius_miles>25</service_radius_miles>
<business_name>Greenleaf Cleaning Co.</business_name>
<city_markets>
<city>austin</city>
<city>sanantonio</city>
<city>waco</city>
</city_markets>
</listing>
<listing>
<external_reference_id>RNT-2026-014</external_reference_id>
<listing_type>real_estate_rent</listing_type>
<title>Modern 2BR Loft in Williamsburg</title>
<description_html><![CDATA[<p>Bright top-floor loft, exposed brick, skyline views. Steps to L train.</p>]]></description_html>
<city>Brooklyn</city>
<state_region>NY</state_region>
<contact_email>rentals@example.com</contact_email>
<listing_intent>rent</listing_intent>
<property_type>apartment</property_type>
<price>3200</price>
<deposit>3200</deposit>
<sqft>950</sqft>
<bedrooms>2</bedrooms>
<bathrooms>1</bathrooms>
<available_date>2026-06-01</available_date>
<pets_allowed>yes</pets_allowed>
<furnished>no</furnished>
<city_markets>
<city>newyork</city>
</city_markets>
</listing>
<listing>
<external_reference_id>SAL-A55</external_reference_id>
<listing_type>real_estate_sale</listing_type>
<title>3BR Craftsman in Ballard</title>
<description_html><![CDATA[<p>Restored 1923 craftsman, original woodwork, detached garage.</p>]]></description_html>
<city>Seattle</city>
<state_region>WA</state_region>
<contact_email>agent@example.com</contact_email>
<listing_intent>sale</listing_intent>
<property_type>house</property_type>
<price>875000</price>
<sqft>1840</sqft>
<bedrooms>3</bedrooms>
<bathrooms>2</bathrooms>
<city_markets>
<city>seattle</city>
</city_markets>
</listing>
</listings>
CSV example
First row must be headers. Multiple cities go in city_markets separated by |, ,, or ;. Leave fields empty when not applicable.
external_reference_id,listing_type,title,description_html,city,state_region,contact_email,contact_phone,service_type,price_type,price_min,price_max,service_area_mode,service_radius_miles,listing_intent,property_type,price,bedrooms,bathrooms,available_date,city_markets
SVC-001,service,Eco-Friendly House Cleaning,<p>Weekly or one-time cleaning with non-toxic products.</p>,Austin,TX,hello@example.com,+15125550142,cleaning,hourly,45,75,onsite,25,,,,,,austin|sanantonio|waco
RNT-2026-014,real_estate_rent,Modern 2BR Loft in Williamsburg,<p>Bright top-floor loft with skyline views.</p>,Brooklyn,NY,rentals@example.com,,,,,,,,rent,apartment,3200,2,1,2026-06-01,newyork
SAL-A55,real_estate_sale,3BR Craftsman in Ballard,<p>Restored 1923 craftsman with original woodwork.</p>,Seattle,WA,agent@example.com,,,,,,,,sale,house,875000,3,2,,seattle
Programmatic upload
POST the same file with your client API key (the same key used for the JSON Listings API):
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@listings.xml" \
https://ipuanzeiogwtxvberefu.supabase.co/functions/v1/upload-listings-feed
The response includes an upload_id and per-row counts for listings_added and skipped, with skip reasons.