Tu panel
Gestiona tus API keys, revisa tu consumo del día y tus avisos de directo.
Cargando…
Inicio rápido
Tres pasos para hacer tu primera petición.
Crea tu cuenta
Es la misma cuenta de la web. Si ya tienes una, inicia sesión.
Haz la petición
Envía la key en el header Authorization y llama a cualquier método.
curl "https://geometryamerica.xyz/api/v1/getProfileInfo?username=tiktok" \ -H "Authorization: Bearer TU_API_KEY"
Autenticación
Todas las peticiones a /api/v1/ requieren una API key. Se puede enviar de tres formas:
- Header (recomendado)
Authorization: Bearer ga_…- Header alternativo
X-API-Key: ga_…- Parámetro
?key=ga_…— paraEventSource(chat) y reproductores de video, que no pueden enviar headers.
Límites y cuota
El límite es global por cuenta: todas tus keys comparten las mismas 100 peticiones diarias.
- Peticiones
- 100 al día por cuenta. Se reinicia a las 00:00 UTC.
- Qué cuenta
- Solo las respuestas correctas (2xx). Los errores no consumen cuota.
- Chat y stream
getLiveChatygetLiveBuffercuentan 1 al conectar y 1 más por cada hora abierta. Sin cuota, la conexión se cierra.- Conexiones abiertas
- Máximo 3 simultáneas por cuenta (chat, stream,
liveEventsy clips dedownloadLive). - Keys
- Hasta 10 activas por cuenta.
- Avisos de directo
- Hasta 10 callbacks por cuenta; los avisos por callback no consumen cuota. Con
liveEventsconectarse es gratis y cada aviso entregado cuenta 1. - Descargas
- Los enlaces que devuelve
downloadTTson válidos 6 horas y no consumen cuota.
Cada respuesta incluye tu consumo en el campo usage y en estos headers:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 2026-10-05T00:00:00Z
Errores
Las respuestas JSON tienen siempre la misma estructura. En caso de error, ok es false y error.code identifica la causa.
{
"ok": false,
"error": { "code": "not_live", "message": "@usuario no está en directo ahora mismo." },
"usage": { "used": 13, "limit": 100, "remaining": 87, "resetsAt": "2026-10-05T00:00:00Z" }
}
| HTTP | code | Significado |
|---|---|---|
| 400 | bad_request | Falta un parámetro o no es válido. |
| 401 | missing_key · invalid_key | No se envió la key, o es incorrecta o está revocada. |
| 404 | not_found · not_live | El recurso no existe, o el usuario no está en directo. |
| 409 | limit_reached · duplicate | Máximo de callbacks alcanzado, o el callback ya existe. |
| 410 | expired_link | El enlace de descarga caducó; vuelve a llamar a downloadTT. |
| 429 | daily_limit · too_many_streams | Cuota diaria agotada, o 3 conexiones abiertas. |
| 502 | upstream_error | TikTok no respondió. Reintenta en unos segundos. |
| 503 | busy | El servidor tiene demasiados directos abiertos a la vez. |
Métodos
Todos responden JSON, salvo los que devuelven archivos o streams.
Formato de los avisos
Cuando un usuario vigilado con liveCallback empieza o termina un directo, se envía un POST con JSON a tu URL. La comprobación se hace cada minuto. liveEvents entrega este mismo cuerpo por SSE. ongoing es true cuando el directo ya estaba en curso al empezar a vigilar al usuario.
Evento live_start
{
"event": "live_start",
"username": "usuario",
"roomId": "7312345678901234567",
"title": "En vivo",
"cover": "https://…/cover.jpeg",
"startedAt": "2026-10-04T18:02:11Z",
"url": "https://www.tiktok.com/@usuario/live",
"watchUrl": "https://geometryamerica.xyz/live/usuario",
"ongoing": false,
"callbackId": 4,
"sentAt": "2026-10-04T18:02:40Z"
}
Evento live_end
{
"event": "live_end",
"username": "usuario",
"roomId": "7312345678901234567",
"title": "En vivo",
"startedAt": "2026-10-04T18:02:11Z",
"endedAt": "2026-10-04T19:40:03Z",
"durationSeconds": 5872,
"url": "https://www.tiktok.com/@usuario/live",
"callbackId": 4,
"sentAt": "2026-10-04T19:41:10Z"
}
https://discord.com/api/webhooks/…, el aviso se envía como mensaje de Discord con la portada del directo, sin necesidad de programar nada.Verificar la firma
Cada aviso incluye X-GA-Signature: sha256=…, un HMAC-SHA256 del cuerpo con el secret que recibiste al crear el callback.
// Node.js (Express) const crypto = require('crypto'); app.post('/aviso', express.raw({ type: '*/*' }), (req, res) => { const esperado = 'sha256=' + crypto .createHmac('sha256', process.env.GA_SECRET) .update(req.body).digest('hex'); if (req.get('X-GA-Signature') !== esperado) return res.sendStatus(401); const ev = JSON.parse(req.body); console.log(ev.event, ev.username); res.sendStatus(200); });
# Python (Flask) import hmac, hashlib, os from flask import Flask, request app = Flask(__name__) @app.post("/aviso") def aviso(): firma = "sha256=" + hmac.new( os.environ["GA_SECRET"].encode(), request.get_data(), hashlib.sha256).hexdigest() if not hmac.compare_digest(firma, request.headers.get("X-GA-Signature", "")): return "", 401 ev = request.get_json() print(ev["event"], ev["username"]) return "", 200
Tu servidor debe responder 2xx en menos de 8 segundos. Tras 20 fallos consecutivos el callback se pausa; puedes reactivarlo con «Probar» desde tu panel.