Solicitar la cancelación de una factura
POST
/invoices/{id}/cancel
# Guarda tus datos en solicitud.json; consulta los campos debajo.FACTUCAT_API_URL="${FACTUCAT_API_URL:-https://sandbox.factucat.com/api/v1}"
curl --fail-with-body --request POST \ --url "$FACTUCAT_API_URL/invoices/$DOCUMENT_ID/cancel" \ --header "X-API-Key: $FACTUCAT_API_KEY" \ --header 'Content-Type: application/json' \ --data @'solicitud.json'// Guarda tus datos en solicitud.json; consulta los campos debajo.import { readFile, writeFile } from 'node:fs/promises'
const baseUrl = process.env.FACTUCAT_API_URL || "https://sandbox.factucat.com/api/v1"const id = process.env.DOCUMENT_IDconst body = await readFile("solicitud.json", 'utf8')const response = await fetch(`${baseUrl}/invoices/${id}/cancel`, { method: "POST", headers: { 'X-API-Key': process.env.FACTUCAT_API_KEY, 'Content-Type': 'application/json', }, body,})const text = await response.text()if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`)console.log(JSON.parse(text))# Guarda tus datos en solicitud.json; consulta los campos debajo.import jsonimport osfrom pathlib import Pathimport urllib.errorimport urllib.request
base_url = os.environ.get("FACTUCAT_API_URL", "https://sandbox.factucat.com/api/v1")id = os.environ["DOCUMENT_ID"]body = Path("solicitud.json").read_bytes()request = urllib.request.Request( f"{base_url}/invoices/{id}/cancel", method="POST", headers={ "X-API-Key": os.environ["FACTUCAT_API_KEY"], "Content-Type": "application/json", }, data=body,)try: with urllib.request.urlopen(request) as response: text = response.read().decode("utf-8")except urllib.error.HTTPError as error: raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8')}") from errorprint(json.loads(text))// Guarda tus datos en solicitud.json; consulta los campos debajo.package main
import ( "bytes" "fmt" "io" "net/http" "os")
func main() { baseURL := os.Getenv("FACTUCAT_API_URL") if baseURL == "" { baseURL = "https://sandbox.factucat.com/api/v1" } id := os.Getenv("DOCUMENT_ID") body, _ := os.ReadFile("solicitud.json") request, err := http.NewRequest("POST", baseURL + "/invoices/" + id + "/cancel", bytes.NewReader(body)) if err != nil { panic(err) } request.Header.Set("X-API-Key", os.Getenv("FACTUCAT_API_KEY")) request.Header.Set("Content-Type", "application/json") response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close() text, _ := io.ReadAll(response.Body) if response.StatusCode < 200 || response.StatusCode >= 300 { panic(fmt.Sprintf("HTTP %d: %s", response.StatusCode, text)) } fmt.Print(string(text))}Authorizations
Sección titulada «Authorizations»Parameters
Sección titulada «Parameters»Path Parameters
Sección titulada «Path Parameters»id
required
string format: uuid
Header Parameters
Sección titulada «Header Parameters»Idempotency-Key
string
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.
Request Bodyrequired
Sección titulada «Request Bodyrequired»Media typeapplication/json
object
reason
required
string
replacementInvoiceId
string format: uuid
Responses
Sección titulada «Responses»Operación exitosa
Media typeapplication/json
object
data
required
object
status
required
string
evidence
required
invoice
meta
required
object
requestId
required
string
idempotencyKey
string
pagination
object
limit
required
integer
offset
required
integer
hasMore
required
boolean
nextCursor
string | null
Datos inválidos
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
API key ausente, inválida o de otro ambiente
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
Plan inactivo o permisos insuficientes
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
Recurso no encontrado
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
Método no permitido
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
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
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
Límite de solicitudes alcanzado
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
Headers
Sección titulada «Headers»Retry-After
integer
Segundos antes de reintentar.
Error interno
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string
PAC temporalmente no disponible
Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
requestId
required
string
retryable
required
boolean
reason
string