GET
/
api
/
v1
/
admin
/
listings
Admin listings list
curl --request GET \
  --url https://api.example.com/api/v1/admin/listings
import requests

url = "https://api.example.com/api/v1/admin/listings"

response = requests.get(url)

print(response.text)
const options = {method: 'GET'};

fetch('https://api.example.com/api/v1/admin/listings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/admin/listings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.example.com/api/v1/admin/listings"

req, _ := http.NewRequest("GET", url, nil)

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.example.com/api/v1/admin/listings")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.example.com/api/v1/admin/listings")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body

Overview

The admin gallery view of current-home listings. Soft-deleted rows are excluded. Ordered by createdAt DESC. Available to any admin role — read-only.

Authentication

Bearer <accessToken> with scope: 'admin' required (requireAdmin).
Read-only — all admin roles (SUPER, MODERATOR, FINANCE) may list. The delete action is role-gated.

Path parameters

None.

Query parameters

NameTypeRequiredNotesExample
statusenumnoDRAFT, LIVE, or HIDDEN. Omit for all (non-deleted) statuses.LIVE
cursorstringnoOpaque base64url pagination cursor, 1..512 chars.eyJjcmVhdGVkQXQ…
limitintegernoPage size, 1..100. Default 25.50

Request body

None.

Response — 200 OK

FieldTypeNotes
itemsarrayArray of listing rows (below).
nextCursorstring | nullCursor for the next page, or null on the last page.

Listing row

FieldTypeNotes
idstringListing ObjectId.
userIdstringOwner.
statusenumDRAFT | LIVE | HIDDEN.
propertyTypestring
bedroomsinteger
bathroomsinteger
addressstring
postcodestring
rentMonthlyMinorintegerRent in minor units (pence).
photoCountintegerNumber of photos attached.
coverPhotoUrlstring | nullSigned URL for the cover photo, or null.
deletedAtstring | nullAlways null here (soft-deleted rows are excluded from this list).
createdAtstringISO timestamp.
ownerobject | null{ id, email, firstName, lastName }, or null.
{
  "items": [
    {
      "id": "66400a8f1c2b4d5e6f7ad000",
      "userId": "66400a8f1c2b4d5e6f7a8b01",
      "status": "LIVE",
      "propertyType": "FLAT",
      "bedrooms": 2,
      "bathrooms": 1,
      "address": "12 Example Street",
      "postcode": "E1 6AN",
      "rentMonthlyMinor": 180000,
      "photoCount": 6,
      "coverPhotoUrl": "https://swappr-public.fra1.digitaloceanspaces.com/listings/…",
      "deletedAt": null,
      "createdAt": "2026-05-01T10:00:00.000Z",
      "owner": { "id": "66400a8f1c2b4d5e6f7a8b01", "email": "jane@example.com", "firstName": "Jane", "lastName": "Doe" }
    }
  ],
  "nextCursor": null
}

Error responses

StatusCodeMeaning
400VALIDATION_FAILEDlimit out of 1..100 or status unknown.
401UNAUTHENTICATEDMissing, malformed, expired, or non-admin-scope token.

See also

curl

curl "https://api.swappr.co.uk/api/v1/admin/listings?status=LIVE&limit=50" \
  -H "Authorization: Bearer $ADMIN_ACCESS_TOKEN"

Postman

See docs/postman/swappr.postman_collection.jsonAdmin Listings → List.