{"openapi":"3.1.0","info":{"title":"Yo Vuelvo API","version":"1.0.0","description":"Suma compras de tu POS a la tarjeta del cliente. Claves `lk_test_…` = sandbox (valida y responde sin guardar nada); `lk_live_…` = producción."},"servers":[{"url":"/api/v1"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"paths":{"/transactions":{"post":{"summary":"Registrar una venta","description":"Idempotente: repetir el mismo `Idempotency-Key` devuelve el mismo resultado y nunca suma dos veces. Si el staff escaneó a ese cliente en los últimos 10 min, responde `counted:false, reason:already_scanned`. STAMPS: +1 sello (ignora `amount`). POINTS: puntos = floor(amount/100 × puntos por unidad). CASHBACK: % sobre `amount`. PROGRESSIVE y MEMBERSHIP: +1 visita (ignoran `amount`); MEMBERSHIP responde `rejected` si la membresía está vencida.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":100}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount"],"properties":{"serial":{"type":"string","description":"Código del QR de la tarjeta"},"phone":{"type":"string","description":"Celular del cliente (alternativa a serial)"},"amount":{"type":"integer","minimum":1,"description":"Monto de la venta en centavos"}}}}}},"responses":{"200":{"description":"Procesada","content":{"application/json":{"schema":{"type":"object","properties":{"transaction_id":{"type":"string"},"counted":{"type":"boolean"},"reason":{"type":"string"},"balance":{"type":"string"},"sandbox":{"type":"boolean"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"422":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}}