Бесплатный тестовый API для REST, GraphQL, gRPC и WebSocket
Настоящие адреса на playground.tetiva.app, куда можно отправить запрос прямо сейчас. Сервер отвечает тем, что вы прислали, любым кодом, который попросите, и так медленно, как нужно. Без ключа, ничего не хранит, не прокси.
Что хотите проверить?
Вы выбрали
Нет нужного? Все 22 запроса — ниже или напишите, что добавить
- REST
https://playground. tetiva. app - GraphQL
https://playground. tetiva. app /graphql - WebSocket
wss://playground. tetiva. app /ws - gRPCreflection включён
playground.tetiva. app:443
- Не прокси — playground.tetiva.app сам никуда не ходит
- Ничего не хранит — тела запросов не сохраняются и не пишутся в логи
- Честное использование — 60 запросов в минуту, тело до 1 МБ, задержка до 10 с
Все эндпоинты
Один хост, четыре протокола, 22 запроса. Всё, что ниже, работает из curl, вашего кода, Postman или Tetiva: REST — на https://, GraphQL — на /graphql, WebSocket — на wss://, gRPC — на playground. с server reflection.
REST · Эхо
Эхо возвращает метод, URL, query (в args), заголовки и тело, которые получило, и request_id. JSON-тело приходит сырым в data и разобранным в json, формы и файлы multipart — в form и files.
Эхо GET#
https:// playground. tetiva. app /get?source=docs&page=2Возвращает ваш запрос в JSON: параметры query в args, заголовки в headers, ваш IP в origin.
Параметры запроса · 2
| source | docs |
| page | 2 |
curl 'https://playground.tetiva.app/get?source=docs&page=2'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 314 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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-тело#
https:// playground. tetiva. app /postОтправьте JSON-тело и получите его обратно: сырым в data и разобранным в json. Тело до 1 МБ; формы и файлы multipart возвращаются в form и files.
Заголовки · 1
| Content-Type | application/json |
Тело · JSON
{"hello":"world"}curl -X POST 'https://playground.tetiva.app/post' \
-H 'Content-Type: application/json' \
--data-raw '{"hello":"world"}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 397 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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#
https:// playground. tetiva. app /putТо же эхо для PUT: тело возвращается в data и json.
Заголовки · 1
| Content-Type | application/json |
Тело · JSON
{
"id": 42,
"name": "Ada Lovelace",
"role": "admin"
}curl -X PUT 'https://playground.tetiva.app/put' \
-H 'Content-Type: application/json' \
--data-raw '{
"id": 42,
"name": "Ada Lovelace",
"role": "admin"
}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 488 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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#
https:// playground. tetiva. app /patchТо же эхо для PATCH, удобно для частичных обновлений.
Заголовки · 1
| Content-Type | application/json |
Тело · JSON
{
"role": "viewer"
}curl -X PATCH 'https://playground.tetiva.app/patch' \
-H 'Content-Type: application/json' \
--data-raw '{
"role": "viewer"
}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 406 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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#
https:// playground. tetiva. app /delete?id=42То же эхо для DELETE. Тело разрешено и тоже возвращается.
Параметры запроса · 1
| id | 42 |
curl -X DELETE 'https://playground.tetiva.app/delete?id=42'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 314 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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"
}
Любой метод, любой путь#
https:// playground. tetiva. app /anything /orders /42?dry_run=true/anything и любой путь под ним отвечают эхом на любой метод, включая нестандартные: так можно подставить маршрут, которого ещё нет.
Параметры запроса · 1
| dry_run | true |
Заголовки · 1
| Content-Type | application/json |
Тело · JSON
{
"status": "shipped"
}curl -X POST 'https://playground.tetiva.app/anything/orders/42?dry_run=true' \
-H 'Content-Type: application/json' \
--data-raw '{
"status": "shipped"
}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 462 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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"
}
Мои заголовки#
https:// playground. tetiva. app /headersВозвращает только заголовки, которые получил сервер. Удобно проверить, что добавляет ваш клиент, прокси или SDK.
Заголовки · 1
| X-Debug | 1 |
curl 'https://playground.tetiva.app/headers' \
-H 'X-Debug: 1'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 167 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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 секунд.
Любой код ответа#
https:// playground. tetiva. app /status /418Отвечает кодом из пути, от 200 до 599. Редиректы ведут на /get, к 401 добавляется WWW-Authenticate, к 429 и 503 — Retry-After.
curl 'https://playground.tetiva.app/status/418'Примеры ответов
418I'm a teapot
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 104 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"status": 418,
"reason": "I'm a teapot",
"request_id": "00000000-0000-4000-8000-000000000001"
}
Медленный ответ#
https:// playground. tetiva. app /delay /2Ждёт столько секунд, сколько указано в пути, но не больше 10, и только потом отвечает; можно дробные, например /delay/0.5. Подходит для проверки таймаутов и состояний загрузки.
curl 'https://playground.tetiva.app/delay/2'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 237 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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-авторизация#
https:// playground. tetiva. app /bearerПроходит любой непустой токен, он возвращается в token. Без Authorization: Bearer … придёт 401 с WWW-Authenticate: Bearer.
Авторизация
Bearer
| prefix | Bearer |
| token | test-token |
curl 'https://playground.tetiva.app/bearer' \
-H 'Authorization: Bearer test-token'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 109 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"authenticated": true,
"token": "test-token",
"request_id": "00000000-0000-4000-8000-000000000001"
}
Basic-авторизация#
https:// playground. tetiva. app /basic-auth /tetiva /playgroundПроходит, если логин и пароль Basic совпадают с теми, что в пути, здесь tetiva / playground. Иначе 401.
Авторизация
Basic
| password | playground |
| username | tetiva |
curl 'https://playground.tetiva.app/basic-auth/tetiva/playground' \
-H 'Authorization: Basic dGV0aXZhOnBsYXlncm91bmQ='Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 104 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"authenticated": true,
"user": "tetiva",
"request_id": "00000000-0000-4000-8000-000000000001"
}
REST · Фейковые данные
Пять фейковых пользователей для списков, таблиц и пагинации. Данные каждый раз одни и те же, а POST /users отвечает так, будто всё получилось, но ничего не сохраняет.
Фейковые пользователи#
https:// playground. tetiva. app /users?limit=3Страница фейковых пользователей. limit от 1 до 5, next ведёт на следующую страницу, пока не станет null.
Параметры запроса · 1
| limit | 3 |
curl 'https://playground.tetiva.app/users?limit=3'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 576 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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"
}
Один фейковый пользователь#
https:// playground. tetiva. app /users /2Пользователь по id от 1 до 5. На любой другой id придёт 404 с подсказкой.
curl 'https://playground.tetiva.app/users/2'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 135 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"id": 2,
"name": "Jonas Berg",
"email": "jonas.berg@example.com",
"role": "editor",
"created_at": "2026-04-18T16:40:00Z"
}
Создать пользователя#
https:// playground. tetiva. app /usersПроверяет name и email и отвечает 201 с новым пользователем и заголовком Location. Ничего не сохраняется: stored равен false.
Заголовки · 1
| Content-Type | application/json |
Тело · JSON
{
"name": "Grace Hopper",
"email": "grace@example.com",
"role": "editor"
}curl -X POST 'https://playground.tetiva.app/users' \
-H 'Content-Type: application/json' \
--data-raw '{
"name": "Grace Hopper",
"email": "grace@example.com",
"role": "editor"
}'Примеры ответов
201Created
Заголовки (7)
| content-type | application/json; charset=utf-8 |
| content-length | 151 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
| location | https://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#
https:// playground. tetiva. app /graphqlОперация: Books
Список книг с авторами. first от 1 до 50; на несуществующее поле придёт ошибка со списком настоящих.
Запрос GraphQL
query Books($first: Int) {
books(first: $first) {
id
title
author {
name
}
}
}Переменные
{
"first": 2
}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"}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 304 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"data": {
"books": [
{
"id": "1",
"title": "Frankenstein",
"author": {
"name": "Mary Shelley"
}
},
{
"id": "2",
"title": "Moby-Dick",
"author": {
"name": "Herman Melville"
}
}
]
}
}
Одна книга по id#
https:// playground. tetiva. app /graphqlОперация: Book
Возвращает одну книгу. Для неизвестного id придёт "book": null, а не ошибка.
Запрос GraphQL
query Book($id: ID!) {
book(id: $id) {
title
year
author {
name
}
}
}Переменные
{
"id": "3"
}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"}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 151 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"data": {
"book": {
"title": "The Time Machine",
"year": 1895,
"author": {
"name": "H. G. Wells"
}
}
}
}
Добавить книгу#
https:// 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 -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"}'Примеры ответов
200OK
Заголовки (6)
| content-type | application/json; charset=utf-8 |
| content-length | 191 |
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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)#
grpcs://playground.tetiva.appecho.v1.EchoService / Echo
Возвращает ваш text вместе с seq, server_time и метаданными запроса, какими их увидел сервер.
Сообщение
{
"text": "ping"
}grpcurl -d '{
"text": "ping"
}' \
'playground.tetiva.app:443' \
'echo.v1.EchoService/Echo'Примеры ответов
0OK
Заголовки (4)
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
{
"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#
grpcs://playground.tetiva.appecho.v1.EchoService / ServerStream
Присылает count сообщений (от 1 до 100, по умолчанию 5), по одному каждые interval_ms (от 50 до 5000, по умолчанию 500). Страница тестового API вызывает его через gRPC-Web.
Сообщение
{
"text": "ping",
"count": 3,
"interval_ms": 500
}grpcurl -d '{
"text": "ping",
"count": 3,
"interval_ms": 500
}' \
'playground.tetiva.app:443' \
'echo.v1.EchoService/ServerStream'Примеры ответов
0OK
Заголовки (4)
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
+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 (в обе стороны)#
grpcs://playground.tetiva.appecho.v1.EchoService / Chat
Каждое отправленное сообщение сразу возвращается со следующим seq, до 100 за стрим. Запускайте через grpcurl: транспорт gRPC-Web на странице не умеет стримить в обе стороны.
Сообщение
{
"text": "hello"
}grpcurl -d '{
"text": "hello"
}' \
'playground.tetiva.app:443' \
'echo.v1.EchoService/Chat'Примеры ответов
0OK
Заголовки (4)
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
+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#
wss:// playground. tetiva. app /wsКаждый отправленный кадр сразу возвращается, текстовый или бинарный, до 64 КБ.
Сообщения · 1
helloТекст
helloprintf '%s' 'hello' | websocat 'wss://playground.tetiva.app/ws'Примеры ответов
101Switching Protocols
Заголовки (4)
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
+0.000s → SENT hello
+0.000s ← RECV hello
+0.000s · INFO closed 1000 Normal Closure
Тикер#
wss:// playground. tetiva. app /ws /tickerКаждую секунду присылает {"tick": n, "at": …}, пока вы не отключитесь. Отправлять ничего не нужно.
websocat 'wss://playground.tetiva.app/ws/ticker'Примеры ответов
101Switching Protocols
Заголовки (4)
| x-request-id | 00000000-0000-4000-8000-000000000001 |
| access-control-allow-origin | * |
| ratelimit-limit | 60 |
| ratelimit-remaining | 59 |
+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-клиенте с открытым кодом.
- Скачать коллекцию PostmanPostman v2.1 · REST и GraphQL, 17 запросов — открывается в Postman и Insomnia
- Скачать Tetiva JSONВсе четыре протокола, 20 запросов — открывается в Tetiva 1.2+
- Сразу в приложение, с историей, окружениями и тестами. Tetiva 1.2+, для gRPC — 1.3+
- Удобнее в терминале?
curl https://playground. tetiva. app /get