ServiceLabs

XLS to XLSX

Send a legacy .xls workbook. Get back an .xlsx with every sheet carried over, cell by cell.

SyncPOST /v1/utilities/xls-to-xlsxWaits up to 90 s for the finished job.

AsyncPOST /v1/utilities/xls-to-xlsx/jobsAnswers 202 with the job id at once.

What it’s for

  • Exports from older systemsSoftware that still writes .xls can feed tools that only read .xlsx.
  • Before parsingLibraries that handle .xlsx well get a file they understand.
  • Old archivesBring a folder of old workbooks forward, one call per file.
  • Quick, in lineTypical workbooks convert in well under a second, so the sync route fits.

How it runs

  1. DownloadFetches the workbook from your http(s):// URL. The download times out after 30 s.
  2. ReadParses the binary BIFF format. A file that is already .xlsx, or a CSV renamed to .xls, fails.
  3. WriteCopies every sheet’s cell values into a new .xlsx. Formulas keep their last computed value.
  4. StoreOne .xlsx file on the job.

Values only. Formatting, charts, macros and merged-cell styling don’t come across.

Input

Send these fields as input in the request body. Anything not listed is refused with 400.

Field Type Required or optional Accepts
url string Required A valid http:// or https:// URL. No s3:// for this utility. The legacy .xls workbook (binary BIFF) to convert.

The request body

Field Required or optional What it is
input Required The fields above.
metadata Optional Your own key–value pairs, returned on the job. At most 50 keys, 4 KB serialised.
callbackUrl Optional Async route only. The finished job is POSTed here, signed. Up to 2,048 characters.

What comes back

Field Value
files[].url A link to the file.
result.files Exactly one file.
files[].contentType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Example

curl https://api.servicelabs.dev/v1/utilities/xls-to-xlsx \
  -H "Authorization: Bearer $DU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "url": "https://example.com/report.xls"
    }
  }'
Response · 200 OK
{
  "id": "job_01K7Z3Q4N5P6R7S8T9V0W1X2Y3",
  "object": "job",
  "utility": "xls-to-xlsx",
  "mode": "sync",
  "status": "succeeded",
  "createdAt": "2026-09-10T17:30:06.650Z",
  "finishedAt": "2026-09-10T17:30:09.009Z",
  "timings": { "queueMs": 0, "upstreamMs": 2140, "storageMs": 196, "totalMs": 2359 },
  "result": {
    "files": [
      {
        "url": "https://…/1789061409_report.xlsx",
        "name": "1789061409_report.xlsx",
        "size": 18342,
        "contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      }
    ]
  },
  "error": null,
  "links": {
    "self": "/v1/jobs/job_01K7Z3Q4N5P6R7S8T9V0W1X2Y3"
  }
}

An example job. File links point at the stored output; download anything you need to keep.

Bad input · 400
{
  "error": {
    "code": "invalid_request",
    "message": "input failed validation for xls-to-xlsx",
    "details": [
      {
        "path": "input.url",
        "message": "must be an http(s) URL"
      }
    ]
  }
}

Input is checked before anything runs. A 400 creates no job and costs nothing.

Limits

Limit Value
Runs up to 300 s (5 min)
Input Legacy .xls (binary BIFF) only
Kept Cell values on every sheet; formulas as their last value
Not kept Formatting, charts, macros, merged-cell styling
Download timeout 30 s
Sync wait 90 s, then 202 with the job id
Long-poll Up to 60 s per GET /v1/jobs/{id}?wait=
Rate limit Per key; 600 requests a minute unless set otherwise
Output files Kept for a limited period; download what you need

When it fails

A 400 means nothing ran. Everything else is a failed job with status: "failed", an error code and the utility’s own message.

Situation Status Code Job
url missing, or not http(s):// 400 invalid_request No job
The source can’t be downloaded: Failed to download file 422 upstream_rejected Failed job
Not a readable .xls: An error occurred during conversion: … 502 upstream_error Failed job
Ran past 300 s 504 upstream_timeout Failed job

Any call can also get 401 unauthorized, 403 forbidden (the key isn’t allowed this utility) or 429 rate_limited. The full list is in Conventions & errors.

Reference

Also in service

Try XLS to XLSX on your own file.

The console’s playground runs xls-to-xlsx against any URL you give it and shows the job it returns.