Listings Feed Schema (XML & CSV)

Bulk-import Craigslist Services and Real Estate listings into JobStak with a single file. Each listing fans out into one posting intent per Craigslist city market. Maximum file size: 20 MB.

How to upload

  1. Sign in to your JobStak client portal.
  2. Go to CL Listings → Import XML/CSV.
  3. Choose a .xml or .csv file and click Upload & Process.
  4. 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)

FieldRequiredTypeNotes
external_reference_idRecommendedstringYour unique ID. Used for deduplication on re-upload.
listing_typeRequiredenumservice | real_estate_rent | real_estate_sale
titleRequiredstring (5–70)Plain text. Avoid ALL CAPS and emoji-spam.
description_htmlRequiredHTML / text≥ 20 characters of visible text after stripping tags.
cityRequiredstringPhysical city of the listing (e.g. "Austin").
state_regionRequiredstringState or region code (e.g. "TX").
contact_emailOne requiredemailEither contact_email or contact_phone must be provided.
contact_phoneOne requiredstringE.164 or local format.
canonical_urlOptionalURLMust be a valid http(s) URL if provided.
city_marketsRequiredlistCraigslist city slugs (e.g. austin, sfbay, newyork). One posting intent generated per city.

Service fields

Required when listing_type = service.

FieldRequiredTypeNotes
service_typeRequiredstringe.g. cleaning, moving, lessons, handyman.
price_typeRequiredenumfixed | hourly | starting_at | quote_required
price_minConditionalnumberRequired unless price_type = quote_required.
price_maxOptionalnumberMust be ≥ price_min if provided.
service_area_modeOptionalenumonsite | remote | mobile | hybrid
service_radius_milesOptionalnumberCannot be set when service_area_mode = remote.
business_nameOptionalstringShown in posting body.

Real estate fields

Required when listing_type = real_estate_rent or real_estate_sale.

FieldRequiredTypeNotes
listing_intentRequiredenumMust be rent for real_estate_rent, sale for real_estate_sale.
property_typeRequiredstringe.g. apartment, house, condo, townhouse, room.
priceRequirednumber > 0Monthly rent or sale price in USD.
depositOptionalnumber ≥ 0Security deposit (rentals).
sqftOptionalintegerSquare footage.
bedroomsOptionalinteger0 = studio.
bathroomsOptionalnumberAllows 0.5 increments.
available_dateOptionaldateYYYY-MM-DD.
pets_allowedOptionalyes/no
furnishedOptionalyes/no

Validation rules

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.