From real-estate-broker
Import a property listing from a URL into Qobrix CRM. Use when the user says "import this listing", "add this property from bazaraki", "import from index", "add this buysellcyprus listing", "scrape this property", "import listing", pastes a URL from bazaraki.com, index.cy, or buysellcyprus.com, or wants to create a property in the CRM from an external listing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/real-estate-broker:import-listingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Scrape a property listing from a URL and create it in Qobrix CRM with correct field mapping, including automatic location UUID resolution, seller/agency linking, and photo upload.
Scrape a property listing from a URL and create it in Qobrix CRM with correct field mapping, including automatic location UUID resolution, seller/agency linking, and photo upload.
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" METHOD "/api/v2/ENDPOINT" '[BODY]'
If the script returns "error":"not_configured", tell the user to run /setup to configure their API credentials.
| Site | URL Pattern | Notes |
|---|---|---|
| Bazaraki | bazaraki.com/adv/... | Largest Cyprus classifieds |
| Index.cy | index.cy/sale/... or index.cy/rent/... | Real estate portal |
| BuySellCyprus | buysellcyprus.com/... | Property marketplace |
| Other | Any property listing URL | Best effort extraction |
Use WebFetch to retrieve the listing page. Extract these fields:
| Listing Field | Qobrix Field | Type | Notes |
|---|---|---|---|
| Title/Name | name | string | Required |
| Sale price | list_selling_price_amount | float | Numeric only, no currency |
| Rental price | list_rental_price_amount | float | Numeric only |
| Bedrooms | bedrooms | integer | |
| Bathrooms | bathrooms | integer | |
| Covered area | covered_area_amount | float | sqm |
| Plot area | plot_area_amount | float | sqm, for houses/land |
| For sale or rent | sale_rent | enum | See values below |
| Property type | property_type | enum code | See values below |
| City/Area | location lookup | string | Used to find location UUID |
| Floor | floor_number | integer | |
| Year built | year_built | integer | |
| Furnished | furnished | enum | See values below |
| Description | description | string | Full text + source attribution |
| Status | status | enum | Always set to available |
| Agency/Seller | contact lookup | string | Used to find/create seller |
| Image URLs | media upload | array | Upload after property creation |
Qobrix requires a location UUID, not a plain text city name.
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" GET "/api/v2/locations?search={district}%20{area}"
If no exact match, try: fuzzy match on area, match on district only, or ask the user.
sale_rent| Listing text | Qobrix value |
|---|---|
| For sale / buy | for_sale |
| For rent / to let | for_rent |
| Both | for_sale_and_rent |
property_type| Listing text | Qobrix code |
|---|---|
| Apartment / Flat | apartment |
| House / Detached / Villa | house |
| Land / Plot | land |
| Office | office |
| Shop / Retail | retail |
| Commercial / Industrial | industrial |
| Investment | investment |
| Other | other |
furnished| Listing text | Qobrix value |
|---|---|
| Fully furnished | furnished |
| Semi / partly | semi_furnished |
| Optional / negotiable | optionally_furnished |
| Unfurnished / empty | unfurnished |
Before creating, show the user:
Property to import:
---
Name: 3 Bedroom Apartment in Mesa Geitonia, Limassol
Type: apartment (for_sale)
Price: EUR 375,000
Beds/Baths: 3 bed / 1 bath
Area: 99m2 covered
Floor: 1st
Built: 1997
Location: Mesa Geitonia, Limassol [matched UUID]
Agency: Kazo Real Estate [found in contacts]
Images: 7 photos found
Source: https://index.cy/sale/9140726-...
---
Create in Qobrix?
Wait for confirmation.
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" POST "/api/v2/properties" \
'{"name":"...","property_type":"apartment","sale_rent":"for_sale","list_selling_price_amount":375000,"bedrooms":3,"bathrooms":1,"covered_area_amount":99,"location":"{location_uuid}","status":"available","description":"..."}'
Always include in description:
{original description text}
---
Imported from {Site Name}
Source URL: {original_url}
External reference: {ref_number_if_found}
Import date: {today}
Original agency: {agency_name_if_found}
After creating, look up the listing agency:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" GET "/api/v2/contacts?search=first_name%20contains%20%22{agency_name}%22&limit=5"
If not found, create:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" POST "/api/v2/contacts" '{"first_name":"{agency_name}","is_company":true}'
Then link:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" PUT "/api/v2/properties/{id}" '{"seller":"{contact_uuid}"}'
For each image URL:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/qobrix-api.sh" POST "/api/v2/properties/{id}/media" \
'{"url":"{image_url}","display_order":{N},"category":"{featured_photo|photos}"}'
First image: category="featured_photo", rest: category="photos".
If upload fails with permission error, collect all URLs and show them for manual upload.
Created in Qobrix: #{id} — {title}
Open: {crm_url}/properties/view/{id}
Seller: {agency} [linked]
Photos: 7/7 uploaded
Then offer:
If given multiple URLs, process each and show a results table at the end.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub index-cy/index-ai --plugin real-estate-broker