
Web development in 2026 offers more tools and possibilities than ever before. From responsive static sites to complex full-stack applications, modern web development requires understanding a diverse ecosystem of frameworks, APIs, and deployment strategies.
Your integration works today and breaks in nineteen days
You wired up a third-party billing API, the demo passed, and then payments started failing at 2 a.m. when the vendor quietly deprecated a response field you never validated. This is the reality of API integration: the code you ship is only half the work, and the other half is decision-making about retries, idempotency, error handling, and change management. Nearly every production incident involving an external API traces back to a choice made in the first hour of integration, not to a bug in the vendor's service.

This guide is structured as a decision tree. Work down the branches in order and you will cover the parts of an integration most teams skip until something breaks. If you are still selecting a stack or contract style, our API integration course walks through the build from requirements to monitoring, and our API development guide covers the contract design side from the provider's point of view.
Branch one: which integration pattern fits your workload
Your first decision is not about libraries; it is about what the integration must tolerate. Answer a few questions before choosing a pattern.

- Is the vendor call synchronous and fast? If a response reliably returns in under ~500ms and you can afford to block, a direct request-response integration is the simplest and most debuggable option.
- Can a response legitimately take seconds? Large file processing, payment settlement, and report generation often return immediately with a job ID and complete asynchronously. You then need a polling loop or a webhook to learn when the job finishes.
- Do you need to retry failed calls safely? This is where you must decide your idempotency strategy. A retry of a non-idempotent operation (say, creating a charge) can double-bill. If the vendor supports an idempotency key header, send a stable UUID per logical operation; if not, you often need to reconcile by a unique reference you generate.
- Does the vendor push events to you? Webhooks invert the call direction and are great for availability, but you inherit the job of deduplicating and verifying deliveries. Most production webhook flows keep a last-seen header and a signature check.
Write this decision down. Teams that skip the pattern decision end up blocking on async jobs or polling on fast calls, and both feel wrong in different ways.
Branch two: design the request and response contract
Before you write code, pin down the shape of both messages. Three fields matter disproportionately.

- A correlation ID you generate and send on every request. When logs across your system and the vendor's support team need to line up, this single string saves hours.
- Explicit accept headers and version. Pin your API version in the URL or header ("/v2/charges") rather than relying on defaults that vendors silently move.
- Strict response validation. Decide what to do when the response has an unexpected shape: fail loudly in development, or log and marshal defensively in production. Choose fail-loud for new fields and tolerate unknown fields, but never silently drop a required field.
If you control both sides of the contract, invest in a machine-readable schema. Our GraphQL API design guide shows how a typed schema and explicit introspection reduce the "undocumented breaking change" class of incidents that plague REST integrations.
Branch three: choose your transport and error model
Different failure needs suggest different protocols. The table below compares the most common choices in production integrations today.

| Platform / Tool | Key Features | Pricing |
|---|---|---|
| Postman | Collection-based API testing, environments, mock servers, and monitors that scan for regressions | Free tier up to 3 members; paid plans from about $14/user/month |
| Stripe API | Idempotency key support, strong typed SDKs, clear error codes, webhook signing signatures | Pay per transaction; free to integrate and test on API |
| PostgREST / FastAPI | Typed endpoints, auto-generated OpenAPI schemas, fast iteration for internal services | Open source, free |
| Pipedream | Webhook handling, retry logic, and low-code event connectors for glue integrations | Free developer tier with limited credits; paid plans from around $19/month |
| Zapier / Make | Managed connectors between hundreds of SaaS tools, native retry and error monitoring | Zapier free tier limited; paid from ~$19.99/month; Make free tier, plans from ~$9/month |
| Datadog API monitoring | Latency, error rate, and correctness checks across API endpoints with alerting | Free trial; paid from roughly $15/host/month plus API monitoring add-ons |
For direct REST calls over HTTP, decide how you map these status classes: 4xx (client error, likely permanent, retry rarely) versus 5xx (server error, safe to retry with backoff). A common production default is: retry 5xx and idempotent 429 rate-limit responses with exponential backoff plus jitter, and never silently retry 4xx errors unless the code is known transient (like 409 on a lock).
Branch four: engineer retries without amplifying load
Retries are where integrations go from "working" to "resilient" or "melting down." Follow these rules and you will avoid the worst failure cascade.

- Exponential backoff with jitter. Retry at 1s, 2s, 4s, 8s, adding random jitter so a fleet of clients does not stampede the vendor at the same instant.
- Cap your retry count. Three to five attempts with a maximum total window (say 60s) beats infinite retries that pile up in a queue.
- Use idempotency keys. Generate a stable key per logical operation so a retried request cannot double-execute a side effect.
- Circuit breaker on persistent failure. If the vendor returns 5xx for N consecutive calls, open the circuit and fail fast for a cooldown period instead of hammering a downstream that is already unhealthy.
- Alert on retry rate, not just final failure. A rising retry rate is your earliest signal that an upstream is degrading, well before users see an error.
The trap most teams hit: retrying a transient 429 without respecting the vendor's Retry-After header, which turns a gentle rate limit into an aggressive fight that gets your key throttled or blocked.
Branch five: make webhooks trustworthy
If you accept push notifications, security and deduplication are your two jobs. Concretely:
- Verify signatures. Never trust a webhook from an open endpoint. Compute the HMAC using the vendor's secret and reject mismatches. Stripe, GitHub, and most serious providers sign payloads; wire that check before anything else.
- Dedup by event ID. Store the received event ID or delivery header in memory or a table, and skip processing any ID you have already handled. Retries from the vendor are normal, not anomalous.
- Return the right status. Acknowledge quickly with 2xx as soon as you have durably received the event; do your actual work with the idempotency key downstream. Do not block the webhook handler on slow processing.
- Plan replays. If the vendor lets you replay recent events in a sandbox, script that into your local integration tests.
Branch six: plan for change and deprecation
Vendors ship breaking changes constantly, sometimes with a single quarter of notice. A sustainable integration assumes change will happen.
- Decouple your internal abstraction. Wrap the vendor SDK behind your own interface so swapping providers or updating the vendor SDK touches one boundary, not your whole codebase.
- Read changelogs and deprecation notices. Schedule a weekly or monthly review of the API lifecycles for your top three vendors and log anything slated for removal.
- Test against the sandbox on a schedule. A forever-untouched sandbox drifts from vendor behavior; re-run a small smoke suite monthly.
- Version your own endpoints. If this API is consumed by other teams, publish your own contract version so consumers can migrate on your timeline, not theirs.
Teams that treat change as expected tend to ship deprecation upgrades in the background without incident, while teams that freeze their contract end up burning a fire drill when the vendor flips the switch.
Wrap-up: the minimal runbook
When someone asks you in two sentences what a robust integration looks like, say this: a versioned, idempotent contract behind your own abstraction, with jittered exponential retries, a circuit breaker, verified and deduplicated webhooks, and monitoring that alerts on retry rate before users ever feel pain. Build the decision tree once, load the assumptions into your runbook, and spend the rest of the quarter on features instead of firefighting. If you are still shaping the broader architecture these integrations live in, our system design fundamentals and the integration course from step one give you the full runway.
For more, check out: .
For more, check out: .
Frequently asked questions
How should I handle a third-party API that has no idempotency key support?
You own idempotency on your side. Generate a stable reference per logical operation, store it with your call records, and before or after any retry query by that reference to detect an already-executed effect. If the vendor exposes a lookup or reconciliation endpoint, use it; if not, you accept a narrow retry window and validate the outcome before mutating state.
When do I choose a webhook over polling for a slow async job?
Choose webhooks when the vendor reliably delivers signed, deduplicated push notifications and you can run a handler to verify signatures. Choose polling when you need tighter observability, when the vendor webhook reliability is poor, or when retries are rare and cheap. Many teams use polling for the happy path and a reconciliation job to catch missed events either way.
What is the safest retry policy for a rate-limited 429 response?
Read the Retry-After header if the vendor sends it and honor it exactly; otherwise back off exponentially from a small base (1s, 2s) with jitter. Respecting the vendor's throttle instead of fighting it prevents your key from being blocked and keeps retries from amplifying load when the upstream is under strain.
Is an internal abstraction around a vendor SDK always worth the overhead?
Usually yes for production integrations. The interface costs little up front and saves you from touching every call site when the vendor breaks a schema or goes dead. For a single tiny, stable integration it can be over-engineering; for anything that other modules depend on, the seam pays for itself on the first deprecation.