# Basic operation

The encoding of URI components addressing a REST endpoint is Unicode UTF-8. There is more information about internationalization in Mailman.

In order to do anything with the REST API, you need to know its Basic AUTH credentials, and the version of the API you wish to speak to.

## Credentials

If you include the proper basic authorization credentials, the request succeeds.

    >>> import requests
    >>> response = requests.get(
    ...     'http://localhost:9001/3.0/system/versions',
    ...     auth=('restadmin', 'restpass'))
    >>> print(response.status_code)
    200

## System version information

System version information can be retrieved from the server, in the form of a JSON encoded response.

    >>> from mailman.testing.documentation import dump_json
    >>> dump_json('http://localhost:9001/3.0/system/versions')
    api_version: 3.0
    http_etag: "..."
    mailman_version: GNU Mailman 3...
    python_version: ...
    self_link: http://localhost:9001/3.0/system/versions

## API Versions

The REST API exposes two versions which are almost completely identical. As you’ve seen above, the `3.0` API is the base API. There is also a `3.1` API, which can be used interchangably:

    >>> dump_json('http://localhost:9001/3.1/system/versions')
    api_version: 3.1
    http_etag: "..."
    mailman_version: GNU Mailman 3...
    python_version: ...
    self_link: http://localhost:9001/3.1/system/versions

The only difference is the way UUIDs are represented. UUIDs are 128-bit unique ids for objects such as users and members. In version `3.0` of the API, UUIDs are represented as 128-bit integers, but these were found to be incompatible for some versions of JavaScript, so in API version `3.1` UUIDs are represented as hex strings.

Choose whichever API version makes sense for your application. In general, we recommend using API `3.1`, but most of the current documentation describes API `3.0`. Just make the mental substitution as you read along.

## Input Types

The REST API accepts POST data in two forms, `application/json` and `application/x-www-form-urlencoded`. You can send data as JSON:

    >>> response = requests.post('http://localhost:9001/3.1/domains',
    ...                          auth=('restadmin', 'restpass'),
    ...                          json={'mail_host': 'example.org',})
    >>> print(response.status_code)
    201

You can also send data as form parameters:

    >>> response = requests.post('http://localhost:9001/3.1/domains',
    ...                          auth=('restadmin', 'restpass'),
    ...                          params={'mail_host': 'example.net',})
    >>> print(response.status_code)
    201

## Error Types

The REST API always returns errors formatted as `json` with a content type of `application/json`:

    >>> response = requests.post('http://localhost:9001/3.1/domains',
    ...                          auth=('restadmin', 'restpass'),
    ...                          json={'mail_host': 'example.org',})
    >>> print(response.status_code)
    400
    >>> print(response.headers.get('content-type', None))
    application/json; charset=UTF-8
    >>> print(response.json()['title'])
    400 Bad Request
    >>> print(response.json()['description'])
    Duplicate email host: example.org