Input JSON
{
"format": "xlsx",
"sheets": [
{
"name": "Inventory",
"columns": [
{
"key": "item",
"label": "Item",
"type": "text"
},
{
"key": "qty",
"label": "Quantity",
"type": "number"
}
],
"rows": [
{
"item": "Cotton sheet",
"qty": 12
},
{
"item": "Linen towel",
"qty": 7
}
],
"freeze_header": true,
"autofilter": true
}
]
}
Captured output JSON
{
"format": "xlsx",
"content_type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename": "workbook.xlsx",
"sheets": [
{
"name": "Inventory",
"rows": 2,
"columns": 2
}
],
"cells_written": 6,
"cells_repaired": 0,
"formula_guard": {
"guarded_cells": 0,
"triggers": [
"=",
"+",
"-",
"@",
"tab",
"cr"
],
"method": "quote_prefix",
"note": "Values are always written as text cells, never as formulas. A value starting with =, +, -, @, a tab or a carriage return also gets the quotePrefix flag on its cell format, which is what Excel writes for a leading apostrophe: the stored value is unchanged and nothing extra is displayed, but no tool re-reads it as a formula."
},
"dates": "Dates are stored as 1900-system serial numbers with a date format applied: serial 1 is 1900-01-01. Excel's 1900 system keeps Lotus 1-2-3's non-existent 29 February 1900, so that day is skipped here and serial 61 is 1900-03-01, which is what Excel shows.",
"text_storage": "Text is stored as shared strings, and every value is read back as the value that was sent. A carriage return is written as the XML character reference because XML turns a raw carriage return into a line feed before any reader sees it; nothing else about the text is rewritten.",
"bytes": 2661,
"sha256": "d0e3de6bcba95549dbbcdc955350912bb453047440f83c30b19c5183a6e21e58",
"file_base64": "XLSX workbook, 2.6 KB, base64 in the real response",
"source": "The file contains only the values supplied in the request. Nothing is looked up, calculated or added, and no copy of the data is kept after the response is sent.",
"checked_at": "2026-10-20T20:47:48.845Z"
}
API call
curl -s -X POST https://getattest.com.au/api/v1/sheets/build \
-H "authorization: Bearer $ATTEST_API_KEY" \
-H "content-type: application/json" \
--data-raw '{"format":"xlsx","sheets":[{"name":"Inventory","columns":[{"key":"item","label":"Item","type":"text"},{"key":"qty","label":"Quantity","type":"number"}],"rows":[{"item":"Cotton sheet","qty":12},{"item":"Linen towel","qty":7}],"freeze_header":true,"autofilter":true}]}'
Run this call with your own bearer key. Issue an API key.
About this example
The input was validated and run locally through the registered service. The output above is a display preview of the captured service result. File bytes are described instead of printed, and strings longer than 400 characters are truncated; the HTTP API also adds call_id, credits_charged and credits_remaining. Timestamps and generated identifiers will vary.
Source: apps/api/svc/sheets_build.mjs
Tool reference and limits · API key guide