Connect your systems to SocialRooms
Landlords, letting agents and housing providers can list rooms, search rooms that welcome benefits and answer enquiries from their own software. Approved partner platforms can exchange rooms with us.
Create an account to get a key Become a partner OpenAPI file
Who can use it
Landlords and letting agents
Create your own API key to list rooms from your property software, keep availability up to date, upload photos and reply to enquiries.
Partner platforms
Other housing platforms can receive our live rooms and send theirs, under a partnership agreement. Access is set up by our team. How partnerships work.
Quick start
- Sign in to your landlord account and open API keys. Create a key, choosing Read and write if you want to make changes.
- Send the key in the
Authorizationheader with every request.
curl "https://www.socialrooms.co.uk/api/v1/listings?city=Leicester&benefit=universal_credit" \ -H "Authorization: Bearer sr_live_your_key"
{
"data": [
{
"id": 42,
"title": "Double room in Leicester",
"kind": "room",
"location": { "city": "Leicester", "postcode": "LE2" },
"rent": { "amount": 500, "period": "month", "monthly_equivalent": 500, "bills_included": true },
"benefits_accepted": ["universal_credit", "housing_benefit"],
"cover_photo": "https://www.socialrooms.co.uk/photo?id=101&sig=…",
"url": "https://www.socialrooms.co.uk/listing?id=42"
}
],
"meta": { "page": 1, "per_page": 20, "total": 37, "pages": 2 }
}
Keys and limits
- Base URL:
https://www.socialrooms.co.uk/api/v1. Everything is JSON over HTTPS. - Send
Authorization: Bearer sr_live_…(orX-Api-Key: sr_live_…). A key acts as the account that made it. - Keys are shown once when you create them. We only keep a fingerprint, so a lost key can't be recovered: revoke it and create another.
- Each key can make 120 requests a minute. Check the
X-RateLimit-Remainingheader. Over the limit you get429withRetry-After. - Never put a key in a public web page or app. To show rooms on your website without a key, use the free search box.
Endpoints
All paths are relative to https://www.socialrooms.co.uk/api/v1.
| Method | Path | What it does | Who |
|---|---|---|---|
| GET | /listings | Search live rooms | Any key |
| GET | /listings/{id} | One live room, with photos and description | Any key |
| GET | /reference | Allowed values: room types, benefits, certificates | Any key |
| GET | /me | The account and key you are using | Any key |
| GET | /my/listings | Your rooms, with status and approval | Landlord |
| POST | /my/listings | Create a room listing | Landlord, write |
| GET | /my/listings/{id} | One of your rooms, with certificates | Landlord |
| PATCH | /my/listings/{id} | Update a room (only the fields you send) | Landlord, write |
| POST | /my/listings/{id}/photos | Upload photos | Landlord, write |
| DELETE | /my/listings/{id}/photos/{photoId} | Remove a photo | Landlord, write |
| GET | /enquiries | Your enquiries | Any key |
| GET | /enquiries/{id} | An enquiry with all its messages | Any key |
| POST | /enquiries/{id}/messages | Reply to an enquiry | Write |
| POST | /enquiries/{id}/close | Close an enquiry | Write |
The full description, for tools like Postman or code generators, is in the OpenAPI file.
Searching
SocialRooms lists rooms only, so every listing is a room. GET /listings takes the same filters as the website:
city(town, city or postcode) andq(keywords)in_hmo(only rooms in an HMO) andmax_rent(monthly; weekly charges are compared by their monthly equivalent)benefit,bills,accessible,step_free,ground_floor,petssupport(rooms that come with support or coaching)pageandper_page(up to 50)
To keep a copy in sync, poll with approved_since set to the time of your last check. It returns only rooms approved after that time.
Keys see other landlords' rooms the way visitors do: no street address, postcode district only, and contact details removed from descriptions. Photo links are signed, so they work in your own system without signing in.
Managing rooms
Create a room with POST /my/listings:
curl -X POST "https://www.socialrooms.co.uk/api/v1/my/listings" \
-H "Authorization: Bearer sr_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"kind": "room",
"title": "Double room near the park",
"description": "Bright double room, close to buses and shops.",
"in_hmo": true,
"room_type": "double",
"rooms_available": 2,
"bathrooms": 2,
"address_line1": "12 Example Road",
"city": "Leicester",
"postcode": "LE2 1AA",
"rent": 450,
"rent_period": "month",
"deposit": 450,
"furnished": "furnished",
"benefits_accepted": ["universal_credit", "housing_benefit"],
"certificates": { "gas_safety": true, "eicr": true, "damp_mould": true }
}'
- New rooms are checked by our team before they go live, just like on the website.
approval_statusshows where it is, andmissing_required_certificateslists anything stopping approval. PATCH /my/listings/{id}changes only the fields you send. Set"status": "let"or"withdrawn"to take a room down, and"active"to put it back.- Set
"support"to"support","coaching"or"both"(ornullfor neither), and optionally"support_details"to say what's included. - Allowed values for every field are at
GET /reference.
Photos
Upload photos as multipart/form-data in a field called photos[] (JPEG, PNG or WebP, up to 8 MB each):
curl -X POST "https://www.socialrooms.co.uk/api/v1/my/listings/42/photos" \ -H "Authorization: Bearer sr_live_your_key" \ -F "photos[]=@front.jpg" -F "photos[]=@kitchen.jpg"
Coaching
curl -X PATCH "https://www.socialrooms.co.uk/api/v1/my/listings/42" \
-H "Authorization: Bearer sr_live_your_key" \
-H "Content-Type: application/json" \
-d '{"support": "coaching", "support_details": "Weekly coaching into work and training."}'
Enquiries
Keys see enquiries about your rooms. Reply with:
curl -X POST "https://www.socialrooms.co.uk/api/v1/enquiries/310/messages" \
-H "Authorization: Bearer sr_live_your_key" \
-H "Content-Type: application/json" \
-d '{"message": "Thanks for your interest. Are you free to view on Thursday?"}'
Replies are sent to the tenant by email as usual, and the same scam checks apply as on the website.
Partnerships: exchanging rooms with other platforms
If you run a housing platform, you can receive our live rooms, send us yours, or both. This is only available under a partnership agreement: there are no open feeds, and personal API keys can't be used for it.
Receive rooms
Read the public room feed and get a signed webhook whenever a room goes live, changes or is taken down.
Send rooms
Push your rooms in batches. They show as listed via your platform, and visitors who want to enquire are sent to the room's page on your website.
How access works
- Email hello@sociallets.com with your platform, what you want to exchange, and the IP addresses you'll call us from.
- Once the agreement is in place, our team sets up your partnership and sends you two credentials, separately and once only:
a partner key (
sr_partner_…) and a request signing secret (pss_…). - Our team also adds your webhook addresses. Each webhook has its own signing secret (
whsec_…) so you can check our messages.
Security
- Every request needs the partner key and a signature made with your signing secret. Unsigned or stale requests are refused.
- Requests can be limited to your IP addresses. We recommend it.
- Each partnership can make 120 requests a minute.
- We only keep a fingerprint of your partner key. If a credential may have leaked, email us and we'll replace it straight away; the old one stops working at once.
Signing requests
Send three headers with every request to /api/v1/partner/…:
| Header | Value |
|---|---|
Authorization | Bearer sr_partner_… |
X-SocialRooms-Signature | t=<unix time>,v1=<signature> |
Content-Type | application/json (when sending a body) |
The signature is the hex HMAC-SHA256 of <t>.<raw body> using your request signing secret. For GET requests the body is empty, so you sign <t>.. The time must be within 5 minutes of ours.
# Shell
BODY='{"rooms":[{"external_id":"ROOM-1001","action":"remove"}]}'
T=$(date +%s)
SIG=$(printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" | sed 's/^.* //')
curl -X POST "https://www.socialrooms.co.uk/api/v1/partner/rooms" \
-H "Authorization: Bearer $PARTNER_KEY" \
-H "Content-Type: application/json" \
-H "X-SocialRooms-Signature: t=$T,v1=$SIG" \
--data "$BODY"
// PHP
$body = json_encode(['rooms' => $rooms]);
$t = time();
$sig = hash_hmac('sha256', $t . '.' . $body, $signingSecret);
// headers: Authorization: Bearer $partnerKey, X-SocialRooms-Signature: "t=$t,v1=$sig"
// Node.js
const body = JSON.stringify({ rooms });
const t = Math.floor(Date.now() / 1000);
const sig = crypto.createHmac('sha256', signingSecret).update(`${t}.${body}`).digest('hex');
// headers: Authorization: `Bearer ${partnerKey}`, 'X-SocialRooms-Signature': `t=${t},v1=${sig}`
Sign the exact bytes you send. Re-encoding the JSON after signing will break the signature.
Partner endpoints
All paths are relative to https://www.socialrooms.co.uk/api/v1. "Receive" and "Send" depend on what your partnership allows. Webhooks are added and changed by our team.
| Method | Path | What it does | Who |
|---|---|---|---|
| GET | /partner/me | Your partnership and what it allows | Any partner |
| GET | /partner/rooms | The public room feed (paged, with approved_since and city) | Receive |
| GET | /partner/rooms/{id} | One live room, public version | Receive |
| POST | /partner/rooms | Send up to 100 rooms: create, update or remove, matched on your external_id | Send |
| GET | /partner/webhooks | The webhooks we have set up for you | Any partner |
| POST | /partner/webhooks/{id}/test | Send a test "ping" event now | Any partner |
| GET | /partner/webhooks/{id}/deliveries | The last 50 deliveries and their results | Any partner |
Sending rooms to SocialRooms
Send up to 100 rooms per request to POST /partner/rooms. Give each room your own external_id. Sending the same external_id again updates that room instead of creating a copy, and "action": "remove" takes it down.
{
"rooms": [
{
"external_id": "PARTNER-ROOM-1001",
"listing_url": "https://partner.example.com/rooms/1001",
"title": "Double room near the station",
"description": "Bright double room, close to buses and shops.",
"room_type": "double",
"rooms_available": 1,
"in_hmo": true,
"address_line1": "12 Example Road",
"city": "Leicester",
"postcode": "LE1 1AA",
"rent": 450,
"rent_period": "month",
"furnished": "furnished",
"bills_included": true,
"benefits_accepted": ["universal_credit", "housing_benefit"],
"certificates": { "gas_safety": true, "eicr": true }
},
{ "external_id": "PARTNER-ROOM-0997", "action": "remove" }
]
}
Visitors are sent to your website
Every room needs a listing_url: its page on your website (https, on the website we hold for your partnership). Your rooms show on SocialRooms marked "Listed via" your platform, and the enquire button sends visitors to that page. Enquiries are not taken on SocialRooms for your rooms. Admins can see how many visitors we've sent you.
Rooms already on SocialRooms
New rooms need address_line1 and postcode (the street address is never shown publicly). If that address is already listed on SocialRooms directly, the room is not added: its result is rejected with "reason": "already_listed".
The reply
- The reply has one result per room:
created,updated,removed,unchanged,rejectedorerror, with our roomid, itsapproval_status, anymissing_required_certificatesand the reasons for any error. - One bad room never stops the others.
- Rooms are listed under the landlord account linked to your partnership and checked before they go live, unless that account is verified and the room is complete.
- Only rooms are accepted. Whole properties are not listed on SocialRooms.
Receiving rooms from SocialRooms
Load the current rooms once with GET /partner/rooms, then keep them up to date with webhooks. We send a JSON POST to each of your webhook addresses whenever a room goes live, changes, or is let or taken down. Webhooks can be limited to towns or postcode districts.
POST https://partner.example.com/socialrooms
X-SocialRooms-Event: room.published
X-SocialRooms-Delivery: evt_5f2c...
X-SocialRooms-Signature: t=1793185000,v1=6b1d...
{
"id": "evt_5f2c...",
"type": "room.published",
"created_at": "2026-10-28T11:30:00+00:00",
"api_version": "1.0",
"data": { "room": { "id": 42, "url": "https://www.socialrooms.co.uk/listing?id=42", "title": "Double room in Leicester", "room_type": "double", "location": { "city": "Leicester", "postcode": "LE1" }, "rent": { "amount": 450, "period": "month" }, "photos": [ ... ] } }
}
Events
room.published: a room becomes visible.room.updated: a live room changes, including photos.room.removed: let, withdrawn, under review, deleted or no longer available, with areason.ping: a test event.
Rooms are sent as the public version: no street address, postcode district only, and contact details removed from the description. Link tenants to the room's url to enquire.
Checking our signature
Work out HMAC-SHA256 of <t>.<raw body> with that webhook's secret and compare it with v1. Reject events where t is more than 5 minutes old.
// PHP
[$t, $v1] = [null, null];
foreach (explode(',', $_SERVER['HTTP_X_SOCIALROOMS_SIGNATURE']) as $part) {
[$k, $v] = explode('=', $part, 2);
if ($k === 't') { $t = $v; } elseif ($k === 'v1') { $v1 = $v; }
}
$body = file_get_contents('php://input');
$ok = hash_equals(hash_hmac('sha256', $t . '.' . $body, $webhookSecret), $v1) && abs(time() - (int) $t) < 300;
// Node.js
const [t, v1] = req.get('X-SocialRooms-Signature').split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', webhookSecret).update(`${t}.${rawBody}`).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1)) && Math.abs(Date.now() / 1000 - t) < 300;
Delivery
- Reply with any 2xx status within 10 seconds. Anything else is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 12 hours and 24 hours.
- A webhook that fails 50 times in a row is switched off. Email us to switch it back on.
- Use the event
idto ignore repeats. Events usually arrive within a few minutes and may arrive out of order, so keep the newest version of each room.
Errors
{ "error": { "code": "validation_failed", "message": "Please complete the title, city and postcode." } }
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key, invalid_api_key | No key, or the key was revoked |
| 401 | missing_partner_key, invalid_partner_key, invalid_signature | Partner key or signature missing or wrong; the message says which |
| 403 | read_only_key, wrong_account_type | The key can't do this |
| 403 | partner_suspended, ip_not_allowed, not_permitted | The partnership is paused, the IP isn't allowed, or it doesn't include this |
| 404 | not_found | No such room, enquiry or webhook |
| 409 | enquiry_closed, no_landlord_account | The enquiry is closed, or no landlord account is linked to the partnership |
| 415 | json_required | Send the body as JSON |
| 422 | validation_failed | Something in the request needs fixing; the message says what |
| 429 | rate_limited | Slow down, try again after Retry-After seconds |
| 503 | api_disabled | The API is switched off for now |
Rules
- Every room must welcome tenants on benefits and follow our terms, the same as rooms added on the website.
- Only use tenants' details to deal with their enquiry, and keep them secure. You are responsible for how your system stores data from the API under UK GDPR.
- Show rooms from SocialRooms only under a partnership agreement, and link back to the room page (
url). - We may revoke keys or suspend partnerships that are misused or put tenants at risk.
Questions about the API or partnerships? Email hello@sociallets.com.