Giggal.ai API Reference

Verify single emails, run bulk batches, and deep-check catch-all and SEG-protected addresses. All endpoints use JSON, are authenticated with an API key, and are billed per successful verification.

Introduction

The Giggal.ai API lets you verify single email addresses, run bulk batches of up to 50,000 emails per job, and deep-check catch-all and SEG-protected addresses via a simple JSON REST API. Every successful verification costs credits from your account.

Base URL
https://api.giggal.ai/v1
Get an API key

Create an API key from your Giggal.ai dashboard: open the Developer API tab in the sidebar and click Create API Key. Each key is scoped to your account, tracks its own usage, and can be revoked at any time.

Open the Developer API tab
Response envelope

Every response follows a consistent JSON envelope:

// Success
{ "success": true, "data": { ... }, "meta": { ... } }

// Error
{ "success": false, "error": "Human-readable error message" }
Quick start — verify one email with cURL
curl -X POST https://api.giggal.ai/v1/verify \
  -H "Authorization: Bearer tp_live_xxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

Authentication

Pass your API key with every request via one of two headers. Either works.

Option 1 — Bearer token
Authorization: Bearer tp_live_xxxxxxxxxxxxxxxxxxxxxxxxx
Option 2 — X-API-Key header
X-API-Key: tp_live_xxxxxxxxxxxxxxxxxxxxxxxxx

Missing, invalid, or revoked keys return HTTP 401. Never expose API keys in client-side code — proxy calls through your backend instead.

Idempotency (bulk & catch-all)

For POST /v1/verify-batch and POST /v1/catchall, pass an Idempotency-Key header. Retries with the same key return the original response without creating a duplicate job or double-charging credits.

Idempotency-Key: 2026-07-24-list-batch-42

Single verification

1 endpoint in this group.

POST/v1/verify

Verify a single email

Verify one email address synchronously. Costs 1 credit. When the domain is catch-all, deep verification runs in-line and the response includes catch_all_score plus catch_all_verdict.

Authorizations
api_key_auth
Request body
email
Required
string
The email address to verify.

Bulk verification

3 endpoints in this group.

POST/v1/verify-batch

Submit a bulk verification job

Submit up to 50,000 emails per job. Processing is asynchronous — poll GET /v1/jobs/:jobId for progress. Pass an Idempotency-Key header to safely retry job creation without double charges.

Authorizations
api_key_auth
Request body
emails
Required
string[]
Array of email addresses to verify. Max 50,000 per job. Duplicates and invalid syntax are stripped server-side.
name
string
Optional human-readable label for the job. Shown in your dashboard.
GET/v1/jobs/:jobId

Get bulk job status

Poll to check progress. Status transitions: processing → completed (or failed). Recommended polling interval: 10–15 seconds. Small batches (< 50 emails) typically finish inside 30 seconds.

Authorizations
api_key_auth
Path & query parameters
jobId
Required
string
The job ID returned from POST /v1/verify-batch.
GET/v1/jobs/:jobId/results

Get bulk job results

Once status is "completed", fetch per-email results. Results are paginated — pass page and limit query params. Results are retained for 48 hours (see resultsExpiresAt on the job).

Authorizations
api_key_auth
Path & query parameters
jobId
Required
string
The job ID.
page
integer
Page number, defaults to 1.
limit
integer
Results per page, defaults to 25, max 500.

Catch-all verification

4 endpoints in this group.

POST/v1/catchall

Start a catch-all verification task

Kick off deep catch-all verification for a completed bulk job. Only addresses flagged as catch-all in the source job are re-checked. Billed at 2 credits per address (see creditsRequired in the response).

Authorizations
api_key_auth
Request body
jobId
Required
string
A completed bulk verification job ID. Only catch-all addresses from that job will be deep-verified.
name
string
Optional human-readable label for the task.
GET/v1/catchall/:taskId

Get catch-all task status

Poll to check progress and live verdictCounts. Catch-all tasks usually resolve in a few seconds to a few minutes depending on volume.

Authorizations
api_key_auth
Path & query parameters
taskId
Required
string
The task ID returned from POST /v1/catchall.
GET/v1/catchall/:taskId/results

Get catch-all task results

Fetch paginated per-email verdicts with the underlying scoring breakdown (domain triage signals and domain age).

Authorizations
api_key_auth
Path & query parameters
taskId
Required
string
The task ID.
page
integer
Page number, defaults to 1.
limit
integer
Results per page, defaults to 25, max 500.
verdict
string
Filter by verdict: valid | invalid.
GET/v1/catchall/:taskId/download

Download catch-all results as CSV

Downloads all results for a completed catch-all task as a CSV file with Email, Score, Verdict columns. Content-Type is text/csv.

Authorizations
api_key_auth
Path & query parameters
taskId
Required
string
The task ID.
verdict
string
Filter by verdict: valid | invalid.

Account

1 endpoint in this group.

GET/v1/credits

Get current credit balance

Returns your account balance including available, reserved (held for in-flight jobs), and lifetime totals. Verifications that come back as "unknown" are refunded automatically and reflected here.

Authorizations
api_key_auth

Errors & rate limits

StatusMeaning
200 OKRequest succeeded (synchronous verification or status/results fetch).
202 AcceptedAsync job or task created and queued.
400 Bad RequestMissing or invalid parameters (bad email format, empty emails array, missing jobId).
401 UnauthorizedMissing, invalid, or revoked API key.
402 Payment RequiredInsufficient credits for the requested operation.
404 Not FoundJob or task ID does not exist under your account.
409 ConflictJob is not in the required state (e.g. requesting results before completion).
410 GoneJob results have passed the 48-hour retention window.
429 Too Many RequestsRate limit exceeded — back off and retry.
500 / 502 / 503Server or upstream verification service is temporarily unavailable.

Rate limits

Every response includes RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers (RFC casing) so you can pace requests. RateLimit-Reset is the number of seconds until the current window resets.

CategoryLimit
All endpoints (default)300 requests / 15 minutes
Batch creation (POST /v1/verify-batch, POST /v1/catchall)30 requests / 15 minutes
Job polling (GET /v1/jobs/:id, GET /v1/jobs/:id/results)600 requests / 15 minutes
Max emails per bulk job50,000
Job results retention48 hours

The three-tier split exists because polling naturally happens more often than batch creation — you might poll every few seconds while a job runs, so 600 / 15 min ( 40/min) gives you room without hammering the backend.

429 response format

When you hit a rate limit, the API returns HTTP 429 with this body:

{
  "success": false,
  "message": "Developer API rate limit exceeded"
}

Back off using the RateLimit-Reset header value (seconds until the window resets) before retrying.

Need higher limits? Talk to us — we routinely lift limits for verified integration partners.

Ready to integrate?

Create your API key in seconds. Free trial credits included so you can wire it up end-to-end before spending a cent.