---
title: 'Object Storage (old)'
description: 'Методы старой версии Object Storage API для работы с S3'
---

import {CustomTable} from '@selectel/docux/components'

:::warning

URL и методы этой версии Object Storage API будут поддерживаться до 15.09.2026.
После 15.09.2026 они будут отключены.
Часть возможностей будет [перестанет поддерживаться](/s3/manage/configure-storage-update/#unavailable-features).

Мы рекомендуем использовать [новую версию Object Storage API](/api/object-storage/), подробнее в инструкции [Настроить S3 после обновления](/s3/manage/configure-storage-update/).

:::

[S3](https://selectel.ru/services/cloud/storage/?utm_source=kb.selectel.ru\&utm_medium=innerreferral\&utm_campaign=Storage_191120_storagerestapi) предоставляет разработчикам возможность интеграции с собственными приложениями и сайтами. Взаимодействие с хранилищем организовано на базе REST API. В документации описаны доступные на текущий момент вызовы REST API Storage, форматы запросов и ответов. На текущий момент с помощью запросов к REST API можно выполнять следующие операции:

* создавать ссылки, по которым сторонние пользователи могут загружать файлы в хранилище;
* работать с версиями файлов;
* создавать пользователей и задавать для них настройки доступа к хранилищу;
* скачивать и распаковывать архивы;
* работать со специальными страницами и т.д.

Способы авторизации и получения токена для работы с API описаны в разделе [Авторизация и получение токена](/api/object-storage-swift-old/#authorization-and-getting-token) инструкции Swift API (old).

## Ограничения для дополнительных пользователей \{#restrictions-for-additional-users}

Дополнительные пользователи имеют ограничения при использовании API, поэтому следующие действия необходимо выполнять от имени основного пользователя S3:

* создание бакета;
* удаление нескольких файлов (с помощью `?bulk-delete=true`);
* создание или изменение пользователей;
* работа с доменами и пользовательскими SSL-сертификатами;
* сброс кэша CDN;
* получение логов;
* создание временных токенов (`/temptokens`).

## Операции с бакетами \{#container-operations}

### Создание галереи изображений \{#create-image-gallery}

#### Параметры запроса \{#create-image-gallery-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Container-Meta-Type: gallery --- тип бакета (в нашем случае --- галерея)</td>
        <td>Активирует демонстрацию изображений в виде галереи</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#create-image-gallery-request-exmaple}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/SEL_*****/container  -H "X-Auth-Token: $token" -H "X-Container-Metatype: gallery"
```

В случае удачного выполнения запроса API возвращает ответ с кодом 204.

#### Пример ответа \{#create-image-gallery-response-example}

```
HTTP/1.1 202 Accepted
Content-Length: 76
Content-Type: text/html; charset=UTF-8
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers:
```

### Скачивание бакета в виде zip-архива \{#download-container-as-zip}

Содержимое любого бакета можно скачать в виде zip-архива. Для этого к ссылке на бакет нужно добавить query-параметр download-all-as-zip=\[имя архива], например:

```bash
wget https://api.selcdn.ru/v1/SEL_*****/container_name/?download-all-as-zip=container_name.zip
```

В публичных бакетах функционал скачивания zip-архива отключен по умолчанию, чтобы его включить надо установить заголовок **X-Container-Meta-Allow-ZipDownload: true**, пример:

```bash
curl -i -XPUT https://api.selcdn.ru/v1/SEL_***/container_name -H "X-Auth-Token: $token" -H "X-Container-Meta-Allow-ZipDownload: true"
```

Значение этого заголовка X-Container-Meta-Allow-ZipDownload в приватных бакетах игнорируется.

Для скачивания содержимого любого публичного бакета в виде zip-архива могут быть использованы следующие команды:

```bash
curl -i -XGET https://api.selcdn.ru/v1/SEL_*****/container?download-all-as-zip=test.zip -o name.zip
```

Для скачивания содержимого любого приватного бакета в виде zip-архива могут быть использованы следующие команды:

```bash
curl -i -XGET https://api.selcdn.ru/v1/SEL_*****/container?download-all-as-zip=test.zip -H "X-Auth-Token: $token" -o name.zip
```

Для просмотра содержимого скачанного архива используйте команду:

```
unzip -l name.zip

Archive: name.zip
warning [name.zip]: 274 extra bytes at beginning or within zipfile (attempting to process anyway)
Length Date Time Name
--------- ---------- ----- ----
555436    1980-00-00 00:00 IMG_20180802_121146.jpg
39        1980-00-00 00:00 copied_file
245473    1980-00-00 00:00 mergetree.pdf
--------- -------
800948    3 files
```

Описываемая операция предназначена в первую очередь для упрощения скачивания,  а не для экономии трафика, поэтому файлы в архиве не сжимаются.

Количество объектов в одном бакете не должно превышать 10 000, иначе команда не сработает и вернет ошибку.

Можно скачивать объекты, начинающиеся на один заданный префикс (например, IMG), в виде zip-архива, указав данный префикс IMG в параметре IMG?download-all-as-zip:

```bash
curl -i -XGET https://*****.selcdn.ru/container/?IMG?download-all-as-zip=test.zip -H "X-Auth-Token: $token" -o name.zip
```

*Примечание: если среди объектов будет папка, начинающаяся на этот же префикс, то будет скачана и она вместе со всем содержимым.*

### Скачивание папки в виде zip-архива

Содержимое любой папки можно скачать в виде zip-архива. Для этого к ссылке на папку нужно добавить query-параметр download-all-as-zip=\[имя архива], например:

```bash
wget https://api.selcdn.ru/v1/SEL_*****/container_name/folder/?download-all-as-zip=container_name.zip
```

Для скачивания содержимого любой папки в виде zip-архива могут быть использованы следующие команды:

```bash
curl -i -XGET https://*****.selcdn.ru/container/folder?download-all-as-zip=test.zip -H "X-Auth-Token: $token" -o name.zip
```

Для просмотра содержимого скачанного архива используйте команду:

```
unzip -l name.zip

Archive: name.zip
warning [name.zip]: 274 extra bytes at beginning or within zipfile (attempting to process anyway)
Length Date Time Name
--------- ---------- ----- ----
555436    1980-00-00 00:00 IMG_20180802_121146.jpg
39        1980-00-00 00:00 copied_file
245473    1980-00-00 00:00 mergetree.pdf
--------- -------
800948    3 files
```

Описываемая операция предназначена в первую очередь для упрощения скачивания,  а не для экономии трафика, поэтому файлы в архиве не сжимаются.

Количество объектов в одной папке не должно превышать 10 000, иначе команда не сработает и вернет ошибку.

## Работа с файлами \{#files}

### Распаковка архивов \{#unpack-archives}

Архивы в формате \*.tar, \*.tar.gz и \*.gzip могут быть распакованы сразу после загрузки в хранилище. Чтобы распаковать архив, в запрос на загрузку файла нужно добавить query-параметр extract-archive:

```bash
curl -i -XPUT  https://api.selcdn.ru/v1/SEL_*****/new_container/archive.tar.gz/?extract-archive=tar.gz \
-H "X-Auth-Token: $token" -T "archive.tar.gz"
```

### Создание символической ссылки на файл \{#create-symbolic-link-to-file}

При использовании хранилища в качестве бэкенда для публичных сервисов нередко возникает необходимость разграничить доступ к файлам — например, сделать доступными для широкого круга пользователей файлы, помещенные в приватный бакет.

Специально для таких случаев в хранилище предусмотрена возможность создавать символические ссылки. Такие ссылки можно защищать паролем, а также устанавливать для них срок действия.

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container/file/в адресе указывается бакет, в котором будет храниться символическая ссылка, и имя, под которым эта ссылка будет сохранена/</td>
        <td>X-Auth-Token --- токен авторизации; Content-Type --- тип символической ссылки (x-storage/onetime-symlink --- одноразовая ссылка, x-storage/symlink+secure --- обычная ссылка, защищенная паролем, x-storage/onetime-symlink+secure --- одноразовая ссылка, защищенная паролем); X-Object-Meta-Location --- заквотированный путь к объекту в хранилище; X-Object-Meta-Delete-At --- дата (в формате Unix Timestamp), до которой ссылка будет действительна; X-Object-Meta-Link-Key --- sha1-хэш от пароля и расположения объекта (для защищенных паролем ссылок; подробности в Пример генерации X-Object-Meta-Link-Key на Python); Content-Disposition --- указывает, что делать с файлом, на который создана ссылка: открывать в браузере (inline) или скачивать на локальную машину (attachment)</td>
        <td>Создает символическую ссылку с заданными в запросе параметрами.</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

##### Пример запроса \{#create-symbolic-link-to-file-request-example}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/SEL_*****/new_container/new_link \
-H "X-Auth-Token: $token" -H "Content-Type: x-storage/symlink" \
-H "X-Object-Meta-Location: /new_container/new_object" \
-H "X-Object-Meta-Link-Key: $key" -H "Content-Length: 0"
```

##### Пример ответа \{#create-symbolic-link-to-file-response-example}

```
HTTP/1.1 201 Created
> etag: d41d8cd98f00b204e9800998ecf8427e
> Last-Modified: Mon, 27 May 2013 13:34:34 GM
```

##### Пример генерации X-Object-Meta-Link-Key на Python \{#create-symbolic-link-to-file-python-example}

```
import hashlib

# location of file, always with container specified
location = "/container/object"

# password
password = "12345"

# concatenate password + location and encode it
encoded_pass_loc = (password + location).encode('utf-8')

# generate sha1-hash
hash_object = hashlib.sha1(encoded_pass_loc)

# convert sha1-hash to hexadecimal digits
link_key = hash_object.hexdigest()

# show calculated value
print(link_key)
```

#### Создание ссылки для скачивания файла \{#create-link-to-download-file}

Можно создавать специальные ссылки, по которым сторонние пользователи могут скачать ваши файлы (в том числе и из личных бакетов).
Для создания такой ссылки не нужно выполнять запрос к API.
Прежде чем генерировать ссылки на файлы аккаунта, нужно самостоятельно установить секретный ключ $key:

```bash
curl -i -XPOST http://*****.selcdn.ru/  -H "X-Auth-Token: $token" -H "X-Account-Meta-Temp-URL-Key: $key"
```

Для создания ссылки на конкретный бакет, установите секретный ключ $key, добавив имя бакета:

```bash
curl -i -XPOST http://*****.selcdn.ru/container   -H "X-Auth-Token: $token" -H "X-Container-Meta-Temp-URL-Key: $key"
```

Доступ к файлам по сгенерированной ссылке смогут получить только пользователи, которым известен секретный ключ.

#### Пример на Python \{#create-link-to-download-file-python-example}

```
import hmac
from hashlib import sha1
from time import time

# access method (always GET)
method = "GET"

# reference valid 60 seconds
expires = int(time()) + 60

# the path to the file in the repository, always with the container specified
path = "/container/dir/file"

# secret key
link_secret_key = str.encode("$key")

# generate access key
hmac_body = str.encode('%s\n%s\n%s' % (method, expires, path))

# access key
sig = hmac.new(link_secret_key, hmac_body, sha1).hexdigest()


#show calculated values
print(sig,expires)
```

При использовании ссылки вида `https://api.selcdn.ru/v1/SEL_***/container_name/object_name` в приведенном выше скрипте переменная **path** должна иметь вид  **`/v1/SEL_***/container_name/object_name`**.

Полученный в результате ключ затем нужно будет указать в ссылке:

```
http://****.selcdn.ru/container/dir/file?temp_url_sig=3f512dfed32111d6e742afc5522076c0621951cc&temp_url_expires=13909142
```

где:

* `*****.selcdn.ru` --- базовый домен;
* `temp_url_sig` --- ключ доступа;
* `temp_url_expires` --- время, до которого действует ссылка (unixtime).

Если к бакету прикреплен домен, то его можно указать в ссылке. Имя бакета при этом указывать не нужно:

```
http://my.domain/dir/file?temp_url_sig=3f512dfed32111d6e742afc5522076c0621951cc&temp_url_expires=1390914227
```

Поддерживается управление заголовком Content-Disposition для отдаваемых по ссылке данных. Для этого нужно добавить параметр filename с соответствующим значением:

```
http://*****.selcdn.ru/container/dir/file?temp_url_sig=3f512dfed32111d6e742afc5522076c0621951cc&temp_url_expires=1390914227&filename=Other+file+name.doc
```

Секретный ключ можно изменить. После изменения секретного ключа все сгенерированные ранее ссылки перестанут работать.

#### Пример на Node.js \{#create-link-to-download-file-node-js-example}

```
const crypto = require('crypto');

// access method (always GET)
const method = 'GET';

// reference valid 60 seconds
const expires = Math.floor(Date.now() / 1000) + 60;

// the path to the file in the repository, always with the container specified
const path = '/container/dir/file';

// secret key
const linkSecretKey = '$key';

// generate access key
const hmacBody = `${method}\n${expires}\n${path}`;

// access key
const sig = crypto.createHmac('sha1', linkSecretKey).update(hmacBody).digest('hex');

// show calculated values
console.log(sig);
console.log(expires);
```

#### Создание ссылки для загрузки файлов (sendmefile) \{#create-link-to-upload-file}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container/upload</td>

        <td>
          X-Auth-Token --- токен авторизации;
          Content-Type --- свойства ссылки (x-storage/sendmefile+inplace --- загрузка только одного файла с указанным именем;
          x-storage/sendmefile+timepostfix --- загрузка файлов с добавлением времени загрузки к имени;
          x-storage/sendmefile+autopostfix --- загрузка файлов с добавлением уникального идентификатора к имени с учетом расширения;
          x-storage/sendmefile+folderday --- загрузка файлов в папку с именем вида yyyy-dd-mm, x-storage/sendmefile+folderhour --- загрузка файлов в папку с именем вида dd-mm hh:min min, x-storage/sendmefile+folderuniq --- загрузка каждого файла в отдельную папку); X-Object-Meta-Sendmefile-Disable-Web --- включает (no)/отключает (yes) веб-интерфейс для загрузки файлов;
          по умолчанию этот заголовок имеет значение yes (веб-интерфейс включен); X-Object-Meta-Sendmefile-Max-Size --- максимальный размер загружаемого файла (в байтах);
          X-Delete-After --- удаляет ссылку через указанное время (в секундах); X-Object-Meta-Sendmefile-Allow-Overwrite --- разрешает (yes) или запрещает (no) перезапись файлов при повторной загрузке (по умолчанию перезапись запрещена);
          X-Object-Meta-Sendmefile-Ignore-Filename --- разрешить (yes) автоматическое переименование файлов в соответствии с заданными настройками;
          X-Object-Meta-Sendmefile-Secret --- хэш пароля (для защищенных паролем ссылок); -Sendmefile-Session-Id --- идентификатор сессии загрузки
        </td>

        <td>Создает ссылку, по которой сторонние пользователи могут загружать файлы в хранилище. Пример ссылки: https://\*\*\*\*\*.selcdn.ru/container/upload \*\*\*\*\* --- базовый домен бакета в виде цифр, указан в панели управления, в карточке Настройки бакета ⟶ Ссылка для загрузки файлов; container --- имя бакета; upload --- имя ссылки для загрузки файла.</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

##### Пример запроса \{#crea-examplete-link-to-upload-file-request}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/SEL_*****/container/upload \
-H "X-Auth-Token: $token"    -H "Content-Type: x-storage/sendmefile+inplace"  \
-H "X-Object-Meta-Sendmefile-Max-Size: 52428800" \
-H "X-Delete-After: 14400" \
-H "X-Object-Meta-Sendmefile-Secret: 5baa61e4c9b93f3f0682250b6cf8331b7ee68" \
-d "Пояснительный текст для страницы загрузки"
```

### Версионирование \{#versioning}

Чтобы хранить не только последнюю версию объекта, но и несколько предыдущих, в хранилище предусмотрена поддержка версий.

Перед началом работы с версионированием создайте бакет для хранения версий.

При удалении объекта на его место не возвращается последняя рабочая версия. Все версии объекта, в том числе та, что была перед удалением, хранятся в бакете для версий.

#### Параметры запроса \{#versioning-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Versions-Location --- имя бакета, где будут храниться версии. Заголовок не будет работать, если не создан бакет для версий</td>
        <td>Активирует версионирование для указанного бакета. Версии всех объектов будут сохранены в бакете, имя которого передано в заголовке</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#versioning-request-example}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/SEL_*****/container1/ -H "X-Auth-Token: $token" -H "X-Versions-Location: container2"
```

При удачном выполнении запроса будет возвращен ответ с кодом 202.

#### Пример ответа \{#versioning-response-example}

```
HTTP/1.1 202 Accepted Content-Length: 76
Content-Type: text/html; charset=UTF-8
Access-Control-Allow-Origin: * Access-Control-Expose-Headers: Expires: 0 Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate
```

## Специальные страницы \{#special-pages}

К специальным страницам относятся:

* индексная страница, отдаваемая в ответ на анонимный GET-запрос  на бакет или папку, помещенную в этот бакет;
* страница ошибки (404) --- файл, отдаваемые при анонимном GET-запросе к несуществующему объекту.

### Индексная страница \{#index-page}

#### Параметры запроса \{#index-page-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Container-Meta-Web-Index --- путь к файлу, который будет использоваться в качестве индексного</td>
        <td>Назначает индексный файл для указанного бакета</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

В запросе можно указывать как абсолютный, так и относительный путь к файлу.

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Web-Index</th>
        <th>Запрос</th>
        <th>Отданный файл</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>/index.html</td>
        <td>GET /container/; GET /container/dir1/</td>
        <td>/container/index.html</td>
      </tr>

      <tr>
        <td>index.html</td>
        <td>GET /container/</td>
        <td>/container/index.html</td>
      </tr>

      <tr>
        <td>index.html</td>
        <td>GET /container/dir1/dir2/</td>
        <td>/container/dir1/dir2/index.html или (если файла нет) /container/index.html</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#index-page-request-example}

Создайте индексный файл:

```bash
echo "<html>custom_index_file</html>" > my_index.html

curl -i -XPUT "https://api.selcdn.ru/v1/SEL_*****/container_name/my_index.html" -H "X-Auth-Token: $token" -T "./my_index.html"
```

Для задания индексной страницы установите значение Web-Index для бакета:

```bash
curl -i -XPUT "https://api.selcdn.ru/v1/SEL_*****/container_name/my_index.html" \
-H "X-Auth-Token: $token" -H "X-Container-Meta-Web-Index:/my_index.html"
```

### Страница 404 \{#error-page}

#### Параметры запроса \{#error-page-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Container-Meta-Web-404-Page --- путь к файлу ошибки</td>
        <td>Настраивает файл ошибки для указанного бакета</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Примеры \{#error-page-examples}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Web-404-Page</th>
        <th>Запрос</th>
        <th>Адрес перенаправления</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>/404.html</td>
        <td>GET /container/nofile; GET /container/dir1/nofile</td>
        <td>/container/404.html</td>
      </tr>

      <tr>
        <td>404.html</td>
        <td>/container/nofile</td>
        <td>/container/404.html</td>
      </tr>

      <tr>
        <td>404.html</td>
        <td>GET /container/nofile</td>
        <td>/container/dir1/dir2/404.html или (если файла нет) /container/404.html</td>
      </tr>

      <tr>
        <td>http://test.test</td>
        <td>GET /container/nofile; /container/dir1/nofile</td>
        <td>http://test.test</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Доступные шаблонные параметры \{#available-template-parameters}

Чтобы передавать информацию об изначально запрашиваемом файле, можно использовать специальные шаблонные параметры:

* {'{container}'} --- имя бакета;
* {'{path}'} --- путь к запрошенному файлу относительно бакета.

По умолчанию переадресация выполняется с кодом 307.  Доступные варианты: 200, 307, 404. При установке внешней ссылки доступно задание только кода 307.

#### Пример запроса \{#available-template-parameters-request-example}

Установите значение Web-404-Page для бакета:

```bash
curl -i -XPOST "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Auth-Token: $token" \
-H "X-Container-Meta-Web-404-Page: /404.html?file={path}"
```

При анонимном запросе на несуществующий объект происходит перенаправление на указанный файл:

```bash
curl -i "https://api.selcdn.ru/v1/SEL_*****/container_name/non_existing_object" \
> HTTP/1.1 307 Temporary Redirect
> Location: https://api.selcdn.ru/v1/SEL_*****/404.html?file=non_existing_object
```

По умолчанию при отправке страницы ошибки возвращается код 404:

```bash
curl -i -XPOST "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Auth-Token: $token" \
-H "X-Container-Meta-Web-404-Page: /404.html?file={path}?{code}"
```

### Листинг файлов \{#files-listing}

#### Параметры запроса \{#files-listing-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Container-Meta-Web-Listings --- on/off --- включить или отключить режим листинга для бакета; X-Container-Meta-Web-Listings-CSS --- ссылка на файл стилей, используется для выводов в HTML-формате (необязательная); X-Container-Meta-Web-Listings-Sort --- тип сортировки листинга, возможные значения: name\_asc, name\_desc, date\_asc, date\_desc, size\_asc, size\_desc; можно сортировать по имени, дате изменения и размеру. Asc и desc определяют порядок сортировки</td>
        <td>Включает режим листинга файлов для указанного в запросе бакета</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#files-listing-request-example}

```bash
curl -i -XPOST "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Auth-Token: $token" \
-H "X-Container-Meta-Web-Listings: on"
```

Для получения листинга файлов анонимным запросом введите:

```bash
curl -i -XGET "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Web-Mode: listing"
```

Для получения листинга приватного бакета укажите токен пользователя, имеющего доступ к бакету:

```bash
curl -i -XGET "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Auth-Token: $token" -H "X-Web-Mode: listing"
```

Для выводов в HTML-формате можно задавать оформление с помощью заголовка X-Container-Meta-Web-Listings-Css, в качестве значения которого указывается ссылка на файл стилей в бакете; можно также дать ссылку на внешний файл стилей.

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Web-Listings-CSS</th>
        <th>Поведение</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>my.css или /my.css</td>
        <td>Будет использоваться файл стилей, находящийся в этом же бакете</td>
      </tr>

      <tr>
        <td>http://my\_site/my.css</td>
        <td>Будут использоваться файл стилей с внешнего сайта</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Устанавливаем значение Web-Listings-CSS для бакета:

```bash
curl -i -XPOST "https://api.selcdn.ru/v1/SEL_*****/container_name" -H "X-Auth-Token: $token" \
-H "X-Container-Meta-Web-Listings-Css: my_style.css"
```

## Управление пользователями \{#users}

### Просмотр списка пользователей \{#view-user-list}

#### Параметры запроса \{#view-user-list-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>GET</td>
        <td>https://api.selcdn.ru/v1/users</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Выводит список пользователей для текущего аккаунта</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#view-user-list-request-xample}

```bash
curl -i https://api.selcdn.ru/v1/users  -H "X-Auth-Token: $token"
```

В случае удачного выполнения запроса API вернет ответ с кодом 200.

#### Пример ответа \{#view-user-list-response-example}

```
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
Content-Length: 80
```

```
main_user (true)
main_user (true)
user1 (true)
user2 (true)
user3 (true)
```

### Добавление нового пользователя \{#add-new-user}

#### Параметры запроса \{#add-new-user-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/users/username</td>
        <td>X-Auth-Token --- токен авторизации; X-Auth-Key --- пароль для нового пользователя; X-User-Active --- статус пользователя (on --- активен, off--- неактивен); X-User-ACL-Containers-R --- имена бакетов, которые новому пользователю будут доступны только для чтения; X-User-ACL-Containers-W --- список бакетов, которые будут доступны новому пользователю для записи; X-User-S3-Password - указывает, что пароль будет использоваться при доступе по протоколу s3 (аналогично опции Использовать эти данные для доступа по протоколу S3 в панели управления)</td>
        <td>Создает пользователя с указанными настройками учетной записи</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#add-new-user-request-example}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/users/my_test_user
-H "X-Auth-Token: $token"
-H "X-Auth-Key: $key"
-H "X-User-ACL-Containers-W: container1, container2, container3"
-H "X-User-ACL-Containers-R: container4"
-H "X-User-S3-Password: yes"
-H "X-User-Active: on"
```

При удачном выполнении запроса API возвращает ответ с кодом 204.

#### Пример ответа \{#add-new-user-response-example}

```
HTTP/2 204 Created
access-control-allow-origin: *
Content-Type: text/html; charset=UTF-8
Content-Length: 0
```

### Удаление пользователя \{#delete-user}

#### Параметры запроса \{#delete-user-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>DELETE</td>
        <td>https://api.selcdn.ru/v1/users/username</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Удаляет указанного пользователя</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#delete-user-request-example}

```bash
curl -i -X DELETE https://api.selcdn.ru/v1/users/my_test_user  -H "X-Auth-Token: $token"
```

В случае успешного удаления пользователя API возвращает ответ с кодом 204.

#### Пример ответа \{#delete-user-response-example}

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Mon, 19 Mar 2018 10:04:25 GMT
```

### Изменение пароля основного пользователя \{#change-main-user-password}

#### Параметры запроса \{#change-main-user-password-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/users/</td>
        <td>X-Auth-Token --- токен авторизации; X-Auth-Key --- новый пароль; X-User-S3-Password - указывает, что пароль будет использоваться при доступе по протоколу s3 (аналогично опции Использовать эти данные для доступа по протоколу S3 в панели управлени)</td>
        <td>Меняет пароль основного пользователя на переданный в заголовке X-Auth-Key</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#change-main-user-password-request-example}

```bash
curl -i -XPOST https://api.selcdn.ru/v1/users -H "X-Auth-Token: $token" -H "X-Auth-Key: $key"
```

При удачном выполнении запроса API возвращает ответ с кодом 204.

#### Пример ответа \{#change-main-user-password-response-example}

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Mon, 19 Mar 2018 10:30:59 GMT
```

## Управление доменами \{#domains}

К бакетам в хранилище можно прикреплять домены.  Все операции с доменами осуществляются через API.

### Домены по умолчанию \{#default-domains}

Каждый пользователь S3 автоматически получает набор доменов по умолчанию, которые можно использовать для доступа к объектам в любых бакетах:

* \*\*\*\*\*.selcdn.ru ---  домен для публичного доступа к файлам в хранилище;
* \*\*\*\*\*.selcdn.com --- домен для раздачи файлов через CDN по http.

### Получение списка прикрепленных доменов \{#get-list-of-attached-domains}

#### Параметры запроса \{#get-list-of-attached-domains-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>GET</td>
        <td>https://api.selcdn.ru/v1/domains</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Возвращает список доменов</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#get-list-of-attached-domains-request-example}

```bash
curl -i -XGET https://api.selcdn.ru/v1/domains -H "X-Auth-Token: $token"
```

При удачном выполнении запроса API возвращает ответ с кодом 200.

#### Пример ответа \{#get-list-of-attached-domains-response-example}

```
HTTP/1.1 200 OK
Content-Length: 69
Content-Type: text/html
Date: Mon, 16 May 2016 07:36:35 GMT
```

```
Base Domains:
00000.selcdn.ru
00000.selcdn.com
Containers Domains:
container1  domain1.ru
container2  domain1.ru
```

### Прикрепление домена \{#add-domains}

#### Параметры запроса \{#add-domains-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Add-Container-Domains --- список доменов, которые будут прикреплены к бакету, домены указываются через запятую</td>
        <td>Прикрепляет к бакету домены, переданные в заголовке X-Add-Container-Domains</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#add-domains-request-example}

```bash
curl -i -XPOST https://api.selcdn.ru/v1/SEL_*****/container -H "X-Add-Container-Domains: domain1.ru" -H "X-Auth-Token: $token"
```

В случае удачного выполнения запроса API вернет ответ с кодом 204.

#### Пример ответа \{#add-domains-response-example}

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Backend-Timestamp, Etag, Last-Modified, X-Object-Manifest, X-Timestamp
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Tue, 20 Mar 2018 12:09:38 GMT
```

### Удаление домена \{#delete-domain}

#### Параметры запроса \{#delete-domain-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Remove-Container-Domains --- список доменов, которые будут откреплены от бакета, домены указываются через запятую</td>
        <td>Открепляет от бакета домены, переданные в заголовке X-Remove-Container-Domains</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#delete-domain-request-example}

```
curl -i -XPOST https://api.selcdn.ru/v1/SEL_*****/container -H "X-Remove-Container-Domains: domain1.ru" -H "X-Auth-Token: $token
```

В случае удачного выполнения запроса API возвращает ответ с кодом 204.

#### Пример ответа \{#delete-domain-response-example}

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Backend-Timestamp, Etag, Last-Modified, X-Object-Manifest, X-Timestamp
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
```

### Редактирование списка доменов \{#edit-list-of-domains}

#### Параметры запроса \{#edit-list-of-domains-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/SEL\_\*\*\*\*\*/container</td>
        <td>X-Auth-Token --- токен авторизации; X-Container-Domains --- список доменов, которые будут прикреплены к бакету, домены указываются через запятую</td>
        <td>Прикрепляет к бакету домены, переданные в заголовке X-Container-Domains. В отличие от X-Add-Container-Domains, данный заголовок полностью заменяет список прикрепленных доменов, а не дополняет его</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#edit-list-of-domains-request-example}

```bash
curl -i -XPOST https://api.selcdn.ru/v1/SEL_*****/container -H "X-Container-Domains: domain1.ru" -H "X-Auth-Token: $token"
```

В случае удачного выполнения запроса API возвращает ответ с кодом 204.

#### Пример ответа \{#edit-list-of-domains-response-example}

```
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Backend-Timestamp, Etag, Last-Modified, X-Object-Manifest, X-Timestamp
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
```

## Управление пользовательскими SSL-сертификатами \{#ssl-certificates}

### Получение списка сертификатов \{#get-list-of-certificates}

#### Параметры запроса \{#get-list-of-certificates-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>GET</td>
        <td>https://api.selcdn.ru/v1/ssl</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Возвращает список сертификатов</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#get-list-of-certificates-request-example}

```bash
curl -i -XGET https://api.selcdn.ru/v1/ssl -H "X-Auth-Token: $token"
```

### Получение информации о сертификате \{#get-certificate-info}

#### Параметры запроса \{#get-certificate-info-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>GET</td>
        <td>https://api.selcdn.ru/v1/ssl/cert</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Возвращает информацию об указанном сертификате</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#get-certificate-info-request-example}

```bash
curl -i -XGET https://api.selcdn.ru/v1/ssl/cert -H "X-Auth-Token: $token"
```

### Добавление сертификата \{#add-certificate}

#### Параметры запроса \{#add-certificate-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>PUT</td>
        <td>https://api.selcdn.ru/v1/ssl/\*\*\*\*\*\_cert1</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Добавляет новый сертификат</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#add-certificate-request-example}

```bash
curl -i -XPUT https://api.selcdn.ru/v1/ssl/*****_cert1 -H "X-Auth-Token: $token" -T ./cert1.pem
```

Имя сертификата ({'{cert_name}'}) нужно передавать в формате \*\*\*\*\*\_cert1, где первая часть (цифры) представляет собой номер учетной записи пользователя, а вторая — любую произвольную комбинацию символов.

Имена сертификатов должны быть уникальными; загрузить два сертификата с одинаковыми именами невозможно.

Сам сертификат и приватный ключ нужно передать в теле запроса в одном файле.

### Удаление сертификата \{#delete-certificate}

#### Параметры запроса \{#delete-certificate-request-certificate}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>DELETE</td>
        <td>https://api.selcdn.ru/v1/ssl/cert</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Удаляет указанный сертификат</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Очистка кэша хранилища \{#clear-storage-cash}

Параметры запроса:

* Тип запроса --- POST;
* URI --- `https://api.selcdn.ru/v1/storage/purge`;
* Заголовки --- токен авторизации X-Auth-Token;
* Описание --- очищает кэш S3 для страниц, адреса которых переданы в запросе.

Пример запроса:

```bash
curl -i -XPOST https://api.selcdn.ru/v1/storage/purge -H "x-auth-token: $token" -d '{"objects":["https://example.domain.ru/test_purge/file","https://example2.domain.ru/test_purge/file2"]}'
```

При удачном выполнении запроса API вернет ответ с кодом 200.

Пример ответа:

```
HTTP/2 200
content-type: application/json
date: Fri, 27 Aug 2021 13:00:42 GMT
content-length: 66
{"HttpStatus":201,"Detail":"Request accepted.","RejectedUrls":{}}
```

## Получение логов \{#get-logs}

### Запрос на создание выгрузки \{#request-to-create-upload}

#### Параметры запроса \{#request-to-create-upload-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>POST</td>
        <td>https://api.selcdn.ru/v1/logs</td>
        <td>X-Auth-Token --- токен авторизации; X-Start-Time --- начало периода в формате Y-m-d H:M:S; X-End-Time --- конец периода в формате Y-m-d H:M:S; X-Limit --- максимальное количество записей, которое нужно вернуть в запросе</td>
        <td>Создать бакет logs и выгрузить в него логи хранилища</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Тело запроса:

```
{
  "since": "2019-05-14T06:00:00",
  "till": "2019-12-09T13:43:00",
  "fields": [
    "container_name"
  ],
  "filters": {
    "host": [
      "example.com",
      "foo.bar.baz"
    ]
  },
  "container": "logs",
  "delete_after": 3600
}
```

Описание полей тела запроса:

* since --- начало периода для выгрузки;
* till --- конец периода для выгрузки;
* fields --- список необходимых полей;
* filters --- фильтры для выгрузки;
* container --- бакет для выгрузки;
* delete\_after --- удаление объектов с логами через заданное время.

Список возможных полей (fields):

* container\_name
* timestamp
* host
* server\_to\_client\_bytes
* client\_to\_server\_bytes
* http\_method
* status
* path
* query
* client\_ip

Список возможных фильтров (filters):

* host
* container\_name

#### Пример запроса \{#request-to-create-upload-example}

```
curl -i -XPOST -H 'X-Auth-Token: $token' -d '{"since": "2019-05-14T06:00:00","till": "2019-12-09T13:43:00", "fields": ["container_name"], "filters": {"host": ["example.com", "foo.bar.baz"]}, "container": "logs", "delete_after": 3600}' 'https://api.selcdn.ru/v1/logs'
```

В случае удачного выполнения запроса API вернет ответ с кодом 200.

#### Пример ответа \{#request-to-create-upload-response-example}

```

HTTP/1.1 201 Created
Access-Control-Allow-Origin: *
Content-Length: 342
Content-Type: application/json
Date: Tue, 14 Jan 2020 13:01:34 GMT

{
  "task": {
    "id": "896aae80-bc7e-434d-8528-5ca2bfb41a56",
    "created": "2020-01-14T13:01:34",
    "updated": "2020-01-14T13:01:34",
    "type": "storage_logs",
    "data": {
      "since": "2019-05-14T06:00:00",
      "till": "2019-12-09T13:43:00",
      "provider": "storage_access",
      "container": "logs",
      "fields": ["container_name"],
      "filters": {"host": ["example.com", "foo.bar.baz"]},
      "delete_after": 3600
    },
    "status": 0,
    "progress": 0
  }
}
```

### Получение информации о созданной задаче \{#get-info-about-created-job}

#### Параметры запроса \{#get-info-about-created-job-request-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Тип запроса</th>
        <th>URI</th>
        <th>Заголовки</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>GET</td>
        <td>https://api.selcdn.ru/v1/logs/$task\_id</td>
        <td>X-Auth-Token --- токен авторизации</td>
        <td>Создать бакет logs и выгрузить в него логи хранилища</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#get-info-about-created-job-request-example}

```bash
curl -i -XPOST -H 'X-Auth-Token: $token' -d '{"since": "2019-05-14T06:00:00","till": "2019-12-09T13:43:00", "fields": ["container_name"], "filters": {"host": ["example.com", "foo.bar.baz"]}, "container": "logs", "delete_after": 3600}' 'https://api.selcdn.ru/v1/logs'
```

#### Пример ответа \{#get-info-about-created-job-response-example}

```
{
  "task": {
    "id": "896aae80-bc7e-434d-8528-5ca2bfb41a56",
    "created": "2020-01-14T13:01:34",
    "updated": "2020-01-14T13:01:45",
    "type": "storage_logs",
    "data": {
      "till": "2019-12-09T13:43:00",
      "since": "2019-05-14T06:00:00",
      "fields": ["container_name"],
      "filters": {"host": ["example.com", "foo.bar.baz"]},
      "provider": "storage_access",
      "container": "logs",
      "delete_after": 3600
    },
    "status": 2,
    "progress": 100
  }
}
```
