# Results and file delivery Read output only when it is available, and save files within their delivery window. ## Check result availability Use result.status rather than the presence or truthiness of output. When the result is available, output follows the inspected outputSchema and may legally be JSON null. Check billing independently to understand settlement. An expired or unavailable result does not erase the original Run or its bill. - [Retrieve a Run](/docs/api/get-run): Read execution, billing and result fields together. ## Use leased browser sessions When browser tools are available, inspect their current limits and prices. Get the private CDP URL from the session creation Run and use it only with your authorized browser client. Keep the CDP URL and base URL out of shared files, logs and chat. Use the session reference with the release tool when you finish. For a profile setup session, save authorized sign-in state or cancel to discard it. Check the original creation Run for the final bill after the session stops. While the session is active, its result can be available while billing is still HELD. For TinyFish automation, inspect browser_profile for the browser runtime and proxy_config for the built-in proxy switch and exit country. Omit either field to use the supplier default. If a Profile release is pending, retrieve the original release Run while Purrkey confirms whether the profile is gone. ## Save files before expiry Tools that support file output can return result.artifacts alongside output. Read result.deliveryUntil and each artifact's expiresAt. Save the authorized files within the delivery window. File links are sensitive. Download from the supplied HTTPS URL without forwarding your Purrkey API key to that host. Purrkey account credentials belong only on requests to the Purrkey API. Polling does not extend file expiry. An expired link does not authorize another paid creation; ask for a new task only when a new result is actually wanted. ## Understand freshness and reuse Inspect behavior.cacheScope and behavior.coalesceScope separately. They describe permission to reuse a result or combine concurrent work; one does not imply the other. cacheControl can tighten allowed caching, but cannot enable reuse that a tool has disabled. A refresh request cannot include maxAgeSeconds. Retrieving an existing Run always reads that Run; it does not request fresh source data.