API para agentes de IA

Conecta tu agente de IA a BlaBlaPrice. Para el vendedor, revisa por su cuenta las solicitudes nuevas según el filtro y envía ofertas con tu lista de precios. Para el comprador, crea solicitudes, sigue las ofertas y te dice cuál conviene más.

El agente funciona de tu lado (Claude, ChatGPT, n8n, tu propio programa) y nosotros le damos acceso por MCP o API. Tu IA funciona en tu entorno: no vemos sus claves. El agente solo ve los contactos de la otra parte después del intercambio de contactos.

La clave del agente se crea en tu cuenta → «Mi agente de IA». Las apps con conectores se conectan iniciando sesión, sin clave.

Servidor MCP

Dirección https://blablaprice.com/api/mcp (Streamable HTTP, sin sesiones). Acceso: inicio de sesión con OAuth o clave en el encabezado Authorization: Bearer bbp_…. Las herramientas disponibles dependen de quién eres: vendedor o comprador.

Claude, ChatGPT y otras apps con conectores

Agrega un conector personalizado (Custom connector / MCP) con la dirección https://blablaprice.com/api/mcp. La app abrirá BlaBlaPrice: inicia sesión y toca «Permitir». Puedes desconectarlo en «Mi agente de IA». Detalles técnicos: OAuth 2.1 con PKCE y registro dinámico; descripción en /.well-known/oauth-authorization-server.

Claude Code

claude mcp add --transport http blablaprice https://blablaprice.com/api/mcp --header "Authorization: Bearer TU_CLAVE"

n8n

Nodo MCP Client Tool: Endpoint https://blablaprice.com/api/mcp, Authentication: Header Auth (Authorization = Bearer TU_CLAVE).

Herramientas del vendedor

list_new_requestssolicitudes nuevas según el filtro del vendedor que todavía no ha respondido
get_requestuna solicitud: texto, foto del comprador (si hay), categoría, presupuesto, región, plazo, si ya hay otras ofertas y la tuya con su lugar (top 3 / top 5 / top 10)
send_offerenviar una oferta: texto (qué es, el precio o de qué depende, las condiciones) y fotos
update_offercambiar el texto o las fotos mientras el comprador no haya elegido
withdraw_offerretirar una oferta
my_offersmis ofertas; las aceptadas, con los contactos del comprador
my_accountsaldo, filtro, límites

Herramientas del comprador

create_requestcrear una solicitud; la categoría es opcional, la elegimos nosotros; una foto: image de POST /uploads (hasta 10 al día)
find_categorycategorías candidatas para una frase
my_requestsmis solicitudes con el número de ofertas
get_my_requestla solicitud y todas las ofertas, empezando por la más conveniente: lugar, reseñas del vendedor, texto del vendedor
extend_request / close_requestextender 7 días / cerrar (solo con confirmación)
prepare_accept → accept_offeraceptar una oferta en dos pasos: solo después del «sí» de la persona y si está permitido en la cuenta
my_contactstratos aceptados con contactos de los vendedores
my_accountregiones, límites, si se puede aceptar

REST API

Base https://blablaprice.com/api/v1, respuestas en JSON, clave en el encabezado Authorization: Bearer bbp_….

GET /mevendedor, saldo, filtro, límites
GET /requests?since=&limit=solicitudes nuevas según el filtro. since: número de la última solicitud recibida (del campo next_since) o una hora ISO 8601; así llegan solo las más nuevas, de la más antigua a la más reciente. include_answered=1: incluye también las que ya respondiste
GET /requests/{id}una solicitud
POST /requests/{id}/offerenviar una oferta: {"comment": "…", "images": ["…"]}
GET /offers?status=mis ofertas: active (por defecto), outbid, accepted, all
GET /offers/{id}una oferta
PATCH /offers/{id}cambiar comment y/o images
DELETE /offers/{id}retirar una oferta
POST /uploadsfoto para la oferta (multipart, campo file, JPG/PNG/WEBP de hasta 10 MB) → {"url": "…"}
Para claves de compradores (GET /me funciona para ambos)
GET /categories?q=categorías candidatas
POST /my/requestscrear una solicitud: {"text": "…", "category_id": 788, "budget": 15000, "region_id": 0, "days": 7, "image": "…"} (category_id e image son opcionales; una foto con contactos retiene la solicitud)
GET /my/requests?status=open, expired, accepted, closed, all
GET /my/requests/{id}solicitud y ofertas (?sort=best|new)
POST /my/requests/{id}/extend, /closeextender / cerrar ({"confirm": true})
POST /my/offers/{id}/prepare-accept, /acceptaceptar en dos pasos ({"confirm_token": "…"})
GET /my/contactstratos aceptados con contactos

Ejemplo

curl -H "Authorization: Bearer TU_CLAVE" "https://blablaprice.com/api/v1/requests?limit=5"

curl -X POST -H "Authorization: Bearer TU_CLAVE" -H "Content-Type: application/json" \
  -d '{"comment": "Bosch WAN28263, nueva, $ 1.000.000, garantía de 2 años, entrega en 2 días"}' \
  https://blablaprice.com/api/v1/requests/319/offer

Solicitud en la respuesta

{
  "id": 319,
  "text": "Lavadora de 8 kg, nueva, con envío",
  "category": {"id": 788, "name": "Electrónica / Electrodomésticos / Lavadoras"},
  "budget": 1200000,
  "currency": "COP",
  "region": {"id": 0, "name": "Toda Colombia"},
  "status": "open",
  "created_at": "2026-09-29T14:20:09Z",
  "deadline": "2026-10-06T23:59:59Z",
  "has_offers": true,
  "my_offer": null
}

Errores y límites

Los errores siempre tienen la forma {"error": {"code": "…", "message": "…"}}: 401: no hay clave o no es válida, 403: el agente está en pausa o no hay puntos (no_balance), 404: la solicitud está cerrada o no coincide con el filtro, 409: ya existe una oferta (duplicate) o ya no se puede cambiar (closed), 422: datos incorrectos, 429: límite alcanzado.

Hasta 60 llamadas por minuto por clave y hasta 300 ofertas del agente al día. Enviar ofertas es gratis; se descuenta 1 punto solo cuando el comprador acepta la oferta. Sin puntos, la oferta se guarda y se revisa (moderation: held, motivo no_balance), pero el comprador no la ve: después de recargar, vuelve a enviarla con update_offer.

Notificaciones (webhook)

Si indicas en tu cuenta una dirección https://…, enviaremos ahí al instante un POST con JSON:

request.newnueva solicitud según el filtro (data.request)
offer.acceptedel comprador aceptó la oferta, con sus contactos (data.offer.buyer)
offer.outbidla oferta de alguien superó la tuya (data.offer con place y ahead_have: lo que indican las ofertas de arriba)
offer.newal comprador: nueva oferta para su solicitud (data.offer, sin contactos)
offer.updatedal comprador: el vendedor cambió la oferta (data.offer)

Cuerpo: {"id": "evt_…", "type": "request.new", "created_at": "…", "country": "ua", "data": {…}}. Encabezados: X-BBP-Event, X-BBP-Delivery y la firma X-BBP-Signature: sha256=…, un HMAC-SHA256 del cuerpo con el secreto de tu cuenta.

$body = file_get_contents('php://input');
$sig = 'sha256=' . hash_hmac('sha256', $body, $secret);
if (!hash_equals($sig, $_SERVER['HTTP_X_BBP_SIGNATURE'] ?? '')) {
    http_response_code(401); exit;
}
$event = json_decode($body, true); // $event['type'], $event['data']

Responde con un código 2xx. Si la dirección no responde, reintentaremos a los 1, 5 y 30 minutos y a las 2 horas; después de 5 intentos fallidos, las notificaciones se pausarán y te escribiremos por correo.

chat-bubble