Webhooks for expired domains

Expired Domains Webhooks that POST when a domain matches — or a price moves

Subscribe with the same Pro key as the Public API. Karma.Domains sends a signed JSON event to Zapier, Make, n8n, IFTTT, or any public HTTPS URL when a filter matches, an auction changes, or you update a note, a favorite, or a user task.

30 Subscriptions
5,000 Deliveries per day
3 Subscription kinds
60/min Shared rate limit
Ask AI
  • ChatGPT
  • Claude
  • Gemini
  • Grok
  • Perplexity

Connect Zapier, Make, n8n, or IFTTT

Create a webhook trigger in your tool, copy its HTTPS URL, and register it with POST /v1/webhooks. The same call works for every client — only the URL changes.

Requires the Pro plan or above. Create or reset the key in Profile → Developer. Treat it like a password.

Subscriptions 30 per account
Deliveries 5,000 per UTC day
Rate limit 60 requests/minute per key (shared with Public API and MCP)

Zapier — Webhooks by Zapier, Catch Hook

  1. Create a Zap and choose Webhooks by Zapier as the trigger. Pick Catch Hook.
  2. Copy the HTTPS webhook URL Zapier shows.
  3. Send POST /v1/webhooks with your Pro key, that URL, a kind, and the events you want. Test the Zap after the first delivery.
curl https://api.karma.domains/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "filter",
    "url": "https://hooks.zapier.com/hooks/catch/123456/abcdef",
    "events": ["domain.matched_filter"],
    "bases": ["expired", "auctions"],
    "filter": { "karmascore_min": 60 }
  }'

Three ways to subscribe

One event is one report, except user-task events, which are one event per task. The secret is returned only when you create the subscription or rotate it.

Filter match

kind=filter sends domain.matched_filter when a report starts matching the same filters as POST /v1/reports/search. The cursor starts when you subscribe, so older rows are not replayed. A report that matches again after leaving the filter can fire again.

Subscribe

curl https://api.karma.domains/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "filter",
    "url": "https://hooks.example.com/karma",
    "events": ["domain.matched_filter"],
    "bases": ["expired", "auctions"],
    "filter": { "karmascore_min": 60 }
  }'

Event you receive

{
  "id": "evt_example",
  "type": "domain.matched_filter",
  "version": "1",
  "subscription_id": "sub_example",
  "object": {
    "domain": "example.com",
    "report_id": "665f0example",
    "report_type": "expired"
  },
  "data": { "current": { "changed_at": 1710000000 } },
  "links": { "report": "https://karma.domains/app/reports/expired/report-665f0example/" }
}

A specific report

kind=reports watches up to 100 reports. Auction events cover price, bid count, ending soon, and ended. Note, tag, and favorite events fire only for the account that made the change — another account watching the same report for price does not receive them. ending_soon_seconds is required only when you select auction.ending_soon.

Subscribe

curl https://api.karma.domains/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "reports",
    "url": "https://hooks.example.com/karma",
    "events": ["auction.price_changed", "report.note_changed"],
    "reports": [{ "report_type": "auctions", "report_id": "665f0example" }]
  }'

Event you receive

{
  "id": "evt_example",
  "type": "auction.price_changed",
  "version": "1",
  "subscription_id": "sub_example",
  "object": {
    "domain": "example.com",
    "report_id": "665f0example",
    "report_type": "auctions"
  },
  "data": {
    "current": { "price": 120, "bid_count": 4 },
    "previous": { "price": 100, "bid_count": 3 },
    "changes": { "price_delta": 20, "bid_count_delta": 1 }
  }
}

User tasks

kind=user has no filter and no report list. usertask.created fires once when a task is saved. usertask.completed fires once when it finishes. Progress ticks are not sent. The payload names the task and the report count — not every domain in the task.

Subscribe

curl https://api.karma.domains/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "user",
    "url": "https://hooks.example.com/karma",
    "events": ["usertask.created", "usertask.completed"]
  }'

Event you receive

{
  "id": "evt_example",
  "type": "usertask.completed",
  "version": "1",
  "subscription_id": "sub_example",
  "object": {
    "task_id": "665f0task",
    "report_type": "expired"
  },
  "data": {
    "current": { "task_name": "French plumbing", "reports_count": 12 }
  }
}

Deliveries are signed with Standard Webhooks. Each POST includes webhook-id, webhook-timestamp, and webhook-signature. The whsec_ secret comes back once, on create and on secret rotation. Send POST /v1/webhooks/{id}/ping to deliver a webhook.ping and confirm the URL.

Frequently asked questions

Is this the same key as the Public API?

Yes. One Pro key from Profile → Developer for REST, MCP, and webhooks. Creating and updating subscriptions counts toward the shared 60 requests per minute.

What are the webhook limits?

30 subscriptions per account and 5,000 deliveries per UTC day. Past the daily cap the subscription becomes quota_paused until the next UTC day. You can pause a subscription yourself with PATCH.

Which events can I subscribe to?

kind=filter accepts only domain.matched_filter. kind=reports accepts auction.price_changed, auction.bid_count_changed, auction.ending_soon, auction.ended, report.note_changed, report.tags_changed, and report.favorite_changed. kind=user accepts usertask.created and usertask.completed.

Why is Majestic (or another metric) missing from the event?

Report data arrives in the background, not in one shot. A filter that does not require a metric can match before that metric exists. A low-priority report may never receive it.

Should I put a required metric in the filter?

Yes, if you only want reports that already have it. That narrows the set and can delay the event until the metric is collected. On expired domains the delay matters — the name can leave the feed while you wait. If you need the earliest signal, leave the metric out and check it after the POST.

In what order do metrics usually appear?

Auction data, then Karma Metric, then Karma Score and archive content, then SEO metrics (Majestic, Moz, Ahrefs, and the rest), then Google data. There is no fixed wait. A later step can be skipped.

Do note and favorite events go to everyone watching that report?

No. Those events go only to subscriptions owned by the account that changed the note, tags, or favorite. A watch used for price updates on the same report stays on auction events.

Where is the request schema?

Types and a try-it console are in Swagger UI. The Public API page covers search, reports, and the rest of REST.

Same inventory as the app — pushed to your URL

Register an HTTPS endpoint and start receiving events

One Pro key. 30 subscriptions. 5,000 deliveries per day.

Pro Plan required
30 Subscriptions
5,000 Deliveries per day
Get your API key

Prefer to pull data yourself? See the Public API

Prefer chat? See the MCP server