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
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,
);