Build on the signal.
The same SEC insider trading intelligence that powers the Pingr dashboard — exposed as a clean REST API. Plug it into your bots, dashboards, trading systems, newsletters. Read-only. JSON. Versioned.
60-second quickstart.
Three steps. One curl. You're live.
1. Generate a key
Scroll to your key workspace below and hit + Test Key. Test keys are free on every tier — use one to explore before committing.
2. Make your first call
# Replace with your actual key curl https://pingr-signup-api.onrender.com/api/v1/ping \\ -H "X-API-Key: pgr_test_YOUR_KEY_HERE"
3. You'll get back
{
"data": {
"pong": true,
"mode": "test",
"tier": "investor",
"test_mode": true,
"server_time": "2026-04-18T15:22:01Z"
},
"meta": { "version": "v1" },
"error": null
}
That's it. You've authenticated, hit a live endpoint, and seen the response envelope. Now go build something.
Authentication.
Every request needs an API key. Generated in your account settings. Sent as a header. That's the whole system.
Two kinds of keys
pgr_live_ keys hit production data. Available on Pro (60 req/hr) and Investor (1,000 req/hr). Pro sees the live feed; Investor sees the feed plus every intelligence engine.
pgr_test_ keys return deterministic mock data. Free on every tier. Same 1,000/hr quota. Use them while you're building — your bot can parse real-shaped responses without burning live quota or polluting your analytics.
Two ways to send them
X-API-Key: pgr_live_abc123...
Authorization: Bearer pgr_live_abc123...
Your workspace.
Generate a key. Use it. Revoke it. All without leaving the docs.
Test keys are free on every tier — use one to explore before you ship. Live keys are Investor-only and hit production data at full rate.
Test Mode.
Build your integration against realistic mock data before you touch production. Same endpoints, same response shapes, but the data is deterministic and free.
Use a pgr_test_ key and every endpoint returns mock data that looks like the real thing — famous tickers (NVDA, AAPL, TSLA), plausible insiders, realistic category distributions, live P&L on holdings, frozen ROI on sold trades. The same query with the same test key will always return the same data, which means you can write tests that don't flake.
Ready for production? Swap your test key for a live key. Nothing else changes.
Response Shape.
Every response. Every endpoint. Same shape.
{
"data": // array or object, never null on success
"meta": {
"count": 50,
"total": 437,
"has_more": true,
"test_mode": false
},
"error": null
}
{
"data": null,
"meta": {},
"error": {
"code": "invalid_param",
"message": "limit must be an integer",
"hint": "Use ?limit=50 (default). Max 200."
}
}
Every error has a code you can branch on, a message you can show users, and a hint that tells you how to fix it.
Plans & Access.
Three tiers. Same shape of data. Different scope and volume.
/signals feed/signals/{id}/sectors — capital flow by industry/insiders/{name} — full profiles/insiders/leaderboard — 4 sort modes/intelligence/exits — curated insider sales/intelligence/graveyard & /intelligence/beached-whalesEndpoint access
| Endpoint | FREE | PRO | INVESTOR |
|---|---|---|---|
| GET /ping | TEST | ✓ | ✓ |
| GET /signals | TEST | ✓ | ✓ |
| GET /signals/{id} | TEST | ✓ | ✓ |
| GET /sectors | TEST | — | ✓ |
| GET /insiders/{name} | TEST | — | ✓ |
| GET /insiders/leaderboard | TEST | — | ✓ |
| GET /intelligence/exits | TEST | — | ✓ |
| GET /intelligence/convergence | TEST | — | ✓ |
| GET /intelligence/graveyard | TEST | — | ✓ |
| GET /intelligence/beached-whales | TEST | — | ✓ |
| GET /intelligence/10b5-1-breaks | TEST | — | ✓ |
| GET /insiders/{name}/trades | TEST | ✓ | ✓ |
| GET /tickers/{ticker}/insider-activity | TEST | ✓ | ✓ |
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. If you hit the ceiling, you'll get a 429 with a Retry-After header. Just wait and try again.
Inside a Signal.
Every signal is a single JSON object with 29 fields — grouped below by purpose. Same shape on every endpoint, test or live, Pro or Investor.
- tickerstr
- companystr
- insider_namestr
- rolestr
- sectorstr
- idint
- pricefloat
- shares_boughtint
- total_valuefloat
- pct_increasefloat
- transaction_datedate
- filing_datedate
- filing_lag_daysint
- categorystr
- score0–99
- ai_summarystr
- current_pricefloat
- current_pnl_pctfloat
- peak_pnl_pctfloat
- soldbool
- is_partialbool
- pct_soldfloat
- roifloat
- sale_datedate
- is_10b5_planbool
- has_derivativesbool
- is_foreignbool
- filing_urlurl
- broker_linksobject
Holding vs closed — only one state is populated at a time.
sold = falsecurrent_price, current_pnl_pct, peak_pnl_pct → liveroi, sale_date → null / empty
sold or is_partial = trueroi, sale_date, pct_sold → populatedcurrent_pnl_pct, peak_pnl_pct → null
Error Codes.
| Code | Status | Meaning |
|---|---|---|
| missing_api_key | 401 | No X-API-Key header. |
| invalid_api_key | 401 | Key doesn't match or was revoked. |
| tier_required | 403 | Your tier can't access this endpoint. |
| rate_limit_exceeded | 429 | You've used your hour's quota. |
| invalid_param | 400 | One of your query params is malformed. |
| not_found | 404 | The requested resource doesn't exist. |
| database_unavailable | 503 | Transient — retry in a few seconds. |
| internal_error | 500 | Something broke on our end. Please report. |
GET /ping
curl https://pingr-signup-api.onrender.com/api/v1/ping \\
-H "X-API-Key: pgr_live_..."
GET /signals
| Param | Type | Description |
|---|---|---|
| category | string | One or more: golden, cluster, whale, penny, basic. Comma-separated or repeated. |
| min_score | int | Minimum conviction score (0–100). |
| ticker | string | Exact ticker match (case-insensitive). |
| insider | string | Substring match on insider name. |
| since | ISO date | Return signals filed on or after this date. |
| before | ISO date | Return signals filed before this date. |
| limit | int | Max results per page. Default 50, max 200. |
curl "https://pingr-signup-api.onrender.com/api/v1/signals?category=golden&min_score=90&limit=10" \\ -H "X-API-Key: pgr_live_..."
{
"id": 204512,
"ticker": "NVDA",
"company": "NVIDIA Corporation",
"insider_name": "Jensen Huang",
"role": "CEO",
"category": "Golden",
"score": 96,
"price": 135.82,
"shares_bought": 50000,
"total_value": 6791000.00,
"filing_date": "2026-04-15",
"transaction_date": "2026-04-14",
"filing_lag_days": 1,
"pct_increase": 42.3,
"is_10b5_plan": false,
"has_derivatives": false,
"is_foreign": false,
"sector": "Technology",
"sold": false,
"is_partial": false,
"pct_sold": 0.0,
"roi": null,
"sale_date": "",
"current_price": 148.30,
"current_pnl_pct": 9.19,
"peak_pnl_pct": 12.4,
"ai_summary": "CEO Jensen Huang purchased $6.8M of NVDA...",
"filing_url": "https://www.sec.gov/...",
"broker_links": {
"etoro": "https://www.etoro.com/markets/nvda",
"ibkr": "https://...",
"trading212": "https://...",
"robinhood": "https://..."
}
}
sold or is_partial is true, roi is populated and current_pnl_pct is null — the position has been closed, ROI is frozen. Otherwise roi is null and current_pnl_pct reflects live market value vs entry.
GET /signals/{id}
curl https://pingr-signup-api.onrender.com/api/v1/signals/204512 \\
-H "X-API-Key: pgr_live_..."
GET /insiders/{name}
curl "https://pingr-signup-api.onrender.com/api/v1/insiders/Jensen%20Huang" \\ -H "X-API-Key: pgr_live_..."
GET /insiders/leaderboard
| Param | Type | Description |
|---|---|---|
| sort | string | avg_return (default), win_rate, capital, speed. |
| limit | int | 1–100, default 50. |
| min_trades | int | Exclude insiders with fewer than this many trades. Default 3. |
curl "https://pingr-signup-api.onrender.com/api/v1/insiders/leaderboard?sort=win_rate&limit=25" \\ -H "X-API-Key: pgr_live_..."
GET /insiders/{name}/trades
/insiders/{name} — that one gives you the summary, this one gives you the full trade history, paginated. Case-insensitive substring match on the name.| Param | Type | Description |
|---|---|---|
| limit | int | 1–100, default 25. |
| offset | int | Pagination offset, default 0. |
curl "https://pingr-signup-api.onrender.com/api/v1/insiders/Jensen%20Huang/trades?limit=50" \\ -H "X-API-Key: pgr_live_..."
total — the full count matching the insider across the entire dataset. Use offset to walk pages when total > limit.
GET /tickers/{ticker}/insider-activity
/insiders/{name}/trades but indexed the other way. Useful for deep-diving a single ticker's insider flow.| Param | Type | Description |
|---|---|---|
| limit | int | 1–100, default 25. |
| offset | int | Pagination offset, default 0. |
| since | ISO date | Optional. Only filings on or after this date (YYYY-MM-DD). |
curl "https://pingr-signup-api.onrender.com/api/v1/tickers/NVDA/insider-activity?since=2026-01-01" \\ -H "X-API-Key: pgr_live_..."
GET /sectors
| Param | Type | Description |
|---|---|---|
| period | string | 7d, 30d (default), 90d, 1y. |
curl "https://pingr-signup-api.onrender.com/api/v1/sectors?period=90d" \\ -H "X-API-Key: pgr_live_..."
GET /intelligence/exits
GET /intelligence/convergence
curl "https://pingr-signup-api.onrender.com/api/v1/intelligence/convergence" \\ -H "X-API-Key: pgr_live_..."
GET /intelligence/graveyard
GET /intelligence/beached-whales
GET /intelligence/10b5-1-breaks
curl "https://pingr-signup-api.onrender.com/api/v1/intelligence/10b5-1-breaks" \\ -H "X-API-Key: pgr_live_..."