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.

ModeBase URLKey prefix
Test modehttps://api.propsocket.io/v1ps_test_
Livehttps://api.propsocket.io/v1ps_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
# .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_SECRET

Load it and confirm a 200:

Load and smoke-test
# 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

Availability. Webhook subscriptions are on theScale plan and above (Scale and Enterprise). On Starter or Growth, develop against the API instead — see pricing.

A webhook subscription needs a public HTTPS URL, but your handler runs onlocalhost. Tunnel one to the other withngrok orcloudflared:

Tunnel to localhost
ngrok http 3000
# forwarding https://abcd-1234.ngrok-free.app -> http://localhost:3000
# Paste the https:// forwarding URL as your subscription endpoint.
  1. Start your local receiver (the snippets in Webhooks listen on port 3000).
  2. Run the tunnel and copy the https:// forwarding URL.
  3. Paste it as the endpoint in Settings → Webhooks → New subscription and copy the signing secret into your .env.
  4. 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.