API Документация

Полное описание REST API платформы "Мои Закупки" для интеграции с внешними системами

Обзор API

API платформы "Мои Закупки" предоставляет программный доступ к справочникам ОКПД-2 и КТРУ, каталогу товаров, а также функционалу создания технических заданий.

Base URL

https://moy-zakupki.ru/api

Формат

JSON (REST API)

Аутентификация

Для доступа к приватным эндпоинтам используется JWT (JSON Web Token) аутентификация.

Получение токена

POST/auth/jwt/create/

Request body:

{
  "email": "user@example.com",
  "password": "your_password"
}

Response:

{
  "access": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "refresh": "eyJ0eXAiOiJKV1QiLCJhbGc..."
}

Использование токена

Добавьте заголовок Authorization к запросам:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...

ОКПД-2 (Классификатор)

GET/okpd2/

Получить список всех кодов ОКПД-2 с пагинацией

Query параметры:

pageНомер страницы (по умолчанию: 1)
page_sizeКоличество записей на странице
searchПоиск по коду или названию

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

{
  "count": 20372,
  "next": "https://moy-zakupki.ru/api/okpd2/?page=2",
  "previous": null,
  "results": [
    {
      "code": "01.11.11.110",
      "name": "Пшеница твердая",
      "is_actual": true,
      "parent_code": "01.11.11",
      "level": 4
    }
  ]
}
GET/okpd2/{'{code}'}/

Получить детальную информацию о коде ОКПД-2

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

{
  "code": "01.11.11.110",
  "name": "Пшеница твердая",
  "is_actual": true,
  "parent_code": "01.11.11",
  "level": 4,
  "children": [],
  "ktru_codes": [
    {
      "code": "26.20.11.110-00000001",
      "name": "Пшеница продовольственная..."
    }
  ],
  "limitations": [
    {
      "type": "44-ФЗ",
      "description": "Описание ограничения..."
    }
  ]
}

КТРУ (Каталог товаров)

GET/ktru/

Получить список позиций КТРУ с характеристиками

Query параметры:

okpd_codeФильтр по коду ОКПД-2
searchПоиск по коду или названию
is_consolidatedФильтр укрупненных позиций (true/false)

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

{
  "count": 77000,
  "results": [
    {
      "code": "26.20.11.110-00000165",
      "name": "Компьютеры портативные...",
      "okpd_code": "26.20.11.110",
      "is_last_version": true,
      "is_consolidated": false,
      "characteristics": [
        {
          "name": "Диагональ экрана",
          "type": "обязательная",
          "value_type": "число",
          "unit": "дюймы",
          "values": ["15.6", "17.3"]
        }
      ]
    }
  ]
}
GET/ktru/{'{code}'}/

Получить детальную информацию о позиции КТРУ

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

{
  "code": "26.20.11.110-00000165",
  "name": "Компьютеры портативные массой не более 10 кг...",
  "okpd_code": "26.20.11.110",
  "is_last_version": true,
  "is_consolidated": false,
  "characteristics": [
    {
      "id": 12345,
      "name": "Диагональ экрана",
      "type": "обязательная",
      "value_type": "число",
      "unit": "дюймы",
      "min_value": "13.0",
      "max_value": "17.3",
      "values": ["13.3", "15.6", "17.3"]
    }
  ],
  "limitations": [...],
  "products_count": 156
}

Каталог товаров

GET/products/

Поиск товаров с фильтрацией по характеристикам КТРУ

Query параметры:

ktru_codeКод КТРУ для фильтрации
characteristicsJSON с характеристиками для фильтрации
searchПоиск по названию

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

{
  "count": 156,
  "results": [
    {
      "id": "uuid-here",
      "name": "Ноутбук Dell Latitude 15.6\"",
      "seo_url": "noutbuk-dell-latitude-156",
      "ktru_code": "26.20.11.110-00000165",
      "characteristics": {
        "Диагональ экрана": "15.6",
        "Процессор": "Intel Core i5",
        "ОЗУ": "16"
      },
      "price": 65000,
      "currency": "RUB"
    }
  ]
}
GET/products/{'{id}'}/

Получить детальную информацию о товаре

Технические задания

GET/tech-specs/

Получить список технических заданий пользователя

Требуется аутентификация: JWT токен в заголовке Authorization

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

{
  "count": 5,
  "results": [
    {
      "id": 123,
      "name": "Закупка оргтехники 2026",
      "products_count": 15,
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-01-20T14:45:00Z",
      "is_deleted": false
    }
  ]
}
POST/tech-specs/

Создать новое техническое задание

Request body:

{
  "name": "Закупка оргтехники 2026",
  "products": [
    {
      "ktru_code": "26.20.11.110-00000165",
      "quantity": 10,
      "characteristics": {
        "Диагональ экрана": "15.6",
        "Процессор": "Intel Core i5"
      }
    }
  ]
}
GET/tech-specs/{'{id}'}/export/

Экспортировать техническое задание

Query параметры:

formatФормат экспорта: docx, pdf, xlsx

Коды ошибок

400

Bad Request

Некорректные параметры запроса

401

Unauthorized

Требуется аутентификация или токен истек

403

Forbidden

Недостаточно прав доступа

404

Not Found

Ресурс не найден

429

Too Many Requests

Превышен лимит запросов (rate limit)

500

Internal Server Error

Внутренняя ошибка сервера

Ограничения

Для обеспечения стабильности сервиса действуют ограничения на частоту запросов:

Анонимные запросы

100

запросов в час с одного IP

Аутентифицированные

1000

запросов в час для пользователя

Заголовки ответа при rate limiting:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 995
X-RateLimit-Reset: 1642345678

Примеры кода

JavaScript (Fetch API)

// Получение JWT токена
async function getAuthToken(email, password) {
  const response = await fetch('https://moy-zakupki.ru/api/auth/jwt/create/', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ email, password })
  });

  const data = await response.json();
  return data.access; // JWT токен
}

// Получение списка КТРУ
async function getKtruList(token) {
  const response = await fetch('https://moy-zakupki.ru/api/ktru/?page=1', {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });

  return await response.json();
}

// Использование
const token = await getAuthToken('user@example.com', 'password');
const ktruData = await getKtruList(token);
console.log(ktruData);

Python (requests)

import requests

# Получение JWT токена
def get_auth_token(email, password):
    url = 'https://moy-zakupki.ru/api/auth/jwt/create/'
    data = {'email': email, 'password': password}
    response = requests.post(url, json=data)
    return response.json()['access']

# Получение списка КТРУ
def get_ktru_list(token, page=1):
    url = f'https://moy-zakupki.ru/api/ktru/?page={page}'
    headers = {'Authorization': f'Bearer {token}'}
    response = requests.get(url, headers=headers)
    return response.json()

# Использование
token = get_auth_token('user@example.com', 'password')
ktru_data = get_ktru_list(token)
print(ktru_data)

cURL

# Получение JWT токена
curl -X POST https://moy-zakupki.ru/api/auth/jwt/create/ \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com", "password": "your_password"}'

# Получение списка КТРУ с токеном
curl -X GET "https://moy-zakupki.ru/api/ktru/?page=1" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

# Поиск товаров по характеристикам
curl -X GET "https://moy-zakupki.ru/api/products/?ktru_code=26.20.11.110-00000165" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"