Apideck PHP SDK Skill
Overview
The Apideck Unified API provides a single integration layer to connect with 200+ third-party services across accounting, CRM, HRIS, file storage, ATS, e-commerce, and more. The official PHP SDK provides typed clients for all unified APIs.
Installation
composer require apideck-libraries/sdk-php
IMPORTANT RULES
- ALWAYS use the
apideck-libraries/sdk-php Composer package. DO NOT make raw Guzzle/curl calls to the Apideck API.
- ALWAYS pass security, app ID, and consumer ID via the builder when creating the client.
- USE
serviceId on requests to specify which downstream connector to use.
- ALWAYS handle errors with try/catch using
Errors\APIException as the base class.
- DO NOT store API keys in source code. Use environment variables.
Quick Start
<?php
use Apideck\Unify;
use Apideck\Unify\Models\Operations;
use Apideck\Unify\Models\Components;
$sdk = Unify\Apideck::builder()
->setConsumerId('your-consumer-id')
->setAppId('your-app-id')
->setSecurity(getenv('APIDECK_API_KEY'))
->build();
$request = new Operations\CrmContactsAllRequest(
serviceId: 'salesforce',
limit: 20,
);
$responses = $sdk->crm->contacts->list(request: $request);
foreach ($responses as $response) {
if ($response->httpMeta->response->getStatusCode() === 200) {
foreach ($response->getContactsResponse->data as $contact) {
echo $contact->name . "\n";
}
}
}
SDK Patterns
Client Setup
use Apideck\Unify;
$sdk = Unify\Apideck::builder()
->setConsumerId('your-consumer-id')
->setAppId('your-app-id')
->setSecurity(getenv('APIDECK_API_KEY'))
->build();
CRUD Operations
All resources follow the pattern: $sdk->{api}->{resource}->{operation}(request: $request).
use Apideck\Unify\Models\Operations;
use Apideck\Unify\Models\Components;
// LIST
$request = new Operations\CrmContactsAllRequest(
serviceId: 'salesforce',
limit: 20,
filter: new Components\ContactsFilter(email: 'john@example.com'),
sort: new Components\ContactsSort(
by: Components\ContactsSortBy::UpdatedAt,
direction: Components\SortDirection::Desc,
),
);
$responses = $sdk->crm->contacts->list(request: $request);
// CREATE
$request = new Operations\CrmContactsAddRequest(
serviceId: 'salesforce',
contact: new Components\ContactInput(
firstName: 'John',
lastName: 'Doe',
emails: [
new Components\Email(email: 'john@example.com', type: Components\EmailType::Primary),
],
phoneNumbers: [
new Components\PhoneNumber(number: '+1234567890', type: Components\PhoneNumberType::Mobile),
],
),
);
$response = $sdk->crm->contacts->create(request: $request);
// GET
$request = new Operations\CrmContactsOneRequest(
id: 'contact_123',
serviceId: 'salesforce',
);
$response = $sdk->crm->contacts->get(request: $request);
// UPDATE
$request = new Operations\CrmContactsUpdateRequest(
id: 'contact_123',
serviceId: 'salesforce',
contact: new Components\ContactInput(firstName: 'Jane'),
);
$response = $sdk->crm->contacts->update(request: $request);
// DELETE
$request = new Operations\CrmContactsDeleteRequest(
id: 'contact_123',
serviceId: 'salesforce',
);
$response = $sdk->crm->contacts->delete(request: $request);
Pagination
The list method returns a PHP Generator. Iterate with foreach:
$request = new Operations\AccountingInvoicesAllRequest(
serviceId: 'quickbooks',
limit: 50,
);
$responses = $sdk->accounting->invoices->list(request: $request);
foreach ($responses as $response) {
if ($response->httpMeta->response->getStatusCode() === 200) {
foreach ($response->getInvoicesResponse->data as $invoice) {
echo "{$invoice->number}: {$invoice->total}\n";
}
}
}
Error Handling
use Apideck\Unify\Models\Errors;
try {
$responses = $sdk->crm->contacts->list(request: $request);
foreach ($responses as $response) {
// handle response
}
} catch (Errors\BadRequestResponseThrowable $e) {
echo "Bad request: " . $e->getMessage() . "\n";
} catch (Errors\UnauthorizedResponseThrowable $e) {
echo "Unauthorized\n";
} catch (Errors\NotFoundResponseThrowable $e) {
echo "Not found\n";
} catch (Errors\PaymentRequiredResponseThrowable $e) {
echo "API limit reached\n";
} catch (Errors\UnprocessableResponseThrowable $e) {
echo "Validation error: " . $e->getMessage() . "\n";
} catch (Errors\APIException $e) {
echo "API error: " . $e->getMessage() . "\n";
}
Retry Configuration
use Apideck\Unify\Utils\Retry;
// Global
$sdk = Unify\Apideck::builder()
->setRetryConfig(
new Retry\RetryConfigBackoff(
initialInterval: 1,
maxInterval: 50,
exponent: 1.1,
maxElapsedTime: 100,
retryConnectionErrors: false,
)
)
->setConsumerId('your-consumer-id')
->setAppId('your-app-id')
->setSecurity(getenv('APIDECK_API_KEY'))
->build();
API Namespaces
| Namespace |
Resources |
$sdk->accounting->* |
invoices, bills, payments, customers, suppliers, ledgerAccounts, journalEntries, taxRates, creditNotes, purchaseOrders, balanceSheet, profitAndLoss, and more |
$sdk->crm->* |
contacts, companies, leads, opportunities, activities, notes, pipelines, users |
$sdk->hris->* |
employees, companies, departments, payrolls, timeOffRequests |
$sdk->fileStorage->* |
files, folders, drives, driveGroups, sharedLinks, uploadSessions |
$sdk->ats->* |
applicants, applications, jobs |
$sdk->vault->* |
connections, consumers, sessions, customMappings, logs |
$sdk->webhook->* |
webhooks, eventLogs |
1---2name: apideck-php3description: Apideck Unified API integration patterns for PHP. Use when building integrations with accounting software (QuickBooks, Xero, NetSuite), CRMs (Salesforce, HubSpot, Pipedrive), HRIS platforms (Workday, BambooHR), file storage (Google Drive, Dropbox, Box), ATS systems (Greenhouse, Lever), e-commerce, or any of Apideck's 200+ connectors using PHP. Covers the apideck-libraries/sdk-php Composer package, authentication, CRUD operations, pagination, error handling, and Vault connection management.4license: Apache-2.05---67# Apideck PHP SDK Skill89## Overview1011The [Apideck Unified API](https://apideck.com) provides a single integration layer to connect with 200+ third-party services across accounting, CRM, HRIS, file storage, ATS, e-commerce, and more. The official PHP SDK provides typed clients for all unified APIs.1213## Installation1415```sh16composer require apideck-libraries/sdk-php17```1819## IMPORTANT RULES2021- ALWAYS use the `apideck-libraries/sdk-php` Composer package. DO NOT make raw `Guzzle`/`curl` calls to the Apideck API.22- ALWAYS pass security, app ID, and consumer ID via the builder when creating the client.23- USE `serviceId` on requests to specify which downstream connector to use.24- ALWAYS handle errors with try/catch using `Errors\APIException` as the base class.25- DO NOT store API keys in source code. Use environment variables.2627## Quick Start2829```php30<?php3132use Apideck\Unify;33use Apideck\Unify\Models\Operations;34use Apideck\Unify\Models\Components;3536$sdk = Unify\Apideck::builder()37 ->setConsumerId('your-consumer-id')38 ->setAppId('your-app-id')39 ->setSecurity(getenv('APIDECK_API_KEY'))40 ->build();4142$request = new Operations\CrmContactsAllRequest(43 serviceId: 'salesforce',44 limit: 20,45);4647$responses = $sdk->crm->contacts->list(request: $request);4849foreach ($responses as $response) {50 if ($response->httpMeta->response->getStatusCode() === 200) {51 foreach ($response->getContactsResponse->data as $contact) {52 echo $contact->name . "\n";53 }54 }55}56```5758## SDK Patterns5960### Client Setup6162```php63use Apideck\Unify;6465$sdk = Unify\Apideck::builder()66 ->setConsumerId('your-consumer-id')67 ->setAppId('your-app-id')68 ->setSecurity(getenv('APIDECK_API_KEY'))69 ->build();70```7172### CRUD Operations7374All resources follow the pattern: `$sdk->{api}->{resource}->{operation}(request: $request)`.7576```php77use Apideck\Unify\Models\Operations;78use Apideck\Unify\Models\Components;7980// LIST81$request = new Operations\CrmContactsAllRequest(82 serviceId: 'salesforce',83 limit: 20,84 filter: new Components\ContactsFilter(email: 'john@example.com'),85 sort: new Components\ContactsSort(86 by: Components\ContactsSortBy::UpdatedAt,87 direction: Components\SortDirection::Desc,88 ),89);90$responses = $sdk->crm->contacts->list(request: $request);9192// CREATE93$request = new Operations\CrmContactsAddRequest(94 serviceId: 'salesforce',95 contact: new Components\ContactInput(96 firstName: 'John',97 lastName: 'Doe',98 emails: [99 new Components\Email(email: 'john@example.com', type: Components\EmailType::Primary),100 ],101 phoneNumbers: [102 new Components\PhoneNumber(number: '+1234567890', type: Components\PhoneNumberType::Mobile),103 ],104 ),105);106$response = $sdk->crm->contacts->create(request: $request);107108// GET109$request = new Operations\CrmContactsOneRequest(110 id: 'contact_123',111 serviceId: 'salesforce',112);113$response = $sdk->crm->contacts->get(request: $request);114115// UPDATE116$request = new Operations\CrmContactsUpdateRequest(117 id: 'contact_123',118 serviceId: 'salesforce',119 contact: new Components\ContactInput(firstName: 'Jane'),120);121$response = $sdk->crm->contacts->update(request: $request);122123// DELETE124$request = new Operations\CrmContactsDeleteRequest(125 id: 'contact_123',126 serviceId: 'salesforce',127);128$response = $sdk->crm->contacts->delete(request: $request);129```130131### Pagination132133The `list` method returns a PHP Generator. Iterate with `foreach`:134135```php136$request = new Operations\AccountingInvoicesAllRequest(137 serviceId: 'quickbooks',138 limit: 50,139);140141$responses = $sdk->accounting->invoices->list(request: $request);142143foreach ($responses as $response) {144 if ($response->httpMeta->response->getStatusCode() === 200) {145 foreach ($response->getInvoicesResponse->data as $invoice) {146 echo "{$invoice->number}: {$invoice->total}\n";147 }148 }149}150```151152### Error Handling153154```php155use Apideck\Unify\Models\Errors;156157try {158 $responses = $sdk->crm->contacts->list(request: $request);159 foreach ($responses as $response) {160 // handle response161 }162} catch (Errors\BadRequestResponseThrowable $e) {163 echo "Bad request: " . $e->getMessage() . "\n";164} catch (Errors\UnauthorizedResponseThrowable $e) {165 echo "Unauthorized\n";166} catch (Errors\NotFoundResponseThrowable $e) {167 echo "Not found\n";168} catch (Errors\PaymentRequiredResponseThrowable $e) {169 echo "API limit reached\n";170} catch (Errors\UnprocessableResponseThrowable $e) {171 echo "Validation error: " . $e->getMessage() . "\n";172} catch (Errors\APIException $e) {173 echo "API error: " . $e->getMessage() . "\n";174}175```176177### Retry Configuration178179```php180use Apideck\Unify\Utils\Retry;181182// Global183$sdk = Unify\Apideck::builder()184 ->setRetryConfig(185 new Retry\RetryConfigBackoff(186 initialInterval: 1,187 maxInterval: 50,188 exponent: 1.1,189 maxElapsedTime: 100,190 retryConnectionErrors: false,191 )192 )193 ->setConsumerId('your-consumer-id')194 ->setAppId('your-app-id')195 ->setSecurity(getenv('APIDECK_API_KEY'))196 ->build();197```198199## API Namespaces200201| Namespace | Resources |202|-----------|-----------|203| `$sdk->accounting->*` | invoices, bills, payments, customers, suppliers, ledgerAccounts, journalEntries, taxRates, creditNotes, purchaseOrders, balanceSheet, profitAndLoss, and more |204| `$sdk->crm->*` | contacts, companies, leads, opportunities, activities, notes, pipelines, users |205| `$sdk->hris->*` | employees, companies, departments, payrolls, timeOffRequests |206| `$sdk->fileStorage->*` | files, folders, drives, driveGroups, sharedLinks, uploadSessions |207| `$sdk->ats->*` | applicants, applications, jobs |208| `$sdk->vault->*` | connections, consumers, sessions, customMappings, logs |209| `$sdk->webhook->*` | webhooks, eventLogs |