1. Go to this page and download the library: Download freeloapp/php-sdk library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
freeloapp / php-sdk example snippets
use Freelo\Sdk\Freelo;
use Freelo\Sdk\Auth\ApiKeyCredentials;
$freelo = new Freelo(
new ApiKeyCredentials('your-api-key', '[email protected]'),
userAgent: 'MyApp/1.0',
);
// List projects
foreach ($freelo->projects()->list() as $project) {
echo $project->name . "\n";
}
// Create a task
$task = $freelo->tasks()->create(
projectId: 123,
tasklistId: 456,
data: ['name' => 'New task', 'priority_enum' => 'h']
);
use Freelo\Sdk\Auth\ApiKeyCredentials;
// Using environment variables (recommended)
$credentials = new ApiKeyCredentials(
apiKey: getenv('FREELO_API_KEY'),
email: getenv('FREELO_EMAIL')
);
$freelo = new Freelo($credentials, userAgent: 'MyApp/1.0');
$projects = $freelo->projects()->list(); // List active projects
$project = $freelo->projects()->get(123); // Get project by ID
$freelo->projects()->archive(123); // Archive project
$freelo->projects()->activate(123); // Activate archived project
// Paginated results
$result = $freelo->projects()->getAll(['p' => 0]);
echo "Total: " . $result->getTotal();
$tasks = $freelo->tasks()->listInTasklist(123, 456); // List tasks in tasklist
$task = $freelo->tasks()->get(789); // Get task by ID
$freelo->tasks()->finish(789); // Mark as complete
$freelo->tasks()->activate(789); // Reopen task
$freelo->tasks()->move(789, 999); // Move to another tasklist
$freelo->tasks()->addComment(789, 'Comment text'); // Add comment
// Shared base instance (e.g. in a service provider)
$freelo = new Freelo(new ApiKeyCredentials(
apiKey: 'default-key',
email: '[email protected]'
));
// Per-request — fully isolated, concurrency-safe
$userFreelo = $freelo->withCredentials(new ApiKeyCredentials(
apiKey: $user->apiKey,
email: $user->email
));
// Optionally override userAgent per tenant
$userFreelo = $freelo->withCredentials(
new ApiKeyCredentials($user->apiKey, $user->email),
userAgent: 'TenantApp/1.0',
);
$projects = $userFreelo->projects()->list();
$freelo->setCredentials(new ApiKeyCredentials(
apiKey: 'new-key',
email: '[email protected]'
));
// With userAgent override
$freelo->setCredentials(
new ApiKeyCredentials('new-key', '[email protected]'),
userAgent: 'MyApp/2.0',
);
$freelo = new Freelo();
// ... later, when credentials are available
$freelo->setCredentials(new ApiKeyCredentials(
apiKey: $apiKey,
email: $email
));
$freelo->projects()->list(); // works
// GET request with query parameters
$response = $freelo->call('/projects', 'GET', params: ['p' => 0]);
$data = $response->json();
// POST request with body
$response = $freelo->call('/projects/123/tasklists/456/tasks', 'POST', data: [
'name' => 'New task',
'priority_enum' => 'h',
]);
// Also available on derived instances
$userFreelo = $freelo->withCredentials($credentials);
$response = $userFreelo->call('/users/me', 'GET');
use Freelo\Sdk\Http\Paginator;
// Auto-paginate through all results
foreach (Paginator::fetchAll(fn($p) => $freelo->projects()->getAll(['p' => $p])) as $project) {
echo $project->name . "\n";
}
// Manual pagination
$page = $freelo->tasks()->getAll(['p' => 0]);
echo "Page {$page->getPage()} of " . ceil($page->getTotal() / 20);
if ($page->hasNextPage()) {
$nextPage = $freelo->tasks()->getAll(['p' => $page->getNextPage()]);
}
$task = $freelo->tasks()->get(123);
// $task->dateAdd is \DateTimeImmutable in UTC
echo $task->dateAdd->format('c'); // 2026-04-24T09:12:38+00:00 (UTC)
echo $task->dateAdd
->setTimezone(new \DateTimeZone('Europe/Prague'))
->format('c'); // 2026-04-24T11:12:38+02:00 (Prague)
// Raw API payload (still strings) is available via toArray():
$raw = $task->toArray()['date_add']; // '2026-04-24T11:12:38'
$filters = FilterBuilder::create()
->dueDateRange(new \DateTimeImmutable('2026-04-01'), new \DateTimeImmutable('2026-04-30'))
->build();
$limiter = $freelo->getClient()->getRateLimiter();
if ($limiter->isLimitExceeded()) {
sleep($limiter->getSecondsUntilReset());
}
use GuzzleHttp\Client;
use Http\Adapter\Guzzle7\Client as GuzzleAdapter;
$httpClient = new GuzzleAdapter(new Client(['timeout' => 30]));
$freelo = new Freelo($credentials, httpClient: $httpClient);
use Symfony\Component\Cache\Psr16Cache;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
$cache = new Psr16Cache(new FilesystemAdapter('freelo', 3600));
$freelo = new Freelo($credentials, cache: $cache);
bash
composer
bash
composer
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.