REST API — Version 1.0

AlertHound API

Integrate real-time marketplace intelligence directly into your applications. Manage alerts, stream listing matches, trigger Stripe checkout flows, and more — all through a clean, consistent REST interface.

Base URLhttps://api.alerthound.io/api/v1

Quick Start

From zero to your first alert match in under 5 minutes.

1

Register an account

POST /auth/register with your email and password. You'll get back a JWT token — keep it.

2

Create an alert

POST /alerts with keywords, a vertical (e.g. "lothound"), and optional price/location filters.

3

Check your matches

GET /alerts/:id/matches returns the listings that matched your criteria, paginated by cursor.

4

Configure notifications

PUT /notifications/preferences to enable email, SMS, push, or webhook delivery.

Authentication

The API uses JWT Bearer tokens. All protected endpoints require an Authorization header.

Getting a token

bash
curl -X POST https://api.alerthound.io/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"your-password"}'

# Response:
# { "success": true, "data": { "token": "eyJhbGci...", "user": { ... } } }

Using the token

bash
# Include the token in every authenticated request:
curl https://api.alerthound.io/api/v1/alerts \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."

Token lifetime: 7 days. There is no refresh endpoint — users re-authenticate to get a new token.

Stateless: Tokens cannot be server-side revoked. Invalidate client-side by discarding the token.

Algorithm: HS256-signed JWT with sub claim containing the user ID.

Response Format

All responses use a consistent envelope. Check the success field before accessing data.

Success
json
{
  "success": true,
  "data": {
    "id": "clalert001abc",
    "name": "Vintage Rolex",
    ...
  }
}
Error
json
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Alert not found"
  }
}

Product Verticals

Alerts and subscriptions are scoped to a vertical. Use these string values in your requests.

🔨
LotHoundlothound

Auction lot tracking

🏪
UnitHoundunithound

Storage unit auctions

🔄
PickHoundpickhound

Marketplace flip opportunities

🏛️
SurplusHoundsurplushound

Government surplus auctions

🏡
EstateHoundestatehound

Estate sale monitoring

🦅
ScanHoundscanhound

Cross-platform deal aggregation

Endpoints

All endpoints are prefixed with /api/v1. Use the interactive explorer to try them out.

Auth

Register, login, password reset, and email verification

POST/auth/register
POST/auth/login
GET/auth/me
POST/auth/logout
POST/auth/forgot-password
POST/auth/reset-password
POST/auth/verify-email
Alerts

Create and manage marketplace alerts with keyword/price/location filters

POST/alerts
GET/alerts
GET/alerts/:id
PATCH/alerts/:id
DELETE/alerts/:id
POST/alerts/:id/pause
POST/alerts/:id/resume
GET/alerts/:id/matches
Listings

Browse scraped marketplace listings — no auth required

GET/listings
GET/listings/:id
Subscriptions

Manage per-vertical subscription tiers

GET/subscriptions
POST/subscriptions
PATCH/subscriptions/:id
DELETE/subscriptions/:id
Notifications

Configure email, SMS, push, and webhook delivery preferences

GET/notifications/preferences
PUT/notifications/preferences
Billing

Stripe checkout, customer portal, and plan catalog

GET/billing/plans
POST/billing/checkout
POST/billing/portal
Users

User profile, password change, and account deletion

GET/users/me
PATCH/users/me
PATCH/users/me/password
DELETE/users/me

Pagination

Cursor Pagination

Used by /alerts and /listings. Pass nextCursor as the cursor query param to get the next page.

json
{
  "items": [...],
  "pagination": {
    "limit": 20,
    "nextCursor": "clalert099xyz",
    "hasNextPage": true
  }
}

Offset Pagination

Used by Admin endpoints. Pass page and limit query params.

json
{
  "items": [...],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 142,
    "totalPages": 6,
    "hasNextPage": true,
    "hasPrevPage": false
  }
}

Rate Limiting

Rate limits protect platform stability. Exceeding them returns HTTP 429.

ScopeLimit
Authenticated requests100 req/min
Unauthenticated requests30 req/min
Analytics event tracking60 req/min
Auth endpoints (login/register)10 req/min

Rate limit state is communicated via headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

Code Examples

End-to-end examples: register, create an alert, and read matches.

curl
bash
# 1. Register an account
curl -X POST https://api.alerthound.io/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"SecurePass123!","name":"Your Name"}'

# 2. Create an alert
curl -X POST https://api.alerthound.io/api/v1/alerts \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Vintage Rolex under $500",
    "vertical": "lothound",
    "keywords": ["rolex", "submariner"],
    "maxPrice": 500,
    "location": "Los Angeles, CA",
    "radiusMiles": 50
  }'

# 3. Get your matches
curl https://api.alerthound.io/api/v1/alerts/ALERT_ID/matches \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
JavaScript
javascript
const API = "https://api.alerthound.io/api/v1";

// Register and get a token
const { data: { token } } = await fetch(`${API}/auth/register`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    email: "you@example.com",
    password: "SecurePass123!",
  }),
}).then(r => r.json());

// Create an alert
const { data: alert } = await fetch(`${API}/alerts`, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Storage unit deals — SoCal",
    vertical: "unithound",
    keywords: ["storage unit", "auction"],
    location: "Los Angeles, CA",
    radiusMiles: 75,
  }),
}).then(r => r.json());

console.log("Alert created:", alert.id);

// Poll for matches
const { data: { items } } = await fetch(
  `${API}/alerts/${alert.id}/matches`,
  { headers: { "Authorization": `Bearer ${token}` } }
).then(r => r.json());

console.log(`${items.length} matches found`);
Python
python
import requests

API = "https://api.alerthound.io/api/v1"

# Register and get a token
resp = requests.post(f"{API}/auth/register", json={
    "email": "you@example.com",
    "password": "SecurePass123!",
    "name": "Your Name",
})
token = resp.json()["data"]["token"]
headers = {"Authorization": f"Bearer {token}"}

# Create an alert
resp = requests.post(f"{API}/alerts", json={
    "name": "Government surplus vehicles",
    "vertical": "surplushound",
    "keywords": ["pickup truck", "ford f150", "chevy silverado"],
    "maxPrice": 15000,
    "location": "California",
}, headers=headers)
alert = resp.json()["data"]
print("Alert created:", alert["id"])

# Get matches
resp = requests.get(
    f"{API}/alerts/{alert['id']}/matches",
    headers=headers,
)
matches = resp.json()["data"]["items"]
print(f"{len(matches)} matches found")

for match in matches:
    listing = match["listing"]
    print(f"  {listing['title']} — ${listing['price']} on {listing['platform']}")

Error Codes

Machine-readable error codes in the error.code field.

EMAIL_TAKEN
Email already registeredHTTP 409
INVALID_CREDENTIALS
Wrong email or passwordHTTP 401
INVALID_RESET_TOKEN
Password reset token expired/invalidHTTP 400
INVALID_VERIFY_TOKEN
Email verification token expired/invalidHTTP 400
NOT_FOUND
Resource not found or not owned by userHTTP 404
INVALID_PRICE_RANGE
minPrice > maxPriceHTTP 400
ALREADY_PAUSED
Alert is already pausedHTTP 400
ALREADY_ACTIVE
Alert is already activeHTTP 400
ALREADY_CANCELLED
Subscription already set to cancelHTTP 400
NO_SUBSCRIPTION
No Stripe customer on fileHTTP 400
STRIPE_ERROR
Stripe API call failedHTTP 500
INVALID_CURRENT_PASSWORD
Current password is incorrectHTTP 400
NO_PASSWORD
Social login account — use password resetHTTP 400
RATE_LIMITED
Too many requests — slow downHTTP 429
INVALID_SIGNATURE
Stripe webhook signature mismatchHTTP 400
USER_NOT_FOUND
User account not foundHTTP 404
🐕

Ready to build?

Get your API token in 30 seconds. No credit card required.

API Documentation | AlertHound