Авторизация
Токен для работы с OpenAPI
Токен – это специальный набор символов, представляющий собой зашифрованную информацию о владельце и прочей необходимой для авторизации в OpenAPI информации.
Существует два вида токенов:
- Токен для работы с песочницей
- Токен для полнофункциональной работы с Тинькофф Инвестиции
Получение токена
- Зайдите в свой аккаунт на https://tinkoff.ru/
- Перейдите в раздел инвестиций
-
Перейдите в настройки
-
Функция "Подтверждение сделок кодом" должна быть отключена
-
Выпустите токен OpenAPI для биржи и Sandbox. Возможно, система попросит вас авторизоваться еще раз. Не беспокойтесь, это необходимо для подключения робота к торговой платформе.
-
Скопируйте токен и сохраните его. Токен отображается только один раз, просмотреть его позже не получится. Тем не менее вы можете выпускать неограниченное количество токенов.
Срок жизни токена
Срок жизни токена составляет три месяца с даты последнего использования.
Отзыв токена
Отозвать токен OpenAPI можно на странице https://id.tinkoff.ru/account
Обратите внимание, что после отзыва токена REST-методы OpenAPI могут оставаться доступны в течение 10 минут, а stream-соединения останутся активны до разрыва.
Выполнение запросов
Чтобы выполнить запрос в OpenAPI вам необходимо передавать токен при каждом вызове в HTTP-заголовке, либо в заголовке запроса подключения в случае streaming-протокола.
Authorization: Bearer {TOKEN}
Пример:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
"time"
)
const (
token = "just_place_token_here"
timeout = time.Second * 3
url = "https://api-invest.tinkoff.ru/openapi/sandbox/sandbox/register"
)
func main() {
client := &http.Client{
Timeout: timeout,
}
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatalf("Can't create register http request: %s", err)
}
req.Header.Add("Authorization", "Bearer "+token)
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Can't send register request: %s", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Fatalf("Register, bad response code '%s' from '%s'", resp.Status, url)
}
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Can't read register response: %s", err)
}
type Register struct {
TrackingID string `json:"trackingId"`
Status string `json:"status"`
}
var regResp Register
err = json.Unmarshal(respBody, ®Resp)
if err != nil {
log.Fatalf("Can't unmarshal register response: '%s' \nwith error: %s", string(respBody), err)
}
if strings.ToUpper(regResp.Status) != "OK" {
log.Fatalf("Register failed, trackingId: '%s'", regResp.TrackingID)
}
fmt.Println("Register succeed")
}