Local development
You don't need a deployed environment to build against PropSocket. Use a ps_test_key for reads and dry-run writes, and tunnel a public URL to localhost for webhooks. This page is the .env template, the base URL, and the ngrok pairing — everything to get a local loop running.
Base URL and keys
There is one host, https://api.propsocket.io/v1, for both modes. The key prefix selects the mode — a ps_test_ key reads real connected data and dry-runs writes; aps_live_ key commits writes.
| Mode | Base URL | Key prefix |
|---|---|---|
| Test mode | https://api.propsocket.io/v1 | ps_test_ |
| Live | https://api.propsocket.io/v1 | ps_live_ |
Develop with a ps_test_ key: reads return your real connected data and writes are dry-run, so local experiments never mutate your PMS. SeeIsolated Test Mode for the behavior.
The .env template
Three values cover the whole surface — REST auth, the base URL, and the webhook signing secret:
# .env.example — copy to .env and fill in. Never commit .env.
# A ps_test_ key reads real connected data and dry-runs writes; a ps_live_
# key commits writes. Same host either way.
PROPSOCKET_API_KEY=ps_test_YOUR_TEST_KEY
PROPSOCKET_BASE_URL=https://api.propsocket.io/v1
# The webhook signing secret (whsec_…) from your subscription. Different from
# the API key. You see it once at subscription creation — store it here.
PROPSOCKET_SIGNING_SECRET=whsec_YOUR_SIGNING_SECRETLoad it and confirm a 200:
# Load it into your shell (or use python-dotenv / dotenv in code).
set -a; source .env; set +a
curl "$PROPSOCKET_BASE_URL/properties" \
-H "Authorization: Bearer $PROPSOCKET_API_KEY"Keep .env out of version control and read these from the environment in code — never hard-code a key. The quickstart uses these same variable names, so its snippets run unchanged once your .env is in place.
Receiving webhooks on localhost
A webhook subscription needs a public HTTPS URL, but your handler runs onlocalhost. Tunnel one to the other withngrok orcloudflared:
ngrok http 3000
# forwarding https://abcd-1234.ngrok-free.app -> http://localhost:3000
# Paste the https:// forwarding URL as your subscription endpoint.- Start your local receiver (the snippets in Webhooks listen on port 3000).
- Run the tunnel and copy the
https://forwarding URL. - Paste it as the endpoint in Settings → Webhooks → New subscription and copy the signing secret into your
.env. - Trigger a change on your connected integration (or replay a delivery from the dashboard) and watch it land.
Real events flow to your local handler signed with the real secret, so your verification code is exercised end-to-end — not stubbed. To eyeball payload shapes before writing a receiver, point a subscription at a webhook.site URL.
A tight feedback loop
Every delivery is logged in Dashboard → Webhooks → Recent deliveries for 30 days with a one-click replay. Combine that with the tunnel: trigger a change once, then replay the same payload and signature against your local handler as many times as it takes to get the code right. No need to re-trigger source changes on every iteration.
Next
With .env in place, run the quickstart end to end, or jump to a recipe. For the full webhook delivery model, seeWebhooks.