Wiki de Militant API

Lista de Endpoints

Paginas auxiliares, ejemplos y detalles tecnicos en una maquetacion mas limpia.

Documentación completa de todos los endpoints de l'API Militant. También puede consultar la lista dinámica de endpoints en formato JSON en /api/v1/index.php.

Niveles de Acceso y Roles

La API distingue entre diferentes roles, especialmente para la moderación y la transmisión en vivo:

Ver guía completa de Traducción

Limitación de tasa

Todas las solicitudes tienen limitación por endpoint:

| Endpoint | Límite | |----------|--------| | Auth | 50 req/h | | Posts | 100 req/h | | Comments | 150 req/h | | Comment Reactions | 200 req/h | | Messages | 200 req/h | | Likes/Reactions | 200 req/h | | Group Reactions | 200 req/h | | Upload | 50 req/h | | Export | 5 req/h | | Otros | 100 req/h |

Ver README API

Llamadas de Audio/Vídeo (solo Flutter)

Atención: Exclusivo para la app móvil Flutter - Requiere la cabecera X-Flutter-App: militant-flutter-v1

| Endpoint | Método | Descripción | |----------|--------|-------------| | /api/v1/calls.php?action=initiate_talk | POST | Invitar a un grupo a una sala Nextcloud Talk | | /api/v1/calls.php?action=initiate | POST | Iniciar una llamada 1 a 1 o de grupo | | /api/v1/calls.php?action=answer | POST | Responder una llamada | | /api/v1/calls.php?action=join | POST | Unirse a una llamada de grupo | | /api/v1/calls.php?action=peer_offer | POST | Enviar una oferta WebRTC (grupo) | | /api/v1/calls.php?action=peer_answer | POST | Enviar una respuesta WebRTC (grupo) | | /api/v1/calls.php?action=ice_candidate | POST | Intercambiar candidatos ICE | | /api/v1/calls.php?action=ice_restart | POST | Reiniciar ICE (cambio de red) | | /api/v1/calls.php?action=reject | POST | Rechazar una llamada | | /api/v1/calls.php?action=leave | POST | Salir de una llamada de grupo sin finalizarla | | /api/v1/calls.php?action=end | POST | Finalizar una llamada | | /api/v1/calls.php?action=poll | GET | Polling para actualizaciones | | /api/v1/calls.php?action=history | GET | Historial de llamadas |

Ejemplos

Iniciar una llamada privada:

POST /api/v1/calls.php?action=initiate
Headers:
  Authorization: Bearer {token}
  X-Flutter-App: militant-flutter-v1
Body:
{
  "recipient_id": 123,
  "call_type": "audio",
  "offer": "v=0\r\no=- 123456..."
}

Iniciar una llamada de grupo:

POST /api/v1/calls.php?action=initiate
Headers:
  Authorization: Bearer {token}
  X-Flutter-App: militant-flutter-v1
Body:
{
  "group_id": 456,
  "call_type": "video",
  "offer": "v=0\r\no=- 123456..."
}

Fediverso (ActivityPub)

MILITANT es compatible con el protocolo ActivityPub — el estándar abierto para redes sociales descentralizadas (Mastodon, Pleroma, Misskey, PeerTube…).

Descubrimiento WebFinger

Los usuarios de MILITANT pueden ser encontrados desde cualquier instancia del Fediverso con su dirección:

@username@tu-dominio.com

Esto utiliza el protocolo WebFinger disponible en:

GET /.well-known/webfinger?resource=acct:username@tu-dominio.com

Perfil ActivityPub (Actor)

Cada usuario tiene un perfil JSON-LD Person accesible vía:

GET /fediverse/actor.php?username={username}
Accept: application/activity+json

La respuesta incluye: identidad, biografía, avatar, portada, bandeja de entrada, bandeja de salida, clave pública RSA.

Seguidores del Fediverso

GET /fediverse/followers.php?username={username}          → Colección principal (total)
GET /fediverse/followers.php?username={username}&page=1   → Página 1 de seguidores

---

API Fediverso (app móvil)

| Endpoint | Método | Descripción | |----------|--------|-------------| | /api/v1/fediverse.php?action=profile | GET | Propio perfil Fediverso | | /api/v1/fediverse.php?action=profile&user_id={id} | GET | Perfil Fediverso de otro usuario | | /api/v1/fediverse.php?action=followers | GET | Propios seguidores Fediverso (paginado) | | /api/v1/fediverse.php?action=followers&user_id={id} | GET | Seguidores Fediverso de otro usuario | | /api/v1/fediverse.php?action=following | GET | Lista de cuentas remotas del Fediverso seguidas (paginada) | | /api/v1/fediverse.php?action=following&user_id={id} | GET | Lista de seguidos remotos de otro usuario | | /api/v1/fediverse.php?action=feed | GET | Flujo de publicaciones de las cuentas remotas seguidas | | /api/v1/fediverse.php?action=feed&refresh=1 | GET | Refresca las outbox remotas seguidas antes de devolver el flujo | | /api/v1/fediverse.php?action=search_remote&q={handle} | GET | Resuelve o busca una cuenta remota del Fediverso | | /api/v1/fediverse.php?action=remote_profile&q={handle_o_actor_url} | GET | Resuelve un perfil remoto único con sus publicaciones recientes | | /api/v1/fediverse.php?action=follow_remote | POST | Seguir una cuenta remota del Fediverso | | /api/v1/fediverse.php?action=unfollow_remote | DELETE | Dejar de seguir una cuenta remota del Fediverso |

#### Respuesta action=profile

{
  "user_id": 42,
  "username": "anar",
  "actor_id": "https://dominio.com/users/anar",
  "fediverse_handle": "@anar@dominio.com",
  "fediverse_active": true,
  "followers_count": 17,
  "following_count": 9,
  "is_remote": false,
  "account_type": "local"
}

#### Respuesta action=feed

{
  "posts": [
    {
      "id": 12,
      "remote_post_id": "https://mastodon.social/@alex/1143596789",
      "original_url": "https://mastodon.social/@alex/1143596789",
      "actor_url": "https://mastodon.social/users/alex",
      "username": "alex",
      "display_name": "Alex",
      "domain": "mastodon.social",
      "handle": "@alex@mastodon.social",
      "avatar": "https://mastodon.social/system/accounts/avatars/...",
      "content": "

Hola Fediverso

", "media_url": null, "media_type": null, "published_at": "2026-04-19 10:10:00", "created_at": "2026-04-19 10:12:00", "profile_url": "https://mastodon.social/@alex", "is_remote": true, "account_type": "remote" } ], "meta": { "current_page": 1, "per_page": 20, "total": 1, "total_pages": 1 }, "synced_posts": 3 }

#### Respuesta action=remote_profile

{
  "actor_url": "https://mastodon.social/users/alex",
  "username": "alex",
  "display_name": "Alex",
  "domain": "mastodon.social",
  "handle": "@alex@mastodon.social",
  "avatar": "https://mastodon.social/system/accounts/avatars/...",
  "summary": "Organizador sindical y desarrollador",
  "profile_url": "https://mastodon.social/@alex",
  "is_following": true,
  "is_remote": true,
  "account_type": "remote",
  "recent_posts": [
    {
      "remote_post_id": "https://mastodon.social/@alex/1143596789",
      "content": "

Hola Fediverso

", "published_at": "2026-04-19 10:10:00" } ] }

Para POST /api/v1/fediverse.php?action=follow_remote y DELETE /api/v1/fediverse.php?action=unfollow_remote, el cuerpo JSON puede contener uno de estos campos:

{
  "handle": "@alex@mastodon.social"
}

o:

{
  "actor_url": "https://mastodon.social/users/alex"
}

> Nota: GET /api/v1/users.php también devuelve fediverse_actor_id, fediverse_followers_count, fediverse_following_count, fediverse_handle, is_remote y account_type.

Estado técnico

| Funcionalidad | Estado | |---|---| | Descubrimiento WebFinger | ✅ Implementado | | Perfil Actor JSON-LD | ✅ Implementado | | Claves RSA generadas automáticamente | ✅ Implementado | | Publicaciones públicas (Outbox) | ✅ Implementado | | Bandeja de entrada (recepción de actividades) | ✅ Implementado | | Firmas HTTP salientes | ✅ Implementado | | Verificación de firmas entrantes | ✅ Implementado | | Accept(Follow) firmado | ✅ Implementado | | Seguidores remotos guardados en BD | ✅ Implementado | | Seguidos remotos guardados en BD | ✅ Implementado | | Resolución de perfiles remotos | ✅ Implementado | | Seguir / dejar de seguir remoto vía API | ✅ Implementado | | Sincronización y almacenamiento del flujo remoto | ✅ Implementado |