REST API v1

API принимает запросы на функции указанные в этой документации.

Все запросы отправляются на сервер: https://qtickets.ru/api/rest/v1/{method}

Авторизация

Каждый запрос к API должен содержать заголовок Authorization: Bearer TOKEN. Токен API (TOKEN_API) можно сформировать в личном кабинете продавца билетов внизу раздела «Настройки – Основное».

Get Token

Мероприятия

Список мероприятий

GET https://qtickets.ru/api/rest/v1/events
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "where": [
    {
      "column": "deleted_at",
      "operator": "null"
    }
  ],
  "orderBy": {
    "id": "desc"
  },
  "page": 1
}

Получение данных по id мероприятия

GET https://qtickets.ru/api/rest/v1/events/1240
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

Создание мероприятия

POST https://qtickets.ru/api/rest/v1/events
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "data": {
    "id": 12,
    "name": "Название мероприятия",
    "is_active": 1,
    "scheme_id": 18,
    "currency_id": "RUB",
    "place_name": "Олимпийский",
    "place_address": "Адрес места",
    "place_description": "",
    "site_url": "http://your-domain.ru/your-event",
    "city_id": 1,
    "description": "Начало координат, следовательно, охватывает аксиоматичный график функции многих переменных. Определитель системы линейных уравнений, в первом приближении, небезынтересно раскручивает определитель системы линейных уравнений, что известно даже школьникам. Огибающая семейства прямых, исключая очевидный случай, позитивно порождает анормальный интеграл от функции, имеющий конечный разрыв.",
    "external_id": null,
    "ticket_id": 17,
    "mail_template_id": 35,
    "payments": [
      38
    ],
    "poster": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB2ZXJzaW9uPSIxLjEiIGJhc2VQcm9maWxlPSJmdWxsIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPiAgIDxwb2x5Z29uIGlkPSJ0cmlhbmdsZSIgcG9pbnRzPSIwLDAgMCw1MCA1MCwwIiBmaWxsPSIjMDA5OTAwIiBzdHJva2U9IiMwMDQ0MDAiLz48L3N2Zz4=",
    "shows": [
      {
        "id": 21,
        "sale_start_date": null,
        "is_active": 1,
        "sale_finish_date": "2019-12-29T18:30:00+03:00",
        "open_date": "2019-12-29T18:30:00+03:00",
        "start_date": "2019-12-29T18:30:00+03:00",
        "finish_date": "2019-12-29T23:00:00+03:00",
        "scheme_properties": {
          "admin": {
            "zones": {
              "VIP": {
                "opened": "1"
              },
              "DANCE": {
                "opened": "1"
              },
              "SUPER_VIP": {
                "opened": "1"
              }
            }
          },
          "zones": {
            "VIP": {
              "disabled": "0",
              "shared": "",
              "price_id": "#0"
            },
            "DANCE": {
              "disabled": "0",
              "shared": "",
              "price_id": "#1"
            },
            "SUPER_VIP": {
              "disabled": "0",
              "shared": "",
              "price_id": "#2"
            }
          },
          "seats": {
            "VIP-1;1": {
              "hot": "1",
              "max_quantity": "100",
              "shared_max_quantity": ""
            },
            "DANCE-1;1": {
              "hot": "1",
              "max_quantity": "200",
              "shared_max_quantity": ""
            },
            "SUPER_VIP-1;1": {
              "hot": "1",
              "max_quantity": "300",
              "shared_max_quantity": ""
            }
          }
        },
        "prices": [
          {
            "default_price": 1000,
            "color_theme": 1
          },
          {
            "default_price": 2000,
            "color_theme": 2
          },
          {
            "default_price": 3000,
            "color_theme": 3
          }
        ]
      }
    ]
  }
}

Редактирование мероприятия

PUT https://qtickets.ru/api/rest/v1/events/1240
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "data": {
    "id": 12,
    "name": "Название мероприятия",
    "is_active": 1,
    "scheme_id": 18,
    "currency_id": "RUB",
    "place_name": "Олимпийский",
    "place_address": "Адрес места",
    "place_description": "",
    "site_url": "http://your-domain.ru/your-event",
    "city_id": 1,
    "description": "Начало координат, следовательно, охватывает аксиоматичный график функции многих переменных. Определитель системы линейных уравнений, в первом приближении, небезынтересно раскручивает определитель системы линейных уравнений, что известно даже школьникам. Огибающая семейства прямых, исключая очевидный случай, позитивно порождает анормальный интеграл от функции, имеющий конечный разрыв.",
    "external_id": null,
    "ticket_id": 17,
    "mail_template_id": 35,
    "payments": [
      38
    ],
    "poster": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB2ZXJzaW9uPSIxLjEiIGJhc2VQcm9maWxlPSJmdWxsIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPiAgIDxwb2x5Z29uIGlkPSJ0cmlhbmdsZSIgcG9pbnRzPSIwLDAgMCw1MCA1MCwwIiBmaWxsPSIjMDA5OTAwIiBzdHJva2U9IiMwMDQ0MDAiLz48L3N2Zz4=",
    "shows": [
      {
        "id": 21,
        "sale_start_date": null,
        "is_active": 1,
        "sale_finish_date": "2019-12-29T18:30:00+03:00",
        "open_date": "2019-12-29T18:30:00+03:00",
        "start_date": "2019-12-29T18:30:00+03:00",
        "finish_date": "2019-12-29T23:00:00+03:00",
        "scheme_properties": {
          "admin": {
            "zones": {
              "VIP": {
                "opened": "1"
              },
              "DANCE": {
                "opened": "1"
              },
              "SUPER_VIP": {
                "opened": "1"
              }
            }
          },
          "zones": {
            "VIP": {
              "disabled": "0",
              "shared": "",
              "price_id": "1001"
            },
            "DANCE": {
              "disabled": "0",
              "shared": "",
              "price_id": "1002"
            },
            "SUPER_VIP": {
              "disabled": "0",
              "shared": "",
              "price_id": "#3"
            }
          },
          "seats": {
            "VIP-1;1": {
              "hot": "1",
              "max_quantity": "100",
              "shared_max_quantity": ""
            },
            "DANCE-1;1": {
              "hot": "1",
              "max_quantity": "200",
              "shared_max_quantity": ""
            },
            "SUPER_VIP-1;1": {
              "hot": "1",
              "max_quantity": "300",
              "shared_max_quantity": ""
            }
          }
        },
        "prices": [
          {
            "id": 1001,
            "default_price": 1000,
            "color_theme": 1
          },
          {
            "id": 1002,
            "default_price": 2000,
            "color_theme": 2
          },
          {
            "id": 1003,
            "default_price": 3000,
            "color_theme": 3
          },
          {
            "default_price": 6000,
            "color_theme": 4
          }
        ]
      }
    ]
  }
}

Заказы

Список заказов

GET https://qtickets.ru/api/rest/v1/orders
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "where": [
    {
      "column": "payed",
      "value": 1
    }
  ],
  "orderBy": {
    "id": "asc"
  },
  "page": 1
}

Получение данных по заказу

GET https://qtickets.ru/api/rest/v1/orders/4360
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

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

{
   "data":{
      "id":4360,
      "uniqid":"z7rkjcV2BV",
      "payed":true,
      "payed_at":"2019-07-30T12:50:52+03:00",
      "created_at":"2019-07-30T12:50:36+03:00",
      "updated_at":"2019-07-30T12:50:52+03:00",
      "deleted_at":null,
      "client_id":235,
      "client":{
         "id":235,
         "email":"username@gmail.com",
         "details":{
            "id":167,
            "name":"Иван",
            "middlename":null,
            "surname":"Петров",
            "phone":"+79100000000",
            "vk_id":"",
            "facebook_id":""
         }
      },
      "site_id":16,
      "site":{
         "id":16,
         "host":"qtickets.ru"
      },
      "payment_id":36,
      "payment_type_id":"bankcard",
      "payment_url":"https://qtickets.ru/pay/z7rkjcV2BV",
      "cancel_url":"https://qtickets.ru/cancel-order/z7rkjcV2BV/a800d6bfc609003205752c42844f541c",
      "basket_user_id":2111,
      "backend_user_id":null,
      "access_code_id":null,
      "discount_id":null,
      "promo_code_id":null,
      "reserved":0,
      "reserved_to":"2019-07-31T12:50:36+03:00",
      "reserve_extended":0,
      "event_id":33,
      "price":800,
      "original_price":800,
      "currency_id":"RUB",
      "utm":[

      ],
      "custom":{
         "var1":"val1",
         "var2":"val2"
      },
      "fields":{
         "organization_name":"ИП Петров"
      },
      "baskets":[
         {
            "id":63993,
            "barcode":"877076325904",
            "show_id":41,
            "seat_id":"CENTER_PARTERRE-21;12",
            "original_price":150,
            "discount_value":null,
            "price":150,
            "quantity":1,
            "client_email":"username@gmail.com",
            "client_phone":"+79100000000",
            "client_name":"Иван",
            "client_surname":"Петров",
            "organization_name":null,
            "legal_name":null,
            "work_position":null,
            "inn":null,
            "kpp":null,
            "comment":null,
            "related_baskets":[

            ],
            "checked_at":null,
            "created_at":"2019-07-30T12:49:47+03:00",
            "updated_at":"2019-07-30T12:50:52+03:00",
            "deleted_at":null,
            "refunded_at":null
         },
         {
            "id":63994,
            "barcode":"877344688530",
            "show_id":41,
            "seat_id":"CENTER_PARTERRE-21;11",
            "original_price":150,
            "discount_value":null,
            "price":150,
            "quantity":1,
            "client_email":"username@gmail.com",
            "client_phone":"+79100000000",
            "client_name":"Иван",
            "client_surname":"Петров",
            "organization_name":null,
            "legal_name":null,
            "work_position":null,
            "inn":null,
            "kpp":null,
            "comment":null,
            "related_baskets":[

            ],
            "checked_at":null,
            "created_at":"2019-07-30T12:49:50+03:00",
            "updated_at":"2019-07-30T12:50:52+03:00",
            "deleted_at":null,
            "refunded_at":null
         },
         {
            "id":63995,
            "barcode":"875606411179",
            "show_id":41,
            "seat_id":"CENTER_BALCONY-1;14",
            "original_price":500,
            "discount_value":null,
            "price":500,
            "quantity":1,
            "client_email":"username@gmail.com",
            "client_phone":"+79100000000",
            "client_name":"Иван",
            "client_surname":"Петров",
            "organization_name":null,
            "legal_name":null,
            "work_position":null,
            "inn":null,
            "kpp":null,
            "comment":null,
            "related_baskets":[

            ],
            "checked_at":null,
            "created_at":"2019-07-30T12:49:54+03:00",
            "updated_at":"2019-07-30T12:50:52+03:00",
            "deleted_at":null,
            "refunded_at":null
         }
      ],
      "integrations":{
         "roistat":{
            "roistat_visit":"100018"
         }
      }
   }
}

где:

поле тип поля Описание
id int Идентификатор заказа
uniqid string Уникальный идентификатор заказа
payed boolean Флаг оплаты заказа
payed_at date Дата оплаты заказа
created_at date Дата создания заказа
updated_at date Дата обновления заказа
client_id int Идентификатор покупателя
client array Данные о покупателе
payment_id int Идентификатор получателя платежей
payment_type_id string Идентификатор способа оплаты
payment_url string URL страницы для оплаты заказа
cancel_url string URL страницы для отмены заказа
basket_user_id int
backend_user_id int Идентификатор пользователя, если заказ был оформлен через ЛК
access_code_id int Идентификатор кода доступа
discount_id int Идентификатор скидки
promo_code_id int Идентификатор промокода
reserved boolean Флаг бесконечного бронирования
reserved_to date Дата бронирования
reserve_extended boolean Флаг продления бронирования
event_id int Идентификатор мероприятия
price float Итоговая цена
original_price float Цена, без учета скидок
currency_id string Валюта
utm array UTM-метки
custom array Дополнительные данные, которые были указаны в data-custom аттрибуте кнопки покупки
fields array Дополнительные поля (Название компании, ИНН, КПП…)
baskets array Состав заказа (билеты)
integrations array Если подключена интеграция Roistat, то будет возвращен roistat_visit

Удаление билетов

В ключи baskets передаются идентификаторы билетов, которые необходимо удалить.

DELETE https://qtickets.ru/api/rest/v1/orders/4360/baskets
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "delete": {
    "baskets": {
      "88344": [],
      "88402": []
    }
  }
}

Ответ будет содержать объект заказа, в котором будут помечены удаленные билеты в полях deleted_at

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

{
  "delete": {
    "baskets": {
      "88374": [      
        88375,
        88376
      ]
    }
  }
}

Где, 88374 — это основной билет (который приходит пользователю на почту), а 88375 и 88376 связанные (related_baskets).
В этом примере удалятся билеты с идентификаторами 88375 и 88376. Основной билет 88374 останется не тронутым, только если у него еще остались активные связанные билеты. Если таковых не окажется, основной билет также автоматически удалится.

Возврат билетов

В deduction_amount передается сумма удержания

DELETE https://qtickets.ru/api/rest/v1/orders/4360/baskets
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "refund": {
    "deduction_amount": 100,
    "baskets": {
      "88344": [],
      "88402": []
    }
  }
}

Ответ будет содержать объект заказа, в котором будут помечены возвращенные билеты в полях refunded_at.
Также список всех возвратов по заказу будет содержаться в поле refunds. В случае с абонементами, запрос будет похож на тот, что при удалении.

Промо

Список скидок

GET https://qtickets.ru/api/rest/v1/discounts
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "where": [
    {
      "column": "deleted_at",
      "operator": "null"
    }
  ],
  "orderBy": {
    "id": "desc"
  },
  "page": 1
}

Список промокодов

GET https://qtickets.ru/api/rest/v1/promo-codes
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "where": [
    {
      "column": "discount_id",
      "value": 45
    },
    {
      "column": "deleted_at",
      "operator": "null"
    }
  ],
  "orderBy": {
    "id": "desc"
  },
  "page": 1
}

Создание промокода

POST https://qtickets.ru/api/rest/v1/promo-codes
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "data": {
    "is_active": 1,
    "discount_id": 45,
    "code": "308076-15950-3",
    "max_uses_count": 5,
    "active_from": null,
    "active_to": null
  }
}

Редактирование промокода

POST https://qtickets.ru/api/rest/v1/promo-codes/13513
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "data": {
    "is_active": 1,
    "code": "308076-15950-3",
    "max_uses_count": 3,
    "active_from": null,
    "active_to": null
  }
}

Штрихкоды

Список штрихкодов

Возвращает все актуальные штрихкоды на текущий момент. В запросе указывается {show_id} — это идентификатор даты мероприятия, получить можно в мероприятии в секции shows

GET https://qtickets.ru/api/rest/v1/shows/{show_id}/barcodes
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer TOKEN

{
  "select": [
    "barcode",
    "price",
    "seat_name"
  ]
}

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

[
  {
    "barcode": "871495495233",
    "price": 500,
    "seat_name": "Танцевальный партер"
  },
  {
    "barcode": "874432174155",
    "price": 500,
    "seat_name": "Танцевальный партер"
  },
  {
    "barcode": "875196723453",
    "price": 1000,
    "seat_name": "VIP: ряд 1, место 1"
  },
  {
    "barcode": "872900619969",
    "price": 1000,
    "seat_name": "VIP: ряд 1, место 2"
  }
]

В select можно передавать такие значения:

поле описание
barcode штрихкод
price цена
seat_name название места
zone_name название категории
row ряд
place номер места
client_name имя покупателя
client_surname фамилия покупателя

Получение штрихкода по номеру

GET https://qtickets.ru/api/rest/v1/shows/{show_id}/barcode/875196723453
accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer secret_token

Отправка информации о сканировании билета

POST https://qtickets.ru/api/rest/v1/shows/{show_id}/barcode/875196723453
accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer secret_token

{
  "checked_at": "2020-03-02T17:08:35+03:00"
}

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

{
  "success": true,
  "barcode": "875196723453",
  "checked_at": "2020-03-02T17:08:35+03:00"
}

Пакетная отправка информации о сканировании билетов

POST https://qtickets.ru/api/rest/v1/shows/2207/barcodes
accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer secret_token

[
  {
    "barcode": "875196723453",
    "checked_at": "2020-03-02T18:08:35+03:00"
  },
  {
    "barcode": "875136523412",
    "checked_at": "2020-03-02T18:08:39+03:00"
  },
  {
    "barcode": "875136213454",
    "checked_at": "2020-03-02T18:08:40+03:00"
  },
]

Обработка ошибок

Если сервер не может обработать запрос, то вернется ответ с HTTP статусом не равным 200 (например 403 или 503)
Пример:

{
  "error": "Some error",
  "status": 403
}

Была ли эта статья вам полезна?

Статьи по теме