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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions