PHP code example of tillio-crm / api

1. Go to this page and download the library: Download tillio-crm/api 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/ */

    

tillio-crm / api example snippets


use TillioCrm\Api\TillioClient;

$client = new TillioClient([
    'apiKey'       => 'MojaIntegracja:sekret',       // format nazwa:klucz (jak w API v1)
    'tenantDomain' => 'firma.tillio.app',            // nagłówek X-Tenant-Domain
    'tenantId'     => 'firma-abc123',                // nagłówek X-Tenant-Id
    // 'server'       => 'https://s2.public.api.tillio.app',  // domyślny SaaS
    // 'instanceName' => 'firma.tillio.app',         // TYLKO serwer wieloinstancyjny (np. dev) - patrz niżej
]);

// najtańszy test konfiguracji:
$who = $client->whoami();
// ['authenticated' => true, 'tenantDomain' => ..., 'tenantId' => ..., 'keyName' => ..., 'userId' => ...]

// i do pracy:
$page = $client->contractors()->list(['limit' => 25]);
foreach ($page as $contractor) {
    echo $contractor->name, ' NIP: ', $contractor->taxId, PHP_EOL;
}

$client = new TillioClient([
    'accessToken' => fn () => $auth->accessToken(),
    // 'server'    => 'https://apps.tillio.app',       // platforma, domyślny prod
    // 'connector' => '<publicId-polaczenia>',         // tylko gdy instalacja ma >1 połączenie CRM
]);

$page = $client->contractors()->list(['limit' => 25]);   // identycznie jak wyżej

$page = $client->contractors()->list(['updatedAfter' => '2026-01-01T00:00:00+00:00', 'limit' => 100]);
$page->total;          // łączna liczba rekordów zapytania
$page->hasNextPage();  // bez ręcznego liczenia ceil(total/limit)
$page->first();        // ?Contractor

foreach ($client->contractors()->iterate(['contractorTypeId' => 1]) as $contractor) {
    // ...
}

use TillioCrm\Api\QueryBuilder;

$known = [659, 660, 702];   // id leadów zapamiętane po swojej stronie
$deleted = [];
foreach (array_chunk($known, QueryBuilder::MAX_LIST_VALUES) as $chunk) {
    $found = [];
    foreach ($client->leads()->list(['id' => $chunk, 'limit' => QueryBuilder::MAX_LIST_VALUES]) as $lead) {
        $found[] = $lead->id;
    }
    array_push($deleted, ...array_diff($chunk, $found));
}
// $deleted - leadów o tych id już nie ma w CRM

use TillioCrm\Api\Dto\ContractorInput;
use TillioCrm\Api\Dto\AddressInput;
use TillioCrm\Api\Dto\WriteOptions;

$result = $client->contractors()->create(
    new ContractorInput(
        name: 'Przykładowa Firma Sp. z o.o.',
        alias: 'przykladowa-firma',        // wymagany przy tworzeniu!
        contractorTypeId: 1,
        taxId: '0000000000',
        address: [new AddressInput(addressTypeId: 1, city: 'Warszawa', street: 'Przykładowa 1')],
    ),
    new WriteOptions(duplicateCheck: ['taxId']),
);

$result->created;      // true = utworzono (201); false = trafiono w istniejący (200)
$result->id;           // id rekordu
$result->matchedBy();  // po czym znaleziono duplikat (np. 'taxId', 'custom:erp_id')
$result->warnings;     // ciche korekty normalizacji - czytaj i podnoś wyżej

use TillioCrm\Api\Exception\ValidationException;

try {
    $client->contractors()->create($input, $options);
} catch (ValidationException $e) {
    foreach ($e->errors as $error) {
        // $error->field, $error->code, $error->message - wszystkie powody naraz
    }
}

$client = new TillioClient([
    // ...tryb...
    'maxAttempts'    => 2,      // łączna liczba prób (1 = bez retry)
    'retryBaseDelay' => 0.25,   // pierwszy backoff [s]; kolejne x2
    'retryMaxDelay'  => 5.0,    // sufit pojedynczego backoffu [s]
    'maxRetryAfter'  => 10.0,   // sufit dla Retry-After z serwera [s]
    'rateLimits'     => [60 => 120],  // własne okna; [] = bez limitera
]);

use TillioCrm\Api\Transport\FileUpload;

$doc = $client->dms()->uploadDocument(
    $contractorId,
    FileUpload::fromPath('/sciezka/do/umowa.pdf'),      // albo ::fromString($tresc, 'nazwa.pdf')
    directoryId: $dirId,
);

$document = $client->dms()->getDocument($publicId);  // świeży downloadUrl
$bytes = $client->download($document->downloadUrl);