Developer docs

PulseSignal API reference

The PulseSignal API gives you programmatic access to the same company records, change feed, and bulk exports you see in the dashboard. It is a curated REST API: a small set of endpoints, JSON in and out, authenticated with a key you create yourself. API access is included on Pro, Business, and Scale.

01

What API access is

API access lets you pull PulseSignal data into your own systems without going through the dashboard. The surface is intentionally small: search and read company records, follow the change feed for the companies you track, and submit bulk export jobs for larger pulls. Every endpoint returns JSON and is metered against your plan’s daily request quota.

API access is a Pro feature. Starter does not include it; Pro, Business, and Scale do, at progressively higher daily limits. See pricing for the full plan comparison.

02

Base URL

Every endpoint below is relative to this base.

https://api.pulsesignal.co

All paths are versioned under /api/v1/. We meter requests against your daily quota, so plan for the limits in the next sections rather than firing requests one per row.

03

Authentication

Create a key in the dashboard under Settings. Keys have the format ps_live_<token> and are shown once at creation, so store the value somewhere safe. Send the key on every request as a bearer token:

curl https://api.pulsesignal.co/api/v1/companies?search=stripe \
  -H "Authorization: Bearer ps_live_xxxxxxxxxxxxxxxxxxxxxxxx"

An X-API-Key: ps_live_… header works too. A request is authenticated as the key owner and counts against that owner’s daily quota. A missing, malformed, or revoked key returns 401 invalid_api_key; a key below Pro returns 402 plan_required. Rotate or revoke a key from the same dashboard page at any time.

04

Rate limits

Each plan has a daily request cap. Every authenticated request counts once against it.

PlanRequests per day
Pro10,000
Business50,000
Scale200,000

When you exhaust the daily cap the API returns 429 rate_limit_exceeded. The response carries a Retry-After header (seconds until the quota resets) alongside X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Sleep for theRetry-After window, then retry.

05

Endpoints

The read surface is three resources: companies, the change feed, and exports. Paths are relative to the base URL above.

MethodPathWhat it returns
GET/api/v1/companiesSearch and list companies (paged).
GET/api/v1/companies/{id}Full company detail with nested pricing plans.
GET/api/v1/companies/{id}/changesPer-company change feed (cursor-paged).
GET/api/v1/changesGlobal change feed across tracked companies.
POST/api/v1/exportsSubmit a bulk export job.
GET/api/v1/exports/{job_id}Poll a job’s status until it is ready.
GET/api/v1/exports/{job_id}/downloadStream the finished file (CSV, JSON, or NDJSON).

Listing uses classic page / page_size pagination. The change feeds are cursor-paged: pass limit and follow next_cursor from each response into the next request, stopping when next_cursor is null. The per-tier history floor still bounds how far back the feed reaches.

06

Bulk exports

Exports are the way to pull a large result set in one shot. The flow is submit, poll, then download. Submit a structured query and output format, poll the returned job until its status reads ready, then download the file with the signed token from the job record.

# 1. Submit
curl -X POST https://api.pulsesignal.co/api/v1/exports \
  -H "Authorization: Bearer ps_live_xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "all": [{ "field": "hq_country", "op": "==", "value": "US" }],
      "limit": 500
    },
    "format": "csv",
    "columns": ["id", "name", "website", "total_funding_usd"]
  }'
# -> { "id": 1234, "status": "pending", "signed_token": "abc123...", ... }

# 2. Poll until status == "ready"
curl https://api.pulsesignal.co/api/v1/exports/1234 \
  -H "Authorization: Bearer ps_live_xxxx"

# 3. Download with the signed token
curl "https://api.pulsesignal.co/api/v1/exports/1234/download?token=abc123..." \
  -H "Authorization: Bearer ps_live_xxxx" -o companies.csv

CSV is available on every API plan; JSON and NDJSON require Pro or higher. Exports carry their own limits on top of the daily request cap: up to 10 submissions per hour, plus a per-tier daily export-row quota. Exceeding the row quota returns 429 export_quota_exceeded.

07

Error model

Errors are JSON with an error code and a human message. The HTTP status carries the category.

StatuserrorWhen
401invalid_api_keyMissing, malformed, unknown, or revoked key.
402plan_requiredKey owner is below Pro. Body names the current and upgrade plans.
404noneUnknown company id, an export job you do not own, or a download that does not match a ready job and token.
422validationBad request shape: unknown export column, malformed query condition, or an out-of-range parameter.
429rate_limit_exceededDaily request cap exhausted. Honor Retry-After.

On a 401 or 402 the request will not succeed on retry, so surface those to the caller. A 429 is transient: wait for the Retry-After window and try again.

08

SDKs and clients

The API is plain REST over HTTPS, so any HTTP client works: curl, your language’s standard request library, or a notebook cell. Official Python and TypeScript SDKs are coming soon; until they ship, the endpoints above are small enough to wrap in a few lines of your own client code.

Have a question the reference does not answer? Email hello@pulsesignal.co and we reply within one business day.