GET
/logs
Returns a paginated history of all file conversions made under your account. Filter by status to find failed or in-progress conversions.
Required scope:
convertacoal:read
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number to retrieve |
| per_page | integer | 20 | Results per page. Maximum: 100 |
| status | string | — | Filter by status. One of: completed, failed, processing |
Response 200 OK
{
"success": true,
"data": [
{
"id": 123,
"original_filename": "report.csv",
"input_format": "csv",
"output_format": "xlsx",
"status": "completed",
"file_size_bytes": 48320,
"download_url": "https://coals.ai/api/v1/convertacoal/download/123",
"created_at": "2026-03-03T14:22:08Z",
"completed_at": "2026-03-03T14:22:09Z"
},
{
"id": 122,
"original_filename": "data.json",
"input_format": "json",
"output_format": "pdf",
"status": "failed",
"file_size_bytes": 12048,
"error": "Malformed JSON: unexpected token at line 34",
"created_at": "2026-03-03T13:10:45Z",
"completed_at": null
}
],
"pagination": {
"current_page": 1,
"per_page": 20,
"total": 87,
"total_pages": 5,
"has_next_page": true,
"has_prev_page": false
}
}
Log Entry Fields
| Field | Description |
|---|---|
| status | completed, failed, or processing |
| download_url | Present only when status is completed. Valid for 24 hours from conversion time. |
| error | Present only when status is failed. Human-readable failure reason. |
| completed_at | ISO 8601 timestamp when the conversion finished. null if still processing or failed before completing. |
Example Requests
Fetch the first page of logs:
curl https://coals.ai/api/v1/convertacoal/logs \ -H "Authorization: Bearer YOUR_API_KEY"
// Using Guzzle $response = $client->get('https://coals.ai/api/v1/convertacoal/logs', [ 'headers' => ['Authorization' => 'Bearer YOUR_API_KEY'] ]); $data = json_decode($response->getBody(), true);
# Using requests import requests response = requests.get( "https://coals.ai/api/v1/convertacoal/logs", headers={"Authorization": "Bearer YOUR_API_KEY"} ) data = response.json()
# Using net/http require "net/http" require "json" uri = URI("https://coals.ai/api/v1/convertacoal/logs") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) } data = JSON.parse(res.body)
// Using fetch (Node 18+) const response = await fetch("https://coals.ai/api/v1/convertacoal/logs", { method: "GET", headers: { "Authorization": "Bearer YOUR_API_KEY" } }); const data = await response.json();
Filter to failed conversions only:
curl -G https://coals.ai/api/v1/convertacoal/logs \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "status=failed" \ --data-urlencode "per_page=50"
// Using Guzzle $response = $client->get('https://coals.ai/api/v1/convertacoal/logs', [ 'headers' => ['Authorization' => 'Bearer YOUR_API_KEY'], 'query' => [ 'status' => 'failed', 'per_page' => '50', ] ]); $data = json_decode($response->getBody(), true);
# Using requests import requests response = requests.get( "https://coals.ai/api/v1/convertacoal/logs", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"status": "failed", "per_page": "50"} ) data = response.json()
# Using net/http require "net/http" require "json" uri = URI("https://coals.ai/api/v1/convertacoal/logs") uri.query = URI.encode_www_form({"status" => "failed", "per_page" => "50"}) req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) } data = JSON.parse(res.body)
// Using fetch (Node 18+) const response = await fetch(`https://coals.ai/api/v1/convertacoal/logs?status=failed&per_page=50`, { method: "GET", headers: { "Authorization": "Bearer YOUR_API_KEY" } }); const data = await response.json();