Duplicar recibos no cancelados en un nuevo borrador
# 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/payroll/batches/$DOCUMENT_ID/duplicate" \ --header "X-API-Key: $FACTUCAT_API_KEY" \ --header "Idempotency-Key: nomina-operacion-001" \ --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}/payroll/batches/${id}/duplicate`, { method: "POST", headers: { 'X-API-Key': process.env.FACTUCAT_API_KEY, 'Idempotency-Key': "nomina-operacion-001", '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}/payroll/batches/{id}/duplicate", method="POST", headers={ "X-API-Key": os.environ["FACTUCAT_API_KEY"], "Idempotency-Key": "nomina-operacion-001", "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 + "/payroll/batches/" + id + "/duplicate", bytes.NewReader(body)) if err != nil { panic(err) } request.Header.Set("X-API-Key", os.Getenv("FACTUCAT_API_KEY")) request.Header.Set("Idempotency-Key", "nomina-operacion-001") 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))}Crea un borrador, sin timbrar. Requiere payroll:write, Plan Miau y permisos de escritura en el espacio. Aplica la compuerta live de MCP. Revisa importes y advertencias antes de timbrar con payroll_batch_stamp. OAuth usa el espacio seleccionado al autorizar; las API keys usan su cuenta propietaria. Los identificadores sensibles se enmascaran. Copiar requiere un recibo timbrado anterior; duplicar excluye recibos cancelados incluso al seleccionar empleados explícitamente.
Authorizations
Sección titulada «Authorizations»Parameters
Sección titulada «Parameters»Path Parameters
Sección titulada «Path Parameters»Header Parameters
Sección titulada «Header Parameters»Obligatoria. Reutiliza la misma clave, ruta y contenido para reintentar. Un contenido distinto devuelve 409.
Request Bodyrequired
Sección titulada «Request Bodyrequired»object
Responses
Sección titulada «Responses»Operación exitosa
object
object
object
object
object
object
object
object
object
object
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