.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _api-doc:

================
Document Methods
================

The CouchDB API Server Document methods detail how to create, read,
update and delete documents within a database.

A list of the available methods and URL paths are provided below:

+--------+-------------------------+-------------------------------------------+
| Method | Path                    | Description                               |
+========+=========================+===========================================+
| POST   | /db                     | Create a new document                     |
+--------+-------------------------+-------------------------------------------+
| GET    | /db/doc                 | Returns the latest revision of the        |
|        |                         | document                                  |
+--------+-------------------------+-------------------------------------------+
| HEAD   | /db/doc                 | Returns bare information in the HTTP      |
|        |                         | Headers for the document                  |
+--------+-------------------------+-------------------------------------------+
| PUT    | /db/doc                 | Inserts a new document, or new version    |
|        |                         | of an existing document                   |
+--------+-------------------------+-------------------------------------------+
| DELETE | /db/doc                 | Deletes the document                      |
+--------+-------------------------+-------------------------------------------+
| COPY   | /db/doc                 | Copies the document                       |
+--------+-------------------------+-------------------------------------------+
| GET    | /db/doc/attachment      | Gets the attachment of a document         |
+--------+-------------------------+-------------------------------------------+
| PUT    | /db/doc/attachment      | Adds an attachment of a document          |
+--------+-------------------------+-------------------------------------------+
| DELETE | /db/doc/attachment      | Deletes an attachment of a document       |
+--------+-------------------------+-------------------------------------------+

``POST /db``
============

* **Method**: ``POST /db``
* **Request**: JSON of the new document
* **Response**: JSON with the committed document information
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: batch

    * **Description**:  Allow document store request to be batched with others
    * **Optional**: yes
    * **Type**: string
    * **Supported Values**: asd
    * **ok**: Enable

* **Return Codes**:

  * **201**:
    Document has been created successfully
  * **409**:
    Conflict - a document with the specified document ID already exists

Create a new document in the specified database, using the supplied JSON
document structure. If the JSON structure includes the ``_id`` field,
then the document will be created with the specified document ID. If the
``_id`` field is not specified, a new unique ID will be generated.

For example, you can generate a new document with a generated UUID using
the following request:

.. code-block:: http

    POST http://couchdb:5984/recipes/
    Content-Type: application/json

    {
       "servings" : 4,
       "subtitle" : "Delicious with fresh bread",
       "title" : "Fish Stew"
    }

The return JSON will specify the automatically generated ID and revision
information:

.. code-block:: javascript

    {
       "id" : "64575eef70ab90a2b8d55fc09e00440d",
       "ok" : true,
       "rev" : "1-9c65296036141e575d32ba9c034dd3ee"
    }

Specifying the Document ID
--------------------------

The document ID can be specified by including the ``_id`` field in the
JSON of the submitted record. The following request will create the same
document with the ID ``FishStew``:

.. code-block:: http

    POST http://couchdb:5984/recipes/
    Content-Type: application/json

    {
       "_id" : "FishStew",
       "servings" : 4,
       "subtitle" : "Delicious with fresh bread",
       "title" : "Fish Stew"
    }

The structure of the submitted document is as shown in the table below:

In either case, the returned JSON will specify the document ID, revision
ID, and status message:

.. code-block:: javascript

    {
       "id" : "FishStew",
       "ok" : true,
       "rev" : "1-9c65296036141e575d32ba9c034dd3ee"
    }
        

.. _api-batch-writes:

UUID generation algorithms
--------------------------

CouchDB supports a number of different UUID generation algorithms for use
in situations where a user-specified UUID does not make sense. These
can be set simply by `PUT http://couchdb:5984/_config/uuids/algorithm`.


+---------------+---------------------+------------------------------------+
| Algorithm     | Description         | Sample UUID                        |
+===============+=====================+====================================+
| random        | 128 bits of pure    | - 43febce5675468a5467fb5467ce9e6c0 |
|               | random awesomeness  |                                    |
+---------------+---------------------+------------------------------------+
| sequential    | monotonically       | - f755c413badf66b22941313f9f001e28 |
|               | increasing ids with | - f755c413badf66b22941313f9f0024ca |
|               | random increments   | - f755c413badf66b22941313f9f00332c |
+---------------+---------------------+------------------------------------+
| utc_random    | time since start of | - 04cfa405381205204f75100d0241ccc3 |
|               | epoch, as 14 hex    | - 04cfa4059c48e76e7c054bbe033dd8db |
|               | digits, followed by | - 04cfa405fce10b0df4c08f95e667cd2f |
|               | 18 random digits.   |                                    |
+---------------+---------------------+------------------------------------+
| utc_id        | time since start of | - 04cfa718b00848_i_am_in_yer_couch |
| & additional  | epoch, as 14 hex    | - 04cfa71d377aef_i_am_in_yer_couch |
| parameter     | digits, followed by | - 04cfa71e0deabd_i_am_in_yer_couch |
|               | utc_id_suffix.      |                                    |
+---------------+---------------------+------------------------------------+

.. Impact of UUID choices::
   The choice of UUID has a signficant impact on the layout of the B-tree,
   prior to compaction. For example, a sequential UUID algorithm during
   uploading thousands of documents, will avoid the need to rewrite many
   intermediate B-tree nodes. A random UUID algorithm may require rewriting
   intermediate nodes on a regular basis, with a corresponding decrease of
   throughput, and significant wasted space due to the append-only B-tree
   design. It is generally recommended to set your own UUIDs, or use the
   sequential algorithm unless you have a specific need and take into account
   the likely need for compaction to re-balance the B-tree and reclaim wasted
   space.


Batch Mode Writes
-----------------

You can write documents to the database at a higher rate by using the
batch option. This collects document writes together in memory (on a
user-by-user basis) before they are committed to disk. This increases
the risk of the documents not being stored in the event of a failure,
since the documents are not written to disk immediately.

To use the batched mode, append the ``batch=ok`` query argument to the
URL of the ``PUT`` or ``POST`` request. The CouchDB server will respond
with a 202 HTTP response code immediately.

Including Attachments
---------------------

You can include one or more attachments with a given document by
incorporating the attachment information within the JSON of the
document. This provides a simpler alternative to loading documents with
attachments than making a separate call (see :ref:`api-put-attachment`).

* **_id** (optional): Document ID
* **_rev** (optional): Revision ID (when updating an existing document)
* **_attachments** (optional): Document Attachment

  * **filename**: Attachment information

    * **content_type**: MIME Content type string
    * **data**: File attachment content, Base64 encoded

The ``filename`` will be the attachment name. For example, when sending
the JSON structure below:

.. code-block:: javascript

    {
       "_id" : "FishStew",
       "servings" : 4,
       "subtitle" : "Delicious with fresh bread",
       "title" : "Fish Stew"
       "_attachments" : {
          "styling.css" : {
             "content-type" : "text/css",
             "data" : "cCB7IGZvbnQtc2l6ZTogMTJwdDsgfQo=",
             },
       },
    }
        

The attachment ``styling.css`` can be accessed using
``/recipes/FishStew/styling.css``. For more information on attachments,
see :ref:`api-get-attachment`.

The document data embedded in to the structure must be encoded using
base64.

.. _api-get-doc:

``GET /db/doc``
===============

* **Method**: ``GET /db/doc``
* **Request**: None
* **Response**: Returns the JSON for the document
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: conflicts

    * **Description**: Returns the conflict tree for the document.
    * **Optional**: yes
    * **Type**: boolean
    * **Default**: false
    * **Supported Values**:

      * **true**: Includes the revisions

  * **Argument**: rev

    * **Description**: Specify the revision to return
    * **Optional**: yes
    * **Type**: string
    * **Supported Values**:

      * **true**: Includes the revisions

  * **Argument**: revs

    * **Description**:  Return a list of the revisions for the document
    * **Optional**: yes
    * **Type**: boolean

  * **Argument**: revs_info

    * **Description**: Return a list of detailed revision information for the
      document
    * **Optional**: yes
    * **Type**: boolean
    * **Supported Values**:

      * **true**: Includes the revisions

* **Return Codes**:

  * **200**:
    Document retrieved
  * **400**:
    The format of the request or revision was invalid
  * **404**:
    The specified document or revision cannot be found, or has been deleted
  * **409**:
    Conflict - a document with the specified document ID already exists

Returns the specified ``doc`` from the specified ``db``. For example, to
retrieve the document with the id ``FishStew`` you would send the
following request:

.. code-block:: http

    GET http://couchdb:5984/recipes/FishStew
    Content-Type: application/json
    Accept: application/json

The returned JSON is the JSON of the document, including the document ID
and revision number:

.. code-block:: javascript

    {
       "_id" : "FishStew",
       "_rev" : "3-a1a9b39ee3cc39181b796a69cb48521c",
       "servings" : 4,
       "subtitle" : "Delicious with a green salad",
       "title" : "Irish Fish Stew"
    }
        

Unless you request a specific revision, the latest revision of the
document will always be returned.

Attachments
-----------

If the document includes attachments, then the returned structure will
contain a summary of the attachments associated with the document, but
not the attachment data itself.

The JSON for the returned document will include the ``_attachments``
field, with one or more attachment definitions. For example:

.. code-block:: javascript

    {
       "_id" : "FishStew",
       "servings" : 4,
       "subtitle" : "Delicious with fresh bread",
       "title" : "Fish Stew"
       "_attachments" : {
          "styling.css" : {
             "stub" : true,
             "content-type" : "text/css",
             "length" : 783426,
             },
       },
    }

The format of the returned JSON is shown in the table below:

* **_id** (optional): Document ID
* **_rev** (optional): Revision ID (when updating an existing document)
* **_attachments** (optional): Document Attachment

  * **filename**: Attachment information

    * **content_type**: MIME Content type string
    * **length**: Length (bytes) of the attachment data
    * **revpos**: Revision where this attachment exists
    * **stub**: Indicates whether the attachment is a stub

Getting a List of Revisions
---------------------------

You can obtain a list of the revisions for a given document by adding
the ``revs=true`` parameter to the request URL. For example:

.. code-block:: http

    GET http://couchdb:5984/recipes/FishStew?revs=true
    Accept: application/json

The returned JSON structure includes the original document, including a
``_revisions`` structure that includes the revision information:

.. code-block:: javascript

    {
       "servings" : 4,
       "subtitle" : "Delicious with a green salad",
       "_id" : "FishStew",
       "title" : "Irish Fish Stew",
       "_revisions" : {
          "ids" : [
             "a1a9b39ee3cc39181b796a69cb48521c",
             "7c4740b4dcf26683e941d6641c00c39d",
             "9c65296036141e575d32ba9c034dd3ee"
          ],
          "start" : 3
       },
       "_rev" : "3-a1a9b39ee3cc39181b796a69cb48521c"
    }

* **_id** (optional): Document ID
* **_rev** (optional): Revision ID (when updating an existing document)
* **_revisions**: CouchDB Document Revisions

  * **ids** [array]: Array of valid revision IDs, in reverse order
    (latest first)
  * **start**: Prefix number for the latest revision

Obtaining an Extended Revision History
--------------------------------------

You can get additional information about the revisions for a given
document by supplying the ``revs_info`` argument to the query:

.. code-block:: http

    GET http://couchdb:5984/recipes/FishStew?revs_info=true
    Accept: application/json

This returns extended revision information, including the availability
and status of each revision:

.. code-block:: javascript

    {
       "servings" : 4,
       "subtitle" : "Delicious with a green salad",
       "_id" : "FishStew",
       "_revs_info" : [
          {
             "status" : "available",
             "rev" : "3-a1a9b39ee3cc39181b796a69cb48521c"
          },
          {
             "status" : "available",
             "rev" : "2-7c4740b4dcf26683e941d6641c00c39d"
          },
          {
             "status" : "available",
             "rev" : "1-9c65296036141e575d32ba9c034dd3ee"
          }
       ],
       "title" : "Irish Fish Stew",
       "_rev" : "3-a1a9b39ee3cc39181b796a69cb48521c"
    }

* **_id** (optional): Document ID
* **_rev** (optional): Revision ID (when updating an existing document)
* **_revs_info** [array]: CouchDB Document Extended Revision Info

  * **rev**: Full revision string
  * **status**: Status of the revision

Obtaining a Specific Revision
-----------------------------

To get a specific revision, use the ``rev`` argument to the request, and
specify the full revision number:

.. code-block:: http

    GET http://couchdb:5984/recipes/FishStew?rev=2-7c4740b4dcf26683e941d6641c00c39d
    Accept: application/json

The specified revision of the document will be returned, including a
``_rev`` field specifying the revision that was requested:

.. code-block:: javascript

    {
       "_id" : "FishStew",
       "_rev" : "2-7c4740b4dcf26683e941d6641c00c39d",
       "servings" : 4,
       "subtitle" : "Delicious with a green salad",
       "title" : "Fish Stew"
    }

``HEAD /db/doc``
================

* **Method**: ``HEAD /db/doc``
* **Request**: None
* **Response**: None
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: rev

    * **Description**:  Specify the revision to return
    * **Optional**: yes
    * **Type**: string

  * **Argument**: revs

    * **Description**:  Return a list of the revisions for the document
    * **Optional**: yes
    * **Type**: boolean

  * **Argument**: revs_info

    * **Description**:  Return a list of detailed revision information for the
      document
    * **Optional**: yes
    * **Type**: boolean

* **Return Codes**:

  * **404**:
    The specified document or revision cannot be found, or has been deleted

Returns the HTTP Headers containing a minimal amount of information
about the specified document. The method supports the same query
arguments as the ``GET`` method, but only the header information
(including document size, and the revision as an ETag), is returned. For
example, a simple ``HEAD`` request:

.. code-block:: http

    HEAD http://couchdb:5984/recipes/FishStew
    Content-Type: application/json
        

Returns the following HTTP Headers:

.. code-block:: javascript

    HTTP/1.1 200 OK
    Server: CouchDB/1.0.1 (Erlang OTP/R13B)
    Etag: "7-a19a1a5ecd946dad70e85233ba039ab2"
    Date: Fri, 05 Nov 2010 14:54:43 GMT
    Content-Type: text/plain;charset=utf-8
    Content-Length: 136
    Cache-Control: must-revalidate

The ``Etag`` header shows the current revision for the requested
document, and the ``Content-Length`` specifies the length of the data,
if the document were requested in full.

Adding any of the query arguments (as supported by ```GET```_ method),
then the resulting HTTP Headers will correspond to what would be
returned. Note that the current revision is not returned when the
``refs_info`` argument is used. For example:

.. code-block:: http

    HTTP/1.1 200 OK
    Server: CouchDB/1.0.1 (Erlang OTP/R13B)
    Date: Fri, 05 Nov 2010 14:57:16 GMT
    Content-Type: text/plain;charset=utf-8
    Content-Length: 609
    Cache-Control: must-revalidate

.. _api-put-doc:

``PUT /db/doc``
===============

* **Method**: ``PUT /db/doc``
* **Request**: JSON of the new document, or updated version of the existed
  document
* **Response**: JSON of the document ID and revision
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: batch

    * **Description**:  Allow document store request to be batched with others
    * **Optional**: yes
    * **Type**: string
    * **Supported Values**:

      * **ok**: Enable

* **HTTP Headers**

  * **Header**: ``If-Match``

    * **Description**: Current revision of the document for validation
    * **Optional**: yes

* **Return Codes**:

  * **201**:
    Document has been created successfully
  * **202**:
    Document accepted for writing (batch mode)


The ``PUT`` method creates a new named document, or creates a new
revision of the existing document. Unlike the ``POST`` method, you
must specify the document ID in the request URL.

For example, to create the document ``FishStew``, you would send the
following request:

.. code-block:: http

    PUT http://couchdb:5984/recipes/FishStew
    Content-Type: application/json

    {
      "servings" : 4,
      "subtitle" : "Delicious with fresh bread",
      "title" : "Fish Stew"
    }

The return type is JSON of the status, document ID,and revision number:

.. code-block:: javascript

    {
       "id" : "FishStew",
       "ok" : true,
       "rev" : "1-9c65296036141e575d32ba9c034dd3ee"
    }

Updating an Existing Document
-----------------------------

To update an existing document you must specify the current revision
number within the ``_rev`` parameter. For example:

.. code-block:: http

    PUT http://couchdb:5984/recipes/FishStew
    Content-Type: application/json

    {
      "_rev" : "1-9c65296036141e575d32ba9c034dd3ee",
      "servings" : 4,
      "subtitle" : "Delicious with fresh salad",
      "title" : "Fish Stew"
    }

Alternatively, you can supply the current revision number in the
``If-Match`` HTTP header of the request. For example:

.. code-block:: http

    PUT http://couchdb:5984/recipes/FishStew
    If-Match: 2-d953b18035b76f2a5b1d1d93f25d3aea
    Content-Type: application/json

    {
       "servings" : 4,
       "subtitle" : "Delicious with fresh salad",
       "title" : "Fish Stew"
    }

The JSON returned will include the updated revision number:

.. code-block:: javascript

    {
       "id" : "FishStew99",
       "ok" : true,
       "rev" : "2-d953b18035b76f2a5b1d1d93f25d3aea"
    }

For information on batched writes, which can provide improved
performance, see :ref:`api-batch-writes`.

.. _api-del-doc:

``DELETE /db/doc``
==================

* **Method**: ``DELETE /db/doc``
* **Request**: None
* **Response**: JSON of the deleted revision
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: rev

    * **Description**:  Current revision of the document for validation
    * **Optional**: yes
    * **Type**: string

* **HTTP Headers**

  * **Header**: ``If-Match``

    * **Description**: Current revision of the document for validation
    * **Optional**: yes

* **Return Codes**:

  * **409**:
    Revision is missing, invalid or not the latest

Deletes the specified document from the database. You must supply the
current (latest) revision, either by using the ``rev`` parameter to
specify the revision:

.. code-block:: http

    DELETE http://couchdb:5984/recipes/FishStew?rev=3-a1a9b39ee3cc39181b796a69cb48521c
    Content-Type: application/json

Alternatively, you can use ETags with the ``If-Match`` field:

.. code-block:: http

    DELETE http://couchdb:5984/recipes/FishStew
    If-Match: 3-a1a9b39ee3cc39181b796a69cb48521c
    Content-Type: application/json
        

The returned JSON contains the document ID, revision and status:

.. code-block:: javascript

    {
       "id" : "FishStew",
       "ok" : true,
       "rev" : "4-2719fd41187c60762ff584761b714cfb"
    }

.. note:: Note that deletion of a record increments the revision number. The
   use of a revision for deletion of the record allows replication of
   the database to correctly track the deletion in synchronized copies.

.. _api-copy-doc:

``COPY /db/doc``
================

* **Method**: ``COPY /db/doc``
* **Request**: None
* **Response**: JSON of the new document and revision
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: rev

    * **Description**:  Revision to copy from
    * **Optional**: yes
    * **Type**: string

* **HTTP Headers**

  * **Header**: ``Destination``

    * **Description**: Destination document (and optional revision)
    * **Optional**: no

* **Return Codes**:

  * **201**:
    Document has been copied and created successfully
  * **409**:
    Revision is missing, invalid or not the latest

The ``COPY`` command (which is non-standard HTTP) copies an existing
document to a new or existing document.

The source document is specified on the request line, with the
``Destination`` HTTP Header of the request specifying the target
document.

Copying a Document
------------------

You can copy the latest version of a document to a new document by
specifying the current document and target document:

.. code-block:: http

    COPY http://couchdb:5984/recipes/FishStew
    Content-Type: application/json
    Destination: IrishFishStew

The above request copies the document ``FishStew`` to the new document
``IrishFishStew``. The response is the ID and revision of the new
document.

.. code-block:: javascript

    {
       "id" : "IrishFishStew",
       "rev" : "1-9c65296036141e575d32ba9c034dd3ee"
    }

Copying from a Specific Revision
--------------------------------

To copy *from* a specific version, use the ``rev`` argument to the query
string:

.. code-block:: http

    COPY http://couchdb:5984/recipes/FishStew?rev=5-acfd32d233f07cea4b4f37daaacc0082
    Content-Type: application/json
    Destination: IrishFishStew

The new document will be created using the information in the specified
revision of the source document.

Copying to an Existing Document
-------------------------------

To copy to an existing document, you must specify the current revision
string for the target document, using the ``rev`` parameter to the
``Destination`` HTTP Header string. For example:

.. code-block:: http

    COPY http://couchdb:5984/recipes/FishStew
    Content-Type: application/json
    Destination: IrishFishStew?rev=1-9c65296036141e575d32ba9c034dd3ee

The return value will be the new revision of the copied document:

.. code-block:: javascript

    {
       "id" : "IrishFishStew",
       "rev" : "2-55b6a1b251902a2c249b667dab1c6692"
    }

.. _api-get-attachment:

``GET /db/doc/attachment``
==========================

* **Method**: ``GET /db/doc/attachment``
* **Request**: None
* **Response**: Returns the attachment data
* **Admin Privileges Required**: no

Returns the file attachment ``attachment`` associated with the document
``doc``. The raw data of the associated attachment is returned (just as
if you were accessing a static file. The returned HTTP ``Content-type``
will be the same as the content type set when the document attachment
was submitted into the database.

.. _api-put-attachment:

``PUT /db/doc/attachment``
==========================

* **Method**: ``PUT /db/doc/attachment``
* **Request**: Raw document data
* **Response**: JSON document status
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: rev

    * **Description**:  Current document revision
    * **Optional**: no
    * **Type**: string

* **HTTP Headers**

  * **Header**: ``Content-Length``

    * **Description**: Length (bytes) of the attachment being uploaded
    * **Optional**: no

  * **Header**: ``Content-Type``

    * **Description**: MIME type for the uploaded attachment
    * **Optional**: no

  * **Header**: ``If-Match``

    * **Description**: Current revision of the document for validation
    * **Optional**: yes

* **Return Codes**:

  * **201**:
    Attachment has been accepted

Upload the supplied content as an attachment to the specified document
(``doc``). The ``attachment`` name provided must be a URL encoded
string. You must also supply either the ``rev`` query argument or the
``If-Match`` HTTP header for validation, and the HTTP headers (to set
the attachment content type). The content type is used when the
attachment is requested as the corresponding content-type in the
returned document header.

For example, you could upload a simple text document using the following
request:

.. code-block:: http

    PUT http://couchdb:5984/recipes/FishStew/basic?rev=8-a94cb7e50ded1e06f943be5bfbddf8ca
    Content-Length: 10
    Content-Type: text/plain

    Roast it

Or by using the ``If-Match`` HTTP header:

.. code-block:: http

    PUT http://couchdb:5984/recipes/FishStew/basic
    If-Match: 8-a94cb7e50ded1e06f943be5bfbddf8ca
    Content-Length: 10
    Content-Type: text/plain

    Roast it

The returned JSON contains the new document information:

.. code-block:: javascript

    {
       "id" : "FishStew",
       "ok" : true,
       "rev" : "9-247bb19a41bfd9bfdaf5ee6e2e05be74"
    }

.. note:: Uploading an attachment updates the corresponding document revision.
   Revisions are tracked for the parent document, not individual
   attachments.

Updating an Existing Attachment
-------------------------------

Uploading an attachment using an existing attachment name will update
the corresponding stored content of the database. Since you must supply
the revision information to add an attachment to a document, this serves
as validation to update the existing attachment.

``DELETE /db/doc/attachment``
=============================

* **Method**: ``DELETE /db/doc/attachment``
* **Request**: None
* **Response**: JSON status
* **Admin Privileges Required**: no
* **Query Arguments**:

  * **Argument**: rev

    * **Description**:  Current document revision
    * **Optional**: no
    * **Type**: string

* **HTTP Headers**

  * **Header**: ``If-Match``

    * **Description**: Current revision of the document for validation
    * **Optional**: yes

* **Return Codes**:

  * **200**:
    Attachment deleted successfully
  * **409**:
    Supplied revision is incorrect or missing

Deletes the attachment ``attachment`` to the specified ``doc``. You must
supply the ``rev`` argument with the current revision to delete the
attachment.

For example to delete the attachment ``basic`` from the recipe
``FishStew``:

.. code-block:: http

    DELETE http://couchdb:5984/recipes/FishStew/basic?rev=9-247bb19a41bfd9bfdaf5ee6e2e05be74
    Content-Type: application/json

        

The returned JSON contains the updated revision information:

.. code-block:: javascript

    {
       "id" : "FishStew",
       "ok" : true,
       "rev" : "10-561bf6b1e27615cee83d1f48fa65dd3e"
    }

.. _JSON object: #table-couchdb-api-db_db-json-changes
.. _POST: #couchdb-api-dbdoc_db_post
