===
API
===

dpaste provides a simple API endpoint to create new snippets. All you need to
do is a simple ``POST`` request to the API endpoint ``/api/``::


    POST http://dpaste.de/api/


Available POST data for an API call:
====================================

``content`` (required)
~~~~~~~~~~~~~~~~~~~~~~

The UTF-8 encoded string you want to paste.

``lexer`` (optional)
~~~~~~~~~~~~~~~~~~~~

The lexer string key used for highlighting. See `lexer list`_  for a full list
of choices. Default: ``python``.

``format`` (optional)
~~~~~~~~~~~~~~~~~~~~~

The format of the API response. Choices are:

* ``default`` — Returns a full qualified URL wrapped in quotes. Example::

    "https://dpaste.de/xsWd"

* ``url`` — Returns the full qualified URL to the snippet, without surrounding
  quotes, but with a line break. Example::

    https://dpaste.de/xsWd\n

* ``json`` — Returns a JSON object containing the URL, lexer and content of the
  the snippet. Example::


    {
        "url": "https://dpaste.de/xsWd",
        "lexer": "python",
        "content": "The text body of the snippet."
    }


``expires`` (optional)
~~~~~~~~~~~~~~~~~~~~~~

A keyword to indicate the lifetime of a snippetn in seconds. The values are
predefined by the server. Calling this with an invalid value returns a HTTP 400
BadRequest together with a list of valid values. Default: ``2592000``. In the
default configuration valid values are:

* onetime
* never
* 3600
* 604800
* 2592000

``filename`` (optional)
~~~~~~~~~~~~~~~~~~~~~~~

A filename which we use to determine a lexer, if ``lexer`` is not set. In case
we can't determine a file, the lexer will fallback to ``plain`` code (no
highlighting). A given ``lexer`` will overwrite any filename! Example::

    {
        "url": "https://dpaste.de/xsWd",
        "lexer": "",
        "filename": "python",
        "content": "The text body of the snippet."
    }

This will create a ``python`` highlighted snippet. However in this example::

    {
        "url": "https://dpaste.de/xsWd",
        "lexer": "php",
        "filename": "python",
        "content": "The text body of the snippet."
    }

Since the lexer is set too, we will create a ``php`` highlighted snippet.

.. note:: Since ``lexer`` defaults to ``python`` you have to specifically
    unset it when using ``filename``.

.. hint:: You need to adjust the setting ``DPASTE_BASE_URL`` which is used
    to generate the full qualified URL in the API response. See :doc:`settings`.

.. note:: When creating new snippets via the API, they won't be listed on the
    history page since they are related to a browser session.

.. _lexer list: https://github.com/bartTC/dpaste/blob/master/dpaste/highlight.py#L25

Example code snippets:
======================

A sample Python 2 script to publish snippets::

    #!/usr/bin/env python

    import urllib
    import urllib2
    import sys

    def paste_code():
        request = urllib2.Request(
            'https://dpaste.de/api/',
            urllib.urlencode([('content', sys.stdin.read())]),
        )
        response = urllib2.urlopen(request)
        # Strip surrounding quotes (NB: response has no trailing newline)
        print response.read()[1:-1]

    if __name__ == '__main__':
        paste_code()

You can simply use curl to publish a whole file::

    $ alias dpaste="curl -F 'content=<-' https://dpaste.de/api/?format=url"
    $ cat foo.txt | dpaste
    https://dpaste.de/ke2pB
