Gitea 1.24 — endpoint cheat sheet
Base URL: https://gitea.nucleoriofrio.com/api/v1 (la skill prefija /api/v1
si el path no empieza con /api/).
Auth: Authorization: token <PAT>. Todas las queries pasan por
scripts/query.sh salvo que digamos lo contrario.
Health
| Endpoint |
Notas |
GET /version |
Health check. Devuelve {"version":"1.24.7"} |
GET /user |
El usuario detrás del PAT actual |
Repos
| Endpoint |
Notas |
POST /user/repos |
Crear repo bajo el user autenticado (claudeCode0). Body: ver schema abajo. La skill bloquea private:true acá (regla dura) |
POST /orgs/{org}/repos |
Crear repo bajo una org (NucleOS). Mismo body |
GET /users/{user}/repos |
Listar repos. Si el caller es ese user, devuelve todos (incluyendo privados); si es otro, solo públicos. Querystring: page, limit, sort (updated/oldest/alphabetically/size). Helper: repo-list.sh |
GET /orgs/{org}/repos |
Listar repos de la org según permisos del PAT. Mismo querystring que el de user. Helper: repo-list.sh --owner <org> |
GET /repos/{o}/{r} |
Detalle de un repo |
DELETE /repos/{o}/{r} |
Borrar repo (requiere PAT con delete_repo o admin) |
Schema de creación (POST body)
Listas de templates válidos: ver
https://gitea.nucleoriofrio.com/api/v1/repos/issue/templates no aplica;
los template names son los mismos que GitHub usa para
gitignore (Node, Python, Go, etc.) y para licenses (MIT, Apache-2.0, GPL-3.0).
Para gitignores no comunes (ej. "Bash"), Gitea responde 400 silencioso —
omitir el campo y crear un .gitignore manualmente después.
Pull Requests
| Endpoint |
Filtros / body |
GET /repos/{o}/{r}/pulls |
?state=open|closed|all, ?limit=N, ?page=N, ?sort=... |
GET /repos/{o}/{r}/pulls/{number} |
Detalle completo |
POST /repos/{o}/{r}/pulls |
Body: {title, body, head, base}. head = branch (mismo repo) o user:branch (fork) |
GET /repos/{o}/{r}/issues/{n}/comments |
PRs son issues; este es el endpoint de comments. Requiere PAT con read:issue |
POST /repos/{o}/{r}/issues/{n}/comments |
Crear comment (out of scope en MVP) |
POST /repos/{o}/{r}/pulls/{n}/merge |
Mergear (out of scope — disruptive) |
Schema mínimo PR create (POST body)
Gitea Actions
Discovery / metadata
| Endpoint |
Notas |
GET /repos/{o}/{r}/actions/workflows |
Lista workflows. id = filename (ej. deploy-infra.yml) |
GET /repos/{o}/{r}/actions/workflows/{wf_id} |
Single workflow |
GET /repos/{o}/{r}/actions/workflows/{wf_id}/timing |
Tiempos del workflow |
Runs (Gitea los llama "tasks")
| Endpoint |
Notas |
GET /repos/{o}/{r}/actions/tasks |
Lista todos los runs (filtros server-side: solo page+limit). Devuelve {workflow_runs: [{id, run_number, status, event, head_branch, head_sha, workflow_id, display_title, created_at, updated_at, run_started_at, url, name}], total_count} |
GET /repos/{o}/{r}/actions/runs/{run}/artifacts |
Artifacts de un run |
No existen estos endpoints en Gitea 1.24 (sí en GitHub):
GET /actions/runs (sin scope a workflow)
GET /actions/runs/{id} (single run plano)
GET /actions/runs/{id}/jobs
GET /actions/runs/{id}/logs plano (existe pero devuelve zip — no usable)
Jobs
| Endpoint |
Notas |
GET /repos/{o}/{r}/actions/jobs/{job_id}/logs |
Texto plano del log de un job. Único path para leer logs desde la skill |
No existe GET /actions/jobs/{job_id} (single job detail). Para
saber qué job_id corresponde a un task_id, la skill hace probe (rango
task_id ± 10, match por primera línea received task <task_id> ).
Artifacts
| Endpoint |
Notas |
GET /repos/{o}/{r}/actions/artifacts |
Lista artifacts del repo |
GET /repos/{o}/{r}/actions/artifacts/{id} |
Single artifact metadata |
GET /repos/{o}/{r}/actions/artifacts/{id}/zip |
Download artifact |
Bloqueado por la skill (admin guard)
Estos endpoints requieren PAT admin del org. La skill aborta con exit 3 si los
llamás (override: export GITEA_USER_PAT=<temporal>):
| Endpoint |
Verbo |
/admin/* |
cualquiera |
/orgs/{org}/actions/secrets/* |
GET/PUT/DELETE |
/orgs/{org}/actions/variables/* |
GET/POST/PUT/DELETE |
/repos/{o}/{r}/actions/secrets/* |
GET/PUT/DELETE |
/repos/{o}/{r}/actions/variables/* |
GET/POST/PUT/DELETE |
Códigos de error comunes
| HTTP |
Causa |
Qué hacer |
| 401 |
PAT inválido / revocado |
Re-correr setup.sh (puede haber agarrado el duplicado equivocado en bitwarden) |
| 403 |
Scope insuficiente del PAT (típico: read:issue faltante) |
Regenerar PAT con scopes correctos, re-correr setup.sh, o pedir PAT admin temporal |
| 404 |
Repo/PR/run no existe (o no tenés acceso) |
Verificar el path y los args |
| 422 |
Body POST inválido (ej. PR sin head/base) |
Revisar schema |
404 page not found (texto crudo) |
Endpoint no existe en Gitea 1.24 (ej. /actions/runs/{id}/jobs) |
Usar el endpoint alternativo (/actions/tasks, probe de job_id) |
Querystring params típicos
- Paginación:
?page=N&limit=N. Default page=1, limit=10 (varía por endpoint).
- Sort (en algunos endpoints):
?sort=newest|oldest|...
- State:
?state=open|closed|all (PRs, issues)
Referencias