apideck-node
Skill4 starsChanged 3 months agoApache-2.0View on GitHub
Apideck Unified API integration patterns for TypeScript and Node.js. 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. Covers the @apideck/unify SDK, authentication, CRUD operations, pagination, filtering, webhooks, and Vault connection management.
- Reads credentials
In this repository182 other files it gives its agents.
- AGENTS.mdAGENTS.md
- llms.txtllms.txt
- access-financialsSkill
- acertaSkill
- activecampaignSkill
- actSkill
- acumaticaSkill
- adp-ihcmSkill
- adp-runSkill
- adp-workforce-nowSkill
- afasSkill
- alexishrSkill
- amazon-seller-centralSkill
- apideck-best-practicesSkill
- apideck-codegenSkill
- apideck-connector-coverageSkill
- apideck-dotnetSkill
- apideck-goSkill
- apideck-javaSkill
- apideck-mcp-month-end-closeSkill
- apideck-mcp-onboard-employeeSkill
- apideck-mcp-pay-billSkill
- apideck-mcp-receive-paymentSkill
- apideck-mcpSkill
- apideck-migrationSkill
- apideck-phpSkill
- apideck-portmanSkill
- apideck-pythonSkill
- apideck-restSkill
- apideck-unified-apiSkill
- asanaSkill
- attioSkill
- azure-active-directorySkill
- azure-devopsSkill
- bamboohrSkill
- banqupSkill
- basecampSkill
- bigcommerceSkill
- blackbaudSkill
- bol-comSkill
- boxSkill
- breathehrSkill
- bullhorn-atsSkill
- campfireSkill
- cascade-hrSkill
- catalystoneSkill
- cegid-talentsoftSkill
- ceridian-dayforceSkill
- cezannehrSkill
- charliehrSkill
- ciphrSkill
- clearbooks-ukSkill
- clickupSkill
- closeSkill
- copperSkill
- deelSkill
- digitsSkill
- dropboxSkill
- dualentrySkill
- ebaySkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. About 0 are common, 3 are distinctive, and 10 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 37
ALWAYS use the @apideck/unify SDK.
- Very specific: line 38
ALWAYS pass apiKey, appId, and consumerId when initializing the client.
- Very specific: line 39
ALWAYS set the APIDECK_API_KEY environment variable rather than hardcoding API keys.
- Very specific: line 40
USE serviceId to specify which downstream connector to use (e.g., "salesforce", "quickbooks", "xero").
- Very specific: line 41
USE cursor-based pagination with for await...of for iterating large result sets.
- Very specific: line 42
USE the filter parameter to narrow results server-side.
- Very specific: line 43
USE the fields parameter to request only the columns you need.
- Distinctive: line 44
ALWAYS handle errors with try/catch.
- Distinctive: line 45
DO NOT store Apideck API keys, App IDs, or Consumer IDs in source code.
- Very specific: line 87
All resources follow the same pattern: apideck.{api}.{resource}.{operation}().
- Distinctive: line 133
Use async iteration to automatically handle cursor-based pagination:
- Very specific: line 207
When the unified model doesn't cover a connector-specific field, use passThrough:
- Very specific: line 253
Use @apideck/vault-js to embed a pre-built modal that lets your users authorize connectors and manage integration settings.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Apideck TypeScript 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 TypeScript SDK (@apideck/unify) provides typed clients for all unified APIs.
Key capabilities:
- Accounting - Invoices, bills, payments, ledger accounts, journal entries, tax rates, balance sheets, P&L
- CRM - Contacts, companies, leads, opportunities, activities, pipelines, notes
- HRIS - Employees, departments, payrolls, time-off requests, schedules
- File Storage - Files, folders, drives, shared links, upload sessions
- ATS - Jobs, applicants, applications
- Vault - Connection management, OAuth flows, custom field mapping
- Vault JS - Embeddable modal UI for users to authorize connectors and manage settings
- Webhook - Event subscriptions and real-time notifications
Installation
npm add @apideck/unifyRequires Node.js 18+. The SDK is fully typed with TypeScript definitions.
IMPORTANT RULES
- ALWAYS use the
@apideck/unifySDK. DO NOT make rawfetch/axioscalls to the Apideck API. - ALWAYS pass
apiKey,appId, andconsumerIdwhen initializing the client. These are required for all API calls. - ALWAYS set the
APIDECK_API_KEYenvironment variable rather than hardcoding API keys. - USE
serviceIdto specify which downstream connector to use (e.g.,"salesforce","quickbooks","xero"). If a consumer has multiple connections for an API,serviceIdis required. - USE cursor-based pagination with
for await...offor iterating large result sets. DO NOT implement manual pagination. - USE the
filterparameter to narrow results server-side. DO NOT fetch all records and filter client-side. - USE the
fieldsparameter to request only the columns you need. This reduces response size and improves performance. - ALWAYS handle errors with try/catch. The SDK throws typed errors for different HTTP status codes.
- DO NOT store Apideck API keys, App IDs, or Consumer IDs in source code. Use environment variables or a secrets manager.
Quick Start
import { Apideck } from "@apideck/unify";
const apideck = new Apideck({
apiKey: process.env["APIDECK_API_KEY"] ?? "",
appId: "your-app-id",
consumerId: "your-consumer-id",
});
// List CRM contacts
const { data } = await apideck.crm.contacts.list({
limit: 20,
filter: { email: "john@example.com" },
});
for (const contact of data) {
console.log(contact.name, contact.emails);
}SDK Patterns
Client Setup
import { Apideck } from "@apideck/unify";
const apideck = new Apideck({
apiKey: process.env["APIDECK_API_KEY"] ?? "",
appId: "your-app-id",
consumerId: "your-consumer-id",
});The consumerId identifies the end-user whose connections are being used. In multi-tenant apps, set this per-request or per-user session.
CRUD Operations
All resources follow the same pattern: apideck.{api}.{resource}.{operation}().
// LIST - retrieve multiple records
const { data } = await apideck.crm.contacts.list({
serviceId: "salesforce",
limit: 20,
filter: { email: "john@example.com" },
sort: { by: "updated_at", direction: "desc" },
fields: "id,name,email,phone_numbers",
});
// CREATE - create a new record
const { data: created } = await apideck.crm.contacts.create({
serviceId: "salesforce",
contact: {
first_name: "John",
last_name: "Doe",
emails: [{ email: "john@example.com", type: "primary" }],
phone_numbers: [{ number: "+1234567890", type: "mobile" }],
},
});
console.log(created.id); // "contact_abc123"
// GET - retrieve a single record
const { data: contact } = await apideck.crm.contacts.get({
id: "contact_abc123",
serviceId: "salesforce",
});
// UPDATE - modify an existing record
const { data: updated } = await apideck.crm.contacts.update({
id: "contact_abc123",
serviceId: "salesforce",
contact: { first_name: "Jane" },
});
// DELETE - remove a record
await apideck.crm.contacts.delete({
id: "contact_abc123",
serviceId: "salesforce",
});Pagination
Use async iteration to automatically handle cursor-based pagination:
const result = await apideck.accounting.invoices.list({
serviceId: "quickbooks",
limit: 50,
});
// Automatically fetches next pages
for await (const page of result) {
for (const invoice of page.data) {
console.log(invoice.number, invoice.total);
}
}Or handle pagination manually:
let cursor: string | undefined;
do {
const { data, meta } = await apideck.accounting.invoices.list({
serviceId: "quickbooks",
limit: 50,
cursor,
});
for (const invoice of data) {
console.log(invoice.number);
}
cursor = meta?.cursors?.next ?? undefined;
} while (cursor);Error Handling
import { Apideck } from "@apideck/unify";
import * as errors from "@apideck/unify/models/errors";
try {
const { data } = await apideck.crm.contacts.get({ id: "invalid" });
} catch (e) {
if (e instanceof errors.BadRequestResponse) {
console.error("Bad request:", e.message);
} else if (e instanceof errors.UnauthorizedResponse) {
console.error("Invalid API key or missing credentials");
} else if (e instanceof errors.NotFoundResponse) {
console.error("Record not found");
} else if (e instanceof errors.PaymentRequiredResponse) {
console.error("API limit reached or payment required");
} else if (e instanceof errors.UnprocessableResponse) {
console.error("Validation error:", e.message);
} else {
throw e;
}
}Common Parameters
Most list endpoints accept these parameters:
| Parameter | Type | Description |
serviceId | string | Downstream connector ID (e.g., "quickbooks", "salesforce") |
limit | number | Max results per page (1-200, default 20) |
cursor | string | Pagination cursor from previous response |
filter | object | Resource-specific filter criteria |
sort | object | { by: string, direction: "asc" | "desc" } |
fields | string | Comma-separated field names to return |
passThrough | object | Pass-through query parameters for the downstream API |
Pass-Through Parameters
When the unified model doesn't cover a connector-specific field, use passThrough:
const { data } = await apideck.accounting.invoices.list({
serviceId: "quickbooks",
passThrough: {
search: "overdue",
},
});For creating/updating, use pass_through in the request body to send connector-specific fields:
const { data } = await apideck.crm.contacts.create({
serviceId: "salesforce",
contact: {
first_name: "John",
last_name: "Doe",
pass_through: [
{
service_id: "salesforce",
operation_id: "contactsAdd",
extend_object: { custom_sf_field__c: "value" },
},
],
},
});API Namespaces
The SDK organizes APIs by namespace. See the reference files for detailed endpoints:
| Namespace | Reference | Resources |
apideck.accounting.* | references/accounting-api.md | invoices, bills, payments, customers, suppliers, ledgerAccounts, journalEntries, taxRates, creditNotes, purchaseOrders, balanceSheet, profitAndLoss, and more |
apideck.crm.* | references/crm-api.md | contacts, companies, leads, opportunities, activities, notes, pipelines, users |
apideck.hris.* | references/hris-api.md | employees, companies, departments, payrolls, timeOffRequests |
apideck.fileStorage.* | references/file-storage-api.md | files, folders, drives, driveGroups, sharedLinks, uploadSessions |
apideck.ats.* | references/ats-api.md | applicants, applications, jobs |
apideck.vault.* | references/vault-api.md | connections, connectionSettings, consumers, customMappings, logs, sessions |
apideck.webhook.* | references/webhook-api.md | webhooks, eventLogs |
Vault JS (Embeddable UI)
Use @apideck/vault-js to embed a pre-built modal that lets your users authorize connectors and manage integration settings. Session creation must happen server-side.
// 1. Server-side: create a session
const { data } = await apideck.vault.sessions.create({
session: {
consumer_metadata: { account_name: "Acme Corp", user_name: "John Doe", email: "john@acme.com" },
redirect_uri: "https://myapp.com/integrations",
settings: { unified_apis: ["accounting", "crm"] },
theme: { vault_name: "My App", primary_color: "#4F46E5" },
},
});
// 2. Client-side: open the modal
import { ApideckVault } from "@apideck/vault-js";
ApideckVault.open({
token: sessionToken,
onConnectionChange: (connection) => console.log("Changed:", connection),
onClose: () => console.log("Closed"),
});See references/vault-js.md for full configuration options, theming, React integration, and event callbacks.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

