ESC
Type to search across all documentation
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();