DOC API
Integrate spam verification directly into your call centers, CRM and dialers. Simple, fast and reliable REST API.
Authentication
All requests require a Bearer token. Retrieve your token from your dashboard > API.
Get your token
- Log in to your dashboard
- Go to "API" in the menu
- Copy your token or regenerate a new one
Security
- • Never share your token
- • Regenerate it if compromised
- • Use environment variables
/auth/regenerate-tokenRegenerates your API token. The old token becomes immediately invalid.
{
"success": true,
"data": {
"apiToken": "spk_live_new_token_here"
}
}/check/{phone}
€0.70 / verificationInstant analysis of a phone number. Returns the spam score, spam type, carrier and location.
URL Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| phone | string | Yes | Number in international format (e.g.: +33612345678) |
curl -X GET "https://num.huhu.fr/api/check/+33612345678" \ -H "Authorization: Bearer spk_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json"
JSON Response
{
"success": true,
"data": {
"phoneNumber": "+33612345678",
"isSpam": true,
"spamScore": 85,
"spamType": "Telemarketing",
"carrier": "Orange",
"location": "France",
"lineType": "mobile",
"checkedAt": "2026-01-24T10:30:00Z"
},
"balance": 14.30
}Response Fields
phoneNumberstringAnalyzed number in international formatisSpambooleantrue if the number is identified as spamspamScorenumberScore from 0 to 100 (0 = safe, 100 = certain spam)spamTypestringSpam type: Telemarketing, Scam, Robocall, Survey, UnknowncarrierstringPhone carrier (Orange, SFR, Free, Bouygues...)locationstringCountry of origin of the numberlineTypestringLine type: mobile, landline, voip, toll-freecheckedAtstringDate/time of the verification (ISO 8601)balancenumberYour remaining credit balance in euros/check/bulk
€0.70 x N numbersAnalyze up to 100 numbers in a single request. Ideal for auditing an existing number database.
Request Body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
| phoneNumbers | string[] | Yes | Array of numbers (max 100) |
| stopOnError | boolean | No | Stop if a number is invalid (default: false) |
{
"phoneNumbers": [
"+33612345678",
"+33698765432",
"+33611223344",
"+33655667788"
],
"stopOnError": false
}JSON Response
{
"success": true,
"data": {
"results": [
{
"phoneNumber": "+33612345678",
"isSpam": true,
"spamScore": 85,
"spamType": "Telemarketing",
"carrier": "Orange"
},
{
"phoneNumber": "+33698765432",
"isSpam": false,
"spamScore": 12,
"spamType": null,
"carrier": "SFR"
},
{
"phoneNumber": "+33611223344",
"isSpam": true,
"spamScore": 92,
"spamType": "Scam",
"carrier": "Free"
}
],
"summary": {
"totalChecked": 4,
"spamCount": 2,
"cleanCount": 2,
"errorCount": 0
}
},
"balance": 11.50
}Limits
- • Maximum 100 numbers per request
- • Duplicate numbers counted only once
- • Invalid numbers ignored (unless stopOnError: true)
Monitoring / Routines
Automatically monitor your numbers 24/7. Receive alerts as soon as a number changes spam status. Each routine check costs €0.70.
/routinesCreate a monitoring routine| Field | Type | Required | Description |
|---|---|---|---|
| phoneNumber | string | Yes | Number to monitor |
| name | string | No | Custom name (e.g.: "Sales Line 1") |
| intervalHours | number | Yes | Frequency in hours (1, 4, 12, 24, 48, 72) |
| notifyVia | string[] | No | Channels: "email", "sms", "webhook", "discord" |
| notifyOnlyIfSpam | boolean | No | Alert only if spam detected (default: true) |
| notifyOnChange | boolean | No | Alert only if status changes (default: false) |
| webhookUrl | string | No | Custom webhook URL for this routine |
// Requête
{
"phoneNumber": "+33612345678",
"name": "Ligne commerciale Paris",
"intervalHours": 24,
"notifyVia": ["email", "webhook"],
"notifyOnlyIfSpam": true,
"notifyOnChange": true,
"webhookUrl": "https://mon-crm.com/webhook/spam"
}
// Réponse
{
"success": true,
"data": {
"id": "routine_abc123",
"phoneNumber": "+33612345678",
"name": "Ligne commerciale Paris",
"intervalHours": 24,
"nextCheckAt": "2026-01-25T10:30:00Z",
"createdAt": "2026-01-24T10:30:00Z"
}
}/routines/bulkCreate multiple monitoring routinesCreate up to 50 routines in a single request with the same parameters.
{
"phoneNumbers": ["+33612345678", "+33698765432", "+33611223344"],
"intervalHours": 24,
"notifyVia": ["email"],
"notifyOnlyIfSpam": true
}/routinesList monitoring routines| Query Param | Description |
|---|---|
| page | Page (default: 1) |
| limit | Results per page (default: 20, max: 100) |
| status | Filter: "active", "paused", "all" |
| search | Search by number or name |
/routines/{id}Update a monitoring routineModify the parameters of an existing routine. All creation fields are editable.
{
"intervalHours": 12,
"notifyVia": ["email", "sms"],
"paused": false
}/routines/{id}Delete a monitoring routinePermanently deletes a routine. Verification history remains available.
/routines/bulkDelete multiple monitoring routines{
"ids": ["routine_abc123", "routine_def456", "routine_ghi789"]
}History
View and export the history of all your verifications.
/history| Query Param | Type | Description |
|---|---|---|
| page | number | Page (default: 1) |
| limit | number | Results per page (default: 20, max: 100) |
| from | string | Start date (ISO 8601) |
| to | string | End date (ISO 8601) |
| isSpam | boolean | Filter by spam status |
| phone | string | Search by number |
// GET /history?page=1&limit=20&isSpam=true
{
"success": true,
"data": {
"checks": [
{
"id": "check_123",
"phoneNumber": "+33612345678",
"isSpam": true,
"spamScore": 85,
"spamType": "Telemarketing",
"carrier": "Orange",
"source": "api",
"checkedAt": "2026-01-24T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 156,
"totalPages": 8
}
}
}/history/exportDownload your history in CSV or JSON.
| Query Param | Description |
|---|---|
| format | "csv" or "json" (required) |
| from | Start date (optional) |
| to | End date (optional) |
Returns a downloadable file (Content-Type: text/csv or application/json)
Credits & Billing
/credits/balanceRetrieve your current credit balance.
{
"success": true,
"data": {
"balance": 47.60,
"currency": "EUR"
}
}/credits/transactionsHistory of your transactions (purchases, usage).
| Query Param | Description |
|---|---|
| page, limit | Pagination |
| type | "credit" (purchase) or "debit" (usage) |
/credits/invoicesList of your downloadable invoices.
Webhooks
Receive real-time notifications on your server. Configure your endpoint in dashboard > Settings > Webhooks.
Payload sent (POST to your URL)
{
"event": "spam_status_changed",
"timestamp": "2026-01-24T10:30:00Z",
"data": {
"routineId": "routine_abc123",
"phoneNumber": "+33612345678",
"phoneName": "Ligne commerciale Paris",
"previousStatus": {
"isSpam": false,
"spamScore": 15
},
"currentStatus": {
"isSpam": true,
"spamScore": 78,
"spamType": "Telemarketing"
}
}
}Available Events
spam_status_changedThe spam status of a monitored number has changedroutine_check_completedA routine check has completedroutine_check_failedA routine check has failedcredits_lowYour balance is below €5credits_depletedYour balance is at €0Security
Each request includes a signature header to validate authenticity:
X-HUHU-Signature: sha256=...HMAC SHA256 of the body with your webhook secret
Retry Policy
- • 3 attempts maximum
- • Delay: 1min, 5min, 15min
- • Timeout: 10 seconds
- • Success codes: 2xx
Error Codes
Invalid number format or missing/incorrect parameters.
Missing, invalid or expired token.
Insufficient credit balance for this operation.
Access denied to this resource.
Resource not found (routine, number...).
Resource already exists (duplicate routine...).
Rate limit exceeded (10 req/sec). Retry after 1 second.
Internal error. Contact support if persistent.
Error Format
{
"success": false,
"error": "Insufficient credits",
"code": "INSUFFICIENT_CREDITS",
"details": {
"required": 0.70,
"balance": 0.35
}
}Need help?
Our technical team can help you integrate the API into your CRM, Dialer or internal system.