curl --request GET \
--url https://api.listo.delivery/v1/request_logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.listo.delivery/v1/request_logs"
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/request_logs', 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/request_logs",
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/request_logs"
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/request_logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.listo.delivery/v1/request_logs")
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{
"data": [
{
"id": "req_4f9c2b7e1a8d3056b1c2d3e4",
"method": "POST",
"path": "/v1/deliveries",
"endpoint": "api/v1/deliveries#create",
"status": 201,
"error_code": null,
"duration_ms": 120,
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10",
"api_key_prefix": "lst_live_Ab1",
"test": false,
"created_at": "2026-08-01T12:00:00Z"
},
{
"id": "req_4f9c2b7e1a8d3056b1c2d3e4",
"method": "POST",
"path": null,
"endpoint": "api/v1/deliveries#create",
"status": 201,
"error_code": null,
"duration_ms": 120,
"request_id": null,
"api_key_prefix": "lst_live_Ab1",
"test": false,
"created_at": "2026-07-01T12:00:00Z"
}
],
"has_more": false,
"cursor": null
}List your request log
Every call your keys made to this API, newest first, keyset-paginated like every list here. Use it to answer “what did my code send, and what did Listo say?” without asking anyone.
A key only ever sees the calls of its own world: a live key reads live calls and a test key reads test calls, and neither can read the other’s.
Filter by status (failed is every answer of 400 or more),
endpoint, created_after and created_before. A filter narrows the
whole history, never only the page you are on.
What is recorded: calls that identified a key. A call with no key or a wrong one is not yours and is not here, and neither is a call refused for rate limiting. Calls are kept indefinitely. Reading this list, one entry or your events or webhook deliveries is itself logged, but without bodies, so the log does not copy itself every time you read it.
The list carries no bodies. GET /v1/request_logs/{id} returns the call
with them.
curl --request GET \
--url https://api.listo.delivery/v1/request_logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.listo.delivery/v1/request_logs"
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/request_logs', 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/request_logs",
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/request_logs"
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/request_logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.listo.delivery/v1/request_logs")
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{
"data": [
{
"id": "req_4f9c2b7e1a8d3056b1c2d3e4",
"method": "POST",
"path": "/v1/deliveries",
"endpoint": "api/v1/deliveries#create",
"status": 201,
"error_code": null,
"duration_ms": 120,
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10",
"api_key_prefix": "lst_live_Ab1",
"test": false,
"created_at": "2026-08-01T12:00:00Z"
},
{
"id": "req_4f9c2b7e1a8d3056b1c2d3e4",
"method": "POST",
"path": null,
"endpoint": "api/v1/deliveries#create",
"status": 201,
"error_code": null,
"duration_ms": 120,
"request_id": null,
"api_key_prefix": "lst_live_Ab1",
"test": false,
"created_at": "2026-07-01T12:00:00Z"
}
],
"has_more": false,
"cursor": null
}Authorizations
Your API key, sent as Authorization: Bearer <key>. Live and test keys are separate; the key you send decides which world the call acts in. To try calls, use a test key (it starts with lst_test_): no real courier is sent and no real money moves, but webhooks fire and the dropoff.phone you give can receive WhatsApp messages, so use your own number. A live key (it starts with lst_live_) books and charges real deliveries.
Query Parameters
Only calls that failed (failed: answered with a status of 400 or more) or that succeeded (succeeded). Any other value matches nothing.
failed, succeeded Only calls to one operation, by the exact endpoint value a row shows.
Only the call with this request id, matched exactly: the X-Request-Id response header of that call, which is also error.request_id in an error body. An id that matches no call of yours gives an empty list.
Only calls received at or after this instant (ISO-8601). A value that does not parse is 422 validation_failed with param: "created_after".
Only calls received at or before this instant (ISO-8601). A value that does not parse is 422 validation_failed with param: "created_before".
The cursor of the previous page, to read the next one. Opaque: never build or parse one.