Backend Developer
API development questions
100 questions on API development for backend developers, easiest first.
Easy 33
- Status code after creating a resourceeasy
- The non-idempotent methodeasy
- What stateless means in RESTeasy
- 401 or 403easy
- Updating only one fieldeasy
- Status code for too many requestseasy
- Browser blocks a call that curl allowseasy
- What a 504 from Nginx meanseasy
- Promise and setTimeout ordereasy
- A GET that deletes dataeasy
- Content-Type versus Accepteasy
- What HTTPS leaves visibleeasy
- Response for a successful DELETEeasy
- A product page removed for goodeasy
- Signing up with a taken usernameeasy
- Calling DELETE on a read-only routeeasy
- A client posts XML to a JSON APIeasy
- URL for one producteasy
- Telling the client where the new item liveseasy
- Filtering and sorting a listeasy
- fetch treats a 404 as successeasy
- What a HEAD request doeseasy
- 4xx or 5xx for bad inputeasy
- Route parameter never matches a numbereasy
- Response for a queued report jobeasy
- Why teams write an OpenAPI speceasy
- How many URLs a GraphQL API useseasy
- Asking for only a few fieldseasy
- Stack traces in production errorseasy
- Handling incoming webhookseasy
- Telling users about a long jobeasy
- Which request is safe to retryeasy
- How a token bucket limits rateeasy
Medium 43
- Offset or cursor paginationmedium
- Token bucket rate limitermedium
- Two awaits that could run togethermedium
- A 64-bit id changes after parsingmedium
- Response to a matching If-None-Matchmedium
- Webhook signature never matchesmedium
- Saving req.body directlymedium
- Async callback inside forEachmedium
- CDN serves one user's profile to anothermedium
- 400 versus 422medium
- Redirecting a POST endpointmedium
- Which change is safe for old clientsmedium
- Deciding when to release v2medium
- A standard shape for error bodiesmedium
- Express error handler never runsmedium
- /users/me returns 'user not found'medium
- Cannot set headers after they are sentmedium
- Large JSON uploads fail with 413medium
- Repeated query keys in Expressmedium
- A slow partner API hangs your requestsmedium
- no-cache or no-store for account datamedium
- Arabic page served to English usersmedium
- Telling clients when to retrymedium
- The same payment webhook arrives twicemedium
- Webhooks retried though they workedmedium
- Live order status in a browsermedium
- What GraphQL fixes for mobile clientsmedium
- A nested GraphQL query overloads the servermedium
- Linking logs for one checkoutmedium
- Paging through a GraphQL listmedium
- Catching breaking changes before deploymedium
- Hiding salary in a GraphQL APImedium
- Pool runs dry after some errorsmedium
- Rows skipped with created_at cursorsmedium
- Rate limit key that never expiresmedium
- A memoised function eats memorymedium
- Printing each message at most once per 10 secondsmedium
- Workers and a partner rate limitmedium
- All jobs fire at midnightmedium
- An unhandled promise rejectionmedium
- One bad item in a batch callmedium
- Paging through a huge feedmedium
- IP rate limits block real usersmedium
Hard 24
- Safe retries for paymentshard
- One slow route freezes Node.jshard
- Burst at a fixed window boundaryhard
- return versus return await in tryhard
- Deep merge of untrusted JSONhard
- Retries at every layerhard
- Why add a circuit breakerhard
- Connection resets when pods stophard
- A CSV export runs out of memoryhard
- File descriptors leak during downloadshard
- Users uploading 2 GB videoshard
- One bad row in a bulk importhard
- How to send money amounts in JSONhard
- Caching GraphQL responses at a CDNhard
- Retiring an old API versionhard
- Rate limiter blocks everyone togetherhard
- A forgotten await crashes the serverhard
- Every page load counts 80 million rowshard
- A database blip restarts every podhard
- Search filters too long for a URLhard
- A PUT wipes the phone numberhard
- Locking accounts after 5 failureshard
- Slow guessing from thousands of IPshard
- Backpressure in Node.js streamshard