Apideck Java 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 Java SDK (com.apideck:unify) provides typed clients for all unified APIs.
Installation
Gradle:
implementation 'com.apideck:unify:0.30.3'
Maven:
<dependency>
<groupId>com.apideck</groupId>
<artifactId>unify</artifactId>
<version>0.30.3</version>
</dependency>
Requires JDK 11 or later.
IMPORTANT RULES
- ALWAYS use the
com.apideck:unify SDK. DO NOT make raw HTTP calls to the Apideck API.
- ALWAYS pass
apiKey, appId, and consumerId when building the client.
- USE
serviceId on requests to specify which downstream connector to use.
- USE the fluent builder pattern for constructing requests.
- ALWAYS handle errors with try/catch using
ApideckError as the base class.
- DO NOT store API keys in source code. Use environment variables.
Quick Start
import com.apideck.unify.Apideck;
import com.apideck.unify.models.operations.*;
Apideck sdk = Apideck.builder()
.consumerId("your-consumer-id")
.appId("your-app-id")
.apiKey(System.getenv("APIDECK_API_KEY"))
.build();
sdk.crm().contacts().list()
.serviceId("salesforce")
.limit(20)
.callAsStream()
.forEach(page -> {
page.getContactsResponse().ifPresent(res ->
res.getData().forEach(contact ->
System.out.println(contact.getName())
)
);
});
SDK Patterns
Client Setup
import com.apideck.unify.Apideck;
Apideck sdk = Apideck.builder()
.consumerId("your-consumer-id")
.appId("your-app-id")
.apiKey(System.getenv("APIDECK_API_KEY"))
.build();
Async client:
import com.apideck.unify.AsyncApideck;
AsyncApideck asyncSdk = Apideck.builder()
.consumerId("your-consumer-id")
.appId("your-app-id")
.apiKey(System.getenv("APIDECK_API_KEY"))
.build()
.async();
CRUD Operations
Uses a fluent builder pattern: sdk.{category}().{resource}().{operation}().
import com.apideck.unify.models.components.*;
import com.apideck.unify.models.operations.*;
// LIST
sdk.crm().contacts().list()
.serviceId("salesforce")
.limit(20)
.filter(ContactsFilter.builder().email("john@example.com").build())
.sort(ContactsSort.builder()
.by(ContactsSortBy.UPDATED_AT)
.direction(SortDirection.DESC)
.build())
.call();
// CREATE
sdk.crm().contacts().create()
.serviceId("salesforce")
.contact(ContactInput.builder()
.firstName("John")
.lastName("Doe")
.emails(List.of(Email.builder()
.email("john@example.com")
.type(EmailType.PRIMARY)
.build()))
.phoneNumbers(List.of(PhoneNumber.builder()
.number("+1234567890")
.type(PhoneNumberType.MOBILE)
.build()))
.build())
.call();
// GET
sdk.crm().contacts().get()
.id("contact_123")
.serviceId("salesforce")
.call();
// UPDATE
sdk.crm().contacts().update()
.id("contact_123")
.serviceId("salesforce")
.contact(ContactInput.builder().firstName("Jane").build())
.call();
// DELETE
sdk.crm().contacts().delete()
.id("contact_123")
.serviceId("salesforce")
.call();
Pagination
Multiple approaches available:
// Stream (recommended)
sdk.accounting().invoices().list()
.serviceId("quickbooks")
.limit(50)
.callAsStream()
.forEach(page -> {
// handle page
});
// Iterable
for (var page : sdk.accounting().invoices().list()
.serviceId("quickbooks")
.limit(50)
.callAsIterable()) {
// handle page
}
// Reactive Streams (for Project Reactor, RxJava, etc.)
var publisher = sdk.accounting().invoices().list()
.serviceId("quickbooks")
.limit(50)
.callAsPublisher();
Async Support
Returns CompletableFuture<T> for standard operations:
AsyncApideck asyncSdk = sdk.async();
asyncSdk.crm().contacts().list()
.serviceId("salesforce")
.limit(20)
.call()
.thenAccept(res -> {
// handle response
});
Error Handling
import com.apideck.unify.models.errors.*;
try {
sdk.crm().contacts().get()
.id("invalid")
.serviceId("salesforce")
.call();
} catch (BadRequestResponse e) {
System.err.println("Bad request: " + e.message());
} catch (UnauthorizedResponse e) {
System.err.println("Invalid API key");
} catch (NotFoundResponse e) {
System.err.println("Record not found");
} catch (PaymentRequiredResponse e) {
System.err.println("API limit reached");
} catch (UnprocessableResponse e) {
System.err.println("Validation error: " + e.message());
} catch (ApideckError e) {
System.err.println("API error " + e.code() + ": " + e.message());
}
Retry Configuration
import com.apideck.unify.utils.BackoffStrategy;
import com.apideck.unify.utils.RetryConfig;
import java.util.concurrent.TimeUnit;
Apideck sdk = Apideck.builder()
.retryConfig(RetryConfig.builder()
.backoff(BackoffStrategy.builder()
.initialInterval(1L, TimeUnit.MILLISECONDS)
.maxInterval(50L, TimeUnit.MILLISECONDS)
.maxElapsedTime(1000L, TimeUnit.MILLISECONDS)
.baseFactor(1.1)
.jitterFactor(0.15)
.retryConnectError(false)
.build())
.build())
.consumerId("your-consumer-id")
.appId("your-app-id")
.apiKey(System.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-java3description: Apideck Unified API integration patterns for Java. 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 Java. Covers the com.apideck:unify Maven package, authentication, CRUD operations, pagination, async support, and Vault connection management.4license: Apache-2.05---67# Apideck Java 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 Java SDK (`com.apideck:unify`) provides typed clients for all unified APIs.1213## Installation1415**Gradle:**16```groovy17implementation 'com.apideck:unify:0.30.3'18```1920**Maven:**21```xml22<dependency>23 <groupId>com.apideck</groupId>24 <artifactId>unify</artifactId>25 <version>0.30.3</version>26</dependency>27```2829Requires JDK 11 or later.3031## IMPORTANT RULES3233- ALWAYS use the `com.apideck:unify` SDK. DO NOT make raw HTTP calls to the Apideck API.34- ALWAYS pass `apiKey`, `appId`, and `consumerId` when building the client.35- USE `serviceId` on requests to specify which downstream connector to use.36- USE the fluent builder pattern for constructing requests.37- ALWAYS handle errors with try/catch using `ApideckError` as the base class.38- DO NOT store API keys in source code. Use environment variables.3940## Quick Start4142```java43import com.apideck.unify.Apideck;44import com.apideck.unify.models.operations.*;4546Apideck sdk = Apideck.builder()47 .consumerId("your-consumer-id")48 .appId("your-app-id")49 .apiKey(System.getenv("APIDECK_API_KEY"))50 .build();5152sdk.crm().contacts().list()53 .serviceId("salesforce")54 .limit(20)55 .callAsStream()56 .forEach(page -> {57 page.getContactsResponse().ifPresent(res ->58 res.getData().forEach(contact ->59 System.out.println(contact.getName())60 )61 );62 });63```6465## SDK Patterns6667### Client Setup6869```java70import com.apideck.unify.Apideck;7172Apideck sdk = Apideck.builder()73 .consumerId("your-consumer-id")74 .appId("your-app-id")75 .apiKey(System.getenv("APIDECK_API_KEY"))76 .build();77```7879Async client:8081```java82import com.apideck.unify.AsyncApideck;8384AsyncApideck asyncSdk = Apideck.builder()85 .consumerId("your-consumer-id")86 .appId("your-app-id")87 .apiKey(System.getenv("APIDECK_API_KEY"))88 .build()89 .async();90```9192### CRUD Operations9394Uses a fluent builder pattern: `sdk.{category}().{resource}().{operation}()`.9596```java97import com.apideck.unify.models.components.*;98import com.apideck.unify.models.operations.*;99100// LIST101sdk.crm().contacts().list()102 .serviceId("salesforce")103 .limit(20)104 .filter(ContactsFilter.builder().email("john@example.com").build())105 .sort(ContactsSort.builder()106 .by(ContactsSortBy.UPDATED_AT)107 .direction(SortDirection.DESC)108 .build())109 .call();110111// CREATE112sdk.crm().contacts().create()113 .serviceId("salesforce")114 .contact(ContactInput.builder()115 .firstName("John")116 .lastName("Doe")117 .emails(List.of(Email.builder()118 .email("john@example.com")119 .type(EmailType.PRIMARY)120 .build()))121 .phoneNumbers(List.of(PhoneNumber.builder()122 .number("+1234567890")123 .type(PhoneNumberType.MOBILE)124 .build()))125 .build())126 .call();127128// GET129sdk.crm().contacts().get()130 .id("contact_123")131 .serviceId("salesforce")132 .call();133134// UPDATE135sdk.crm().contacts().update()136 .id("contact_123")137 .serviceId("salesforce")138 .contact(ContactInput.builder().firstName("Jane").build())139 .call();140141// DELETE142sdk.crm().contacts().delete()143 .id("contact_123")144 .serviceId("salesforce")145 .call();146```147148### Pagination149150Multiple approaches available:151152```java153// Stream (recommended)154sdk.accounting().invoices().list()155 .serviceId("quickbooks")156 .limit(50)157 .callAsStream()158 .forEach(page -> {159 // handle page160 });161162// Iterable163for (var page : sdk.accounting().invoices().list()164 .serviceId("quickbooks")165 .limit(50)166 .callAsIterable()) {167 // handle page168}169170// Reactive Streams (for Project Reactor, RxJava, etc.)171var publisher = sdk.accounting().invoices().list()172 .serviceId("quickbooks")173 .limit(50)174 .callAsPublisher();175```176177### Async Support178179Returns `CompletableFuture<T>` for standard operations:180181```java182AsyncApideck asyncSdk = sdk.async();183184asyncSdk.crm().contacts().list()185 .serviceId("salesforce")186 .limit(20)187 .call()188 .thenAccept(res -> {189 // handle response190 });191```192193### Error Handling194195```java196import com.apideck.unify.models.errors.*;197198try {199 sdk.crm().contacts().get()200 .id("invalid")201 .serviceId("salesforce")202 .call();203} catch (BadRequestResponse e) {204 System.err.println("Bad request: " + e.message());205} catch (UnauthorizedResponse e) {206 System.err.println("Invalid API key");207} catch (NotFoundResponse e) {208 System.err.println("Record not found");209} catch (PaymentRequiredResponse e) {210 System.err.println("API limit reached");211} catch (UnprocessableResponse e) {212 System.err.println("Validation error: " + e.message());213} catch (ApideckError e) {214 System.err.println("API error " + e.code() + ": " + e.message());215}216```217218### Retry Configuration219220```java221import com.apideck.unify.utils.BackoffStrategy;222import com.apideck.unify.utils.RetryConfig;223import java.util.concurrent.TimeUnit;224225Apideck sdk = Apideck.builder()226 .retryConfig(RetryConfig.builder()227 .backoff(BackoffStrategy.builder()228 .initialInterval(1L, TimeUnit.MILLISECONDS)229 .maxInterval(50L, TimeUnit.MILLISECONDS)230 .maxElapsedTime(1000L, TimeUnit.MILLISECONDS)231 .baseFactor(1.1)232 .jitterFactor(0.15)233 .retryConnectError(false)234 .build())235 .build())236 .consumerId("your-consumer-id")237 .appId("your-app-id")238 .apiKey(System.getenv("APIDECK_API_KEY"))239 .build();240```241242## API Namespaces243244| Namespace | Resources |245|-----------|-----------|246| `sdk.accounting().*` | invoices, bills, payments, customers, suppliers, ledgerAccounts, journalEntries, taxRates, creditNotes, purchaseOrders, balanceSheet, profitAndLoss, and more |247| `sdk.crm().*` | contacts, companies, leads, opportunities, activities, notes, pipelines, users |248| `sdk.hris().*` | employees, companies, departments, payrolls, timeOffRequests |249| `sdk.fileStorage().*` | files, folders, drives, driveGroups, sharedLinks, uploadSessions |250| `sdk.ats().*` | applicants, applications, jobs |251| `sdk.vault().*` | connections, consumers, sessions, customMappings, logs |252| `sdk.webhook().*` | webhooks, eventLogs |