@every-app/sdk 0.2.0 → 0.3.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +609 -3
- package/dist/cloudflare/catalogSettings.generated.d.ts +81 -0
- package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -0
- package/dist/cloudflare/catalogSettings.generated.js +174 -0
- package/dist/cloudflare/index.d.ts +23 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +24 -0
- package/dist/cloudflare/sentinel.d.ts +127 -0
- package/dist/cloudflare/sentinel.d.ts.map +1 -0
- package/dist/cloudflare/sentinel.js +85 -0
- package/dist/cloudflare/worker.d.ts +805 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +997 -0
- package/dist/dev/index.d.ts +8 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +7 -0
- package/dist/dev/keypair.d.ts +26 -0
- package/dist/dev/keypair.d.ts.map +1 -0
- package/dist/dev/keypair.js +62 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/internal/aiDefault.d.ts +204 -0
- package/dist/internal/aiDefault.d.ts.map +1 -0
- package/dist/internal/aiDefault.js +334 -0
- package/dist/internal/aiProviders.d.ts +72 -0
- package/dist/internal/aiProviders.d.ts.map +1 -0
- package/dist/internal/aiProviders.js +233 -0
- package/dist/internal/appSettings.d.ts +315 -0
- package/dist/internal/appSettings.d.ts.map +1 -0
- package/dist/internal/appSettings.js +549 -0
- package/dist/internal/audit.d.ts +108 -0
- package/dist/internal/audit.d.ts.map +1 -0
- package/dist/internal/audit.js +235 -0
- package/dist/internal/capabilities.d.ts +3174 -0
- package/dist/internal/capabilities.d.ts.map +1 -0
- package/dist/internal/capabilities.js +1110 -0
- package/dist/internal/catalog/commerce.d.ts +394 -0
- package/dist/internal/catalog/commerce.d.ts.map +1 -0
- package/dist/internal/catalog/commerce.js +477 -0
- package/dist/internal/catalog/comms.d.ts +375 -0
- package/dist/internal/catalog/comms.d.ts.map +1 -0
- package/dist/internal/catalog/comms.js +520 -0
- package/dist/internal/catalog/index.d.ts +1973 -0
- package/dist/internal/catalog/index.d.ts.map +1 -0
- package/dist/internal/catalog/index.js +19 -0
- package/dist/internal/catalog/inference.d.ts +393 -0
- package/dist/internal/catalog/inference.d.ts.map +1 -0
- package/dist/internal/catalog/inference.js +460 -0
- package/dist/internal/catalog/infra.d.ts +423 -0
- package/dist/internal/catalog/infra.d.ts.map +1 -0
- package/dist/internal/catalog/infra.js +543 -0
- package/dist/internal/catalog/search.d.ts +400 -0
- package/dist/internal/catalog/search.d.ts.map +1 -0
- package/dist/internal/catalog/search.js +463 -0
- package/dist/internal/devProviders.d.ts +49 -0
- package/dist/internal/devProviders.d.ts.map +1 -0
- package/dist/internal/devProviders.js +80 -0
- package/dist/internal/email.d.ts +280 -0
- package/dist/internal/email.d.ts.map +1 -0
- package/dist/internal/email.js +613 -0
- package/dist/internal/events.d.ts +193 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +367 -0
- package/dist/internal/gatewaySettings.d.ts +83 -0
- package/dist/internal/gatewaySettings.d.ts.map +1 -0
- package/dist/internal/gatewaySettings.js +215 -0
- package/dist/internal/identity.d.ts +57 -5
- package/dist/internal/identity.d.ts.map +1 -1
- package/dist/internal/identity.js +99 -22
- package/dist/internal/index.d.ts +22 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +22 -1
- package/dist/internal/members.d.ts +36 -0
- package/dist/internal/members.d.ts.map +1 -0
- package/dist/internal/members.js +7 -0
- package/dist/internal/oauthClient.d.ts +61 -0
- package/dist/internal/oauthClient.d.ts.map +1 -0
- package/dist/internal/oauthClient.js +133 -0
- package/dist/internal/oauthPresets.d.ts +33 -0
- package/dist/internal/oauthPresets.d.ts.map +1 -0
- package/dist/internal/oauthPresets.js +1064 -0
- package/dist/internal/oauthScopes.d.ts +172 -0
- package/dist/internal/oauthScopes.d.ts.map +1 -0
- package/dist/internal/oauthScopes.js +510 -0
- package/dist/internal/oauthSpec.d.ts +102 -0
- package/dist/internal/oauthSpec.d.ts.map +1 -0
- package/dist/internal/oauthSpec.js +789 -0
- package/dist/internal/organizationName.d.ts +18 -0
- package/dist/internal/organizationName.d.ts.map +1 -0
- package/dist/internal/organizationName.js +24 -0
- package/dist/internal/protocol.d.ts +150 -3
- package/dist/internal/protocol.d.ts.map +1 -1
- package/dist/internal/protocol.js +163 -2
- package/dist/internal/providerApps.d.ts +75 -0
- package/dist/internal/providerApps.d.ts.map +1 -0
- package/dist/internal/providerApps.js +59 -0
- package/dist/internal/providerRegistry.d.ts +218 -0
- package/dist/internal/providerRegistry.d.ts.map +1 -0
- package/dist/internal/providerRegistry.js +432 -0
- package/dist/internal/providerSpec.d.ts +66 -0
- package/dist/internal/providerSpec.d.ts.map +1 -0
- package/dist/internal/providerSpec.js +1154 -0
- package/dist/internal/remoteMcp.d.ts +188 -0
- package/dist/internal/remoteMcp.d.ts.map +1 -0
- package/dist/internal/remoteMcp.js +543 -0
- package/dist/internal/signInProviders.d.ts +104 -0
- package/dist/internal/signInProviders.d.ts.map +1 -0
- package/dist/internal/signInProviders.js +245 -0
- package/dist/internal/tools.d.ts +115 -0
- package/dist/internal/tools.d.ts.map +1 -0
- package/dist/internal/tools.js +80 -0
- package/dist/manifest.d.ts +238 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +30 -0
- package/dist/server/ai.d.ts +111 -0
- package/dist/server/ai.d.ts.map +1 -0
- package/dist/server/ai.js +145 -0
- package/dist/server/aiBinding.d.ts +68 -0
- package/dist/server/aiBinding.d.ts.map +1 -0
- package/dist/server/aiBinding.js +294 -0
- package/dist/server/attribution.d.ts +43 -0
- package/dist/server/attribution.d.ts.map +1 -0
- package/dist/server/attribution.js +75 -0
- package/dist/server/authorizeUrl.d.ts +43 -0
- package/dist/server/authorizeUrl.d.ts.map +1 -0
- package/dist/server/authorizeUrl.js +106 -0
- package/dist/server/connectUrl.d.ts +21 -0
- package/dist/server/connectUrl.d.ts.map +1 -0
- package/dist/server/connectUrl.js +37 -0
- package/dist/server/context.d.ts +68 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +117 -0
- package/dist/server/emailBinding.d.ts +72 -0
- package/dist/server/emailBinding.d.ts.map +1 -0
- package/dist/server/emailBinding.js +124 -0
- package/dist/server/emit.d.ts +63 -0
- package/dist/server/emit.d.ts.map +1 -0
- package/dist/server/emit.js +101 -0
- package/dist/server/env.d.ts +44 -0
- package/dist/server/env.d.ts.map +1 -0
- package/dist/server/env.js +1 -0
- package/dist/server/everyApp.d.ts +65 -19
- package/dist/server/everyApp.d.ts.map +1 -1
- package/dist/server/everyApp.js +195 -30
- package/dist/server/fromMcpTools.d.ts +89 -0
- package/dist/server/fromMcpTools.d.ts.map +1 -0
- package/dist/server/fromMcpTools.js +192 -0
- package/dist/server/gatewayFetch.d.ts +54 -14
- package/dist/server/gatewayFetch.d.ts.map +1 -1
- package/dist/server/gatewayFetch.js +201 -37
- package/dist/server/gatewayUrl.d.ts +13 -0
- package/dist/server/gatewayUrl.d.ts.map +1 -0
- package/dist/server/gatewayUrl.js +34 -0
- package/dist/server/index.d.ts +23 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +19 -2
- package/dist/server/integrationFetch.d.ts +162 -0
- package/dist/server/integrationFetch.d.ts.map +1 -0
- package/dist/server/integrationFetch.js +688 -0
- package/dist/server/listMembers.d.ts +32 -0
- package/dist/server/listMembers.d.ts.map +1 -0
- package/dist/server/listMembers.js +71 -0
- package/dist/server/nodeServer.d.ts +48 -0
- package/dist/server/nodeServer.d.ts.map +1 -0
- package/dist/server/nodeServer.js +45 -0
- package/dist/server/refusal.d.ts +55 -0
- package/dist/server/refusal.d.ts.map +1 -0
- package/dist/server/refusal.js +193 -0
- package/dist/server/sendEmail.d.ts +39 -0
- package/dist/server/sendEmail.d.ts.map +1 -0
- package/dist/server/sendEmail.js +114 -0
- package/dist/server/tools.d.ts +184 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +347 -0
- package/dist/server/toolsEndpoint.d.ts +32 -0
- package/dist/server/toolsEndpoint.d.ts.map +1 -0
- package/dist/server/toolsEndpoint.js +237 -0
- package/dist/tanstack-start/index.d.ts +9 -0
- package/dist/tanstack-start/index.d.ts.map +1 -0
- package/dist/tanstack-start/index.js +29 -0
- package/dist/testing/index.d.ts +93 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +156 -0
- package/package.json +42 -8
- package/dist/server/mcp.d.ts +0 -66
- package/dist/server/mcp.d.ts.map +0 -1
- package/dist/server/mcp.js +0 -147
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
export const COMMERCE = {
|
|
2
|
+
stripe: {
|
|
3
|
+
mode: "api_key",
|
|
4
|
+
label: "Stripe",
|
|
5
|
+
description: "Payments: customers, subscriptions, invoices, charges and payouts.",
|
|
6
|
+
auth: {
|
|
7
|
+
kind: "bearer",
|
|
8
|
+
secret: "STRIPE_API_KEY",
|
|
9
|
+
},
|
|
10
|
+
docs: "https://dashboard.stripe.com/apikeys",
|
|
11
|
+
api: "https://docs.stripe.com/api",
|
|
12
|
+
hosts: ["api.stripe.com", "files.stripe.com"],
|
|
13
|
+
data: "account",
|
|
14
|
+
access: ["read", "write"],
|
|
15
|
+
readMethods: ["GET", "HEAD"],
|
|
16
|
+
writeMethods: ["POST", "DELETE"],
|
|
17
|
+
accountWidePaths: [
|
|
18
|
+
["v1", "account"],
|
|
19
|
+
["v1", "accounts"],
|
|
20
|
+
["v2", "core", "accounts"],
|
|
21
|
+
["v1", "webhook_endpoints"],
|
|
22
|
+
["v2", "core", "event_destinations"],
|
|
23
|
+
["v1", "apps", "secrets"],
|
|
24
|
+
],
|
|
25
|
+
hint: "A restricted API key from the API keys page of the Stripe dashboard, with only the permissions the app needs. The Gateway sends it as a bearer token.",
|
|
26
|
+
secrets: [
|
|
27
|
+
{
|
|
28
|
+
name: "STRIPE_API_KEY",
|
|
29
|
+
hint: "A restricted key (rk_live_...) with only the permissions the app needs; a sandbox key (rk_test_... or sk_test_...) to try it.",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
smoke: {
|
|
33
|
+
method: "GET",
|
|
34
|
+
path: "/v1/balance",
|
|
35
|
+
expect: [200],
|
|
36
|
+
free: true,
|
|
37
|
+
note: "A restricted key needs Balance read for this one.",
|
|
38
|
+
},
|
|
39
|
+
cost: {
|
|
40
|
+
unit: "call",
|
|
41
|
+
note: "No per-call price; reads should average under 500 per transaction over 30 days, with at least 10,000 a month allowed.",
|
|
42
|
+
},
|
|
43
|
+
rate: {
|
|
44
|
+
perSecond: 100,
|
|
45
|
+
note: "Live mode, per account; sandbox 25/s; most single endpoints 25/s; Search 20/s.",
|
|
46
|
+
},
|
|
47
|
+
example: "list my latest customers and their subscriptions",
|
|
48
|
+
verified: {
|
|
49
|
+
on: "2026-10-25",
|
|
50
|
+
how: "docs",
|
|
51
|
+
},
|
|
52
|
+
tags: ["payments", "billing"],
|
|
53
|
+
},
|
|
54
|
+
lemonsqueezy: {
|
|
55
|
+
mode: "api_key",
|
|
56
|
+
label: "Lemon Squeezy",
|
|
57
|
+
description: "Merchant of record for software: stores, products, orders, subscriptions, license keys.",
|
|
58
|
+
auth: {
|
|
59
|
+
kind: "bearer",
|
|
60
|
+
secret: "LEMONSQUEEZY_API_KEY",
|
|
61
|
+
},
|
|
62
|
+
docs: "https://app.lemonsqueezy.com/settings/api",
|
|
63
|
+
api: "https://docs.lemonsqueezy.com/api",
|
|
64
|
+
hosts: ["api.lemonsqueezy.com"],
|
|
65
|
+
data: "account",
|
|
66
|
+
access: ["read", "write"],
|
|
67
|
+
readMethods: ["GET", "HEAD"],
|
|
68
|
+
writeMethods: ["POST", "PATCH", "DELETE"],
|
|
69
|
+
accountWidePaths: [
|
|
70
|
+
["v1", "users"],
|
|
71
|
+
["v1", "webhooks"],
|
|
72
|
+
],
|
|
73
|
+
hint: "An API key from Settings > API in Lemon Squeezy; the Gateway sends it as a bearer token. The API is JSON:API, so the app sends Accept and Content-Type application/vnd.api+json.",
|
|
74
|
+
secrets: [
|
|
75
|
+
{
|
|
76
|
+
name: "LEMONSQUEEZY_API_KEY",
|
|
77
|
+
hint: "An API key from Settings > API; a test mode key reaches test mode store data only.",
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
smoke: {
|
|
81
|
+
method: "GET",
|
|
82
|
+
path: "/v1/users/me",
|
|
83
|
+
expect: [200],
|
|
84
|
+
free: true,
|
|
85
|
+
note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.",
|
|
86
|
+
},
|
|
87
|
+
rate: {
|
|
88
|
+
perMinute: 300,
|
|
89
|
+
note: "300 API calls per minute.",
|
|
90
|
+
},
|
|
91
|
+
example: "list this month's orders and active subscriptions",
|
|
92
|
+
verified: {
|
|
93
|
+
on: "2026-10-25",
|
|
94
|
+
how: "docs",
|
|
95
|
+
},
|
|
96
|
+
tags: ["payments", "billing"],
|
|
97
|
+
},
|
|
98
|
+
paddle: {
|
|
99
|
+
mode: "api_key",
|
|
100
|
+
label: "Paddle",
|
|
101
|
+
description: "Paddle Billing: products, prices, customers, subscriptions and transactions.",
|
|
102
|
+
auth: {
|
|
103
|
+
kind: "bearer",
|
|
104
|
+
secret: "PADDLE_API_KEY",
|
|
105
|
+
},
|
|
106
|
+
docs: "https://developer.paddle.com/api-reference/about/authentication/",
|
|
107
|
+
api: "https://developer.paddle.com/api-reference/",
|
|
108
|
+
hosts: ["api.paddle.com", "sandbox-api.paddle.com"],
|
|
109
|
+
data: "account",
|
|
110
|
+
access: ["read", "write"],
|
|
111
|
+
readMethods: ["GET", "HEAD"],
|
|
112
|
+
writeMethods: ["POST", "PATCH", "DELETE"],
|
|
113
|
+
accountWidePaths: [
|
|
114
|
+
["account"],
|
|
115
|
+
["settings"],
|
|
116
|
+
["notification-settings"],
|
|
117
|
+
["notifications"],
|
|
118
|
+
["simulations"],
|
|
119
|
+
["simulation-runs"],
|
|
120
|
+
["client-tokens"],
|
|
121
|
+
["checkout-domains"],
|
|
122
|
+
["verifications"],
|
|
123
|
+
],
|
|
124
|
+
hint: "An API key from Paddle > My account > Settings > Authentication (API keys tab), with only the permissions the app needs; the Gateway sends it as a bearer token. Live and sandbox are separate hosts with separate keys.",
|
|
125
|
+
secrets: [
|
|
126
|
+
{
|
|
127
|
+
name: "PADDLE_API_KEY",
|
|
128
|
+
hint: "An API key (pdl_live_apikey_... or pdl_sdbx_apikey_...) with only the permissions the app needs; a sandbox key works on the sandbox host only.",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
smoke: {
|
|
132
|
+
method: "GET",
|
|
133
|
+
path: "/event-types",
|
|
134
|
+
expect: [200],
|
|
135
|
+
free: true,
|
|
136
|
+
note: "Paddle's own first request: needs no permissions. Send it to sandbox-api.paddle.com with a sandbox key.",
|
|
137
|
+
},
|
|
138
|
+
rate: {
|
|
139
|
+
perMinute: 240,
|
|
140
|
+
note: "Per IP address; pricing previews 1,000 a minute; 20 immediate-charge updates per subscription an hour.",
|
|
141
|
+
},
|
|
142
|
+
example: "list the active subscriptions that renew this week",
|
|
143
|
+
verified: {
|
|
144
|
+
on: "2026-10-25",
|
|
145
|
+
how: "docs",
|
|
146
|
+
},
|
|
147
|
+
tags: ["payments", "billing"],
|
|
148
|
+
},
|
|
149
|
+
// Legacy admin custom apps only: Shopify no longer lets a store create one, and Dev Dashboard tokens expire daily (the hint says so; shipping it is Ben's call, TODO.md).
|
|
150
|
+
shopify: {
|
|
151
|
+
mode: "api_key",
|
|
152
|
+
label: "Shopify",
|
|
153
|
+
description: "One store's Admin API (GraphQL): products, orders, customers and inventory.",
|
|
154
|
+
auth: {
|
|
155
|
+
kind: "header",
|
|
156
|
+
secret: "SHOPIFY_API_TOKEN",
|
|
157
|
+
header: "X-Shopify-Access-Token",
|
|
158
|
+
},
|
|
159
|
+
docs: "https://shopify.dev/docs/apps/build/authentication-authorization/legacy/admin-custom-apps",
|
|
160
|
+
api: "https://shopify.dev/docs/api/admin-graphql",
|
|
161
|
+
hosts: [],
|
|
162
|
+
hostSetting: "SHOPIFY_HOST",
|
|
163
|
+
data: "account",
|
|
164
|
+
access: ["write"],
|
|
165
|
+
readMethods: [],
|
|
166
|
+
writeMethods: ["POST"],
|
|
167
|
+
accountWidePaths: [["webhooks"], ["storefront_access_tokens"]],
|
|
168
|
+
hint: "An Admin API access token from a custom app created in the store's admin, sent in the X-Shopify-Access-Token header to the store's myshopify.com host. Shopify no longer lets stores create new admin custom apps, and Dev Dashboard tokens expire after 24 hours, which the Gateway can't refresh yet.",
|
|
169
|
+
secrets: [
|
|
170
|
+
{
|
|
171
|
+
name: "SHOPIFY_API_TOKEN",
|
|
172
|
+
hint: "The Admin API access token of a custom app made in the store's admin (Apps > Develop apps > the app > API credentials); it is shown once.",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "SHOPIFY_HOST",
|
|
176
|
+
hint: "The store's own host, like your-store.myshopify.com.",
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
smoke: {
|
|
180
|
+
method: "GET",
|
|
181
|
+
path: "/admin/api/2026-10/shop.json",
|
|
182
|
+
expect: [200],
|
|
183
|
+
free: true,
|
|
184
|
+
note: "The legacy REST read of the store; the Gateway forwards no GET for this entry, so run it from the person's terminal.",
|
|
185
|
+
},
|
|
186
|
+
rate: {
|
|
187
|
+
note: "GraphQL cost points per second by plan: Standard 100, Advanced 200, Plus 1,000, enterprise 2,000.",
|
|
188
|
+
},
|
|
189
|
+
example: "list the ten newest orders and what was in them",
|
|
190
|
+
verified: {
|
|
191
|
+
on: "2026-10-25",
|
|
192
|
+
how: "docs",
|
|
193
|
+
},
|
|
194
|
+
tags: ["ecommerce"],
|
|
195
|
+
},
|
|
196
|
+
// Unverified: Plaid wants a client id and a secret on every call (body or two headers); one header is all this kind sends, so the app adds PLAID-CLIENT-ID itself.
|
|
197
|
+
plaid: {
|
|
198
|
+
mode: "api_key",
|
|
199
|
+
label: "Plaid",
|
|
200
|
+
description: "Bank data: accounts, balances, transactions and identity, for the Items an app links.",
|
|
201
|
+
auth: {
|
|
202
|
+
kind: "header",
|
|
203
|
+
secret: "PLAID_SECRET",
|
|
204
|
+
header: "PLAID-SECRET",
|
|
205
|
+
},
|
|
206
|
+
docs: "https://dashboard.plaid.com/developers/keys",
|
|
207
|
+
api: "https://plaid.com/docs/api/",
|
|
208
|
+
hosts: ["sandbox.plaid.com", "production.plaid.com"],
|
|
209
|
+
data: "account",
|
|
210
|
+
access: ["read"],
|
|
211
|
+
readMethods: ["POST"],
|
|
212
|
+
accountWidePaths: [
|
|
213
|
+
["item", "webhook", "update"],
|
|
214
|
+
["item", "access_token", "invalidate"],
|
|
215
|
+
["item", "remove"],
|
|
216
|
+
["webhook_verification_key"],
|
|
217
|
+
["dashboard_user"],
|
|
218
|
+
["transfer"],
|
|
219
|
+
["payment_initiation"],
|
|
220
|
+
],
|
|
221
|
+
hint: "Plaid needs a client_id and a secret on every call, in the JSON body or in the PLAID-CLIENT-ID and PLAID-SECRET headers. The Gateway puts on one header, so the app would have to send PLAID-CLIENT-ID itself. Every endpoint is a POST.",
|
|
222
|
+
secrets: [
|
|
223
|
+
{
|
|
224
|
+
name: "PLAID_SECRET",
|
|
225
|
+
hint: "The secret for one environment (Sandbox or Production) from the Keys page of the Plaid Dashboard.",
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
rate: {
|
|
229
|
+
note: "Set per endpoint and per Item: /accounts/get allows 15 a minute per Item and 15,000 a minute per client.",
|
|
230
|
+
},
|
|
231
|
+
example: "list the last 30 days of transactions on a linked account",
|
|
232
|
+
verified: false,
|
|
233
|
+
tags: ["finance", "banking"],
|
|
234
|
+
},
|
|
235
|
+
attio: {
|
|
236
|
+
mode: "api_key",
|
|
237
|
+
label: "Attio",
|
|
238
|
+
description: "CRM: people, companies, deals, lists, notes and tasks in one Attio workspace.",
|
|
239
|
+
auth: {
|
|
240
|
+
kind: "bearer",
|
|
241
|
+
secret: "ATTIO_API_KEY",
|
|
242
|
+
},
|
|
243
|
+
docs: "https://attio.com/help/reference/apps/generating-an-api-key",
|
|
244
|
+
api: "https://docs.attio.com/rest-api/overview",
|
|
245
|
+
hosts: ["api.attio.com"],
|
|
246
|
+
data: "account",
|
|
247
|
+
access: ["read", "write"],
|
|
248
|
+
readMethods: ["GET", "HEAD"],
|
|
249
|
+
writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
|
|
250
|
+
accountWidePaths: [
|
|
251
|
+
["v2", "self"],
|
|
252
|
+
["v2", "webhooks"],
|
|
253
|
+
["v2", "workspace_members"],
|
|
254
|
+
],
|
|
255
|
+
hint: "An access token a workspace admin makes under Workspace settings > Developers, scoped to what the app needs; the Gateway sends it as a bearer token. Listing and searching records are POSTs, so an app that lists records needs write access.",
|
|
256
|
+
secrets: [
|
|
257
|
+
{
|
|
258
|
+
name: "ATTIO_API_KEY",
|
|
259
|
+
hint: "An access token from Workspace settings > Developers, with only the scopes the app needs.",
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
smoke: {
|
|
263
|
+
method: "GET",
|
|
264
|
+
path: "/v2/objects",
|
|
265
|
+
expect: [200],
|
|
266
|
+
free: true,
|
|
267
|
+
note: "Lists the workspace's objects; needs the object_configuration:read scope. /v2/self answers 200 even for a revoked token.",
|
|
268
|
+
},
|
|
269
|
+
rate: {
|
|
270
|
+
perSecond: 100,
|
|
271
|
+
note: "100 reads and 25 writes per second; listing records and entries also has score-based limits.",
|
|
272
|
+
},
|
|
273
|
+
example: "find the companies we added this week and their open deals",
|
|
274
|
+
verified: {
|
|
275
|
+
on: "2026-10-25",
|
|
276
|
+
how: "docs",
|
|
277
|
+
},
|
|
278
|
+
tags: ["crm"],
|
|
279
|
+
},
|
|
280
|
+
hubspot: {
|
|
281
|
+
mode: "api_key",
|
|
282
|
+
label: "HubSpot",
|
|
283
|
+
description: "CRM and marketing: contacts, companies, deals, tickets and more in one HubSpot account.",
|
|
284
|
+
auth: {
|
|
285
|
+
kind: "bearer",
|
|
286
|
+
secret: "HUBSPOT_API_TOKEN",
|
|
287
|
+
},
|
|
288
|
+
docs: "https://developers.hubspot.com/docs/apps/legacy-apps/private-apps/overview",
|
|
289
|
+
api: "https://developers.hubspot.com/docs/api-reference/latest/overview",
|
|
290
|
+
hosts: ["api.hubapi.com"],
|
|
291
|
+
data: "account",
|
|
292
|
+
access: ["read", "write"],
|
|
293
|
+
readMethods: ["GET", "HEAD"],
|
|
294
|
+
writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
|
|
295
|
+
accountWidePaths: [
|
|
296
|
+
["account-info"],
|
|
297
|
+
["settings", "users"],
|
|
298
|
+
["settings", "v3", "users"],
|
|
299
|
+
["settings", "teams"],
|
|
300
|
+
["app-webhooks"],
|
|
301
|
+
["webhooks"],
|
|
302
|
+
["webhooks-journal"],
|
|
303
|
+
["oauth"],
|
|
304
|
+
],
|
|
305
|
+
hint: "An access token from a HubSpot legacy private app (Development > Legacy apps > Create legacy app > Private), scoped to what the app needs; the Gateway sends it as a bearer token. CRM search is a POST, so an app that searches needs write access.",
|
|
306
|
+
secrets: [
|
|
307
|
+
{
|
|
308
|
+
name: "HUBSPOT_API_TOKEN",
|
|
309
|
+
hint: "The access token of a legacy private app (Development > Legacy apps > the app > Auth), with only the scopes the app needs.",
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
smoke: {
|
|
313
|
+
method: "GET",
|
|
314
|
+
path: "/account-info/2026-09/details",
|
|
315
|
+
expect: [200],
|
|
316
|
+
free: true,
|
|
317
|
+
note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.",
|
|
318
|
+
},
|
|
319
|
+
rate: {
|
|
320
|
+
perDay: 250000,
|
|
321
|
+
note: "Private apps on Free and Starter: 100 per 10 seconds per app and 250,000 a day per account; Pro 190 and 625,000; Enterprise 190 and 1,000,000.",
|
|
322
|
+
},
|
|
323
|
+
example: "list the deals that moved to closed won this month",
|
|
324
|
+
verified: {
|
|
325
|
+
on: "2026-10-25",
|
|
326
|
+
how: "docs",
|
|
327
|
+
},
|
|
328
|
+
tags: ["crm", "marketing"],
|
|
329
|
+
},
|
|
330
|
+
pipedrive: {
|
|
331
|
+
mode: "api_key",
|
|
332
|
+
label: "Pipedrive",
|
|
333
|
+
description: "Sales CRM: deals, persons, organizations, activities and pipelines.",
|
|
334
|
+
auth: {
|
|
335
|
+
kind: "header",
|
|
336
|
+
secret: "PIPEDRIVE_API_TOKEN",
|
|
337
|
+
header: "x-api-token",
|
|
338
|
+
},
|
|
339
|
+
docs: "https://app.pipedrive.com/settings/api",
|
|
340
|
+
api: "https://developers.pipedrive.com/docs/api/v1",
|
|
341
|
+
hosts: ["api.pipedrive.com"],
|
|
342
|
+
data: "account",
|
|
343
|
+
access: ["read", "write"],
|
|
344
|
+
readMethods: ["GET", "HEAD"],
|
|
345
|
+
writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
|
|
346
|
+
accountWidePaths: [
|
|
347
|
+
["v1", "users"],
|
|
348
|
+
["v1", "webhooks"],
|
|
349
|
+
["v1", "billing"],
|
|
350
|
+
["v1", "permissionsets"],
|
|
351
|
+
["v1", "roles"],
|
|
352
|
+
["v1", "usersettings"],
|
|
353
|
+
["v1", "userconnections"],
|
|
354
|
+
["v1", "legacyteams"],
|
|
355
|
+
],
|
|
356
|
+
hint: "A personal API token from Settings > Personal preferences > API in Pipedrive; the Gateway sends it in the x-api-token header. If API is missing there, an admin enables it for the person's permission set.",
|
|
357
|
+
secrets: [
|
|
358
|
+
{
|
|
359
|
+
name: "PIPEDRIVE_API_TOKEN",
|
|
360
|
+
hint: "Your personal API token from Settings > Personal preferences > API; it acts as you, and each company you belong to has its own.",
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
smoke: {
|
|
364
|
+
method: "GET",
|
|
365
|
+
path: "/v1/users/me",
|
|
366
|
+
expect: [200],
|
|
367
|
+
free: true,
|
|
368
|
+
note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.",
|
|
369
|
+
},
|
|
370
|
+
cost: {
|
|
371
|
+
unit: "call",
|
|
372
|
+
note: "Each endpoint spends API tokens from a daily company budget of 30,000 x plan multiplier (1 to 7) x seats.",
|
|
373
|
+
},
|
|
374
|
+
rate: {
|
|
375
|
+
note: "Per API token: 20 (Lite) to 120 (Ultimate) requests per 2 seconds; Search 10 per 2 seconds.",
|
|
376
|
+
},
|
|
377
|
+
example: "list the open deals in my main pipeline",
|
|
378
|
+
verified: {
|
|
379
|
+
on: "2026-10-25",
|
|
380
|
+
how: "docs",
|
|
381
|
+
},
|
|
382
|
+
tags: ["crm", "sales"],
|
|
383
|
+
},
|
|
384
|
+
airtable: {
|
|
385
|
+
mode: "api_key",
|
|
386
|
+
label: "Airtable",
|
|
387
|
+
description: "Bases, tables and records in the Airtable workspaces a token can reach.",
|
|
388
|
+
auth: {
|
|
389
|
+
kind: "bearer",
|
|
390
|
+
secret: "AIRTABLE_API_TOKEN",
|
|
391
|
+
},
|
|
392
|
+
docs: "https://airtable.com/create/tokens",
|
|
393
|
+
api: "https://airtable.com/developers/web/api/introduction",
|
|
394
|
+
hosts: ["api.airtable.com"],
|
|
395
|
+
data: "account",
|
|
396
|
+
access: ["read", "write"],
|
|
397
|
+
readMethods: ["GET", "HEAD"],
|
|
398
|
+
writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
|
|
399
|
+
accountWidePaths: [
|
|
400
|
+
["v0", "meta", "whoami"],
|
|
401
|
+
["v0", "meta", "enterpriseaccounts"],
|
|
402
|
+
["v0", "meta", "workspaces"],
|
|
403
|
+
["v0", "meta", "groups"],
|
|
404
|
+
["v0", "bases"],
|
|
405
|
+
["scim"],
|
|
406
|
+
["collaborators"],
|
|
407
|
+
["invites"],
|
|
408
|
+
["shares"],
|
|
409
|
+
["blockinstallations"],
|
|
410
|
+
],
|
|
411
|
+
hint: "A personal access token from airtable.com/create/tokens, limited to the scopes and bases the app needs; the Gateway sends it as a bearer token. Listing records by POST (listRecords) needs write access; the GET form doesn't.",
|
|
412
|
+
secrets: [
|
|
413
|
+
{
|
|
414
|
+
name: "AIRTABLE_API_TOKEN",
|
|
415
|
+
hint: "A personal access token limited to the scopes and bases the app needs.",
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
smoke: {
|
|
419
|
+
method: "GET",
|
|
420
|
+
path: "/v0/meta/whoami",
|
|
421
|
+
expect: [200],
|
|
422
|
+
free: true,
|
|
423
|
+
note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.",
|
|
424
|
+
},
|
|
425
|
+
rate: {
|
|
426
|
+
perSecond: 5,
|
|
427
|
+
note: "5 requests per second per base; 50 per second across all of one user's personal access tokens.",
|
|
428
|
+
},
|
|
429
|
+
example: "list this week's new rows in my Leads table",
|
|
430
|
+
verified: {
|
|
431
|
+
on: "2026-10-25",
|
|
432
|
+
how: "docs",
|
|
433
|
+
},
|
|
434
|
+
tags: ["database", "spreadsheet"],
|
|
435
|
+
},
|
|
436
|
+
notion: {
|
|
437
|
+
mode: "api_key",
|
|
438
|
+
label: "Notion",
|
|
439
|
+
description: "Pages, databases and blocks that a Notion connection has been given.",
|
|
440
|
+
auth: {
|
|
441
|
+
kind: "bearer",
|
|
442
|
+
secret: "NOTION_API_TOKEN",
|
|
443
|
+
},
|
|
444
|
+
docs: "https://app.notion.com/developers/connections",
|
|
445
|
+
api: "https://developers.notion.com/reference/intro",
|
|
446
|
+
hosts: ["api.notion.com"],
|
|
447
|
+
data: "account",
|
|
448
|
+
access: ["read", "write"],
|
|
449
|
+
readMethods: ["GET", "HEAD"],
|
|
450
|
+
writeMethods: ["POST", "PATCH", "DELETE"],
|
|
451
|
+
accountWidePaths: [["v1", "users"], ["v1", "oauth"], ["admin"]],
|
|
452
|
+
hint: "An internal connection's API token (a workspace owner creates the connection in Notion's developer portal), sent as a bearer token; it reaches only pages shared with it. The app sends the Notion-Version header itself. Search and data source queries are POSTs, so an app that queries needs write access.",
|
|
453
|
+
secrets: [
|
|
454
|
+
{
|
|
455
|
+
name: "NOTION_API_TOKEN",
|
|
456
|
+
hint: "The API token on an internal connection's Configuration tab; share the pages it should reach with the connection.",
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
smoke: {
|
|
460
|
+
method: "GET",
|
|
461
|
+
path: "/v1/users/me",
|
|
462
|
+
expect: [200],
|
|
463
|
+
free: true,
|
|
464
|
+
note: "Send Notion-Version: 2026-03-11 with it; account-wide, so run it from the person's terminal.",
|
|
465
|
+
},
|
|
466
|
+
rate: {
|
|
467
|
+
perMinute: 180,
|
|
468
|
+
note: "Per connection: 180 a minute, 600 on Business and Enterprise; data source queries about 3 per second.",
|
|
469
|
+
},
|
|
470
|
+
example: "find the pages in my Projects database that are due this week",
|
|
471
|
+
verified: {
|
|
472
|
+
on: "2026-10-25",
|
|
473
|
+
how: "docs",
|
|
474
|
+
},
|
|
475
|
+
tags: ["docs", "notes", "database"],
|
|
476
|
+
},
|
|
477
|
+
};
|