Ethereum API: Transferencias ERC-20 con Una Sola Llamada REST
Envía ETH y tokens ERC-20 con una sola llamada REST en lugar de web3.js y JSON-RPC en bruto. Wallets, transferencias y webhooks de depósito, sin node que operar.
La Ethereum API de Chaingateway envía ETH y tokens ERC-20 mediante una única llamada REST autenticada y reemplaza la secuencia JSON-RPC en bruto que necesita una integración manual: codificar la transferencia contra el ABI del contrato, estimar el gas, gestionar el nonce y firmar la transacción, todo antes del manejo de errores. Librerías como web3.js y ethers.js envuelven esos pasos, pero siguen ejecutándose dentro de tu pila y siguen necesitando un endpoint de nodo detrás.
Chaingateway mueve ese trabajo al servidor. Un webhook te avisa cuando llegan depósitos. No hay SDK que instalar ni nodo que ejecutar. La prueba gratuita de 7 días empieza sin KYC.
Quickstart: tres pasos hasta tu primera transferencia
Crea una cuenta y copia tu API key. Regístrate aquí — la prueba empieza sin KYC, así que este paso toma alrededor de un minuto — luego copia la key de tu panel a la cabecera Authorization: Bearer de cada solicitud. Guárdala solo en el servidor; una key en código de frontend es pública.
Haz la llamada de hola mundo. GET /api/account devuelve los detalles de tu cuenta y demuestra que la key funciona.
Envía una transferencia de testnet, luego sal a producción. Añade X-Network: testnet, importa una key desechable mediante POST /api/v2/ethereum/addresses/import, financíala desde un faucet público, y envía la transferencia ERC-20 que se muestra abajo. Registra un webhook para que los depósitos vuelvan a ti, luego elimina la cabecera de testnet — el mismo código se ejecuta en mainnet.
REST en lugar de JSON-RPC y web3.js
JSON-RPC es el protocolo nativo de cada nodo de Ethereum, y para algunos trabajos (herramientas de consenso, indexación personalizada) quieres ese nivel de acceso. Nuestra guía sobre interactuar con nodos vía JSON-RPC muestra cómo se ve eso en PHP, Python y JavaScript.
Contar los round trips deja clara la idea. Una transferencia de token sobre JSON-RPC en bruto toca al menos cuatro métodos — eth_gasPrice, eth_estimateGas, eth_getTransactionCount y eth_sendRawTransaction — con codificación ABI y firma de transacción entre medias.
Para pagos, la abstracción vale la pena. En la solicitud de transacción de Chaingateway, gas limit, gas price y nonce son campos opcionales — omítelos y la API los rellena al construir y transmitir la transacción; pásalos explícitamente cuando quieras control. Tu parte del intercambio es una única solicitud HTTP que puedes escribir en cualquier lenguaje con una librería estándar.
Todo lo que necesitas para construir en Ethereum
Webhooks (IPN)
Notificaciones en tiempo real para transacciones entrantes, enviadas en cuanto una transferencia coincidente se liquida on-chain. Con un secreto personal fijado en tu perfil, cada notificación lleva una cabecera X-Signature que tu servidor puede verificar. Las entregas fallidas las lista la API y se pueden reenviar con una sola llamada.
Transacciones sencillas
Envía ETH y tokens ERC-20 sin tocar el mercado de comisiones: gas limit, gas price y nonce son campos opcionales de la solicitud que la API rellena por ti. Tú aportas el destinatario, el token y el importe.
Manejo seguro de direcciones
Validación del formato de dirección en cada solicitud — las direcciones malformadas fallan con un 422 antes de que nada se construya — y una arquitectura non-custodial. Las keys existentes entran mediante POST /api/v2/ethereum/addresses/import.
Consultas decodificadas
Las transacciones vuelven como JSON legible mediante GET /api/v2/ethereum/transactions/{txid}/decoded, en un formato que tu aplicación puede leer y almacenar sin parseo adicional.
Endpoints de Ethereum de un vistazo
| Ruta | Método | Qué hace |
|---|---|---|
/api/account | GET | Detalles de la cuenta; la comprobación estándar de la key |
/api/v2/ethereum/addresses/import | POST | Trae una private key existente bajo la gestión de la API |
/api/v2/ethereum/transactions/erc20 | POST | Envía una transferencia de token ERC-20 |
/api/v2/ethereum/webhooks/notifications | GET | Lista las notificaciones de depósito recibidas |
Cuatro rutas cubren el ciclo de pago: demostrar la key, cargar una wallet, enviar tokens, auditar lo que llegó. Los esquemas exactos de solicitud y respuesta están en la referencia de la API, y el mismo diseño se repite en Polygon, Arbitrum y — con bep20 en lugar de erc20 — en BNB Smart Chain.
El ejemplo central: envía un token ERC-20
Paso 1: importa la dirección desde la que quieres enviar.
curl -X POST https://app.chaingateway.io/api/v2/ethereum/addresses/import \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "0xYourWallet...", "privatekey": "0x...", "password": "strong-wallet-password"}'curl -X POST https://app.chaingateway.io/api/v2/ethereum/transactions/erc20 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contractaddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"from": "0xYourWallet...",
"to": "0xRecipient...",
"amount": 25.50,
"password": "strong-wallet-password"
}'curl https://app.chaingateway.io/api/v2/ethereum/webhooks/notifications \
-H "Authorization: Bearer YOUR_API_KEY"Esa es la transferencia completa, campos de gas incluidos — crea una cuenta y envíala primero en Sepolia.
Viniendo de web3.js: la misma transferencia, dos veces
Si hoy mantienes una integración con web3.js, aquí está la comparación honesta. Una transferencia ERC-20 mediante la librería se ve más o menos así:
// web3.js against your own RPC endpoint
const { Web3 } = require("web3");
const web3 = new Web3("https://your-rpc-endpoint");
const token = new web3.eth.Contract(ERC20_ABI, "0xdAC17F958D2ee523a2206206994597C13D831ec7");
const data = token.methods.transfer(recipient, amountInBaseUnits).encodeABI();
const tx = {
from: sender,
to: token.options.address,
data,
gas: await web3.eth.estimateGas({ from: sender, to: token.options.address, data }),
gasPrice: await web3.eth.getGasPrice(),
nonce: await web3.eth.getTransactionCount(sender),
};
const signed = await web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
await web3.eth.sendSignedTransaction(signed.rawTransaction);
Más allá de lo que cabe en el fragmento, este código posee un archivo ABI, convierte importes legibles en unidades base a mano (te equivocas en los decimales y envías una millonésima parte de la suma prevista, o un millón de veces más), y mantiene una private key en bruto en memoria de la aplicación. La versión REST es el único POST de arriba: importe como cadena decimal, decimales gestionados del lado del servidor, key cifrada en reposo detrás de una contraseña.
La migración no necesita un fin de semana de reescritura. Ambos estilos son llamadas sencillas, así que ejecútalos en paralelo: enruta los nuevos flujos de pago por REST, deja las interacciones de contrato personalizadas en web3.js, y retira la librería donde ya no se gane su complejidad. Los equipos que usaban web3.js solo para transferencias y comprobaciones de saldo suelen eliminar la dependencia por completo.
Quién paga el gas — y cómo funciona
Cada transacción de Ethereum quema gas, pagado en ETH por la dirección remitente, nunca por el destinatario. Una wallet con miles de USDT pero cero ETH no puede enviar un solo token, porque el contrato ERC-20 no tiene forma de cubrir su propio coste de ejecución. Recibir tokens no cuesta nada al destinatario.
Este detalle atrapa a más integraciones ERC-20 que cualquier otro. Si tus transferencias impulsadas por la API vienen de una wallet de tesorería, esa wallet necesita un saldo de ETH junto a sus tokens, y recargarla pertenece a la lista de tareas operativas junto a la renovación de certificados.
Cuánto cuesta el gas
Una transferencia simple de ETH cuesta exactamente 21.000 de gas — una constante del protocolo. Una transferencia ERC-20 ejecuta código de contrato y cuesta un múltiplo de eso, con la cifra exacta variando según el contrato del token. El precio por unidad flota con la demanda: desde la actualización London de 2021, la comisión se divide en una base fee que la red quema y una propina de prioridad al proponente del bloque, y ambas suben bajo congestión. La consecuencia práctica: la misma transferencia de USDT cuesta centavos un domingo tranquilo y considerablemente más durante un mint popular.
Lo que la API gestiona por ti
Gas limit, gas price y los topes de EIP-1559 (maxFeePerGas, maxPriorityFeePerGas) son campos opcionales de la solicitud — omítelos y la API los rellena al construir tu transacción, o fíjalos por solicitud cuando quieras el control. Dos cosas siguen siendo responsabilidad tuya: mantener ETH en las wallets remitentes, y decidir dónde tienen sentido económico las transferencias pequeñas — cuando las comisiones de mainnet se acercan al importe de la transferencia, la misma llamada en Polygon o Arbitrum está a un cambio de ruta de distancia.
Recibir es gratis
Una dirección de depósito no necesita ETH para aceptar tokens. El gas se vuelve tu problema solo cuando los fondos salen — incluido cuando consolidas depósitos de clientes en una wallet de tesorería, que es en sí misma una transacción saliente desde cada dirección de depósito.
Tiempos de bloque y finalidad en Ethereum
Desde el cambio a proof of stake, el ritmo de Ethereum es fijo en lugar de estadístico. Los bloques llegan en slots de doce segundos, 32 slots forman una época de 6,4 minutos, y un bloque se finaliza tras aproximadamente dos épocas — llámalo 13 minutos — una vez que dos tercios del ETH en staking lo ha atestiguado (parámetros del protocolo a mediados de 2026). Finalizado significa que la red no puede revertir el bloque sin destruir una gran parte de todo el ETH en staking, lo cual lo sitúa en una categoría distinta de la liquidación probabilística de Bitcoin.
Para la lógica de pagos, la línea temporal se lee así: una transferencia suele incluirse en un bloque en segundos a un minuto; cada slot adicional añade seguridad; tras unos 13 minutos es final en el sentido estricto. La mayoría de aplicaciones acreditan depósitos bastante antes de la finalidad — la inclusión más un puñado de bloques cubre los importes habituales — mientras que los exchanges suelen retener los grandes retiros hasta la finalización. El webhook de depósito te da el evento on-chain; dónde fijas el umbral de acreditación es una línea de política en tu configuración, no en la nuestra.
Cualquier token en Ethereum, incluido el tuyo
USDT, USDC, DAI y los demás tokens consolidados funcionan de fábrica, con importes en unidades de token en lugar de unidades base en bruto. ¿Lanzas tu propio ERC-20? Aporta el contract address y el mismo endpoint lo envía. Sin proceso de listado, sin esperas. El contexto sobre el propio estándar está en nuestra guía del estándar ERC-20 token.
Por qué los desarrolladores eligen Ethereum
- Es la plataforma de smart contracts más adoptada, probada en batalla desde 2015.
- El ecosistema DeFi es el mayor de cualquier chain, con miles de dApps con las que integrarse.
- El precio del gas es dinámico, basado en la demanda de red; puedes dejar los campos de comisión a la API o limitarlos por solicitud con los parámetros de EIP-1559.
- El trabajo de escalado continúa, y Polygon y Arbitrum están disponibles a través de la misma API cuando las comisiones de mainnet aprietan.
Una integración, cuatro chains EVM
El patrón de ruta ERC-20 se repite en las redes EVM: /api/v2/polygon/transactions/erc20, /api/v2/arbitrum/transactions/erc20, y /api/v2/bsc/transactions/bep20 para BNB Smart Chain. El código escrito para Ethereum se traslada editando la ruta. Cuando el gas de mainnet se vuelve demasiado caro para transferencias pequeñas, moverlas a Polygon es un cambio de una línea. La lista completa de chains está en la visión general de la blockchain API.
Construido para casos de uso reales
Los bloques de construcción anteriores cubren la mayoría de patrones de producción que vemos: flujos de checkout que aceptan USDT o USDC, exchanges que acreditan depósitos y procesan retiros a escala, proyectos de tokens que distribuyen mediante airdrops o calendarios de vesting, y negocios de suscripción que facturan en stablecoins cada mes. Todos se reducen a las mismas dos llamadas: enviar una transacción, recibir un webhook.
Dos construcciones, de principio a fin
Checkout en stablecoins para una tienda online
El cliente elige "pagar con USDT" y tu backend asigna una dirección de depósito para el pedido — una dirección por factura, así que la atribución nunca depende de emparejar importes. Muestra la dirección con el importe, y luego espera el webhook. Cuando llega la notificación, cambia el pedido a "pago detectado" para que el comprador vea una respuesta rápida; acredítalo una vez que la transacción tenga la profundidad que tu política exige (la sección de finalidad anterior te da las cifras). Un caso límite pertenece al código desde el primer día: las wallets que restan comisiones del importe introducido producen pagos ligeramente insuficientes, y tu tolerancia ante eso debería ser un valor de configuración, no un ticket de soporte.
Retiros para una plataforma de trading
Los usuarios piden pagos; tu trabajo es enviar muchas transferencias ERC-20 de forma fiable. Pon cada retiro en cola en tu base de datos con una columna de estado, y luego recorre la cola con POST /api/v2/ethereum/transactions/erc20 — una solicitud por pago, registrando la respuesta antes de pasar al siguiente. La regla que mantiene contentos a los auditores: una llamada HTTP que hizo timeout no es una transacción fallida. Verifica contra tus registros y GET /api/v2/ethereum/transactions, que lista cada transacción creada mediante la API, antes de reenviar nada, o pagarás a alguien dos veces. Monitoriza también el saldo de ETH de la wallet de tesorería, ya que cada transferencia saliente quema gas, y alerta con antelación en lugar de cuando la cola se atasque.
Manejo de errores
Aquí existen dos capas de fallo: errores HTTP de la API, y condiciones on-chain que tu lógica tiene que absorber.
El lado HTTP sigue la convención. Un 401 significa que la key falta o es inválida — un problema de configuración, no un candidato a reintentar. Otras respuestas 4xx dicen que la solicitud está mal: una dirección malformada, un contrato desconocido, un campo ausente. Registra el cuerpo de la respuesta y corrige el llamador. Los reintentos con backoff pertenecen solo a las respuestas 5xx y a los timeouts de red.
El lado de la chain es donde el código de pagos se gana el sueldo. Una transferencia desde una wallet sin ETH suficiente para el gas falla aunque el saldo de tokens sea amplio — monitoriza los saldos de gas de forma proactiva en lugar de descubrirlos vacíos en un mensaje de error. La congestión puede retrasar la inclusión; eso es un retraso, no un fallo, y tu interfaz debería distinguir ambos. Y la regla del recorrido de retiros merece repetirse, porque protege contra el error más caro de este dominio: nunca reenvíes una transferencia solo porque la respuesta HTTP nunca llegó. Confirma primero que realmente no ocurrió.
Para depósitos, crea el hábito de conciliar. GET /api/v2/ethereum/webhooks/notifications lista lo que se entregó; una comparación nocturna contra tu contabilidad detecta cualquier cosa que un error o una interrupción se haya tragado, mientras la solución sigue siendo barata.
Testnet: la misma API con monedas sin valor
Añade X-Network: testnet a cualquier solicitud y se ejecuta en la red de pruebas. Rutas, cuerpos de solicitud y formatos de respuesta se mantienen idénticos a mainnet, lo cual significa que tus pruebas de integración ejercitan la ruta de código real en lugar de mocks. Financia una wallet de prueba desde un faucet público, ejecuta transferencias, recibe webhooks — el ciclo completo no cuesta nada.
Organízalo para que la cabecera venga de la configuración: staging la fija, producción no, y no existe diferencia de código entre ambos. Da también a staging una URL de callback separada, o los depósitos de prueba caerán en tu manejador de webhook de producción. Salir a producción es entonces la eliminación de una cabecera, deliberadamente anticlimática.
Integración en cuatro pasos
Obtén tu API key. El registro es gratis y la prueba empieza sin KYC.
Haz tu primera solicitud. Verifica la key con GET /api/account, luego importa o crea direcciones.
Configura webhooks. Apunta las notificaciones a tu endpoint y verifica la firma HMAC.
Sal a producción. Elimina la cabecera X-Network: testnet; el código idéntico se ejecuta en mainnet.
Qué funciona en cada chain
Ethereum establece el patrón de solicitud ERC-20 que BSC, Polygon y Arbitrum siguen todos con un segmento de ruta cambiado. La tabla siguiente lo sitúa junto a las otras seis chains que cubre la API.
| Chain | Direcciones | Transferencias de tokens | Webhooks de depósito |
|---|---|---|---|
| Bitcoin | POST /api/v2/bitcoin/wallets/{wallet}/addresses | — (sin estándar de token) | GET /api/v2/bitcoin/webhooks/notifications |
| Ethereum | POST /api/v2/ethereum/addresses/import | ERC-20: POST /api/v2/ethereum/transactions/erc20 | GET /api/v2/ethereum/webhooks/notifications |
| TRON | POST /api/v2/tron/addresses/import | TRC-20 y TRC-10: POST /api/v2/tron/transactions/trc20 y .../trc10 | GET /api/v2/tron/webhooks/notifications |
| Solana | POST /api/v2/solana/addresses | SPL: POST /api/v2/solana/transactions/SPL | — |
| BNB Smart Chain | POST /api/v2/bsc/addresses/import | BEP-20: POST /api/v2/bsc/transactions/bep20 | GET /api/v2/bsc/webhooks/notifications |
| Polygon | POST /api/v2/polygon/addresses/import | ERC-20: POST /api/v2/polygon/transactions/erc20 | GET /api/v2/polygon/webhooks/notifications |
| Arbitrum | POST /api/v2/arbitrum/addresses/import | ERC-20: POST /api/v2/arbitrum/transactions/erc20 | GET /api/v2/arbitrum/webhooks/notifications |
Dos notas al pie para leer bien la tabla. Primero: TRON es la integración más profunda de la plataforma. Más allá de las rutas anteriores, la documentación cubre staking (POST /api/v2/tron/freeze y /delegate), parámetros de la chain, y un par de auto-firma — /transactions/trc20/build para construir una transacción y /transactions/broadcast para enviar una que hayas firmado localmente. Si tu equipo de cumplimiento insiste en que las private keys nunca salgan de tus servidores, ese patrón de construir y transmitir es tu vía de entrada.
Segundo: un guion significa que la documentación actual no recoge una ruta v2 para esa celda, no que la red sea de segunda categoría. Bitcoin no tiene estándar de token, de ahí la celda de token vacía — el BTC nativo funciona con su propio modelo de wallet en su lugar: crea una wallet cifrada con contraseña con POST /api/v2/bitcoin/wallets, deriva direcciones de depósito bajo ella, y envía con POST /api/v2/bitcoin/transactions. La documentación de Solana cubre creación de direcciones, transferencias de SOL y SPL, y consultas de saldo y bloque, pero aún sin webhooks. Para cualquier cosa no listada aquí, la referencia de la API tiene el estado actual.
Preguntas frecuentes
¿Listo para integrar Ethereum?
Crea una cuenta en app.chaingateway.io/register, importa una wallet de testnet y envía una transferencia ERC-20 en Sepolia. La referencia completa de endpoints está en la documentación, y planes y límites de tasa tienen su propia página.