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.