curl --request GET \
--url https://api.listo.delivery/v1/withdrawals/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.listo.delivery/v1/withdrawals/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.listo.delivery/v1/withdrawals/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.listo.delivery/v1/withdrawals/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.listo.delivery/v1/withdrawals/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.listo.delivery/v1/withdrawals/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.listo.delivery/v1/withdrawals/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "wd_2xN6bK9mR4tQ7vC1sZ8pLwYe",
"amount_cents": 250000,
"currency": "MXN",
"status": "paid",
"requested_at": "2026-07-30T18:30:00Z",
"resolved_at": "2026-06-09T15:00:00Z",
"test": false,
"clave_de_rastreo": "MBAN01002608120001234567",
"fee_cents": 0,
"kind": "standard",
"due_at": null
}{
"error": {
"code": "not_found",
"message": "No resource with that id exists for this API key.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/not_found",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}Obtén un retiro
Obtiene un retiro por su id wd_, que es como revisas uno que aún no se resuelve sin esperar a su webhook.
Una vez que está paid, clave_de_rastreo trae la clave de rastreo SPEI que tu banco usa para encontrar el depósito, así que este también es el endpoint para conciliar un pago si prefieres consultar en lugar de manejar el webhook.
curl --request GET \
--url https://api.listo.delivery/v1/withdrawals/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.listo.delivery/v1/withdrawals/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.listo.delivery/v1/withdrawals/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.listo.delivery/v1/withdrawals/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.listo.delivery/v1/withdrawals/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.listo.delivery/v1/withdrawals/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.listo.delivery/v1/withdrawals/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "wd_2xN6bK9mR4tQ7vC1sZ8pLwYe",
"amount_cents": 250000,
"currency": "MXN",
"status": "paid",
"requested_at": "2026-07-30T18:30:00Z",
"resolved_at": "2026-06-09T15:00:00Z",
"test": false,
"clave_de_rastreo": "MBAN01002608120001234567",
"fee_cents": 0,
"kind": "standard",
"due_at": null
}{
"error": {
"code": "not_found",
"message": "No resource with that id exists for this API key.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/not_found",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}Autorizaciones
Tu llave de API, enviada como Authorization: Bearer <key>. Las llaves reales y de prueba son distintas; la llave que envías decide en qué modo actúa la llamada. Para probar llamadas, usa una llave de prueba (empieza con lst_test_): no se envía ningún repartidor real y no se mueve dinero real, pero los webhooks se disparan y el dropoff.phone que des puede recibir mensajes de WhatsApp, así que usa tu propio número. Una llave real (empieza con lst_live_) reserva y cobra envíos reales.
Parámetros de ruta
Respuesta
La solicitud fue exitosa.
Una solicitud para mover dinero de tu saldo a tu cuenta bancaria.
El id del retiro, con prefijo wd_.
"wd_2xN6bK9mR4tQ7vC1sZ8pLwYe"
Lo que recibe tu banco. En un retiro same_day la tarifa es un SEGUNDO cargo en lugar de una deducción, así que esta cifra es lo que llega en cualquiera de los dos casos, y fee_cents es lo que tu saldo pierde encima de ella.
Cuánto costó el retiro, con IVA incluido. Siempre 0 en un retiro standard. Siempre está presente.
MXN standard es la vía gratuita: solo tu saldo liberado, enviado en 1 a 3 días hábiles. same_day cuesta fee_cents, puede alcanzar efectivo que todavía está retenido, y se envía el mismo día dentro de los horarios indicados en POST /v1/withdrawals.
standard, same_day pending hasta que una persona lo liquide. El paso a paid o failed es lo que anuncia withdrawal.updated.
pending, paid, failed Cuándo se espera que se haya enviado un retiro same_day, sellado cuando lo solicitaste y nunca recalculado después. Es null en cada retiro standard: la vía gratuita promete un rango de días hábiles en lugar de un instante.
Null mientras siga pendiente.
La clave de rastreo SPEI de la transferencia: el identificador que tu propio banco usa para localizar el depósito. Es con lo que concilias un pago contra un estado de cuenta bancario, y es la misma clave que ves en el panel de este retiro.
Siempre está presente, y es null hasta que se envía la transferencia. Se queda en null
para siempre en un retiro failed, porque nunca hubo transferencia.
"MBAN01002608120001234567"