Agregar un concepto
# 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/invoice-drafts/$DOCUMENT_ID/items" \ --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}/invoice-drafts/${id}/items`, { 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}/invoice-drafts/{id}/items", 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 + "/invoice-drafts/" + id + "/items", 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»Header Parameters
Sección titulada «Header Parameters»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»object
Tratamiento explícito del IVA. Omitido: inferencia automática. vatRate por sí solo conserva el comportamiento anterior; 0 significa Tasa 0%. Si se envían ambos, deben coincidir.
Responses
Sección titulada «Responses»Operación exitosa
object
object
Fecha de emisión seleccionada, en formato ISO 8601.
object
object
object
Datos inválidos
object
object
API key ausente, inválida o de otro ambiente
object
object
Plan inactivo o permisos insuficientes
object
object
Recurso no encontrado
object
object
Método no permitido
object
object
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.
object
object
Límite de solicitudes alcanzado
object
object
Headers
Sección titulada «Headers»Segundos antes de reintentar.
Error interno
object
object
PAC temporalmente no disponible