Skip to content

Downloads

Every file in Prophouse is a blob addressed by the SHA-256 of its bytes. An entry’s current version is content_hash on the entry; its dependencies are in GET /entries/{entry_id}/closure. Downloading is free of charge on every plan and does not count toward any allowance.

Method and path Scope Purpose
GET /blobs/{content_hash}/url read Get a presigned download URL as JSON
GET /blobs/{content_hash} read Redirect to the bytes
POST /entries/{entry_id}/pulled write Record that you handed this entry’s files to someone
  1. Find the hash. For one entry, read content_hash (and source_ext, name) from GET /entries/{entry_id}. For an entry with dependencies, list members from GET /entries/{entry_id}/closure.

  2. Ask for a download URL:

    Terminal window
    curl -H "Authorization: Bearer $PH_KEY" \
    "https://api.prophouse.dev/api/v1/blobs/9f2c...e41a/url"
    { "url": "https://<presigned-host>/...&X-Amz-Signature=...", "expires_at": "2026-07-25T13:00:00Z" }
  3. Fetch url with a plain request and no Authorization header, before expires_at:

    Terminal window
    curl -o SM_Barrel_Rusty.uasset "<url>"
  4. Hash the downloaded bytes and compare with content_hash. Discard the file if they differ.

Returns {"url", "expires_at"}. url is a short-lived presigned URL. Prefer this over the redirect below if your HTTP client forwards headers across redirects. Unknown hash: 404 BLOB_MISSING.

Answers 302 to the same kind of presigned URL, with ETag: <content_hash> and Cache-Control: private, no-store. Follow it without the Authorization header. Unknown hash: 404 BLOB_MISSING.

content_hash must be 64 lowercase hex characters; anything else is 422.

Blobs are stored by hash, not by name. Name the file yourself:

Kind of file Suggested name
Unreal package (source_ext is null) The last segment of origin_path with the package extension (usually .uasset), placed at origin_path under the project’s Content/ folder
Source file (source_ext set) <entry name>.<source_ext>, for example Barrel.fbx

A check-out also returns a ready-made suggested_filename; see Check-out locks.

A download beacon. Call it after you give an entry’s files to a person or a pipeline outside a pull job. It marks the entry ever_pulled (which protects it from hard deletion) and adds a download.pull event to the activity feed.

No body. Returns 204. Repeating it is safe; each call records one more download event. Unknown entry: 404 ENTRY_NOT_FOUND. It needs write scope, and it keeps working while the workspace is read-only for billing.