API Reference
The India CyberThreat Pulse API provides programmatic access to real-time Indian cybersecurity threat intelligence — including incidents, CERT-In advisories, and Indicators of Compromise (IOCs).
Format
REST / JSON
Auth
Bearer Token
Version
v1 (Stable)
Quick Start: Get your API key from the Pricing page (B2B or Enterprise tier), then use it as a Bearer token in your requests.
Authentication
All API requests require a valid API key passed as a Bearer token in the Authorization header. API keys are issued to B2B and Enterprise subscribers.
http
GET /api/v1/incidents HTTP/1.1
Host: pulse.krishnamuduli.co.in
Authorization: Bearer your_api_key_here
Content-Type: application/json⚠ Security: Never expose your API key in client-side code, public repositories, or browser requests. Use server-side API calls only.
Endpoints
Rate Limits
Rate limits are enforced per API key. Exceeding the limit returns a 429 Too Many Requests response.
| Plan | Price | Requests/Month | Requests/Minute | Features |
|---|---|---|---|---|
| Community | ₹0 | No API access | — | Dashboard only (48hr delay) |
| Professional | ₹999/mo | No API access | — | Real-time dashboard + email digest |
| B2B | ₹5,000/mo | 5,000 | 30 | Full API: incidents + CERT-In + IOCs |
| Enterprise | ₹24,999/mo | Unlimited | 120 | Unlimited API + STIX/TAXII + SLA |
Error Codes
| Status | Code | Description |
|---|---|---|
| 200 | OK | Successful request. Response body contains data. |
| 401 | Unauthorized | Missing or invalid API key. Include Bearer token in Authorization header. |
| 403 | Forbidden | API key is valid but does not have access. Upgrade to B2B or Enterprise tier. |
| 429 | Too Many Requests | Rate limit exceeded. Wait and retry. Check X-RateLimit-Reset header. |
| 500 | Internal Server Error | Server-side error. Retry after 30 seconds. Contact support if persistent. |
Code Examples
Python
python
import requests
API_KEY = "your_api_key_here"
BASE_URL = "https://pulse.krishnamuduli.co.in/api/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Fetch critical incidents from the BFSI sector
response = requests.get(
f"{BASE_URL}/incidents",
headers=headers,
params={
"severity": "Critical",
"sector": "BFSI",
"limit": 10
}
)
data = response.json()
print(f"Found {data['meta']['count']} critical BFSI incidents")
for incident in data["data"]:
print(f" [{incident['severity']}] {incident['title']}")
print(f" Actor: {incident['actor']}")
print(f" Date: {incident['created_at']}")
print()JavaScript (Node.js)
javascript
const API_KEY = "your_api_key_here";
const BASE_URL = "https://pulse.krishnamuduli.co.in/api/v1";
async function fetchThreats() {
const response = await fetch(
`${BASE_URL}/incidents?severity=Critical&limit=10`,
{
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
}
);
const { meta, data } = await response.json();
console.log(`Found ${meta.count} critical incidents`);
data.forEach((incident) => {
console.log(`[${incident.severity}] ${incident.title}`);
console.log(` Actor: ${incident.actor}`);
});
}
fetchThreats();cURL
bash
# Fetch all IOCs with confidence > 80%
curl -s "https://pulse.krishnamuduli.co.in/api/v1/iocs?min_confidence=80&limit=20" \
-H "Authorization: Bearer your_api_key_here" | jq .
# Fetch latest CERT-In advisories
curl -s "https://pulse.krishnamuduli.co.in/api/v1/cert-alerts?limit=5" \
-H "Authorization: Bearer your_api_key_here" | jq '.data[].title'
# Export incidents to CSV (with jq)
curl -s "https://pulse.krishnamuduli.co.in/api/v1/incidents?limit=100" \
-H "Authorization: Bearer your_api_key_here" | \
jq -r '.data[] | [.created_at, .severity, .actor, .title] | @csv'