> ## Documentation Index
> Fetch the complete documentation index at: https://docs.onepay.la/llms.txt
> Use this file to discover all available pages before exploring further.

# Productos y suscripciones

> Errores de productos, precios, planes y suscripciones.

Esta página cubre [Productos](/client/products/index), [Precios](/client/prices/index), [Planes](/client/plans/index) y [Suscripciones](/client/subscriptions/index). Además de lo que se lista acá, cualquiera de estos endpoints puede devolver los [errores comunes](/client/base/errors/common). Los que tienen un ID en la ruta también responden `404 record_not_found` si el ID no es un UUID, y `404 environment_key_mismatch` si el recurso es del otro ambiente.

**Endpoints:** [Productos](#productos) · [Precios](#precios) · [Planes](#planes) · [Suscripciones](#suscripciones)

## Productos

### Listar productos

`GET /products` · [Referencia](/client/products/list)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| Sin código | 500 | Server Error | Un valor de `ids[]`, `starting_after` o `ending_before` no es un UUID. | Envía solo UUIDs; como cursor usa el `id` de un producto de la página anterior. | Sí, tras corregir |

### Detalle, actualizar y eliminar un producto

`GET /products/{id}` · [Referencia](/client/products/detail)<br />
`PUT /products/{id}` · [Referencia](/client/products/update)<br />
`DELETE /products/{id}` · [Referencia](/client/products/delete)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, SubscriptionProduct no existe | El producto no existe, se eliminó o es de otra empresa. | Revisa el `id`. | No |
| `10001`<br />`validation_error` | 422 | El campo nombre es obligatorio. | Al actualizar: falta `name` (el cuerpo se valida completo) o un campo no cumple las reglas de creación. | Revisa `errors` y envía el cuerpo completo. | Sí, tras corregir |

### Crear un producto

`POST /products` · [Referencia](/client/products/create)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10001`<br />`validation_error` | 422 | El campo nombre es obligatorio. | Falta `name`, `tax_rate` está fuera de 0 a 100, hay más de 15 `marketing_features` o más de 8 `images`, o una URL no es válida. | Revisa `errors` y corrige el cuerpo. | Sí, tras corregir |

## Precios

### Listar precios

`GET /prices` · [Referencia](/client/prices/list)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| Sin código | 500 | Server Error | `product`, `starting_after` o `ending_before` no es un UUID. | Envía el UUID del producto; como cursor usa el `id` de un precio de la página anterior. | Sí, tras corregir |

### Detalle y eliminar un precio

`GET /prices/{id}` · [Referencia](/client/prices/detail)<br />
`DELETE /prices/{id}` · [Referencia](/client/prices/delete)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, Plan no existe | El precio no existe, se eliminó o es de otra empresa. | Revisa el `id`. | No |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado | El `id` es de un plan creado antes de que existieran los productos. | Consúltalo o elimínalo como [plan](#planes). | No |

### Crear un precio

`POST /prices` · [Referencia](/client/prices/create)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10001`<br />`validation_error` | 422 | El campo product es obligatorio. | Falta `product` o `currency`; `product` no existe; `currency` no es COP, USD ni MXN; enviaste `unit_amount` y `unit_amount_in_cents` juntos o ninguno; el monto está por debajo del mínimo o por encima de tu límite; o `recurring` no es válido. | Revisa `errors` y corrige el cuerpo. | Sí, tras corregir |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, SubscriptionProduct no existe | El producto es de otra empresa o se eliminó. | Usa un producto tuyo. | No |
| Sin código | 500 | Server Error | El producto es del otro ambiente. | Crea el precio con la llave del ambiente del producto. | Sí, tras corregir |
| Sin código | 500 | Server Error | `lookup_key` ya lo usa otro precio tuyo en este ambiente (incluso uno archivado). | Envía `transfer_lookup_key: true` o usa otro `lookup_key`. | Sí, tras corregir |

## Planes

### Listar planes

`GET /plans` · [Referencia](/client/plans/list)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| Sin código | 500 | Server Error | `created_from` no es una fecha válida. | Envía la fecha como `AAAA-MM-DD`. | Sí, tras corregir |

### Crear un plan

`POST /plans` · [Referencia](/client/plans/create)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10001`<br />`validation_error` | 422 | El campo nombre es obligatorio. | Falta `name`, `currency`, `amount_in_cents`, `reference_price_in_cents` o `cicle_frequency`; `coupon_id` no existe; o no se cumplen las reglas de prueba gratis, medios de pago o funcionalidades. | Revisa `errors` y corrige el cuerpo. | Sí, tras corregir |
| `10001`<br />`validation_error` | 422 | El monto mínimo es COP \$1.000 | `amount_in_cents` está por debajo del mínimo de la moneda o por encima de tu límite por transacción. | Ajusta el monto. | Sí, tras corregir |
| Sin código | 500 | Server Error | `coupon_id` existe pero no se puede aplicar: inactivo, vencido, agotado, con un mínimo mayor al monto o de otra empresa. | Usa un cupón activo y vigente de tu empresa. | Sí, tras corregir |

### Eliminar un plan

`DELETE /plans/{plan_id}` · [Referencia](/client/plans/delete)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, Plan no existe | El plan no existe, ya se eliminó o es de otra empresa. | Revisa el `plan_id`. | No |

## Suscripciones

### Listar suscripciones

`GET /subscriptions` · [Referencia](/client/subscriptions/list)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| Sin código | 500 | Server Error | `created_from` o `created_to` no es una fecha válida. | Envía las fechas como `AAAA-MM-DD`. | Sí, tras corregir |

### Crear una suscripción

`POST /subscriptions` · [Referencia](/client/subscriptions/create)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10001`<br />`validation_error` | 422 | El plan id seleccionado es inválido. | Falta `plan_id` (o `price_id`), `customer_id`, `payment_method_type` o `payment_method_id`; el plan o el cliente no existen, son de otra empresa o del otro ambiente; o `payment_method_type` no es `Card` ni `Account`. | Revisa `errors` y corrige el cuerpo. | Sí, tras corregir |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, CreditCard no existe | La tarjeta no existe, es de otro cliente o del otro ambiente. Con `Account` el mensaje es «Registro no encontrado, Cuenta no existe». | Usa un medio de pago del mismo cliente y ambiente. | No |
| Sin código | 500 | Server Error | `start_date` o `start_trial_date` no viene exactamente como `AAAA-MM-DD`. | Envía las fechas como `AAAA-MM-DD`, sin hora. | Sí, tras corregir |
| Sin código | 500 | Server Error | El precio es de pago único, no recurrente. | Suscribe solo precios recurrentes. | No |
| Sin código | 500 | Server Error | `trial_days` llegó como `null`. | Omite `trial_days` o envía un número entero. | Sí, tras corregir |

### Eliminar una suscripción

`DELETE /subscriptions/{subscription_id}` · [Referencia](/client/subscriptions/delete)

| Código | HTTP | Mensaje | Causa probable | Qué hacer | ¿Reintentar? |
| - | - | - | - | - | - |
| `10002`<br />`record_not_found` | 404 | Registro no encontrado, Subscription no existe | La suscripción no existe, ya se eliminó o es de otra empresa. | Revisa el `subscription_id`. | No |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.