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."
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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"
}
Respuesta recibida:
La petición falló con error:
Consejo: Verifica que estés conectado correctamente a la red.
Si eres el mantenedor de esta API, verifica que tu API esté funcionando y que hayas habilitado CORS.
Puedes revisar la consola de Herramientas de Desarrollador para información de depuración.
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