Official PHP SDK for HamroCDN — a simple, typed, and framework-agnostic way to upload, fetch, and manage files from your HamroCDN account.
Install via Composer:
composer require hamrocdn/sdk- PHP 8.0+
- GuzzleHTTP 7.10+
That’s it.
No Laravel dependencies, no magic — just pure PHP.
You can pass your API key directly, or rely on environment/config values if available.
use HamroCDN\HamroCDN;
$cdn = new HamroCDN('your-api-key');Alternatively, if your environment has them:
export HAMROCDN_API_KEY="your-api-key"the SDK automatically detects and uses them.
Here’s a quick example showing upload and fetch in action:
use HamroCDN\HamroCDN;
$cdn = new HamroCDN('your-api-key');
// Upload a file
$upload = $cdn->upload('/path/to/image.jpg');
echo "Uploaded: " . $upload->getOriginal()->getUrl() . PHP_EOL;
// Fetch it again
$fetched = $cdn->fetch($upload->getNanoId());
echo "Fetched: " . $fetched->getOriginal()->getUrl() . PHP_EOL;This SDK make use of public API provided by HamroCDN. To get your API key, sign up at hamrocdn.com and navigate to Edit Profile page in your dashboard.
The index() method returns paginated results.
You can provide pagination parameters such as page and per_page:
$uploads = $cdn->index(page: 1, per_page: 10);
foreach ($uploads->all() as $upload) {
    echo $upload->getNanoId() . ' - ' . $upload->getOriginal()->getUrl() . PHP_EOL;
}Returns an object containing
data(array ofUploadmodels) andmeta(pagination info).
Example of returned metadata:
{
  "meta": {
    "total": 120,
    "per_page": 10,
    "page": 1
  }
}To fetch all uploads without pagination, use the all() method:
$uploads = $cdn->all();
foreach ($uploads as $upload) {
    echo $upload->getNanoId() . ' - ' . $upload->getOriginal()->getUrl() . PHP_EOL;
}Returns an array of
Uploadmodels.
$upload = $cdn->fetch('abc123');
echo $upload->getOriginal()->getUrl(); // https://hamrocdn.com/abc123/original$upload = $cdn->upload('/path/to/image.png');
echo $upload->getNanoId(); // nano ID of the uploaded fileTo delete the file after a certain time, use the
deleteAfterparameter (in seconds):
$upload = $cdn->upload('/path/to/image.png', deleteAfter: 3600); // Deletes after 1 hourThis will set the
deleteAtproperty on the returnedUploadmodel.
$upload = $cdn->uploadByURL('https://example.com/image.png');
echo $upload->getOriginal()->getUrl();Also supports the
deleteAfterparameter.
| Property | Type | Description | 
|---|---|---|
| nanoId | string | Unique identifier of the upload | 
| user | Userornull | Owner of the file (if authenticated) | 
| deleteAt | Carbonornull | Deletion timestamp if temporary | 
| original | File | File information (URL, size) | 
- getNanoId():- string
- getUser():- ?User
- getDeleteAt():- ?Carbon
- getOriginal():- File
- toArray():- array
| Property | Type | Description | 
|---|---|---|
| name | string | Name of the uploader | 
| email | string | Email of the uploader | 
- getName():- string
- getEmail():- string
- toArray():- array
| Property | Type | Description | 
|---|---|---|
| url | string | Public CDN URL | 
| size | int | File size in bytes | 
- getUrl():- string
- getSize():- int
- toArray():- array
All SDK errors extend HamroCDN\Exceptions\HamroCDNException.
Example:
use HamroCDN\Exceptions\HamroCDNException;
try {
    $cdn->upload('/invalid/path.jpg');
} catch (HamroCDNException $e) {
    echo 'Upload failed: ' . $e->getMessage();
}The SDK automatically wraps:
- Network issues (GuzzleException)
- Invalid JSON responses
- Missing API key or misconfiguration
This SDK is built with Pest and supports real API integration tests.
A dedicated testing environment is configured within the HamroCDN infrastructure, ensuring safe, production-like validations.
Run tests locally:
composer testThis SDK is framework-agnostic. If you’re using Laravel, check out the companion package:
It provides service providers, configuration publishing, and automatic Facade binding.
- Fully typed with PHPStan annotations
- 100% PHP 8.0+ compatible
- Pint with laravelpreset for code style
- Rector for automated refactoring
- SonarCloud integration for code quality
This package is open-sourced software licensed under the MIT license.
Contributions are welcome! Please create a pull request or open an issue if you find any bugs or have feature requests.
If you find this package useful, please consider starring the repository on GitHub to show your support.