* 14 schedules

API Polling

Webhook retries, queue drain, and external API polling schedules.

0 8-17 * * 1-5

Every hour on the hour during standard daytime business hours on weekdays.

View details →
0 */1 * * *

At the start of every hour, every day of the year.

View details →
*/1 * * * *

Every single minute, endlessly throughout the day, every day of the year.

View details →
*/10 * * * *

Every ten minutes, continuously throughout the day, every day of the week, and every month of the year.

View details →
*/15 8-20 * * *

Every fifteen minutes starting in the morning and continuing through mid-evening every day.

View details →
*/15 * * * *

Every fifteen minutes, at the start of each quarter-hour interval.

View details →
View all 14 schedules →

* About API Polling

by Sinthuyan Arulselvam

API polling is one of the most fundamental patterns in distributed systems engineering. Rather than waiting for a server to push data to you, polling inverts the model: your system reaches out on a fixed schedule, checks for updates, and processes whatever it finds. While webhooks have become the preferred delivery mechanism for real-time events, polling remains indispensable—and cron expressions are the most reliable tool for scheduling it correctly.

At its core, API polling solves a coordination problem. External services have their own uptime guarantees, rate limits, and delivery semantics. By combining a well-crafted cron schedule with idempotent handlers, you can build integrations that are robust against transient failures, network partitions, and vendor outages. The cron expression defines when to check; your application logic defines what to do when the check returns data.

Common API Polling Use Cases

Webhook Retry and Dead-Letter Processing

Webhook delivery is inherently unreliable. Your endpoint may be temporarily down, return a non-2xx status, or time out—triggering exponential backoff retries from the sender. A robust architecture supplements webhook consumption with a periodic poll of a dead-letter queue or a vendor-provided event log. A schedule like */5 * * * * (every 5 minutes) sweeps the backlog and reprocesses any events that the push delivery missed, ensuring eventual consistency without manual intervention.

Queue Drain and Backpressure Management

Message queues—whether SQS, RabbitMQ, or Cloudflare Queues—accumulate messages faster than consumers can process them under load. A scheduled drain job running on a cadence such as 0 * * * * (hourly) or */15 * * * * (every 15 minutes) provides a secondary consumer that clears aged messages, re-routes DLQ entries, and emits queue-depth metrics. This is particularly useful for low-throughput queues where a persistent long-polling worker would be wasteful.

External API Polling for Third-Party Data

Many SaaS vendors—payment processors, shipping carriers, CRM platforms—do not offer webhooks for all event types. Polling their REST APIs on a schedule is the only way to detect status changes. For example, checking an order fulfilment API with 0 */4 * * * (every 4 hours) keeps your local database in sync without hammering rate limits. Similarly, monitoring a partner's data export endpoint with 30 6 * * 1-5 (6:30 AM on weekdays) aligns your ingestion with their publish schedule.

Best Practices for Scheduled API Polling

Respect Rate Limits with Jitter

When multiple instances of your application boot simultaneously, they will fire polling jobs at identical timestamps, creating a thundering herd against the upstream API. Introduce random jitter—a short random sleep at job startup—to spread the load. If your infrastructure supports it, use distributed locking (Redis SET NX, Cloudflare Durable Objects) to ensure only one instance polls at a time.

Track Cursors, Not Full Scans

Never poll by fetching all records and diffing them locally. Always request only records that changed after a stored cursor: a timestamp, a sequence number, or a pagination token. Persist the cursor in a durable store immediately after a successful response, before processing. This makes your polling jobs both efficient and resumable—if the job crashes mid-batch, the next run picks up exactly where it left off.

Design for Idempotency

Polling jobs will occasionally run twice due to scheduler retries, clock drift, or infrastructure restarts. Every downstream write must be idempotent. Use upsert semantics in your database layer, deduplicate on a stable external ID, and emit structured logs with the cursor range so you can audit exactly what each run processed.

  • Use */5 * * * * for near-real-time webhook backfill (5-minute windows)
  • Use */15 * * * * for queue drain and backpressure jobs
  • Use 0 */4 * * * for partner API synchronisation within daily SLA
  • Use 30 6 * * 1-5 for business-hours-aligned polling on weekdays
  • Always store and advance a cursor; never do full-table scans
  • Apply jitter and distributed locking to prevent thundering herds
Partner BetterStack

Monitor this schedule in production

Get alerted the moment this cron job fails, is late, or doesn't run. BetterStack tracks execution, duration, and output — no infrastructure required.

Related Topics