# Ver las existencias de un producto

`GET https://api.fiscalisto.com/v1/products/{id}/stock`

Lo que hay del producto en cada almacén del emisor (también en 0), apartado por cotizaciones y disponible.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `id` | ruta | sí | El id del objeto. |

## Con el SDK de TypeScript

```ts
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

const { data } = await fiscalisto.products.stock("id");
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

data = fiscalisto.products.stock("id")["data"]
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

$data = $fiscalisto->products->stock('id')['data'];
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var stockLevelList = await fiscalisto.Products.StockAsync("id");
```

## Con el SDK de Go

```go
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	stockLevelList, err := client.Products.Stock(ctx, "id")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *stockLevelList)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var stockLevelList = fiscalisto.products().stock("id");
System.out.println(stockLevelList);
```

## Respuesta 200

Correcto.

Un objeto `StockLevelList`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `object` | `"list"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `data` | arreglo de objeto | sí | Los objetos de esta página. |
| `data[].id` | string | sí | Su id (stl_…): el producto en ese almacén. Sirve como starting_after. |
| `data[].livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `data[].object` | `"stock_level"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `data[].product` | string | sí | El producto (prd_…). |
| `data[].warehouse` | string | sí | El almacén (whs_…). |
| `data[].on_hand` | number | sí | Lo que hay, en la unidad del producto (todos sus lotes). |
| `data[].reserved` | number | sí | Lo apartado por cotizaciones aceptadas que no se han facturado. |
| `data[].available` | number | sí | on_hand menos reserved: lo que se puede vender. |
| `data[].value` | number | sí | Lo que valen esas existencias a su costo, en pesos sin IVA. |
| `data[].average_cost` | number o null | sí | value / on_hand: el costo por unidad, o null sin existencias. |
| `has_more` | boolean | sí | true si hay más: pida la siguiente con starting_after igual al id del último. |
| `url` | string | sí | La ruta de esta lista. |

```json
{
  "object": "list",
  "data": [
    {
      "id": "stl_OufpKqnrvx9p4gfFC6",
      "object": "stock_level",
      "livemode": false,
      "product": "prd_OufpKqnrvx9p2",
      "warehouse": "whs_OufpKqnrvx9p1",
      "on_hand": 48,
      "reserved": 6,
      "available": 42,
      "value": 4320,
      "average_cost": 90
    }
  ],
  "has_more": false,
  "url": "/v1/products/{id}/stock"
}
```

## Errores

Puede responder 400, 401, 403, 404, 429, 500 con el cuerpo de error de siempre; cada código está en https://fiscalisto.com/docs/api/errores.md.
