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 |
Download a file
Section titled “Download a file”-
Find the hash. For one entry, read
content_hash(andsource_ext,name) fromGET /entries/{entry_id}. For an entry with dependencies, listmembersfromGET /entries/{entry_id}/closure. -
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" } -
Fetch
urlwith a plain request and noAuthorizationheader, beforeexpires_at:Terminal window curl -o SM_Barrel_Rusty.uasset "<url>" -
Hash the downloaded bytes and compare with
content_hash. Discard the file if they differ.
GET /blobs/{content_hash}/url
Section titled “GET /blobs/{content_hash}/url”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.
GET /blobs/{content_hash}
Section titled “GET /blobs/{content_hash}”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.
Filenames
Section titled “Filenames”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.
POST /entries/{entry_id}/pulled
Section titled “POST /entries/{entry_id}/pulled”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.
