MENU navbar-image

Introducción

JaJa Project - La mejor comunidad para entretenimiento y compartir el humor

Esta documentación tiene como objetivo proporcionar toda la información necesaria para trabajar con nuestra API REST del proyecto JaJa. La API permite acceder a chistes, adivinanzas y contenido humorístico de manera programática, facilitando la integración con aplicaciones externas, bots de Discord, Telegram u otras plataformas que requieran contenido de entretenimiento.

Para comenzar a utilizar la API, necesitarás autenticarte mediante el endpoint de login con tus credenciales de usuario, lo que te proporcionará un token Bearer que deberás incluir en las cabeceras de autorización de tus peticiones posteriores. Una vez autenticado, podrás acceder a los diferentes endpoints para obtener contenido aleatorio, filtrar por tipos, categorías o grupos específicos, así como consultar la información de tu perfil de usuario. Todos los endpoints devuelven respuestas en formato JSON con una estructura consistente que incluye el estado de la operación, los datos solicitados y metadatos adicionales como información de paginación cuando corresponda.

Nota importante: Mientras navegas por esta documentación, verás ejemplos de código para trabajar con la API en diferentes lenguajes de programación en el área oscura de la derecha (o como parte del contenido en dispositivos móviles). Puedes cambiar el lenguaje utilizado con las pestañas en la parte superior derecha (o desde el menú de navegación en la parte superior izquierda en móviles). Los ejemplos incluyen las cabeceras HTTP necesarias, la estructura de las peticiones y las respuestas esperadas para cada endpoint.

Autenticando peticiones

Para autenticar peticiones, incluye una cabecera Authorization con el valor "Bearer {TU_TOKEN_BEARER}".

Todos los endpoints que requieren autenticación están marcados con una etiqueta requiere autenticación en la documentación a continuación.

Para obtener tu token logueate con tu cuenta de usuario y lo recibirás en la respuesta. También puedes acceder al panel para generar el API TOKEN desde tu perfil.

🔐 Autenticación

Login

Limitado a 3 intentos por minuto

Lo usamos para obtener token de acceso api y de sesión (para SPA por ejemplo)

El Token Bearer devuelto lo usaremos en los headers para las peticiones que requieran autenticación:

Bearer 5|dpsZX6OKLdrx1wYDfJqyMjg3kdAGdrmzDU4gMkJ1be4af09b

Ejemplo de petición:
curl --request POST \
    "https://jaja.raupulus.dev/api/v1/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"password\": \"mipasswordsupersegura123123123\",
    \"device_name\": \"Mi iPhone 13 Pro\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/auth/login';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'user@example.com',
            'password' => 'mipasswordsupersegura123123123',
            'device_name' => 'Mi iPhone 13 Pro',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/auth/login'
payload = {
    "email": "user@example.com",
    "password": "mipasswordsupersegura123123123",
    "device_name": "Mi iPhone 13 Pro"
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/auth/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "password": "mipasswordsupersegura123123123",
    "device_name": "Mi iPhone 13 Pro"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Ejemplo de respuesta (200):


{
    "success": true,
    "data": {
        "token": "5|dpsZX6OKLdrx1wYDfJqyMjg3kdAGdrmzDU4gMkJ1be4af09b",
        "user": {
            "name": "Juan Pérez",
            "nick": "juanito",
            "urlImage": "https://ejemplo.com/storage/user-images/avatar.webp",
            "email": "juan@ejemplo.com",
            "email_verified_at": "2024-01-15T10:30:00.000000Z"
        }
    },
    "message": "Login exitoso"
}
 

Ejemplo de respuesta (401):


{
    "success": false,
    "message": "Las credenciales proporcionadas son incorrectas."
}
 

Petición      

POST api/v1/auth/login

Cabeceras

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros del cuerpo

email   string   

Email del usuario. El formato del value no es válido. Example: user@example.com

password   string   

Contraseña del usuario. El campo value debe tener al menos 8 caracteres. El campo value debe ser menor que 100 caracteres. Example: mipasswordsupersegura123123123

device_name   string   

Nombre del dispositivo para generar el token y asociarlo a este. El campo value debe ser menor que 100 caracteres. Example: Mi iPhone 13 Pro

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   object   

Datos de respuesta del login (solo si es exitoso)

token   string   

Token Bearer para autenticación en futuras peticiones

user   object   

Información del usuario autenticado

name   string   

Nombre completo del usuario

nick   string   

Apodo único del usuario

urlImage   string   

URL completa de la imagen de perfil

email   string   

Email del usuario (incluido al ser el propio usuario)

email_verified_at   string   

Fecha de verificación del email ISO 8601

Logout

requires authentication

Cierra la sesión de un usuario e invalida el token de acceso utilizado en ese momento

Ejemplo de petición:
curl --request POST \
    "https://jaja.raupulus.dev/api/v1/auth/logout" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/auth/logout';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/auth/logout'
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/auth/logout"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):


{
    "success": true,
    "data": null,
    "message": "Sesión cerrada exitosamente"
}
 

Petición      

POST api/v1/auth/logout

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data      

null No se devuelven datos adicionales

Información de usuario

requires authentication

Devuelve la información del usuario actualmente logueado en la plataforma

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/auth/user" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/auth/user';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/auth/user'
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/auth/user"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):


{
    "success": true,
    "data": {
        "name": "Juan Pérez",
        "nick": "juanito",
        "urlImage": "https://ejemplo.com/storage/user-images/avatar.webp",
        "email": "juan@ejemplo.com",
        "email_verified_at": "2024-01-15T10:30:00.000000Z"
    },
    "message": "Información del usuario obtenida"
}
 

Petición      

GET api/v1/auth/user

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   object   

Datos del usuario

name   string   

Nombre completo del usuario

nick   string   

Apodo único del usuario (máximo 25 caracteres)

urlImage   string   

URL completa de la imagen de perfil del usuario

email   string   

Email del usuario (solo si es el propio usuario autenticado)

email_verified_at   string   

Fecha de verificación del email en formato ISO 8601 (solo si es el propio usuario autenticado)

🏷️ Categorías, Grupos y Tipos

Tipos de Contenido

requires authentication

Devuelve la lista de tipos de contenido que existen.

Útil para utilizar el slug del tipo que necesites y filtrar en otros endpoints.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/types" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/types';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/types'
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/types"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "name": "Quiz",
            "slug": "quiz",
            "description": "Preguntas tipo quiz",
            "urlImage": null
        },
        {
            "name": "Chistes",
            "slug": "chistes",
            "description": "Chistes, bromas y situaciones de humor",
            "urlImage": null
        },
        {
            "name": "Adivinanzas",
            "slug": "adivinanzas",
            "description": "Adivinanzas para reflexionarAdivinanzas para reflexionarAdivinanzas para reflexionarAdivinanzas para reflexionarAdivinanzas para reflexionarAdivinanzas para reflexionarAdivinanzas para reflexionar",
            "urlImage": "http://jaja.raupulus.dev/storage/general/1751920088_oHVOUYtCWj.webp"
        }
    ],
    "message": "Se obtuvieron 3 tipos",
    "meta": {
        "total_items": 3
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron tipos de contenido"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener la lista de tipos"
}
 

Petición      

GET api/v1/types

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista de tipos de contenido disponibles

name   string   

Nombre del tipo de contenido

slug   string   

Slug del tipo para URLs amigables

description   string   

Descripción del tipo de contenido

urlImage   string|null   

URL completa de la imagen asociada al tipo (null si no tiene imagen)

meta   object   

Metadatos adicionales de la respuesta

total_items   integer   

Número total de tipos disponibles

Grupos de Contenidos

requires authentication

Devuelve la lista de grupos de contenido que existen paginados.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/groups?page=1&limit=2" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/groups';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/groups'
params = {
  'page': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/groups"
);

const params = {
    "page": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "title": "Preguntas en General",
            "slug": "quiz-general",
            "urlImage": null
        },
        {
            "title": "Preguntas Programación",
            "slug": "quiz-devs",
            "urlImage": null
        }
    ],
    "message": "Se obtuvieron 2 grupos de contenido",
    "meta": {
        "pagination": {
            "current_page": 1,
            "per_page": 2,
            "total": 12,
            "last_page": 6,
            "from": 1,
            "to": 2,
            "has_more_pages": true,
            "has_previous_page": false,
            "next_page_url": "http://localhost:8000/api/v1/groups?groups_index=2",
            "prev_page_url": null
        }
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "La página solicitada no existe. Última página disponible: 2"
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron grupos de contenido"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener la lista de grupos"
}
 

Petición      

GET api/v1/groups

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de consulta

page   integer  optional  

Número de página a obtener. El campo value debe tener al menos 1. Example: 1

limit   integer  optional  

Cantidad de elementos por página (máximo 50). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 50. Example: 2

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista de grupos de contenido paginados

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del grupo

slug   string   

Slug del grupo para URLs amigables

urlImage   string|null   

URL completa de la imagen asociada al grupo (null si no tiene imagen)

pagination   object   

Información de paginación

current_page   integer   

Página actual

first_page_url   string   

URL de la primera página

from   integer   

Número del primer elemento en la página actual

last_page   integer   

Número de la última página

last_page_url   string   

URL de la última página

next_page_url   string|null   

URL de la siguiente página (null si es la última)

path   string   

URL base para la paginación

per_page   integer   

Elementos por página

prev_page_url   string|null   

URL de la página anterior (null si es la primera)

to   integer   

Número del último elemento en la página actual

total   integer   

Total de elementos disponibles

Categorías

requires authentication

Devuelve la lista de categorías disponibles paginadas.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/categories?page=1&limit=2" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/categories';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/categories'
params = {
  'page': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/categories"
);

const params = {
    "page": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "title": "iOS",
            "slug": "ios",
            "description": "Sistema operativo de Apple para dispositivos móviles",
            "urlImage": null
        },
        {
            "title": "Vue.js",
            "slug": "vue-js",
            "description": "Framework progresivo para la interfaz de usuario",
            "urlImage": null
        }
    ],
    "message": "Se obtuvieron 2 categorías de 105, página 1.",
    "meta": {
        "pagination": {
            "current_page": 1,
            "per_page": 2,
            "total": 105,
            "last_page": 53,
            "from": 1,
            "to": 2,
            "has_more_pages": true,
            "has_previous_page": false,
            "next_page_url": "http://localhost:8000/api/v1/categories?page=2",
            "prev_page_url": null
        }
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se han encontrado categorías"
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "La página solicitada no existe. Última página disponible: 5"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener la lista de categorías"
}
 

Petición      

GET api/v1/categories

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de consulta

page   integer  optional  

Número de página a obtener. El campo value debe tener al menos 1. Example: 1

limit   integer  optional  

Cantidad de elementos por página (máximo 50). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 50. Example: 2

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista de categorías paginadas

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título de la categoría

slug   string   

Slug de la categoría para URLs amigables

description   string   

Descripción de la categoría

urlImage   string|null   

URL completa de la imagen asociada a la categoría (null si no tiene imagen)

pagination   object   

Información de paginación

current_page   integer   

Página actual

first_page_url   string   

URL de la primera página

from   integer   

Número del primer elemento en la página actual

last_page   integer   

Número de la última página

last_page_url   string   

URL de la última página

next_page_url   string|null   

URL de la siguiente página (null si es la última)

path   string   

URL base para la paginación

per_page   integer   

Elementos por página

prev_page_url   string|null   

URL de la página anterior (null si es la primera)

to   integer   

Número del último elemento en la página actual

total   integer   

Total de elementos disponibles

📚 Contenidos

Contenido Aleatorio

Devuelve un contenido aleatorio de entre todos los existentes en la plataforma sin filtro alguno.

Este endpoint al ser público está limitado a máximo 5 elementos por petición y a 10 peticiones por minuto.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/random?limit=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/random';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/random'
params = {
  'limit': '1',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/random"
);

const params = {
    "limit": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 237,
            "title": "Patrulla con sirenas",
            "content": "Por qué en Lepe los coches patrulla llevan encima una bañera? Para llevar las sirenas!",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se obtuvo 1 contenido aleatorio",
    "meta": {
        "total_items": 268,
        "limit": 1
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener chistes aleatorios"
}
 

Petición      

GET api/v1/random

Cabeceras

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de consulta

limit   integer  optional  

Cantidad de elementos por página (máximo 5). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 5. Example: 1

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Colección de contenidos aleatorios

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido (chiste, adivinanza, etc.)

content   string   

Texto del contenido

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nombre del usuario que subió el contenido

meta   object   

Metadatos adicionales de la respuesta

total_items   integer   

Número total de contenidos disponibles

limit   integer   

Límite aplicado en esta consulta

Contenido Aleatorio

Devuelve un contenido aleatorio de entre todos los existentes en la plataforma filtrando por tipo [chistes|adivinanzas|quiz].

Este endpoint al ser público está limitado a máximo 5 elementos por petición y a 10 peticiones por minuto.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/random/chistes?limit=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/random/chistes';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/random/chistes'
params = {
  'limit': '1',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/random/chistes"
);

const params = {
    "limit": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 188,
            "title": "Ketchup en la oreja",
            "content": "Que hace uno de lepe con un sobre de ketchup en la oreja? Escuchar salsa",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se obtuvo 1 contenido aleatorio",
    "meta": {
        "total_items": 265,
        "limit": 1
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener chistes aleatorios"
}
 

Petición      

GET api/v1/random/{type_slug}

Cabeceras

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de URL

type_slug   string   

El slug del tipo de contenido [chistes|adivinanzas|quiz]. Example: chistes

Parámetros de consulta

limit   integer  optional  

Cantidad de elementos por página (máximo 5). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 5. Example: 1

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Colección de contenidos aleatorios

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido (chiste, adivinanza, etc.)

content   string   

Texto del contenido

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nombre del usuario que subió el contenido

meta   object   

Metadatos adicionales de la respuesta

total_items   integer   

Número total de contenidos disponibles

limit   integer   

Límite aplicado en esta consulta

Contenido en base a un tipo

requires authentication

Devuelve un contenido aleatorio de un tipo concreto recibido.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/type/chistes/content/random?limit=1" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/type/chistes/content/random';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/type/chistes/content/random'
params = {
  'limit': '1',
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/type/chistes/content/random"
);

const params = {
    "limit": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 204,
            "title": "Llamada telefónica",
            "content": "Llama un lepero por teléfono y le contestan: - ¿Si.....dígame? - Doctor, doctor, mi mujer está a punto de dar a luz. - ¿Es su primer hijo? - No, soy su marido.",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se devuelve 1 contenido aleatorio para el tipo Chistes de 265 contenidos totales para este tipo.",
    "meta": {
        "type": "Chistes",
        "type_slug": "chistes",
        "total_items": 265
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos para el tipo especificado"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener contenidos del tipo especificado"
}
 

Petición      

GET api/v1/type/{type_slug}/content/random

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de URL

type_slug   string   

El slug del tipo de contenido [chistes|adivinanzas|quiz]. Example: chistes

Parámetros de consulta

limit   integer  optional  

Cantidad de elementos por página (máximo 5). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 5. Example: 1

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista con el contenido aleatorio solicitado

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido

content   string   

Texto del contenido (chiste, adivinanza, etc.)

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nick del usuario que subió el contenido (formato: @nick)

meta   object   

Metadatos adicionales de la respuesta

type   string   

Nombre del tipo de contenido

type_slug   string   

Slug del tipo

total_items   integer   

Total de contenidos disponibles para este tipo

Contenido en base a un tipo y Categoría

requires authentication

Devuelve un contenido aleatorio que pertenezca al tipo y categoría recibido.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/type/chistes/category/javascript/content/random?limit=1" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/type/chistes/category/javascript/content/random';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/type/chistes/category/javascript/content/random'
params = {
  'limit': '1',
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/type/chistes/category/javascript/content/random"
);

const params = {
    "limit": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 93,
            "title": "JavaScript: el lenguaje universal de los aliens",
            "content": "¿Cuál es el lenguaje de programación favorito de los extraterrestres?\nJavaScript, porque es universal.",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se devuelve 1 contenido aleatorio para el tipo Chistes y la categoría JavaScript de 2 contenidos totales.",
    "meta": {
        "type": "Chistes",
        "type_slug": "chistes",
        "category": "JavaScript",
        "category_slug": "javascript",
        "total_items": 2
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "Categoría no encontrada"
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos para el tipo y categoría especificados"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener contenidos del tipo especificado"
}
 

Petición      

GET api/v1/type/{type_slug}/category/{categorySlug}/content/random

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de URL

type_slug   string   

El slug del tipo de contenido [chistes|adivinanzas|quiz]. Example: chistes

categorySlug   string   

El slug de la categoría. Example: javascript

Parámetros de consulta

limit   integer  optional  

Cantidad de elementos por página (máximo 5). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 5. Example: 1

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista con el contenido aleatorio solicitado

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido

content   string   

Texto del contenido (chiste, adivinanza, etc.)

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nick del usuario que subió el contenido (formato: @nick)

meta   object   

Metadatos adicionales de la respuesta

type   string   

Nombre del tipo de contenido

type_slug   string   

Slug del tipo

category   string   

Título de la categoría

category_slug   string   

Slug de la categoría

total_items   integer   

Total de contenidos disponibles para este tipo y categoría

Contenido en base a un grupo

requires authentication

Contenido aleatorio que pertenecen al grupo recibido.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/group/chistes-devs/content/random?limit=1" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/group/chistes-devs/content/random';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/group/chistes-devs/content/random'
params = {
  'limit': '1',
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/group/chistes-devs/content/random"
);

const params = {
    "limit": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 121,
            "title": "El project manager en el laberinto: siempre con plan B",
            "content": "¿Por qué el project manager nunca se asusta en un laberinto?\nPorque siempre tiene un \"plan de salida\".",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se devuelve 1 contenido aleatorio para el grupo Chistes de Programación de 126 contenidos totales.",
    "meta": {
        "group": "Chistes de Programación",
        "group_slug": "chistes-devs",
        "total_items": 126
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos para el grupo especificado"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener contenidos del tipo especificado"
}
 

Petición      

GET api/v1/group/{group_slug}/content/random

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de URL

group_slug   string   

El slug del grupo de contenido. Example: chistes-devs

Parámetros de consulta

limit   integer  optional  

Cantidad de elementos por página (máximo 5). El campo value debe tener al menos 1. El campo value no debe de ser mayor a 5. Example: 1

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Lista con el contenido aleatorio solicitado

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido

content   string   

Texto del contenido (chiste, adivinanza, etc.)

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nick del usuario que subió el contenido (formato: @nick)

meta   object   

Metadatos adicionales de la respuesta

group   string   

Título del grupo

group_slug   string   

Slug del grupo

total_items   integer   

Total de contenidos disponibles para este grupo

Contenido en base a un usuario

requires authentication

Devuelve un contenido aleatorio de entre todos los que pertenezcan a un usuario.

Ejemplo de petición:
curl --request GET \
    --get "https://jaja.raupulus.dev/api/v1/user/raupulus/content/random" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/user/raupulus/content/random';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/user/raupulus/content/random'
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/user/raupulus/content/random"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Ejemplo de respuesta (200):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "success": true,
    "data": [
        {
            "id": 78,
            "title": "El lince: mascota oficial del backend",
            "content": "¿Cuál es el animal favorito de un programador backend?\nEl lince, siempre acechando en los servidores.",
            "urlImage": null,
            "uploader": "@raupulus",
            "options": []
        }
    ],
    "message": "Se devuelven 271 contenidos aleatorios para el usuario @raupulus",
    "meta": {
        "user": "raupulus",
        "total_items": 271
    }
}
 

Ejemplo de respuesta (404):


{
    "success": false,
    "message": "No se encontraron contenidos para el usuario especificado"
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al obtener contenidos del usuario especificado"
}
 

Petición      

GET api/v1/user/{nick}/content/random

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros de URL

nick   string   

El nick del usuario para filtrar por su contenido. Example: raupulus

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   string[]   

Colección de contenidos aleatorios

id   integer   

Identificador del contenido, principalmente para reportes

title   string   

Título del contenido (chiste, adivinanza, etc.)

content   string   

Texto del contenido

urlImage   string|null   

URL completa de la imagen asociada al contenido (null si no tiene imagen)

uploader   string   

Nombre del usuario que subió el contenido

meta   object   

Metadatos adicionales de la respuesta

user   string   

Nick del usuario sobre el que se filtran los contenidos

total_items   integer   

Número total de contenidos disponibles

💡 Sugerencias

Envía una sugerencia de chiste a la plataforma

requires authentication

Se permiten máximo 10 sugerencias en 1 minuto.

Ejemplo de petición:
curl --request POST \
    "https://jaja.raupulus.dev/api/v1/suggestion/send" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"nick\": \"mi_usuario_123\",
    \"title\": \"Pájaros caminantes\",
    \"content\": \"¿Por qué los pájaros vuelan hacia el sur? Porque caminando tardarían mucho.\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/suggestion/send';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'nick' => 'mi_usuario_123',
            'title' => 'Pájaros caminantes',
            'content' => '¿Por qué los pájaros vuelan hacia el sur? Porque caminando tardarían mucho.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/suggestion/send'
payload = {
    "nick": "mi_usuario_123",
    "title": "Pájaros caminantes",
    "content": "¿Por qué los pájaros vuelan hacia el sur? Porque caminando tardarían mucho."
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/suggestion/send"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "nick": "mi_usuario_123",
    "title": "Pájaros caminantes",
    "content": "¿Por qué los pájaros vuelan hacia el sur? Porque caminando tardarían mucho."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Ejemplo de respuesta (201):


{
    "success": true,
    "data": null,
    "message": "La sugerencia ha sido enviada correctamente."
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al añadir sugerencia, si persiste contacta con el administrador"
}
 

Petición      

POST api/v1/suggestion/send

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros del cuerpo

nick   string  optional  

Nombre de usuario o nick del autor de la sugerencia (máximo 25 caracteres, solo letras, números y guiones bajos). Must match the regex /^[a-zA-Z0-9_]+$/. El campo value debe ser menor que 25 caracteres. Example: mi_usuario_123

title   string  optional  

Título de la sugerencia (máximo 255 caracteres). El campo value debe ser menor que 255 caracteres. Example: Pájaros caminantes

content   string   

Contenido principal de la sugerencia (chiste, adivinanza, etc.) - máximo 1024 caracteres. El campo value debe ser menor que 1024 caracteres. Example: ¿Por qué los pájaros vuelan hacia el sur? Porque caminando tardarían mucho.

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

🚨 Reportes

Envía un reporte sobre contenido de la plataforma

requires authentication

Se permiten máximo 10 reportes en 1 minuto por usuario.

Ejemplo de petición:
curl --request POST \
    "https://jaja.raupulus.dev/api/v1/report/send" \
    --header "Authorization: Bearer {TU_TOKEN_BEARER}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content_id\": 123,
    \"title\": \"Contenido inapropiado\",
    \"type\": \"inappropriate_content\",
    \"description\": \"Este contenido contiene lenguaje ofensivo\",
    \"additional_info\": \"Reportado por múltiples usuarios\",
    \"reporter_name\": \"Juan Pérez\",
    \"reporter_email\": \"juan@example.com\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://jaja.raupulus.dev/api/v1/report/send';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {TU_TOKEN_BEARER}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'content_id' => 123,
            'title' => 'Contenido inapropiado',
            'type' => 'inappropriate_content',
            'description' => 'Este contenido contiene lenguaje ofensivo',
            'additional_info' => 'Reportado por múltiples usuarios',
            'reporter_name' => 'Juan Pérez',
            'reporter_email' => 'juan@example.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://jaja.raupulus.dev/api/v1/report/send'
payload = {
    "content_id": 123,
    "title": "Contenido inapropiado",
    "type": "inappropriate_content",
    "description": "Este contenido contiene lenguaje ofensivo",
    "additional_info": "Reportado por múltiples usuarios",
    "reporter_name": "Juan Pérez",
    "reporter_email": "juan@example.com"
}
headers = {
  'Authorization': 'Bearer {TU_TOKEN_BEARER}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://jaja.raupulus.dev/api/v1/report/send"
);

const headers = {
    "Authorization": "Bearer {TU_TOKEN_BEARER}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content_id": 123,
    "title": "Contenido inapropiado",
    "type": "inappropriate_content",
    "description": "Este contenido contiene lenguaje ofensivo",
    "additional_info": "Reportado por múltiples usuarios",
    "reporter_name": "Juan Pérez",
    "reporter_email": "juan@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Ejemplo de respuesta (201):


{
    "success": true,
    "data": {
        "id": 1,
        "title": "Contenido inapropiado",
        "type": "inappropriate_content",
        "status": "pending",
        "content_id": 123,
        "reporter_name": "Juan Pérez"
    },
    "message": "El reporte ha sido enviado correctamente y será revisado por nuestro equipo."
}
 

Ejemplo de respuesta (422):


{
    "success": false,
    "message": "Error de validación",
    "errors": {
        "content_id": [
            "El ID del contenido es requerido."
        ],
        "title": [
            "El título del reporte es requerido."
        ]
    }
}
 

Ejemplo de respuesta (500):


{
    "success": false,
    "message": "Error al enviar el reporte, si persiste contacta con el administrador"
}
 

Petición      

POST api/v1/report/send

Cabeceras

Authorization      

Example: Bearer {TU_TOKEN_BEARER}

Content-Type      

Example: application/json

Accept      

Example: application/json

Parámetros del cuerpo

content_id   integer   

ID del contenido a reportar. Example: 123

title   string   

Título del reporte (máximo 255 caracteres). Example: Contenido inapropiado

type   string  optional  

Tipo de reporte. Valores aceptados: spam|inappropriate_content|adult_content|hate_speech|harassment. Example: inappropriate_content

description   string  optional  

Descripción detallada del reporte (máximo 1024 caracteres). Example: Este contenido contiene lenguaje ofensivo

additional_info   string  optional  

Información adicional sobre el reporte (máximo 1024 caracteres). Example: Reportado por múltiples usuarios

reporter_name   string  optional  

Nombre del reportador (si difiere del usuario autenticado). Example: Juan Pérez

reporter_email   string  optional  

Email del reportador (si difiere del usuario autenticado). Example: juan@example.com

Respuesta

Campos de respuesta

success   boolean   

Indica si la operación fue exitosa

message   string   

Mensaje descriptivo de la operación

data   object   

Datos del reporte creado