Guia de remision POST

La guia de remision acompana el traslado de bienes.

Ejemplo en el ambiente de pruebas. Los comprobantes no tienen validez fiscal.

POST /v1/contribuyentes/{identificacion}/comprobantes
infoTributaria.codDoc = "06"

No lleva importes y usa destinatarios en lugar de detalles. La estructura del comprobante es la misma que en Factura; cambia el contenido de info y el cuerpo de ejemplo (comprobante.json).

Estructura del comprobante#

Clave Tipo Obligatorio Descripcion
origenReferencia string Si Sistema de origen (max. 64)
referenciaExterna string Si Referencia estable de tu sistema (max. 128)
infoTributaria object Si Identidad del documento
info object Si Cabecera de la guia
destinatarios array Si Destinatarios con sus lineas
infoAdicional array No Hasta 20 objetos {nombre, valor}

infoTributaria: ruc (13), codDoc (06), estab (3), ptoEmi (3) y secuencial (9) obligatorios. La clave de acceso la asigna la plataforma; no la envies.

Campos de info#

Campo Tipo Obligatorio Regla
dirEstablecimiento string No Direccion del establecimiento
dirPartida string Si Direccion de partida
razonSocialTransportista string Si Razon social del transportista
tipoIdentificacionTransportista string Si Catalogos de identificacion
rucTransportista string Si Identificacion del transportista
fechaIniTransporte string Si dd/MM/yyyy
fechaFinTransporte string Si dd/MM/yyyy
placa string Si Placa del vehiculo

La guia no lleva importes.

destinatarios#

La guia lleva un unico destinatario.

Campo Tipo Obligatorio Descripcion
identificacionDestinatario string Si Cedula o RUC del destinatario
razonSocialDestinatario string Si Razon social del destinatario
dirDestinatario string Si Direccion de destino
motivoTraslado string Si Motivo del traslado
docAduaneroUnico string No Documento aduanero unico
codEstabDestino string No Codigo del establecimiento de destino
ruta string No Ruta del traslado
detalles array Si Bienes trasladados (ver abajo)

destinatarios[].detalles#

Las lineas de la guia no usan importes ni impuestos.

Campo Tipo Obligatorio Descripcion
codigoInterno string Si Codigo del bien
descripcion string Si Descripcion del bien
cantidad number Si Cantidad trasladada

infoAdicional#

Campo Tipo Obligatorio Descripcion
nombre string Si Nombre del campo adicional
valor string Si Valor del campo adicional

Ejemplo de solicitud#

curl -s -X POST "https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes" \
  -H "X-Api-Key: $ECUAFACT_API_KEY" \
  -H "Idempotency-Key: GR-2026-0004" \
  -H "Content-Type: application/json" \
  -d @comprobante.json
using System.Text;

using var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-Api-Key", apiKey);
http.DefaultRequestHeaders.Add("Idempotency-Key", "GR-2026-0004");

string json = await File.ReadAllTextAsync("comprobante.json");
using var contenido = new StringContent(json, Encoding.UTF8, "application/json");
using var respuesta = await http.PostAsync(
    "https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes",
    contenido);

Console.WriteLine($"{(int)respuesta.StatusCode} {await respuesta.Content.ReadAsStringAsync()}");
import json, os, requests

headers = {
    "X-Api-Key": os.environ["ECUAFACT_API_KEY"],
    "Idempotency-Key": "GR-2026-0004",
}
with open("comprobante.json", encoding="utf-8") as archivo:
    cuerpo = json.load(archivo)

r = requests.post(
    "https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes",
    headers=headers, json=cuerpo, timeout=30)
print(r.status_code, r.text)
import { readFile } from 'node:fs/promises';

const cuerpo = await readFile('comprobante.json', 'utf8');
const res = await fetch(
  'https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes',
  {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.ECUAFACT_API_KEY,
      'Idempotency-Key': 'GR-2026-0004',
      'Content-Type': 'application/json'
    },
    body: cuerpo
  });
console.log(res.status, await res.text());
<?php
$ch = curl_init('https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'X-Api-Key: ' . getenv('ECUAFACT_API_KEY'),
        'Idempotency-Key: GR-2026-0004',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => file_get_contents('comprobante.json'),
]);
$respuesta = curl_exec($ch);
$estado = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $estado . ' ' . $respuesta;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;

HttpClient cliente = HttpClient.newHttpClient();
String cuerpo = Files.readString(Path.of("comprobante.json"));

HttpRequest peticion = HttpRequest.newBuilder()
    .uri(URI.create("https://staging-api.mynexusapi.com/v1/contribuyentes/0123456789/comprobantes"))
    .header("X-Api-Key", System.getenv("ECUAFACT_API_KEY"))
    .header("Idempotency-Key", "GR-2026-0004")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(cuerpo))
    .build();

HttpResponse<String> respuesta = cliente.send(peticion, HttpResponse.BodyHandlers.ofString());
System.out.println(respuesta.statusCode() + " " + respuesta.body());
using Ecuafact.Sdk;

// client: cliente EcuafactClient - ver SDK .NET
EmisionResultado resultado = await client.EmitirAsync(comprobante);
Console.WriteLine($"Operacion {resultado.Admission.IdOperacion} / codigo: {resultado.Admission.Codigo}");
from ecuafact import EcuafactClient

# client: cliente EcuafactClient - ver SDK Python
resultado = client.emitir(comprobante)
print(f"Operacion {resultado.admission.id_operacion} / codigo: {resultado.admission.codigo}")
import { EcuafactClient } from "@ecuafact/sdk";

// client: cliente EcuafactClient - ver SDK Node.js
const resultado = await client.emitir(comprobante);
console.log(`Operacion ${resultado.admission.idOperacion} / codigo: ${resultado.admission.codigo}`);
<?php
use Ecuafact\Sdk\EcuafactClient;

// $client: cliente EcuafactClient - ver SDK PHP
$resultado = $client->emitir($comprobante);
echo 'Operacion ' . $resultado->admission->idOperacion . ' / codigo: ' . $resultado->admission->codigo;
import com.ecuafact.sdk.EcuafactClient;

// client: cliente EcuafactClient - ver SDK Java
EmisionResultado resultado = client.emitir(comprobante);
System.out.println("Operacion " + resultado.admission().idOperacion() + " / codigo: " + resultado.admission().codigo());

Cuerpo de la Guia de remision#

{
  "origenReferencia": "MiERP",
  "referenciaExterna": "GR-2026-0004",
  "infoTributaria": {
    "ruc": "0123456789001",
    "codDoc": "06",
    "estab": "002",
    "ptoEmi": "001",
    "secuencial": "000000004"
  },
  "info": {
    "dirEstablecimiento": "AV. PRINCIPAL 123",
    "dirPartida": "BODEGA CENTRAL",
    "razonSocialTransportista": "TRANSPORTES DE EJEMPLO",
    "tipoIdentificacionTransportista": "04",
    "rucTransportista": "1790012345001",
    "fechaIniTransporte": "07/09/2026",
    "fechaFinTransporte": "08/09/2026",
    "placa": "PBA1234"
  },
  "destinatarios": [
    {
      "identificacionDestinatario": "0123456789",
      "razonSocialDestinatario": "DESTINATARIO DE EJEMPLO",
      "dirDestinatario": "SUCURSAL NORTE",
      "motivoTraslado": "VENTA",
      "codEstabDestino": "001",
      "ruta": "QUITO - GUAYAQUIL",
      "detalles": [
        { "codigoInterno": "PROD-001", "descripcion": "Caja de producto", "cantidad": 10 }
      ]
    }
  ]
}

Notas#

  • La guia admite un solo destinatario.
  • Las lineas de la guia no usan importes ni impuestos.

Respuesta#

La API responde 202 Accepted con la operacion creada:

{
  "codigo": "200",
  "mensaje": "Operacion exitosa.",
  "idOperacion": "3f1c8c1e-6f2a-4b7e-9c3d-2a1b0c9d8e7f",
  "urlEstado": "https://staging-api.mynexusapi.com/v1/operaciones/3f1c8c1e-6f2a-4b7e-9c3d-2a1b0c9d8e7f",
  "uid": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}
Campo Significado
codigo 200 si es una emision nueva; 201 si es un reintento con la misma Idempotency-Key
mensaje Descripcion del resultado
idOperacion Identificador de seguimiento de la emision
urlEstado Ruta para consultar el estado de esta operacion
uid Identificador del documento

El 202 no es la autorizacion del SRI: el comprobante quedo recibido. Consulta urlEstado o espera el webhook.

Estados de este endpoint#

Codigo HTTP Cuando ocurre Que hacer
200 202 Emision aceptada Sigue el estado de la operacion
201 202 Reintento con la misma Idempotency-Key y el mismo contenido Sigue la misma operacion
301 400 Falta Idempotency-Key o hay campos mal formados Corrige la solicitud
302 422 El comprobante no cumple una regla fiscal o de estructura Revisa errores
401 409 Numero o clave ya registrados (duplicado) Consulta la operacion existente
403 409 Misma Idempotency-Key con otro contenido Usa la misma intencion
501 429 Cupo agotado Amplia tu cupo
101 401 API Key invalida Revisa la API Key
103 403 Contribuyente o tipo no habilitado Habilita el contribuyente

El catalogo completo esta en Errores.

Siguientes pasos#

No se pudo completar la operacion. Recargar ✕