# Pedirle sus datos fiscales a un cliente

`POST https://api.fiscalisto.com/v1/customer_data_requests`

Una liga (url) que usted le manda a su cliente: la abre en fiscalisto.com y da su RFC, nombre, régimen, código postal y uso, escritos o leídos de su constancia, revisados antes de aceptarlos. Al mandarlos llega customer_data_request.completed. Un cliente nuevo queda en el catálogo del emisor; si ya existía con otros datos, los nuevos vienen en submission para que usted los aplique.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `Idempotency-Key` | encabezado |  | Opcional (los SDK la mandan solos). Si la respuesta se pierde, repita la solicitud con el mismo valor durante 24 horas: contesta lo mismo, con idempotent-replayed: true, y no lo hace dos veces (ni crea, ni manda correos, ni cobra). |

## Cuerpo

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `issuer` | string |  | El emisor (iss_…) que va a facturarle. Por omisión, su único emisor. |
| `reference` | string |  | Su id para este cliente o pedido, como «Pedido 1042». El cliente la ve arriba del formulario y viene de vuelta en el evento. (hasta 100 caracteres) |
| `description` | string |  | Una línea que el cliente ve arriba del formulario: para qué son sus datos. (hasta 300 caracteres) |
| `expires_in_days` | integer |  | Días que la liga sirve, de 1 a 60. Por omisión 60. (de 1 a 60) |

Ejemplo:

```json
{
  "reference": "cliente-8812",
  "description": "Para facturar su suscripción de octubre."
}
```

## Con el SDK de TypeScript

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

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

const customerDataRequest = await fiscalisto.customerDataRequests.create({
  reference: "cliente-8812",
  description: "Para facturar su suscripción de octubre.",
}, { idempotencyKey: "pedido-A-1042" });
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

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

customer_data_request = fiscalisto.customer_data_requests.create({
    "reference": "cliente-8812",
    "description": "Para facturar su suscripción de octubre.",
}, idempotency_key="pedido-A-1042")
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

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

$customerDataRequest = $fiscalisto->customerDataRequests->create([
    'reference' => 'cliente-8812',
    'description' => 'Para facturar su suscripción de octubre.',
], ['idempotency_key' => 'pedido-A-1042']);
```

## Con el SDK de .NET

```csharp
using Fiscalisto;

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

var customerDataRequest = await fiscalisto.CustomerDataRequests.CreateAsync(new CreateCustomerDataRequestParams
{
    Reference = "cliente-8812",
    Description = "Para facturar su suscripción de octubre.",
}, new RequestOptions { IdempotencyKey = "pedido-A-1042" });
```

## 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()

	customerDataRequest, err := client.CustomerDataRequests.Create(ctx, &fiscalisto.CreateCustomerDataRequestParams{
		Reference:   fiscalisto.String("cliente-8812"),
		Description: fiscalisto.String("Para facturar su suscripción de octubre."),
	}, fiscalisto.WithIdempotencyKey("pedido-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(customerDataRequest.ID)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.CreateCustomerDataRequestParams;

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

var customerDataRequest = fiscalisto.customerDataRequests().create(new CreateCustomerDataRequestParams()
        .setReference("cliente-8812")
        .setDescription("Para facturar su suscripción de octubre."), RequestOptions.idempotencyKey("pedido-A-1042"));
System.out.println(customerDataRequest.getId());
```

## Respuesta 201

Correcto.

Un objeto `CustomerDataRequest`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `id` | string | sí | Identificador del objeto, con su prefijo (iss_, inv_, ret_, cus_, prd_, emp_, bat_, brn_, whs_, stm_, adj_, evt_, whe_). |
| `livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `object` | `"customer_data_request"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `issuer` | string | sí | El emisor que le va a facturar. |
| `status` | `open`, `completed`, `expired`, `canceled` | sí | open (la liga espera), completed (el cliente mandó sus datos), expired (venció) o canceled. |
| `url` | string o null | sí | La liga para su cliente, en fiscalisto.com. null cuando ya no está abierta. |
| `reference` | string o null | sí | Su id para este cliente o pedido. |
| `description` | string o null | sí | Lo que el cliente ve arriba del formulario. |
| `expires_at` | string (date-time) o null | sí | Cuándo deja de servir la liga. |
| `created_at` | string (date-time) o null | sí | Cuándo se creó. |
| `submission` | objeto o null | sí | Lo que mandó el cliente (el último envío: puede corregirlo en las 24 horas siguientes). null mientras no conteste. |
| `submission.tax_id` | string | sí | Su RFC. |
| `submission.legal_name` | string | sí | Su nombre o razón social, como en su constancia. |
| `submission.tax_system` | string | sí | Su régimen fiscal (c_RegimenFiscal). |
| `submission.zip` | string | sí | El código postal de su domicilio fiscal. |
| `submission.use` | string | sí | El uso del CFDI que eligió (c_UsoCFDI). |
| `submission.email` | string o null | sí | Su correo para recibir facturas, si lo dio. |
| `submission.source` | `constancia`, `manual` | sí | constancia (leído de su constancia o del SAT con su idCIF) o manual (escrito). |
| `submission.customer` | string o null | sí | El cliente (cus_…) en el catálogo del emisor: el nuevo, o el que ya existía con ese RFC. |
| `submission.applied` | boolean | sí | true si quedó en el catálogo. false si el cliente ya existía con otros datos: aplíquelos con POST /v1/customers/{id} si son correctos. |
| `submission.submitted_at` | string (date-time) o null | sí | Cuándo los mandó. |

```json
{
  "id": "cdr_0q1Vmmw52sbD4cHPqLfBvX0AkFg3hX2Ys",
  "object": "customer_data_request",
  "livemode": false,
  "issuer": "iss_0q1Vmmw52sbD",
  "status": "completed",
  "url": null,
  "reference": "cliente-8812",
  "description": "Para facturar su suscripción de octubre.",
  "expires_at": "2026-12-23T10:15:00-06:00",
  "created_at": "2026-10-24T10:15:00-06:00",
  "submission": {
    "tax_id": "ICV060329BY0",
    "legal_name": "INMOBILIARIA CVA",
    "tax_system": "601",
    "zip": "33826",
    "use": "G03",
    "email": "facturas@inmobiliariacva.mx",
    "source": "constancia",
    "customer": "cus_0q1Vmmw52sbD1",
    "applied": true,
    "submitted_at": "2026-10-24T11:02:41-06:00"
  }
}
```

## 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.
