References

Beginner-friendly references for web development, with live, editable examples.

The JavaScript fetch() method

Method JavaScript All modern browsers Updated
Quick answer

The fetch() method makes a network request and returns a promise that resolves to the response. The modern pattern is const res = await fetch(url); const data = await res.json();. It's the standard way to call APIs. Note it only rejects on network failure — you must check res.ok for HTTP errors like 404.

Overview

fetch() is how modern JavaScript talks to servers. You give it a URL and it returns a promise for a Response. Because it's promise-based, it pairs beautifully with async/await: const res = await fetch(url) reads almost like synchronous code while staying non-blocking.

Getting the data is a two-step dance. fetch() resolves once the response headers arrive; you then call a method on the response to read the body — usually await res.json() for JSON, or res.text() for plain text. That's why API calls have two awaits.

The gotcha that bites everyone: fetch() only rejects the promise on a network failure (offline, DNS, CORS). An HTTP error status like 404 or 500 still resolves successfully — so you must check res.ok (or res.status) yourself and throw if it's not OK. Wrap the whole thing in try/catch to handle both network and HTTP errors. For a POST, pass a second options object with method, headers and a body (often JSON.stringify()'d).

Syntax

const response = await fetch(url)
const response = await fetch(url, options)

// typical GET
const res = await fetch("/api/users");
if (!res.ok) throw new Error(res.status);
const data = await res.json();

// POST with a JSON body
await fetch("/api/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Ada" })
});

Parameters

The fetch() method accepts the following parameters.

Parameter Description
resource The URL to request, or a Request object.
options Optional. A settings object — method, headers, body, credentials, signal and more.

Example

Live example
// Fetch data from an API with async/await
async function loadUser(id) {
  try {
    const res = await fetch('/api/users/' + id);
    if (!res.ok) throw new Error('HTTP ' + res.status);

    const user = await res.json();
    console.log(user.name);
  } catch (err) {
    console.error('Request failed:', err);
  }
}

loadUser(1);

Best practices

  • Always check response.okfetch() does not reject on HTTP errors like 404 or 500.
  • Wrap calls in try/catch with async/await to handle network failures.
  • Remember the two-step read: await fetch() then await res.json().
  • For POST/PUT, set the method, a Content-Type header and a stringified body.

Frequently asked questions

How do I use fetch() with async/await?
Await the request and then the body: const res = await fetch(url); const data = await res.json();. Wrap it in try/catch.
Why doesn't fetch() throw on a 404?
It only rejects on network errors. HTTP error statuses still resolve, so you must check response.ok and throw yourself.
How do I send a POST request with fetch()?
Pass an options object: fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }).
How do I get JSON from a fetch response?
Call await response.json(), which parses the body and returns the data.