Summary
TurboUploadResponse only maps 5 of 10 fields from the Turbo upload API response. The receipt fields timestamp, signature, public, version, and deadlineHeight — documented as part of the upload receipt — are silently discarded.
Per the Turbo docs: "the service does not store and retrieve your receipts for you." Once these fields are dropped during response parsing, they're gone permanently.
Where the fields are lost
Single uploads — client.py _upload_single():
result = response.json()
return TurboUploadResponse(
id=result["id"],
owner=result["owner"],
data_caches=result.get("dataCaches", []),
fast_finality_indexes=result.get("fastFinalityIndexes", []),
winc=result.get("winc", "0"),
)
# timestamp, signature, public, version, deadlineHeight in `result` are discarded
Chunked uploads — chunked.py has a second issue. get_status() captures timestamp in TurboUploadStatus, but _upload_chunked() then converts to TurboUploadResponse which drops it again:
return TurboUploadResponse(
id=status.id or "",
owner=status.owner or "",
data_caches=status.data_caches,
fast_finality_indexes=status.fast_finality_indexes,
winc=status.winc or "0",
# status.timestamp is NOT carried over
)
Confirmed by testing
We made an upload and captured the raw response.json() directly (bypassing the SDK's response mapping). The API returns all 10 fields:
id, timestamp, winc, version, deadlineHeight, dataCaches,
fastFinalityIndexes, public, signature, owner
The timestamp is millisecond-precision (1776068746997), and signature/public enable independent receipt verification.
Why this matters
For regulatory/compliance use cases (e.g., EU AI Act), the signed Turbo receipt with its millisecond timestamp serves as an independent third-party attestation of when data was submitted for permanent storage. This fills the gap between the uploader's self-reported timestamp and Arweave block confirmation. Losing these fields makes the receipt unverifiable.
Suggested fix
Add the missing fields to TurboUploadResponse:
@dataclass
class TurboUploadResponse:
id: str
owner: str
data_caches: List[str]
fast_finality_indexes: List[str]
winc: str
timestamp: Optional[int] = None
signature: Optional[str] = None
public: Optional[str] = None
version: Optional[str] = None
deadline_height: Optional[int] = None
And extract them in _upload_single():
return TurboUploadResponse(
...
timestamp=result.get("timestamp"),
signature=result.get("signature"),
public=result.get("public"),
version=result.get("version"),
deadline_height=result.get("deadlineHeight"),
)
Same fix needed in the TurboUploadStatus → TurboUploadResponse conversion for chunked uploads.
Summary
TurboUploadResponseonly maps 5 of 10 fields from the Turbo upload API response. The receipt fieldstimestamp,signature,public,version, anddeadlineHeight— documented as part of the upload receipt — are silently discarded.Per the Turbo docs: "the service does not store and retrieve your receipts for you." Once these fields are dropped during response parsing, they're gone permanently.
Where the fields are lost
Single uploads —
client.py_upload_single():Chunked uploads —
chunked.pyhas a second issue.get_status()capturestimestampinTurboUploadStatus, but_upload_chunked()then converts toTurboUploadResponsewhich drops it again:Confirmed by testing
We made an upload and captured the raw
response.json()directly (bypassing the SDK's response mapping). The API returns all 10 fields:The
timestampis millisecond-precision (1776068746997), andsignature/publicenable independent receipt verification.Why this matters
For regulatory/compliance use cases (e.g., EU AI Act), the signed Turbo receipt with its millisecond timestamp serves as an independent third-party attestation of when data was submitted for permanent storage. This fills the gap between the uploader's self-reported timestamp and Arweave block confirmation. Losing these fields makes the receipt unverifiable.
Suggested fix
Add the missing fields to
TurboUploadResponse:And extract them in
_upload_single():Same fix needed in the
TurboUploadStatus→TurboUploadResponseconversion for chunked uploads.