Бесплатный тестовый API для REST, GraphQL, gRPC и WebSocket

Настоящие адреса на playground.tetiva.app, куда можно отправить запрос прямо сейчас. Сервер отвечает тем, что вы прислали, любым кодом, который попросите, и так медленно, как нужно. Без ключа, ничего не хранит, не прокси.

Что хотите проверить?

Нет нужного? Все 22 запроса — ниже или напишите, что добавить

  • RESThttps://playground.tetiva.app
  • GraphQLhttps://playground.tetiva.app/graphql
  • WebSocketwss://playground.tetiva.app/ws
  • gRPCreflection включёнplayground.tetiva.app:443
  • Не прокси — playground.tetiva.app сам никуда не ходит
  • Ничего не хранит — тела запросов не сохраняются и не пишутся в логи
  • Честное использование — 60 запросов в минуту, тело до 1 МБ, задержка до 10 с

Все эндпоинты

Один хост, четыре протокола, 22 запроса. Всё, что ниже, работает из curl, вашего кода, Postman или Tetiva: REST — на https://playground.tetiva.app, GraphQL — на /graphql, WebSocket — на wss://playground.tetiva.app/ws, gRPC — на playground.tetiva.app:443 с server reflection.

REST · Эхо

Эхо возвращает метод, URL, query (в args), заголовки и тело, которые получило, и request_id. JSON-тело приходит сырым в data и разобранным в json, формы и файлы multipart — в form и files.

Эхо GET#

GEThttps://playground.tetiva.app/get?source=docs&page=2

Возвращает ваш запрос в JSON: параметры query в args, заголовки в headers, ваш IP в origin.

Параметры запроса · 2
sourcedocs
page2
cURL
curl 'https://playground.tetiva.app/get?source=docs&page=2'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length314
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "GET",
  "url": "https://playground.tetiva.app/get?source=docs&page=2",
  "args": {
    "page": "2",
    "source": "docs"
  },
  "headers": {
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Вернуть моё POST-тело#

POSThttps://playground.tetiva.app/post

Отправьте JSON-тело и получите его обратно: сырым в data и разобранным в json. Тело до 1 МБ; формы и файлы multipart возвращаются в form и files.

Заголовки · 1
Content-Typeapplication/json
Тело · JSON
{"hello":"world"}
cURL
curl -X POST 'https://playground.tetiva.app/post' \
  -H 'Content-Type: application/json' \
  --data-raw '{"hello":"world"}'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length397
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "POST",
  "url": "https://playground.tetiva.app/post",
  "args": {},
  "headers": {
    "Content-Length": "17",
    "Content-Type": "application/json",
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "data": "{\"hello\":\"world\"}",
  "json": {
    "hello": "world"
  },
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Эхо PUT#

PUThttps://playground.tetiva.app/put

То же эхо для PUT: тело возвращается в data и json.

Заголовки · 1
Content-Typeapplication/json
Тело · JSON
{
  "id": 42,
  "name": "Ada Lovelace",
  "role": "admin"
}
cURL
curl -X PUT 'https://playground.tetiva.app/put' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "id": 42,
  "name": "Ada Lovelace",
  "role": "admin"
}'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length488
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "PUT",
  "url": "https://playground.tetiva.app/put",
  "args": {},
  "headers": {
    "Content-Length": "59",
    "Content-Type": "application/json",
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "data": "{\n  \"id\": 42,\n  \"name\": \"Ada Lovelace\",\n  \"role\": \"admin\"\n}",
  "json": {
    "id": 42,
    "name": "Ada Lovelace",
    "role": "admin"
  },
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Эхо PATCH#

PATCHhttps://playground.tetiva.app/patch

То же эхо для PATCH, удобно для частичных обновлений.

Заголовки · 1
Content-Typeapplication/json
Тело · JSON
{
  "role": "viewer"
}
cURL
curl -X PATCH 'https://playground.tetiva.app/patch' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "role": "viewer"
}'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length406
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "PATCH",
  "url": "https://playground.tetiva.app/patch",
  "args": {},
  "headers": {
    "Content-Length": "22",
    "Content-Type": "application/json",
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "data": "{\n  \"role\": \"viewer\"\n}",
  "json": {
    "role": "viewer"
  },
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Эхо DELETE#

DELETEhttps://playground.tetiva.app/delete?id=42

То же эхо для DELETE. Тело разрешено и тоже возвращается.

Параметры запроса · 1
id42
cURL
curl -X DELETE 'https://playground.tetiva.app/delete?id=42'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length314
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "DELETE",
  "url": "https://playground.tetiva.app/delete?id=42",
  "args": {
    "id": "42"
  },
  "headers": {
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "data": "",
  "json": null,
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Любой метод, любой путь#

POSThttps://playground.tetiva.app/anything/orders/42?dry_run=true

/anything и любой путь под ним отвечают эхом на любой метод, включая нестандартные: так можно подставить маршрут, которого ещё нет.

Параметры запроса · 1
dry_runtrue
Заголовки · 1
Content-Typeapplication/json
Тело · JSON
{
  "status": "shipped"
}
cURL
curl -X POST 'https://playground.tetiva.app/anything/orders/42?dry_run=true' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "status": "shipped"
}'
Примеры ответов
200Эхо

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length462
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "POST",
  "url": "https://playground.tetiva.app/anything/orders/42?dry_run=true",
  "args": {
    "dry_run": "true"
  },
  "headers": {
    "Content-Length": "25",
    "Content-Type": "application/json",
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1"
  },
  "data": "{\n  \"status\": \"shipped\"\n}",
  "json": {
    "status": "shipped"
  },
  "origin": "203.0.113.42",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Мои заголовки#

GEThttps://playground.tetiva.app/headers

Возвращает только заголовки, которые получил сервер. Удобно проверить, что добавляет ваш клиент, прокси или SDK.

Заголовки · 1
X-Debug1
cURL
curl 'https://playground.tetiva.app/headers' \
  -H 'X-Debug: 1'
Примеры ответов
200Ваши заголовки

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length167
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "headers": {
    "Host": "playground.tetiva.app",
    "User-Agent": "curl/8.7.1",
    "X-Debug": "1"
  },
  "request_id": "00000000-0000-4000-8000-000000000001"
}

REST · Коды ответа и задержки

Заставьте сервер ошибиться или притормозить: любой код от 200 до 599 или ожидание до 10 секунд.

Любой код ответа#

GEThttps://playground.tetiva.app/status/418

Отвечает кодом из пути, от 200 до 599. Редиректы ведут на /get, к 401 добавляется WWW-Authenticate, к 429 и 503 — Retry-After.

cURL
curl 'https://playground.tetiva.app/status/418'
Примеры ответов
418Я чайник

418I'm a teapot

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length104
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "status": 418,
  "reason": "I'm a teapot",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Медленный ответ#

GEThttps://playground.tetiva.app/delay/2

Ждёт столько секунд, сколько указано в пути, но не больше 10, и только потом отвечает; можно дробные, например /delay/0.5. Подходит для проверки таймаутов и состояний загрузки.

cURL
curl 'https://playground.tetiva.app/delay/2'
Примеры ответов
200Через 2 секунды

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length237
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "method": "GET",
  "url": "https://playground.tetiva.app/delay/2",
  "args": {},
  "delay": 2,
  "started_at": "2026-10-17T09:30:00Z",
  "finished_at": "2026-10-17T09:30:02Z",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

REST · Авторизация

Проверьте, что клиент отправляет учётные данные и не теряется, когда в ответ приходит 401.

Bearer-авторизация#

GEThttps://playground.tetiva.app/bearer

Проходит любой непустой токен, он возвращается в token. Без Authorization: Bearer … придёт 401 с WWW-Authenticate: Bearer.

Авторизация

Bearer

prefixBearer
tokentest-token
cURL
curl 'https://playground.tetiva.app/bearer' \
  -H 'Authorization: Bearer test-token'
Примеры ответов
200С токеном

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length109
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "authenticated": true,
  "token": "test-token",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Basic-авторизация#

GEThttps://playground.tetiva.app/basic-auth/tetiva/playground

Проходит, если логин и пароль Basic совпадают с теми, что в пути, здесь tetiva / playground. Иначе 401.

Авторизация

Basic

passwordplayground
usernametetiva
cURL
curl 'https://playground.tetiva.app/basic-auth/tetiva/playground' \
  -H 'Authorization: Basic dGV0aXZhOnBsYXlncm91bmQ='
Примеры ответов
200Логин и пароль совпали

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length104
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "authenticated": true,
  "user": "tetiva",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

REST · Фейковые данные

Пять фейковых пользователей для списков, таблиц и пагинации. Данные каждый раз одни и те же, а POST /users отвечает так, будто всё получилось, но ничего не сохраняет.

Фейковые пользователи#

GEThttps://playground.tetiva.app/users?limit=3

Страница фейковых пользователей. limit от 1 до 5, next ведёт на следующую страницу, пока не станет null.

Параметры запроса · 1
limit3
cURL
curl 'https://playground.tetiva.app/users?limit=3'
Примеры ответов
200Первая страница

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length576
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "data": [
    {
      "id": 1,
      "name": "Mila Novak",
      "email": "mila.novak@example.com",
      "role": "admin",
      "created_at": "2026-03-02T09:14:00Z"
    },
    {
      "id": 2,
      "name": "Jonas Berg",
      "email": "jonas.berg@example.com",
      "role": "editor",
      "created_at": "2026-04-18T16:40:00Z"
    },
    {
      "id": 3,
      "name": "Priya Raman",
      "email": "priya.raman@example.com",
      "role": "viewer",
      "created_at": "2026-05-27T11:05:00Z"
    }
  ],
  "total": 5,
  "limit": 3,
  "next": "/users?limit=3&after=3"
}

Один фейковый пользователь#

GEThttps://playground.tetiva.app/users/2

Пользователь по id от 1 до 5. На любой другой id придёт 404 с подсказкой.

cURL
curl 'https://playground.tetiva.app/users/2'
Примеры ответов
200Найден

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length135
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "id": 2,
  "name": "Jonas Berg",
  "email": "jonas.berg@example.com",
  "role": "editor",
  "created_at": "2026-04-18T16:40:00Z"
}

Создать пользователя#

POSThttps://playground.tetiva.app/users

Проверяет name и email и отвечает 201 с новым пользователем и заголовком Location. Ничего не сохраняется: stored равен false.

Заголовки · 1
Content-Typeapplication/json
Тело · JSON
{
  "name": "Grace Hopper",
  "email": "grace@example.com",
  "role": "editor"
}
cURL
curl -X POST 'https://playground.tetiva.app/users' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "name": "Grace Hopper",
  "email": "grace@example.com",
  "role": "editor"
}'
Примеры ответов
201Создан, но не сохранён

201Created

Заголовки (7)
content-typeapplication/json; charset=utf-8
content-length151
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
locationhttps://playground.tetiva.app/users/6
{
  "id": 6,
  "name": "Grace Hopper",
  "email": "grace@example.com",
  "role": "editor",
  "created_at": "2026-10-17T09:30:00Z",
  "stored": false
}

GraphQL

Маленькая библиотека на https://playground.tetiva.app/graphql: книги, авторы и одна мутация. Introspection включена, так что любой GraphQL-клиент сам загрузит схему.

Запрос GraphQL#

GraphQLhttps://playground.tetiva.app/graphql

Операция: Books

Список книг с авторами. first от 1 до 50; на несуществующее поле придёт ошибка со списком настоящих.

Запрос GraphQL
query Books($first: Int) {
  books(first: $first) {
    id
    title
    author {
      name
    }
  }
}
Переменные
{
  "first": 2
}
cURL
curl -X POST 'https://playground.tetiva.app/graphql' \
  -H 'Content-Type: application/json' \
  --data-raw '{"query":"query Books($first: Int) {\n  books(first: $first) {\n    id\n    title\n    author {\n      name\n    }\n  }\n}","variables":{"first":2},"operationName":"Books"}'
Примеры ответов
200Две книги

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length304
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "data": {
    "books": [
      {
        "id": "1",
        "title": "Frankenstein",
        "author": {
          "name": "Mary Shelley"
        }
      },
      {
        "id": "2",
        "title": "Moby-Dick",
        "author": {
          "name": "Herman Melville"
        }
      }
    ]
  }
}

Одна книга по id#

GraphQLhttps://playground.tetiva.app/graphql

Операция: Book

Возвращает одну книгу. Для неизвестного id придёт "book": null, а не ошибка.

Запрос GraphQL
query Book($id: ID!) {
  book(id: $id) {
    title
    year
    author {
      name
    }
  }
}
Переменные
{
  "id": "3"
}
cURL
curl -X POST 'https://playground.tetiva.app/graphql' \
  -H 'Content-Type: application/json' \
  --data-raw '{"query":"query Book($id: ID!) {\n  book(id: $id) {\n    title\n    year\n    author {\n      name\n    }\n  }\n}","variables":{"id":"3"},"operationName":"Book"}'
Примеры ответов
200Одна книга

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length151
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "data": {
    "book": {
      "title": "The Time Machine",
      "year": 1895,
      "author": {
        "name": "H. G. Wells"
      }
    }
  }
}

Добавить книгу#

GraphQLhttps://playground.tetiva.app/graphql

Операция: AddBook

Мутация возвращает новую книгу с id 6. Ничего не сохраняется: extensions.stored равен false.

Запрос GraphQL
mutation AddBook($title: String!, $authorId: ID!) {
  addBook(title: $title, authorId: $authorId) {
    id
    title
    author {
      name
    }
  }
}
Переменные
{
  "title": "Carmilla",
  "authorId": "a5"
}
cURL
curl -X POST 'https://playground.tetiva.app/graphql' \
  -H 'Content-Type: application/json' \
  --data-raw '{"query":"mutation AddBook($title: String!, $authorId: ID!) {\n  addBook(title: $title, authorId: $authorId) {\n    id\n    title\n    author {\n      name\n    }\n  }\n}","variables":{"title":"Carmilla","authorId":"a5"},"operationName":"AddBook"}'
Примеры ответов
200Добавлена, но не сохранена

200OK

Заголовки (6)
content-typeapplication/json; charset=utf-8
content-length191
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "data": {
    "addBook": {
      "id": "6",
      "title": "Carmilla",
      "author": {
        "name": "Sheridan Le Fanu"
      }
    }
  },
  "extensions": {
    "stored": false
  }
}

gRPC

echo.v1.EchoService на playground.tetiva.app:443 с TLS и server reflection: клиенты находят методы без .proto-файла.

Reflection

grpcurl playground.tetiva.app:443 list
grpcurl playground.tetiva.app:443 describe echo.v1.EchoService

Echo (unary)#

gRPCgrpcs://playground.tetiva.app

echo.v1.EchoService / Echo

Возвращает ваш text вместе с seq, server_time и метаданными запроса, какими их увидел сервер.

Сообщение
{
  "text": "ping"
}
gRPCurl
grpcurl -d '{
  "text": "ping"
}' \
  'playground.tetiva.app:443' \
  'echo.v1.EchoService/Echo'
Примеры ответов
0Ответ

0OK

Заголовки (4)
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
{
  "text": "ping",
  "seq": 1,
  "serverTime": "2026-10-17T09:30:00Z",
  "metadata": {
    "host": "playground.tetiva.app",
    "user-agent": "grpcurl/1.9.3 grpc-go/1.73.0"
  }
}

Стрим из gRPC#

gRPCgrpcs://playground.tetiva.app

echo.v1.EchoService / ServerStream

Присылает count сообщений (от 1 до 100, по умолчанию 5), по одному каждые interval_ms (от 50 до 5000, по умолчанию 500). Страница тестового API вызывает его через gRPC-Web.

Сообщение
{
  "text": "ping",
  "count": 3,
  "interval_ms": 500
}
gRPCurl
grpcurl -d '{
  "text": "ping",
  "count": 3,
  "interval_ms": 500
}' \
  'playground.tetiva.app:443' \
  'echo.v1.EchoService/ServerStream'
Примеры ответов
0Лог стрима

0OK

Заголовки (4)
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
+0.000s CALL echo.v1.EchoService/ServerStream {"text":"ping","count":3,"interval_ms":500}
+0.000s RECV #1 {"text":"ping","seq":1,"serverTime":"2026-10-17T09:30:00Z"}
+0.500s RECV #2 {"text":"ping","seq":2,"serverTime":"2026-10-17T09:30:00.500Z"}
+1.000s RECV #3 {"text":"ping","seq":3,"serverTime":"2026-10-17T09:30:01Z"}
+1.000s END OK

Chat (в обе стороны)#

gRPCgrpcs://playground.tetiva.app

echo.v1.EchoService / Chat

Каждое отправленное сообщение сразу возвращается со следующим seq, до 100 за стрим. Запускайте через grpcurl: транспорт gRPC-Web на странице не умеет стримить в обе стороны.

Сообщение
{
  "text": "hello"
}
gRPCurl
grpcurl -d '{
  "text": "hello"
}' \
  'playground.tetiva.app:443' \
  'echo.v1.EchoService/Chat'
Примеры ответов
0Лог чата

0OK

Заголовки (4)
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
+0.000s CALL echo.v1.EchoService/Chat {"text":"hello"}
+0.000s RECV #1 {"text":"hello","seq":1,"serverTime":"2026-10-17T09:30:00Z"}
+0.000s END OK

WebSocket

Текстовые и бинарные кадры до 64 КБ. /ws закрывается кодом 1000 Normal Closure, если 60 секунд не было сообщений; любая сессия заканчивается через 10 минут.

Эхо через WebSocket#

WebSocketwss://playground.tetiva.app/ws

Каждый отправленный кадр сразу возвращается, текстовый или бинарный, до 64 КБ.

Сообщения · 1

helloТекст

hello
websocat
printf '%s' 'hello' | websocat 'wss://playground.tetiva.app/ws'
Примеры ответов
101Лог сессии

101Switching Protocols

Заголовки (4)
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
+0.000s → SENT hello
+0.000s ← RECV hello
+0.000s · INFO closed 1000 Normal Closure

Тикер#

WebSocketwss://playground.tetiva.app/ws/ticker

Каждую секунду присылает {"tick": n, "at": …}, пока вы не отключитесь. Отправлять ничего не нужно.

websocat
websocat 'wss://playground.tetiva.app/ws/ticker'
Примеры ответов
101Три тика

101Switching Protocols

Заголовки (4)
x-request-id00000000-0000-4000-8000-000000000001
access-control-allow-origin*
ratelimit-limit60
ratelimit-remaining59
+1.000s ← RECV {"tick":1,"at":"2026-10-17T09:30:01Z"}
+2.000s ← RECV {"tick":2,"at":"2026-10-17T09:30:02Z"}
+3.000s ← RECV {"tick":3,"at":"2026-10-17T09:30:03Z"}
+3.000s · INFO closed 1000 Normal Closure

Не хватает эндпоинта или протокола? Напишите, что добавить

Заберите запросы с собой

Весь Playground готовой коллекцией, с примерами ответов. Импортируйте её в Postman или Insomnia либо откройте в Tetiva — бесплатном десктопном API-клиенте с открытым кодом.