Estimates

Get a download URL for an estimate file

Returns file metadata plus a short-lived presigned URL for downloading the file's bytes.

Which files:

  • Takeoff deliverables announced in the estimate webhook's takeoffFiles array
  • The input files you uploaded for this estimate job

Flexible ID lookup: The estimateJobId parameter accepts either the UUID returned from estimate creation or your internal externalId, matching the behaviour of GET /v1/estimate/{estimateJobId}.

Why a separate call: The presigned URL is deliberately not embedded in the webhook. Webhook payloads are signed when queued and retried for up to six hours, so an embedded URL could arrive already expired. Call this endpoint when you are ready to download.

URL lifetime: The URL is valid for 15 minutes and is a bearer credential that cannot be revoked once issued — do not log or share it. Request a fresh one whenever you need it; there is no limit beyond the usual rate limit.

get/v1/estimate/{estimateJobId}/files/{fileId}/download

Request

  • Base URL: https://api.handoff.ai
  • URL: https://api.handoff.ai/v1/estimate/{estimateJobId}/files/{fileId}/download
  • Auth: HTTP bearer

Path parameters

estimateJobIdstring required

Estimate identifier - either the UUID job ID or your internal externalId

Example:e1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c
fileIdstring required

File identifier, as reported in the webhook payload

Example:a7c31c2b-9f4e-5d3a-8b1c-2e6f4a5b6c7d

Response

File metadata and a presigned download URL

idstring uuid required

File identifier; matches takeoffFiles[].id from the estimate webhook

filenamestring required

File name including extension

contentTypestring required

MIME type of the file

sizeBytesinteger required

File size in bytes

downloadUrlstring uri required

Presigned S3 GET URL. Treat it as a bearer credential: do not log or forward it. Valid for 15 minutes; request a new one whenever you need it.

expiresAtstring date-time required

When downloadUrl stops working (ISO 8601)

Example response

{
  "id": "a7c31c2b-9f4e-5d3a-8b1c-2e6f4a5b6c7d",
  "filename": "takeoff-markup.pdf",
  "contentType": "application/pdf",
  "sizeBytes": 2456789,
  "downloadUrl": "https://bucket.s3.amazonaws.com/enterprise/...?X-Amz-Signature=...",
  "expiresAt": "2026-08-31T16:00:00.000Z"
}

Changes

No recorded changes to this operation across all 1 revision of this API.