# Aprovisionamiento de cuentas

Si integras Met dentro de tu producto, no necesitas que cada cliente se registre a mano: puedes **crear su cuenta desde tu backend** y dejarla lista para usar. Es el caso "Meteor como servicio".

Está disponible para **Tech Partners aprobados**, con una API key de partner. Una key de workspace no puede hacerlo: los permisos de esta guía solo existen en keys de partner.

## Scopes

| Scope | Para qué |
|---|---|
| `workspaces:provision` | Crear una cuenta nueva con su dueño |
| `workspaces:recharge` | Cargarle energía a una cuenta que creaste |

Los dos son **exclusivos de keys de partner** y ninguno funciona con una key de prueba (`met_test_`): las cuentas que se crean son reales y los cobros también.

## Crear una cuenta

```ts
import Met from '@meteor.ia/sdk';

const met = new Met(process.env.MET_PARTNER_KEY!);

const cuenta = await met.workspaces.create({
  business_name: 'Inmobiliaria Andes',
  owner_email: 'ana@andes.co',
  owner_name: 'Ana Gómez',
  owner_phone: '+573001234567',
  country: 'CO',
});

console.log(cuenta.id, cuenta.operational); // 1234  false
```

```python
from meteor_ia import Met

met = Met(api_key=os.environ["MET_PARTNER_KEY"])

cuenta = met.workspaces.create(
    business_name="Inmobiliaria Andes",
    owner_email="ana@andes.co",
    owner_name="Ana Gómez",
    owner_phone="+573001234567",
    country="CO",
)
```

La cuenta nace con el plan **Tech Partner**: mensual, sin cargo fijo, con la Energía a tarifa premium. Tu cliente puede subir a un plan comercial cuando quiera, y a partir de ahí paga la tarifa de ese plan.

## Tres cosas que conviene saber antes

### La cuenta nace sin energía

La respuesta trae `operational: false` y `balance_usd: 0`. **Una cuenta sin energía no puede correr ni un solo turno de Met**: el primer mensaje responde que no hay presupuesto.

La energía la paga siempre la cuenta que la consume, así que el paso siguiente es cargarle saldo (más abajo) o pedirle a tu cliente que lo haga. No lo dejes para después del primer mensaje.

### Tú no defines la contraseña

No mandas contraseña en la llamada, y no hay forma de hacerlo. Met le envía al dueño un correo con un enlace para que defina la suya. El campo `owner.invitation_sent` te dice si ese correo salió; si volvió `false`, tu cliente puede pedirlo de nuevo desde "Olvidé mi contraseña".

### Reintentar no duplica

La cabecera `Idempotency-Key` es **obligatoria**. El SDK genera una por ti si no la pasas, pero conviene que pases la tuya —el id de tu propio registro, por ejemplo—: así un reintento por timeout de red devuelve la misma cuenta en vez de crear una segunda.

```ts
await met.workspaces.create(datos, { idempotencyKey: `alta-${miRegistro.id}` });
```

## Cargar energía

```ts
const pago = await met.workspaces.recharge(cuenta.id, 50);
// pago.checkout_url → enlace de pago de Stripe
```

La recarga **no acredita el saldo al instante**: devuelve un `checkout_url` y la energía entra cuando el pago se completa. El mínimo es USD 5.

Solo funciona sobre cuentas que creaste tú. Una cuenta ajena responde `403`.

## Cupos

Cada nivel de partner tiene un cupo **mensual** de cuentas nuevas:

| Nivel | Cuentas por mes |
|---|---|
| Bronce | 100 |
| Plata | 300 |
| Oro | 1000 |

Al agotarse, la creación responde `403` con el cupo, lo que llevas consumido y cuándo se reinicia. El contador vuelve a cero el primer día de cada mes.

## Errores

| Código | Qué pasó |
|---|---|
| `403 scope_not_allowed_for_owner` | Estás usando una key de workspace; esto necesita una key de partner |
| `403 test_mode_restricted` | Estás usando una key `met_test_`; estas operaciones son reales |
| `403` con mensaje de capacidad | Tu cuenta de partner no tiene la capacidad Tech Partner aprobada |
| `403` con mensaje de cupo | Se agotó tu cupo del mes |
| `400` | Falta la cabecera `Idempotency-Key`, o algún dato del dueño no es válido |

Para el detalle de reintentos e idempotencia, ver [Errores e idempotencia](errores-e-idempotencia.html).
