REST API

Build on top of your blast data.

Access your submission history, set up webhooks, and export reports via the List My Product API.

JWT Bearer token

All API requests require a valid JWT token passed in the Authorization header. Get your token from your account Settings page.

1
Sign in to your List My Product account.
2
Go to Settings and copy your API token.
3
Include the token in every request header.
Authorization: Bearer <your_token>
Base URL: https://firmhound.com

Available API endpoints

GET /alerts

List your alert history. Returns an array of alert objects in reverse chronological order. Requires an active subscription to the product.

product_id limit
// Response [ { "id": "uuid", "product_name": "List My Product", "title": "Blast completed", "content": "Submission summary...", "source_id": "blast_abc123", "created_at": "2026-04-19T10:00:00Z" } ]
GET /alerts/export

Export your alert history as a CSV file. Pass the product ID as a query parameter to filter by product.

product_id
GET /webhooks

List all webhooks registered for your account.

POST /webhooks

Register a new webhook endpoint. Supported events: blast.started and blast.completed.

// Request body { "url": "https://yourapp.com/webhooks/listmyproduct", "events": ["blast.started", "blast.completed"] }
DELETE /webhooks/:id

Remove a registered webhook by its ID.

GET /feed/listmyproduct

Public RSS 2.0 feed of recent blasts (no auth required). Returns the last 20 items.

Fetching alert history

Three ways to call the /alerts endpoint.

curl -X GET "https://firmhound.com/alerts?limit=10" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json"
import requests token = "YOUR_TOKEN" headers = {"Authorization": f"Bearer {token}"} resp = requests.get( "https://firmhound.com/alerts", headers=headers, params={"limit": 10} ) data = resp.json()
// Node.js (fetch) const resp = await fetch("https://firmhound.com/alerts?limit=10", { headers: { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json" } }); const data = await resp.json();

Request quotas

Auth endpoints are rate limited to prevent abuse. Exceeding limits returns a 429 response.

5
Signups per hour
Per IP address. POST /auth/signup.
10
Logins per minute
Per IP address. POST /auth/login.
429 Too Many Requests: Wait before retrying. Auth rate limits reset on a rolling window.