For CRM providers & brokers
Listing feed integration
Brokers list once in their CRM and Servo For Sale stays in sync. We accept the REAXML-style XML most Australian agency CRMs already export, so adding us is usually just a new portal destination.
Push
Your CRM POSTs XML to our endpoint with the agency's API key whenever a listing changes.
Pull
Give us a URL to your agency's XML file. We fetch it every hour.
CSV
Brokers upload a spreadsheet from their dashboard. Ideal for getting started.
Authentication
Each agency creates an API key in Dashboard → Import & feeds. Send it as a bearer token. Keys are shown once and stored hashed; creating a new key revokes the old one.
curl -X POST https://www.servoforsale.com.au/api/feeds/xml \
-H "Authorization: Bearer sfs_xxxxxxxx_yourSecretKey" \
-H "Content-Type: application/xml" \
--data-binary @listings.xmlREAXML-style feed
Send <business> listings (operating businesses) and <commercial> listings (freehold fuel investments) inside <propertyList>. You can send the agency's whole feed: we only import listings whose category, headline or description indicates a service station, petrol station, roadhouse or truck stop, or that include a <servoDetails> block.
uniqueIDidentifies the listing; resending it updates the listing.status="sold","withdrawn"or"offmarket"takes it down.<underOffer value="yes"/>marks it under offer.<address display="no">makes it a confidential listing (region shown, suburb hidden).- Images are copied to our CDN;
id="m"is the cover photo. Max 20 per listing. <servoDetails>accepts any field from the table below, so buyers can filter on litres, brand and model.
<?xml version="1.0" encoding="UTF-8"?>
<propertyList>
<business modTime="2026-10-29-09:30:00" status="current">
<agentID>ABC123</agentID>
<uniqueID>SS-1042</uniqueID>
<listingAgent id="1">
<name>Jane Broker</name>
<telephone type="mobile">0400 000 000</telephone>
<email>jane@agency.com.au</email>
</listingAgent>
<price display="yes">650000</price>
<priceView>$650,000 + SAV</priceView>
<address display="yes">
<streetNumber>12</streetNumber>
<street>Great Western Hwy</street>
<suburb>Penrith</suburb>
<state>NSW</state>
<postcode>2750</postcode>
</address>
<businessCategory id="1">
<name>Automotive</name>
<businessSubCategory>Service Station</businessSubCategory>
</businessCategory>
<headline>High-volume Ampol commission site</headline>
<description>Commission agency on a major arterial…</description>
<takings>2100000</takings>
<netProfit>265000</netProfit>
<underOffer value="no"/>
<images>
<img id="m" url="https://cdn.agency.com.au/ss-1042/1.jpg"/>
<img id="a" url="https://cdn.agency.com.au/ss-1042/2.jpg"/>
</images>
<!-- Optional: any Servo For Sale field REAXML has no element for -->
<servoDetails>
<brand>Ampol</brand>
<operating_model>commission_agent</operating_model>
<fuel_litres_per_month>520000</fuel_litres_per_month>
<shop_sales_per_week>38000</shop_sales_per_week>
<commission_cpl>2.4</commission_cpl>
<lease_years_remaining>9</lease_years_remaining>
<features>car_wash|24_7|food_service</features>
</servoDetails>
</business>
</propertyList>Native XML and CSV
The native format uses the same field names as the CSV template. Every column is optional except external_ref, title, state, a suburb or region, and a price (or price_on_application).
<?xml version="1.0" encoding="UTF-8"?>
<servoListings>
<listing>
<external_ref>SS-1042</external_ref>
<status>current</status>
<kind>business</kind>
<title>High-volume Ampol commission site</title>
<price>650000</price>
<state>NSW</state>
<suburb>Penrith</suburb>
<postcode>2750</postcode>
<brand>Ampol</brand>
<operating_model>commission_agent</operating_model>
<fuel_litres_per_month>520000</fuel_litres_per_month>
<image_urls>https://cdn.agency.com.au/1.jpg|https://cdn.agency.com.au/2.jpg</image_urls>
</listing>
</servoListings>CSV columns: external_ref, status, kind, title, summary, description, price, price_max, price_display, price_plus_sav, price_on_application, state, region, suburb, postcode, is_confidential, business_name, street_address, brand, operating_model, supply_agreement_expiry, tenure, lease_years_remaining, lease_expiry, lease_options, rent_pa, fuel_litres_per_month, shop_sales_per_week, annual_turnover, ebitda, commission_cpl, fuel_grades, features, tank_count, tank_install_year, last_tank_test, land_area_sqm, building_area_sqm, trading_hours, staff_count, established_year, net_income_pa, yield_pct, tenant_name, wale_years, contact_name, contact_phone, contact_email, nda_required, image_urls. Download the template.
Field values
| kind | business | freehold_going_concern | freehold_investment |
| operating_model | commission_agent | franchise | dealer_supply | independent | company_operated | other |
| tenure | leasehold | freehold |
| brand | Ampol, BP, Shell, Reddy Express, 7-Eleven, Caltex, United, Puma, Liberty, Metro, Mobil, EG, OTR, Speedway, Astron, Pearl, Independent, Other |
| features | car_wash, workshop, lpg, ev_charging, truck_stop, adblue, food_service, qsr, liquor, post_office, accommodation, atm, gas_bottles, 24_7 (separate with |) |
| fuel_grades | ULP, E10, P95, P98, Diesel, Premium diesel, LPG, AdBlue, E85 (separate with |) |
| status | current | under_offer | sold | withdrawn | offmarket |
| dates | YYYY-MM-DD (lease_expiry, supply_agreement_expiry, last_tank_test) |
| money / numbers | Plain numbers; $ and commas are stripped |
| booleans | yes / no, true / false, 1 / 0 |
Response
200 with a summary when anything was processed, 401 for a bad key, 413 over 20 MB, 422 when nothing could be imported. Listings from agencies we haven't verified yet wait for review before going live.
{
"created": 3,
"updated": 12,
"withdrawn": 1,
"skipped": 40,
"errors": [{ "ref": "SS-1077", "message": "state: Choose a state" }]
}Need a different format or a direct API? Talk to us. We're happy to work with CRM vendors on a native integration.