Skip to content

TurboUploadResponse drops receipt fields (timestamp, signature, public, version, deadlineHeight) #5

@kempsterrrr

Description

@kempsterrrr

Summary

TurboUploadResponse only maps 5 of 10 fields from the Turbo upload API response. The receipt fields timestamp, signature, public, version, and deadlineHeightdocumented 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 uploadsclient.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 uploadschunked.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 TurboUploadStatusTurboUploadResponse conversion for chunked uploads.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions