Skip to main content
2xx Success

208 Already Reported

Used inside a WebDAV Multi-Status response to avoid enumerating internal members of multiple bindings to the same collection repeatedly.

Meaning & Description

The HTTP `208 Already Reported` response code is a WebDAV extension used exclusively within a `207 Multi-Status` XML payload (specifically inside the `DAV:propstat` element).

When a client requests a listing of a directory structure (via `PROPFIND`), a server might encounter multiple paths that point to the exact same directory (symlinks or WebDAV bindings). To prevent infinite loops and massive duplicated responses, the server returns the full properties of that collection the first time it is encountered. Any subsequent encounters of that same collection in the same request will return a `208 Already Reported` status, telling the client "I have already given you the data for this collection earlier in this response."

Common Causes

  • A client issued a `PROPFIND` with `Depth: infinity` on a WebDAV system containing cyclic bindings or overlapping directory structures.

How to fix a 208 error

  1. If you are building a WebDAV client and encounter this, look earlier in the XML payload for the actual properties of the resource.
  2. Do not traverse the children of a resource that returned 208, or you may enter an infinite loop.
  3. Check your server configuration for recursive symlinks or circular directory bindings.

Browser & SEO Behaviour

Browser Behavior

Browsers ignore this entirely. WebDAV clients parse the XML and handle the 208 loop-prevention logic.

SEO Impact

None. Search engines do not execute WebDAV commands.

Code Examples

Raw HTTP
PROPFIND /webdav/ HTTP/1.1
Host: example.com
Depth: infinity
Content-Type: application/xml

<?xml version="1.0" encoding="utf-8" ?>
<propfind xmlns="DAV:">
  <propname/>
</propfind>
Node.js (Express)
// Simulating a cyclic directory response in WebDAV
app.all('/webdav', (req, res) => {
  if (req.method === 'PROPFIND') {
    const xmlResponse = `<?xml version="1.0" encoding="utf-8" ?>
<d:multistatus xmlns:d="DAV:">
  <!-- First encounter of the collection -->
  <d:response>
    <d:href>/webdav/shared-folder</d:href>
    <d:propstat>
      <d:prop><d:displayname>Shared Folder</d:displayname></d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
  
  <!-- Second encounter via a different binding -->
  <d:response>
    <d:href>/webdav/users/alice/shared-link</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 208 Already Reported</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>`;
    
    res.set('Content-Type', 'application/xml; charset=utf-8');
    // Top level is 207, 208 is inside the body
    return res.status(207).send(xmlResponse);
  }
  res.status(405).send('Method Not Allowed');
});
Python (FastAPI)
from fastapi import Request, Response

@app.route("/webdav", methods=["PROPFIND"])
def propfind(request: Request):
    xml_body = """<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
  <D:response>
    <D:href>/webdav/dir1</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
  <D:response>
    <D:href>/webdav/dir2/shortcut_to_dir1</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 208 Already Reported</D:status>
    </D:propstat>
  </D:response>
</D:multistatus>"""
    
    return Response(
        content=xml_body,
        status_code=207,
        media_type="application/xml"
    )
Go (net/http)
func handlePropfind(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/xml; charset=utf-8")
    w.WriteHeader(207)
    
    xml := `<?xml version="1.0" encoding="utf-8" ?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/folder-a</d:href>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:response>
  <d:response>
    <d:href>/folder-b/alias-to-a</d:href>
    <d:status>HTTP/1.1 208 Already Reported</d:status>
  </d:response>
</d:multistatus>`
    
    w.Write([]byte(xml))
}
curl
curl -X PROPFIND http://example.com/webdav/ \n  -H "Depth: infinity" \n  -H "Content-Type: application/xml" \n  -d '<?xml version="1.0"?><d:propfind xmlns:d="DAV:"><d:propname/></d:propfind>'

Raw HTTP Response Example

HTTP Response
HTTP/1.1 207 Multi-Status
Date: Tue, 04 Oct 2026 12:00:00 GMT
Content-Type: application/xml; charset=utf-8

<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
  <D:response>
    <D:href>/files/original/</D:href>
    <D:propstat>
      <D:prop><D:displayname>Original</D:displayname></D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
  <D:response>
    <D:href>/files/shortcut/</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 208 Already Reported</D:status>
    </D:propstat>
  </D:response>
</D:multistatus>

Real-world Examples

Apache Jackrabbit: A content repository that implements WebDAV and returns 208 to prevent infinite loops when querying trees with circular references.
Nextcloud: Underlying sabre/dav engine correctly generates 208 Already Reported when a client uses PROPFIND Depth: infinity across complex share trees.

Frequently Asked Questions

Will I ever see 208 Already Reported in my browser network tab?

Very unlikely. It is an internal code used within WebDAV XML payloads. A browser network tab will show the top-level 207 Multi-Status request, and you would have to inspect the XML body to find the 208.

Is 208 an error code?

No, it is a 2xx success code. It indicates that the server successfully recognized the resource but is optimizing the response by not repeating data. It is a loop-prevention and bandwidth-saving mechanism.

What is a "binding" in WebDAV?

A binding is essentially a pointer or link. Just like symlinks in a Linux file system, a WebDAV collection can be bound to multiple URIs. 208 is used when navigating these multiple URIs pointing to the same underlying data.

How is 208 related to 508 Loop Detected?

Both deal with loops. 208 is a success code telling the client "I am safely ignoring this duplicate path." 508 Loop Detected is a fatal server error indicating an operation failed completely because an infinite loop was caught.

Can 208 be used outside of WebDAV?

No. The RFC explicitly specifies that it is only to be used inside a DAV `propstat` XML element.

Did You Know?

208 Already Reported is technically impossible to receive as a standard HTTP response header line in compliant systems; it only lives inside XML bodies.

This status code was introduced specifically to prevent WebDAV clients from crashing out of memory when querying directory structures containing cyclic links.

RFC 5842, which introduced 208, is specifically titled "Binding Extensions to Web Distributed Authoring and Versioning (WebDAV)".

Developer Tips

  • If you are building a generic REST API, do not use 208. It will confuse clients.
  • When building a WebDAV client, you must keep track of the hrefs you have already processed in a 207 payload. If you hit a 208, you must manually link that resource to the properties of the previously seen href.

Interview Questions

These are questions you might face in a backend or API design interview that touch on HTTP 208.

Which HTTP status code is almost never sent in the HTTP response headers, but rather in the response body?

208 Already Reported. It is used exclusively inside the XML body of a 207 Multi-Status WebDAV response.

How do WebDAV systems prevent infinite loops when clients request deep directory listings with cyclic links?

They return the directory details the first time, and for any subsequent encounters of the same directory in that request, they return a 208 Already Reported status inside the XML payload.

Is 208 a client error, server error, or success code?

It is a 2xx success code. It indicates successful loop prevention and bandwidth optimization.

Common Interview Mistakes

  • Confusing 208 Already Reported with 508 Loop Detected. While both deal with cyclic references, 208 is a safe, successful optimization, whereas 508 is a fatal server error.
  • Designing a REST API in an interview and suggesting returning 208 as an HTTP header for duplicate database records.