Ir al contenido

Crear un borrador

POST
/invoice-drafts
FACTUCAT_API_URL="${FACTUCAT_API_URL:-https://sandbox.factucat.com/api/v1}"
curl --fail-with-body --request POST \
--url "$FACTUCAT_API_URL/invoice-drafts" \
--header "X-API-Key: $FACTUCAT_API_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
Idempotency-Key
string
>= 1 characters <= 255 characters

Opcional. Reutiliza la misma clave, ruta y contenido para reintentar una operación sin repetirla. Una clave con contenido diferente devuelve 409. Sin clave, cada solicitud es independiente.

Media typeapplication/json
object
issueDate

Fecha de emisión: YYYY-MM-DD o datetime ISO (día en la zona horaria del código postal de expedición). La fecha de emisión puede ser hoy o hasta 72 horas antes del timbrado (máximo 3 días de calendario atrás), nunca futura, en la zona horaria del código postal de expedición (regla 2.7.2.9 RMF). INVALID_ISSUE_DATE si no es válida.

string
customerId
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
receiverRfc
string
receiverLegalName
string
receiverPostalCode
Any of:
string
receiverTaxRegime
Any of:
string
receiverFiscalResidence
string
receiverTaxId
string
receiverEmail
string format: email
/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/
receiverInvoiceLanguage
string
Allowed values: es en
currency
string
Allowed values: MXN USD EUR
exchangeRate
number
exchangeRateDate
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
cfdiUse
string
exportacion
string
Allowed values: 01 02 03 04

Operación exitosa

Media typeapplication/json
object
data
required
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
userId
required
string
>= 1 characters
customerId
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
receiverRfc
required
string
receiverLegalName
required
string
receiverPostalCode
required
string
receiverTaxRegime
required
string
receiverFiscalResidence
string
receiverTaxId
string
receiverEmail
string format: email
/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/
receiverInvoiceLanguage
required
string
Allowed values: es en
serie
string
folio
string
satUuid
string
status
required
string
Allowed values: draft issued error cancelled
cfdiType
required
string
cfdiUse
required
string
exportacion
required
string
Allowed values: 01 02 03 04
paymentMethod
string
paymentForm
string
currency
required
string
Allowed values: MXN USD EUR
exchangeRate
required
number
exchangeRateDate
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
subtotal
required
number
vatRate
required
Any of:
number
0
taxTotal
required
number
total
required
number
customerNotes
string
pdfLanguage
required
string
Allowed values: es en
errorMessage
string
issueDate

Fecha de emisión seleccionada, en formato ISO 8601.

string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
issuedAt
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
cancelledAt
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
createdAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
updatedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
items
required
Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
invoiceId
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
position
required
integer
<= 9007199254740991
productCode
string
unitCode
required
string
description
required
string
quantity
required
number
unitPrice
required
number
amount
required
number
objetoImp
string
Allowed values: 01 02 03 04 05 06 07 08
vatKind
string
Allowed values: none tasa exento
vatTreatment
string
Allowed values: iva_16 iva_8 tasa_0 exento no_objeto
vatRate
required
Any of:
number
0
vatSource
string
Allowed values: manual inferred default
vatReason
string
isrWithholdingRate
required
Any of:
number
0
isrWithholdingSource
string
Allowed values: manual inferred default
isrWithholdingReason
string
suggestedProductCode
string
suggestionConfidence
number
suggestionSource
string
Allowed values: ai memory manual review
meta
required
object
requestId
required
string
>= 1 characters
idempotencyKey
string
>= 1 characters
pagination
object
limit
required
integer
> 0 <= 9007199254740991
offset
required
integer
<= 9007199254740991
hasMore
required
boolean
nextCursor
string | null

Datos inválidos

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

API key ausente, inválida o de otro ambiente

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

Plan inactivo o permisos insuficientes

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

Recurso no encontrado

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

Método no permitido

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

Conflicto o solicitud en curso. error.reason es opcional; duplicate_rfc indica que ya existe un cliente con ese RFC en la cuenta; stamp_in_progress indica que el documento se está timbrando: consúltalo antes de reintentar.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

Límite de solicitudes alcanzado

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string
Retry-After
integer

Segundos antes de reintentar.

Error interno

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string

PAC temporalmente no disponible

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request conflict csd_required forbidden internal_error pac_unavailable invalid_api_key invalid_json method_not_allowed missing_api_key missing_idempotency_key missing_scope not_found plan_required rate_limit_exceeded validation_error invalid_input INVALID_ISSUE_DATE idempotency_conflict idempotency_in_progress
message
required
string
>= 1 characters
requestId
required
string
>= 1 characters
retryable
required
boolean
reason
string