Skip to main content

Webhooks & Callbacks

Coming Soon

Webhooks are on our roadmap for Q2 2026. This page documents the planned functionality.

Want early access? Contact support@web3identity.com

Planned Features

Event Types

EventDescriptionStatus
ens.transferENS name transferredPlanned
ens.expiringName expires within 30 daysPlanned
ens.expiredName has expiredPlanned
ens.record_changedText record updatedPlanned
wallet.transferETH/token transferPlanned
wallet.nft_transferNFT transferredPlanned
farcaster.followNew Farcaster followPlanned
farcaster.castNew cast from userPlanned
price.alertToken price thresholdPlanned

Proposed API

Create Webhook

POST /api/webhooks
Content-Type: application/json

{
"url": "https://your-app.com/webhook",
"events": ["ens.transfer", "ens.expiring"],
"filters": {
"names": ["yourname.eth", "*.yourname.eth"]
},
"secret": "your-webhook-secret"
}

Response

{
"id": "wh_abc123",
"url": "https://your-app.com/webhook",
"events": ["ens.transfer", "ens.expiring"],
"status": "active",
"createdAt": "2026-02-08T12:00:00Z"
}

Webhook Payload Format

{
"id": "evt_xyz789",
"type": "ens.transfer",
"timestamp": "2026-02-08T12:34:56Z",
"data": {
"name": "yourname.eth",
"from": "0xabc...",
"to": "0xdef...",
"txHash": "0x123..."
}
}

Signature Verification

const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');

return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}

// In your webhook handler
app.post('/webhook', (req, res) => {
const signature = req.headers['x-webhook-signature'];

if (!verifyWebhook(JSON.stringify(req.body), signature, SECRET)) {
return res.status(401).send('Invalid signature');
}

// Process webhook
const { type, data } = req.body;
console.log(`Received ${type}:`, data);

res.status(200).send('OK');
});

Pricing (Proposed)

PlanWebhooksEvents/MonthPrice
Free11,000$0
Pro1050,000$29/mo
EnterpriseUnlimitedUnlimitedContact us

Alternative: Polling

Until webhooks launch, use polling:

// Check ENS ownership every hour
async function checkENSOwnership(name) {
const response = await fetch(
`https://api.web3identity.com/api/ens/${name}`
);
const data = await response.json();

// Compare with cached value
if (data.registrant !== cachedRegistrant) {
console.log(`${name} transferred!`);
// Handle the change
}

cachedRegistrant = data.registrant;
}

setInterval(() => checkENSOwnership('yourname.eth'), 3600000);

Efficient Batch Polling

// Poll multiple names efficiently
async function batchCheck(names) {
const response = await fetch(
`https://api.web3identity.com/api/ens/batch?names=${names.join(',')}`
);
return response.json();
}

Request This Feature

Help us prioritize by telling us your use case:

Include:

  1. Events you need
  2. Expected volume
  3. Your application type