API REST de Forgejo
API REST de Forgejo
Forgejo expone una API REST completa que permite automatizar cualquier operacion que se puede hacer desde la interfaz web. Es compatible con la API de Gitea, por lo que herramientas y SDKs escritos para Gitea funcionan sin cambios.
Swagger UI integrado
Forgejo incluye documentacion interactiva de la API accesible directamente desde el navegador:
https://tu-forgejo.com/api/swagger
Desde esa interfaz puedes explorar todos los endpoints, ver los parametros requeridos y ejecutar llamadas de prueba autenticandote con tu token. Es el punto de partida recomendado para explorar la API.
La version actual de la API es v1. Todos los endpoints comienzan con /api/v1/.
Autenticacion
Hay tres formas de autenticarse con la API.
Token en header (recomendado)
Genera un token desde tu perfil en Settings > Applications > Access Tokens.
curl -H "Authorization: token TU_TOKEN_AQUI" \
https://tu-forgejo.com/api/v1/user
Token en query param
Util para integraciones rapidas o pruebas, aunque menos seguro porque el token queda expuesto en logs de servidor:
curl "https://tu-forgejo.com/api/v1/user?token=TU_TOKEN_AQUI"
Basic Auth
curl -u "usuario:contrasena" \
https://tu-forgejo.com/api/v1/user
No recomendado para automatizacion. Usar tokens es preferible porque se pueden revocar sin cambiar la contrasena.
Endpoints principales
| Prefijo | Descripcion |
|---|---|
/api/v1/repos | Repositorios |
/api/v1/user | Usuario autenticado |
/api/v1/users/{username} | Usuario especifico |
/api/v1/orgs | Organizaciones |
/api/v1/admin | Administracion (requiere admin) |
/api/v1/issues | Issues globales |
/api/v1/repos/{owner}/{repo}/pulls | Pull Requests |
Ejemplos con curl
Listar repositorios del usuario autenticado
TOKEN="tu_token"
BASE="https://tu-forgejo.com/api/v1"
curl -s -H "Authorization: token $TOKEN" \
"$BASE/repos/search?limit=50&page=1" | jq '.data[].full_name'
Obtener informacion del usuario autenticado
curl -s -H "Authorization: token $TOKEN" "$BASE/user" | jq '{login, email, is_admin}'
Crear un repositorio
curl -s -X POST \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "mi-nuevo-repo",
"description": "Creado via API",
"private": true,
"auto_init": true,
"default_branch": "main"
}' \
"$BASE/user/repos" | jq '{full_name, html_url}'
Crear un issue
curl -s -X POST \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Bug encontrado en produccion",
"body": "Descripcion detallada del problema.",
"assignees": ["usuario1"]
}' \
"$BASE/repos/mi-org/mi-repo/issues" | jq '{number, title, html_url}'
Listar Pull Requests abiertos
curl -s -H "Authorization: token $TOKEN" \
"$BASE/repos/mi-org/mi-repo/pulls?state=open&limit=20" | \
jq '.[] | {number, title, user: .user.login}'
Automatizacion: crear repositorios en batch
El siguiente script lee una lista de nombres desde un archivo y crea cada repositorio en una organizacion:
#!/usr/bin/env bash
set -euo pipefail
TOKEN="${FORGEJO_TOKEN:?Variable FORGEJO_TOKEN no definida}"
BASE="${FORGEJO_BASE_URL:?Variable FORGEJO_BASE_URL no definida}/api/v1"
ORG="${1:?Indica el nombre de la organizacion como primer argumento}"
REPOS_FILE="${2:?Indica el archivo con nombres de repos como segundo argumento}"
while IFS= read -r repo_name; do
[[ -z "$repo_name" || "$repo_name" == \#* ]] && continue
echo "Creando: $repo_name"
response=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"$repo_name\",
\"private\": true,
\"auto_init\": true,
\"default_branch\": \"main\"
}" \
"$BASE/orgs/$ORG/repos")
if [[ "$response" == "201" ]]; then
echo " OK: $repo_name creado"
else
echo " ERROR: $repo_name - HTTP $response"
fi
done < "$REPOS_FILE"
Uso:
# repos.txt contiene un nombre por linea
FORGEJO_TOKEN=xxx FORGEJO_BASE_URL=https://forgejo.ejemplo.com \
./crear-repos.sh mi-organizacion repos.txt
Rate Limiting
Por defecto Forgejo no tiene rate limiting habilitado. Para configurarlo, edita app.ini:
[api]
ENABLE_SWAGGER = true
MAX_RESPONSE_ITEMS = 50
DEFAULT_PAGING_NUM = 20
[rate_limit]
ENABLE = true
LIMIT = 300
WINDOW = 60
LIMIT: numero maximo de peticionesWINDOW: ventana de tiempo en segundos
Cuando se supera el limite, la API responde con HTTP 429. Los headers X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset informan el estado actual del limite.
SDKs disponibles
SDK oficial en Go
El SDK oficial es go-forgejo/forgejo:
go get codeberg.org/forgejo/go-forgejo
Es el mas completo y se mantiene en sincronismo con la API.
Clientes comunitarios
- Python:
forgejo-apien PyPI, tambien funcionagitea(compatible) - JavaScript/TypeScript:
@gitea/gitea-jsfunciona con Forgejo por compatibilidad de API - Ruby: gemas compatibles con Gitea funcionan sin modificaciones
Para proyectos nuevos en Python o JS, verificar la compatibilidad con la version de Forgejo instalada antes de elegir un cliente.
Siguiente: Capitulo 19: Webhooks y Migracion