# Expandir objetos

> Pida con expand[] que los ids de otros objetos lleguen como esos objetos, en la misma respuesta, sin una llamada más por cada uno.

Muchos objetos guardan el id de otro: una factura tiene su `issuer` y su `recurring_invoice`, una factura recurrente su `last_invoice`, un ticket su `invoice`. Con `expand[]` ese id llega como el objeto completo, en la misma respuesta:

```bash tab="cURL"
curl "https://api.fiscalisto.com/v1/invoices/inv_OufpKqnrvx9p1?expand[]=issuer&expand[]=recurring_invoice" \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

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

const invoice = await fiscalisto.invoices.get("inv_OufpKqnrvx9p1", { "expand[]": "recurring_invoice" });
```

```python tab="Python"
from fiscalisto import Fiscalisto

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

invoice = fiscalisto.invoices.get("inv_OufpKqnrvx9p1", {"expand[]": "recurring_invoice"})
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

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

$invoice = $fiscalisto->invoices->get('inv_OufpKqnrvx9p1', ['expand[]' => 'recurring_invoice']);
```

```go tab="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()

	invoice, err := client.Invoices.Get(ctx, "inv_OufpKqnrvx9p1", &fiscalisto.GetInvoiceParams{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(invoice.ID)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.GetInvoiceParams;

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

var invoice = fiscalisto.invoices().get("inv_OufpKqnrvx9p1", new GetInvoiceParams());
System.out.println(invoice.getId());
```

```csharp tab="C#"
using Fiscalisto;

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

var invoice = await fiscalisto.Invoices.GetAsync("inv_OufpKqnrvx9p1", new GetInvoiceParams());
```

```json
{
  "id": "inv_OufpKqnrvx9p1",
  "object": "invoice",
  "issuer": { "id": "iss_OufpKqnrvx9p", "object": "issuer", "legal_name": "ESCUELA KEMPER URGATE", "…": "…" },
  "recurring_invoice": { "id": "rin_OufpKqnrvx9p1", "object": "recurring_invoice", "…": "…" }
}
```

Sin `expand[]`, los ids siguen siendo ids.

## Cómo se escribe

- Un parámetro `expand[]` por campo (`expand[]=issuer&expand[]=invoice`), o varios separados por comas (`expand=issuer,invoice`).
- Con puntos se entra a un objeto expandido: `expand[]=recurring_invoice.last_invoice`. Hasta 4 niveles.
- En una lista, cada elemento se expande: `expand[]=data.issuer`, o solo `expand[]=issuer`.
- Hasta 10 campos por solicitud, y hasta 200 objetos por respuesta (cada id se lee una vez, aunque se repita en la página).
- Sirve en `GET` y en `POST`: `POST /v1/products?expand[]=issuer` contesta el producto creado con su emisor.

Se expande cualquier campo que guarda el id de otro objeto (`iss_`, `inv_`, `cus_`, `prd_`, `rin_`, `quo_`, `tkt_`, `btx_`, `emp_`, `ret_`, `bat_`, `sdl_`, `sat_`, `stc_`, `cdr_`, `whe_`, `evt_`, `sbx_`). Cada objeto se lee con su misma llave, como lo haría su `GET`: una llave restringida a ciertos emisores no ve nada fuera de ellos.

Un campo que la respuesta no tiene, o que no es el id de otro objeto, responde `400` con `expand_invalid` en un `GET`. En un `POST` lo que pidió ya se hizo, así que la respuesta llega sin expandir. Si el objeto ya no existe, queda su id. Un campo en `null` se queda en `null`.

## En los SDKs

```ts
const invoice = await fiscalisto.invoices.get("inv_…", { expand: ["issuer", "recurring_invoice"] });
```

```python
invoice = fiscalisto.invoices.get("inv_…", expand=["issuer", "recurring_invoice"])
```

```php
$invoice = $fiscalisto->invoices->get('inv_…', [], ['expand' => ['issuer', 'recurring_invoice']]);
```

Los tipos de los SDKs dicen el id (`issuer: string`); con `expand` el campo trae el objeto. En Go, Java y .NET, que convierten cada campo a su tipo, lea el objeto relacionado con su propio `get`.
