Concepts
Bloomfilter uses three key protocols. Understanding them will help you work with the API effectively.
x402 — HTTP payments
Section titled “x402 — HTTP payments”x402 is an open protocol that adds native payments to HTTP. When you request a paid endpoint without paying, the server responds with HTTP 402 Payment Required — the status code that HTTP reserved for payments since 1997.
How it works:
- Client sends a request to a paid endpoint (e.g.
POST /domains/register) - Server responds with
402+ aPAYMENT-REQUIREDheader containing payment details (price, asset, network) - Client signs a USDC payment on Base L2
- Client retries the request with a
PAYMENT-SIGNATUREheader - Server verifies and settles the payment on-chain, then processes the request
Two pricing models:
| Model | Endpoints | Price |
|---|---|---|
| Dynamic | POST /domains/register, POST /domains/renew | Varies by TLD + years |
| Static | POST /dns/*, PUT /dns/*, DELETE /dns/* | $0.10 per operation |
For a detailed walkthrough, see the x402 Payment Flow guide.
SIWE — Wallet-based authentication
Section titled “SIWE — Wallet-based authentication”SIWE (Sign-In With Ethereum) replaces traditional username/password auth with wallet signatures.
How it works:
- Client requests a nonce from
GET /auth/nonce - Client constructs a standard EIP-4361 message with the nonce
- Client signs the message with their wallet private key
- Client sends message + signature to
POST /auth/verify - Server returns a JWT access token (1 hour) + refresh token (30 days)
Which endpoints need auth?
| Requires auth | Endpoints |
|---|---|
| No | Search, pricing, registration, renewal, domain info, health |
| Yes | DNS management, account info, session revocation |
For step-by-step instructions, see the Authentication guide.
Async provisioning
Section titled “Async provisioning”Domain registration usually completes instantly, but some registrations take longer (registry delays, premium domains, etc.). Bloomfilter handles this with HTTP 202 + job polling.
How it works:
- Client sends
POST /domains/registerwith payment - If registration completes within the timeout: 201 Created with domain details
- If it takes longer: 202 Accepted with a
jobIdandpoll_url - Client polls
GET /domains/status/{jobId}until status iscompletedorfailed
// 202 response{ "status": "pending", "jobId": "01JMXYZ...", "message": "Registration is being processed asynchronously", "poll_url": "/domains/status/01JMXYZ...", "poll_interval_ms": 2000}For implementation details, see the Async Provisioning guide.