InsiderPulse API
Programmatic access to European insider (PDMR) transaction data across 8 markets.
Authentication
All endpoints require an API key. Pass it via the Authorization header:
Authorization: Bearer ip_your_api_key_here
Generate API keys in your account settings. Free users get 1 key (50 req/day). Pro users get up to 3 keys (500 req/day).
Rate Limits
Every response includes rate limit headers:
X-RateLimit-Limit: 500 X-RateLimit-Remaining: 487 X-RateLimit-Reset: 1741305600
Limits reset at midnight UTC. When exceeded, you receive a 429 response with a Retry-After header.
Endpoints
/api/v1/transactionsSearch insider transactions with filtering, sorting, and pagination.
| Parameter | Type | Description |
|---|---|---|
| company | string | Search by company name, ISIN, or ticker |
| insider | string | Search by insider name |
| country | string | Comma-separated country codes: DE,GB,SE |
| type | string | buy or sell |
| cluster | boolean | Only cluster transactions (3+ insiders) |
| min_value | number | Minimum transaction value in EUR |
| from | string | Start date (YYYY-MM-DD) |
| to | string | End date (YYYY-MM-DD) |
| role | string | Filter by insider role (e.g. CEO) |
| mcap | string | Market cap tier: small,mid,large,mega |
| min_pct_mcap | number | Min transaction value as % of market cap |
| csuite | boolean | Only C-suite insiders (CEO, CFO, etc.) |
| watchlist | boolean | Only your watchlist companies |
| sort | string | date, value, or shares (default: date) |
| order | string | asc or desc (default: desc) |
| page | number | Page number (default: 1) |
| per_page | number | Results per page, max 100 (default: 50) |
| format | string | json (default) or csv |
curl -H "Authorization: Bearer ip_xxx" \ "https://www.insiderpulse.io/api/v1/transactions?country=DE,SE&type=buy&min_value=50000"
/api/v1/companiesSearch and list companies.
| Parameter | Type | Description |
|---|---|---|
| q | string | Search by name, ISIN, or ticker |
| country | string | Comma-separated country codes |
| sector | string | Filter by sector |
| sort | string | name, market_cap, or last_activity |
| page | number | Page number |
| per_page | number | Results per page |
/api/v1/companies/{isin}Get company detail with insider activity stats and signal flags.
curl -H "Authorization: Bearer ip_xxx" \ "https://www.insiderpulse.io/api/v1/companies/DE000TUAG505"
/api/v1/signals/clustersActive cluster signals โ 3+ insiders trading in the same direction.
| Parameter | Type | Description |
|---|---|---|
| period | string | 7d, 30d, or 90d (default: 7d) |
| type | string | buy or sell |
| country | string | Country code filter |
/api/v1/signals/dip-buysInsider buys after a stock price drop.
| Parameter | Type | Description |
|---|---|---|
| period | string | 7d, 30d, or 90d (default: 30d) |
| min_dip_percent | number | Minimum price drop % (default: 10) |
/api/v1/signals/outsized-movesTransactions that are large relative to market cap.
| Parameter | Type | Description |
|---|---|---|
| period | string | 7d, 30d, or 90d (default: 7d) |
/api/v1/signals/high-convictionInsider buys when stock is trading above its 12-month average.
| Parameter | Type | Description |
|---|---|---|
| period | string | 7d, 30d, or 90d (default: 30d) |
/api/v1/exportBulk export transactions as CSV or JSON. Costs 10 rate limit units.
| Parameter | Type | Description |
|---|---|---|
| from | string | Start date (YYYY-MM-DD) |
| to | string | End date (YYYY-MM-DD) |
| country | string | Country filter |
| type | string | buy or sell |
| per_page | number | Max rows, up to 10000 (default: 1000) |
| format | string | csv (default) or json |
/api/v1/meYour profile, tier, rate limit status, and watchlist.
Code Examples
Python
import requests
API_KEY = "ip_your_key_here"
BASE = "https://www.insiderpulse.io/api/v1"
# Get recent insider buys in Germany
r = requests.get(f"{BASE}/transactions", headers={
"Authorization": f"Bearer {API_KEY}"
}, params={"country": "DE", "type": "buy", "per_page": 20})
for tx in r.json()["data"]:
print(f"{tx['date']} {tx['company']['name']} - {tx['insider']['name']} bought {tx['value']} EUR")JavaScript
const API_KEY = "ip_your_key_here";
const BASE = "https://www.insiderpulse.io/api/v1";
const res = await fetch(`${BASE}/transactions?country=SE&type=buy`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const { data, meta } = await res.json();
console.log(`${meta.total} transactions found`);Webhook Verification
Webhook payloads include an HMAC-SHA256 signature. Verify it using your webhook secret:
import hmac, hashlib
def verify_signature(body: bytes, timestamp: str, signature: str, secret: str) -> bool:
payload = f"{timestamp}.{body.decode()}"
expected = "sha256=" + hmac.new(
secret.encode(), payload.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)MCP Server
Use InsiderPulse with Claude, GPT, and other AI assistants via the MCP protocol.
// claude_desktop_config.json
{
"mcpServers": {
"insiderpulse": {
"command": "npx",
"args": ["-y", "insiderpulse-mcp"],
"env": {
"INSIDERPULSE_API_KEY": "ip_your_key_here"
}
}
}
}Error Codes
| Code | Status | Description |
|---|---|---|
| unauthorized | 401 | Invalid or missing API key |
| forbidden | 403 | Feature requires a higher tier |
| not_found | 404 | Resource not found |
| rate_limit_exceeded | 429 | Daily request limit exceeded |
| internal_error | 500 | Unexpected server error |
OpenAPI spec available at /api/v1/openapi.json