The word “API” gets thrown around constantly, but the concept is actually simple. And once you understand sync vs async, you’ll understand why most automation tools are built the wrong way — and how async jobs fix it.
What is an API?
API stands for Application Programming Interface. At its core, an API is a way for two software systems to talk to each other.
When you book a flight on a travel website, the site uses an API to ask the airline’s system “what seats are available?” The airline’s system responds with data. The website shows you that data. You never saw the raw exchange — just the result.
Think of an API as a menu in a restaurant. The menu tells you what you can order (the available endpoints), what information you need to provide (the inputs), and what you’ll get back (the outputs). You don’t need to know how the kitchen works.
Synchronous APIs: the default — and the problem
Most APIs are synchronous. You send a request, you wait, you get a response. The connection stays open the entire time.
Client ──── request ────► Server
◄─── response ─── (waits 2–30 seconds)
This works fine for fast operations. But what happens when the task takes 30 seconds? Or 5 minutes?
- Your HTTP connection might time out
- The caller has to sit idle, burning resources
- If the server crashes mid-way, the work is lost
- You can’t easily run multiple tasks at once
For anything heavier than a database query, sync APIs are fragile.
Asynchronous jobs: the better model
Async flips the model. Instead of “send request, wait for result”, you:
- Submit a job — server responds instantly with a job ID
- Go do other things — your code doesn’t block
- Poll or receive a webhook when the job is ready
Client ──── POST /jobs ────► Server
◄─── { job_uuid } ─── (instant response)
... time passes, worker runs in background ...
Client ──── GET /jobs/{id} ──► Server
◄─── { status: completed, result: {...} }
The key insight: the client is never blocked. You can submit 50 jobs simultaneously and retrieve results as they complete — in parallel, at whatever pace makes sense for your application.
Why this matters for automation
Most automation workloads are fundamentally slow:
- Scraping a website: 2–30 seconds
- Running an AI model: 1–15 seconds
- Sending bulk emails: minutes
- Extracting a PDF: 1–5 seconds
- Enriching a list of 1,000 leads: many minutes in total
With a sync API, you’d have 1,000 open HTTP connections for that last one. With async jobs, you submit 1,000 jobs, get 1,000 job IDs back instantly, and poll as they finish. Much cleaner.
How Seek API implements this
Every worker on Seek API uses async jobs by default — even fast ones that complete in under a second.
A typical flow:
# Step 1: submit job
curl -X POST https://api.seek-api.com/v1/workers/email-validator/jobs \
-H "X-Api-Key: YOUR_KEY" \
-d '{"email": "hello@example.com"}'
# → { "job_uuid": "job_abc123", "status": "QUEUED" }
# Step 2: poll
curl https://api.seek-api.com/v1/jobs/job_abc123 \
-H "X-Api-Key: YOUR_KEY"
# → { "status": "completed", "response_json": { "valid": true, "score": 0.97 } }
The consistency matters. Whether a job takes 0.5 seconds or 5 minutes, the API contract is identical. Your code doesn’t need special handling for slow jobs — it just polls.
Webhooks: an even better option
If you don’t want to poll, you can provide a callback_url when submitting a job. When the job completes, Seek API sends a POST request to that URL with the result.
{
"url": "https://api.seek-api.com/v1/workers/email-validator/jobs",
"body": {
"email": "hello@example.com",
"callback_url": "https://yourapp.com/webhooks/seek-job-done"
}
}
Your server receives the result the moment the job completes — no polling required.
Summary
| Pattern | When to use | Problem |
|---|---|---|
| Sync API | Fast operations < 500ms | Breaks on slow tasks |
| Async polling | Any duration, simple setup | Client must poll |
| Async + webhook | Any duration, production apps | Requires webhook endpoint |
For automation, data enrichment, and AI workloads — anything that might take more than a second — async is the right model. It’s why every worker on Seek API is async by default.