Quickstart

Five steps from a ps_test_ key to a verified webhook. Every step has a runnablecurl plus equivalents in Python, Node, Go, Ruby, PHP, Java, and .NET — paste them as-is once you've swapped in your key. A ps_test_ key reads your real connected data againstapi.propsocket.io, so reads are safe to run as-is.

What you'll have at the end

  • A 200 response from GET /v1/properties with your real connected CDM data.
  • A pagination loop that walks every page until hasMore is false.
  • A webhook subscription pointed at an endpoint you control.
  • Working HMAC-SHA256 verification on the first event that lands.

Plan for about 20 minutes end-to-end — roughly half of that is waiting for your first integration to finish syncing, which runs once and varies by connector.

Step 1 — Get a test key

Test keys are prefixed ps_test_ and are scoped to your Organization. They read your real connected data and dry-run writes — see Isolated Test Modefor how that works and how live differs. Store the key in an environment variable; don't paste it into source:

shell
export PROPSOCKET_API_KEY="ps_test_YOUR_TEST_KEY"

Both ps_test_ and ps_live_ keys authenticate against the same host,api.propsocket.io — the prefix selects the mode, not the URL. Full detail on the auth model lives in Authentication.

Step 2 — Your first 200

List properties. The response is the standard envelope — a meta object and aresults array. Up to 25 records come back by default.

GET /v1/properties
curl https://api.propsocket.io/v1/properties \
  -H "Authorization: Bearer ps_test_YOUR_TEST_KEY"

You'll get back something shaped like this:

200 OK
{
  "meta": { "limit": 25, "offset": 0, "hasMore": true },
  "results": [
    {
      "id": "prp_01HX0G5T8N3KEWBYV2QMR4DCFA",
      "x_id": "entrata-property-3391",
      "integration_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Maple Court Apartments",
      "type": "apartment",
      "status": "active",
      "address": {
        "line_1": "1400 Maple Court",
        "line_2": null,
        "city": "Austin",
        "state": "TX",
        "postal_code": "78704",
        "country": "US"
      },
      "total_units": 188,
      "created_at": "2026-05-01T09:12:44Z",
      "updated_at": "2026-05-11T18:04:58Z",
      "deleted_at": null
    }
  ]
}

Money fields are integer minor units plus a currency, datetimes are UTC ISO 8601, andx_id is the native PMS identifier. The full set of conventions is inthe conventions reference.

Step 3 — Paginate

The envelope tells you whether more pages exist. Loop until meta.hasMore isfalse, bumping offset by your page size each time. Use the max page size (limit=100) for backfills, and sort by created_at:asc so the ordering is stable as new records arrive.

Walk every page
# Page two: skip the first 100, take the next 100.
curl "https://api.propsocket.io/v1/properties?limit=100&offset=100&order-by=created_at:asc" \
  -H "Authorization: Bearer ps_test_YOUR_TEST_KEY"

Don't fan out parallel requests with pre-computed offsets — inserts between requests will shift the window and you'll skip or double-read records. The why-and-how is inthe pagination guide.

Step 4 — Subscribe to a webhook

Scale planWebhooks require the Scale plan.

Webhook subscriptions are available on the Scale plan and above. If you're on Starter or Growth, you can still read and page through the CDM via the API — see thepricing page for what each tier includes.

Reading is half the picture; the other half is reacting to change without polling. Create a subscription in the dashboard:

  1. Open Settings → Webhooks → New subscription.
  2. Paste an HTTPS endpoint you control. For local development, tunnel to your machine withngrok http 3000 and paste the forwarding URL — thewebhooks guide walks through this.
  3. Pick the events you want — start with LEASE_SIGNED to see a full record land.
  4. Save. PropSocket generates a signing secret at creation time. Copy it into your secret manager now — you see it once.

Store the secret the same way you stored your API key — it's the input to signature verification in the next step:

shell
export PROPSOCKET_SIGNING_SECRET="whsec_YOUR_SIGNING_SECRET"

Step 5 — Verify the signature

Every event arrives as an HTTP POST carrying an X-PropSocket-Signature header — a lowercase hex HMAC-SHA256 digest over the raw, unmodified request body. Compute the same digest with your signing secret and compare in constant time. The single most common mistake is parsing the JSON and re-serializing it before hashing — that changes the bytes and the signature won't match.

Verify X-PropSocket-Signature
# There's no curl for HMAC verification — the signature is computed
# in your receiver against the raw request body. See the snippets below,
# then read /docs/webhooks for full receiver examples.

These are the verification cores. For full receiver scaffolding — capturing the raw body, acknowledging fast, processing async, and handling retries — readthe webhooks guide.

Next: pick a recipe

You can now read the CDM, page through it, and react to changes with a verified signature. From here, head to the recipes for task-shaped how-tos — listening for new leases, exporting units nightly, backfilling a warehouse — or browsethe API reference for the full response shapes.