apideck-rest
Skill4 starsChanged 3 months agoApache-2.0View on GitHub
Apideck Unified REST API reference for any language. 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 direct HTTP calls. Covers authentication headers, CRUD operations, cursor-based pagination, filtering, sorting, error handling, rate limiting, pass-through parameters, and webhooks. Language-agnostic — works with curl, fetch, axios, httpx, or any HTTP client.
- Reads credentials
- Sends data out
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-nodeSkill
- apideck-phpSkill
- apideck-portmanSkill
- apideck-pythonSkill
- 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
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 5 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 21
ALWAYS include the three required headers: Authorization, x-apideck-app-id, and x-apideck-consumer-id.
- Distinctive: line 22
ALWAYS make API calls server-side to prevent token leakage.
- Very specific: line 23
USE x-apideck-service-id to specify which downstream connector to use.
- Very specific: line 24
USE cursor-based pagination — iterate until meta.cursors.next is null.
- Very specific: line 25
USE the filter query parameters to narrow results server-side.
- Very specific: line 26
USE the fields query parameter to request only the columns you need.
- Distinctive: line 27
DO NOT store API keys in source code.
- Distinctive: line 31
Every request requires these headers:
- Distinctive: line 43
All resources follow a consistent URL pattern:
- Very specific: line 167
When meta.cursors.next is null, you have reached the last page.
- Distinctive: line 225
All errors follow this format:
- Very specific: line 301
Verify signatures using the x-apideck-signature header with HMAC-SHA256.
≈ “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 REST API Skill
Overview
The Apideck Unified API provides a single REST endpoint to connect with 200+ third-party services across accounting, CRM, HRIS, file storage, ATS, e-commerce, and more. This skill covers direct HTTP usage for any language.
Base URL: https://unify.apideck.com
IMPORTANT RULES
- ALWAYS include the three required headers:
Authorization,x-apideck-app-id, andx-apideck-consumer-id. - ALWAYS make API calls server-side to prevent token leakage.
- USE
x-apideck-service-idto specify which downstream connector to use. Required when a consumer has multiple connections for the same API. - USE cursor-based pagination — iterate until
meta.cursors.nextisnull. - USE the
filterquery parameters to narrow results server-side. DO NOT fetch all records and filter client-side. - USE the
fieldsquery parameter to request only the columns you need. - DO NOT store API keys in source code. Use environment variables.
Authentication
Every request requires these headers:
| Header | Required | Description |
Authorization | Yes | Bearer {API_KEY} |
x-apideck-app-id | Yes | Your Apideck application ID |
x-apideck-consumer-id | Yes | End-user/customer ID stored in Vault |
x-apideck-service-id | No | Downstream connector ID (e.g., salesforce, quickbooks) |
Content-Type | Yes (POST/PATCH) | application/json |
CRUD Operations
All resources follow a consistent URL pattern:
GET /{api}/{resource} → List
POST /{api}/{resource} → Create
GET /{api}/{resource}/{id} → Get
PATCH /{api}/{resource}/{id} → Update
DELETE /{api}/{resource}/{id} → DeleteList
curl -X GET 'https://unify.apideck.com/crm/contacts?limit=20&filter[email]=john@example.com&sort[by]=updated_at&sort[direction]=desc&fields=id,name,email' \
-H 'Authorization: Bearer {API_KEY}' \
-H 'x-apideck-app-id: {APP_ID}' \
-H 'x-apideck-consumer-id: {CONSUMER_ID}' \
-H 'x-apideck-service-id: salesforce'Response:
{
"status_code": 200,
"status": "OK",
"service": "salesforce",
"resource": "contacts",
"operation": "all",
"data": [
{ "id": "contact_123", "name": "John Doe", "email": "john@example.com" }
],
"meta": {
"items_on_page": 20,
"cursors": {
"previous": null,
"current": "em9oby1jcm06Om9mZnNldDo6MA==",
"next": "em9oby1jcm06Om9mZnNldDo6MjA="
}
},
"links": {
"previous": null,
"current": "https://unify.apideck.com/crm/contacts?cursor=...",
"next": "https://unify.apideck.com/crm/contacts?cursor=..."
}
}Create
curl -X POST 'https://unify.apideck.com/crm/contacts' \
-H 'Authorization: Bearer {API_KEY}' \
-H 'Content-Type: application/json' \
-H 'x-apideck-app-id: {APP_ID}' \
-H 'x-apideck-consumer-id: {CONSUMER_ID}' \
-H 'x-apideck-service-id: salesforce' \
-d '{
"first_name": "John",
"last_name": "Doe",
"title": "VP of Engineering",
"emails": [{"email": "john@example.com", "type": "primary"}],
"phone_numbers": [{"number": "+1234567890", "type": "mobile"}],
"addresses": [{
"type": "primary",
"street_1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postal_code": "94105",
"country": "US"
}]
}'Response: 201 Created with { "data": { "id": "contact_123" } }
Get
curl -X GET 'https://unify.apideck.com/crm/contacts/contact_123' \
-H 'Authorization: Bearer {API_KEY}' \
-H 'x-apideck-app-id: {APP_ID}' \
-H 'x-apideck-consumer-id: {CONSUMER_ID}' \
-H 'x-apideck-service-id: salesforce'Update
curl -X PATCH 'https://unify.apideck.com/crm/contacts/contact_123' \
-H 'Authorization: Bearer {API_KEY}' \
-H 'Content-Type: application/json' \
-H 'x-apideck-app-id: {APP_ID}' \
-H 'x-apideck-consumer-id: {CONSUMER_ID}' \
-H 'x-apideck-service-id: salesforce' \
-d '{"title": "CTO"}'Delete
curl -X DELETE 'https://unify.apideck.com/crm/contacts/contact_123' \
-H 'Authorization: Bearer {API_KEY}' \
-H 'x-apideck-app-id: {APP_ID}' \
-H 'x-apideck-consumer-id: {CONSUMER_ID}' \
-H 'x-apideck-service-id: salesforce'Pagination
Apideck uses cursor-based pagination. Pass the next cursor from the response to fetch subsequent pages:
| Parameter | Type | Default | Range |
limit | integer | 20 | 1-200 |
cursor | string | — | Opaque cursor from meta.cursors.next |
# First page
curl 'https://unify.apideck.com/crm/contacts?limit=50' -H '...'
# Next page
curl 'https://unify.apideck.com/crm/contacts?limit=50&cursor=em9oby1jcm06Om9mZnNldDo6NTA=' -H '...'When meta.cursors.next is null, you have reached the last page.
Filtering and Sorting
Filters
?filter[field_name]=valueAvailable filters vary by resource. Common examples:
| Resource | Filters |
| CRM Contacts | filter[name], filter[email], filter[phone_number], filter[company_id], filter[owner_id], filter[first_name], filter[last_name] |
| CRM Opportunities | filter[status], filter[title], filter[company_id], filter[owner_id] |
| Accounting Invoices | filter[updated_since] (ISO 8601 datetime) |
| General | filter[updated_since] for incremental sync |
Sorting
?sort[by]=updated_at&sort[direction]=descField Selection
?fields=id,name,email,phone_numbersPass-Through Parameters
For connector-specific query parameters not in the unified model:
?pass_through[search]=overdueFor connector-specific fields in request bodies:
{
"first_name": "John",
"pass_through": [
{
"service_id": "salesforce",
"operation_id": "contactsAdd",
"extend_object": {
"custom_sf_field__c": "value"
}
}
]
}Error Handling
All errors follow this format:
{
"status_code": 400,
"error": "Bad Request",
"type_name": "RequestValidationError",
"message": "Human-readable error description",
"detail": "Parameter-specific info",
"ref": "https://developers.apideck.com/errors#requestvalidationerror"
}| Code | Meaning |
| 400 | Bad Request — invalid parameters |
| 401 | Unauthorized — invalid API key |
| 402 | Payment Required — API limit reached |
| 404 | Not Found — resource does not exist |
| 422 | Unprocessable Entity — validation error |
| 429 | Too Many Requests — rate limit exceeded |
| 5xx | Server Error — Apideck or downstream failure |
Rate Limiting
Apideck normalizes downstream rate limit headers:
| Header | Description |
x-downstream-ratelimit-limit | Total request capacity |
x-downstream-ratelimit-remaining | Remaining requests |
x-downstream-ratelimit-reset | Unix timestamp when limits reset |
Raw Mode
Append ?raw=true to include the unmodified downstream response in a _raw property alongside normalized data.
Available API Endpoints
| API | URL Prefix | Resources |
| CRM | /crm/ | contacts, companies, leads, opportunities, activities, notes, pipelines, users |
| Accounting | /accounting/ | invoices, bills, payments, customers, suppliers, ledger-accounts, journal-entries, tax-rates, credit-notes, purchase-orders, balance-sheet, profit-and-loss |
| HRIS | /hris/ | employees, companies, departments, payrolls, time-off-requests |
| File Storage | /file-storage/ | files, folders, drives, drive-groups, shared-links, upload-sessions |
| ATS | /ats/ | applicants, applications, jobs |
| Vault | /vault/ | connections, sessions, consumers, custom-mappings, logs |
| Webhook | /webhook/ | webhooks, event-logs |
Webhook Events
Events follow the pattern {api}.{resource}.{action}:
crm.contact.created / .updated / .deleted
accounting.invoice.created / .updated / .deleted
hris.employee.created / .updated / .deleted / .terminated
file-storage.file.created / .updated / .deleted
ats.applicant.created / .updated / .deletedPayload:
{
"payload": {
"event_type": "crm.contact.updated",
"unified_api": "crm",
"service_id": "salesforce",
"consumer_id": "user_abc123",
"entity_id": "contact_123",
"entity_type": "contact",
"occurred_at": "2024-06-15T10:30:00.000Z"
}
}Verify signatures using the x-apideck-signature header with HMAC-SHA256.
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.

