@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,3174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in provider catalog: everything the gateway holds a credential
|
|
3
|
+
* for on apps' behalf (docs/capabilities.md,
|
|
4
|
+
* docs/design/2026-10-provider-registry.md), of four kinds, each an entry
|
|
5
|
+
* of data and nothing else, so a provider the catalog doesn't have can be
|
|
6
|
+
* registered on one gateway as a row of the same shape (./providerSpec.ts,
|
|
7
|
+
* ./providerRegistry.ts):
|
|
8
|
+
*
|
|
9
|
+
* - `api_key`: a provider whose key the gateway holds. The operator sets
|
|
10
|
+
* the key once on the gateway (`everyapp secret set <secret>`), an app lists the provider in its manifest's `capabilities`,
|
|
11
|
+
* and the app calls the provider through the AppGateway binding
|
|
12
|
+
* (`integrationFetch()`), so no app ever holds the key. `auth` says
|
|
13
|
+
* where the key goes on the request ({@link ApiKeyAuth}).
|
|
14
|
+
* - `ai`: an AI provider, reached under `providers` in the manifest and
|
|
15
|
+
* `/api/ai/<id>` on the binding (`createGatewayFetch()`), with the AI
|
|
16
|
+
* proxy's rules: inference routes only, the model allowlist, the usage
|
|
17
|
+
* tap. Never a capability: its key would reach the account's credits
|
|
18
|
+
* and keys on the same host.
|
|
19
|
+
* - `oauth_client`: a provider's OAuth client (Google's, Microsoft's,
|
|
20
|
+
* Slack's), held the same way. The gateway completes the token endpoint
|
|
21
|
+
* calls only, putting the client on them; the app builds the authorize
|
|
22
|
+
* URL from the public client id (`integrationStatus()`), sends people
|
|
23
|
+
* back to a callback its manifest entry lists (`redirectPaths`), keeps
|
|
24
|
+
* the user tokens and calls the provider's API with them itself. Other
|
|
25
|
+
* providers' clients (GitHub, the social networks) are presets
|
|
26
|
+
* (./oauthPresets.ts): rows only once an operator adds one. A client shared by apps
|
|
27
|
+
* with different needs carries a `scopePolicy`: named scope sets an app
|
|
28
|
+
* lists in its manifest entry's `scopes`, which ./oauthScopes.ts turns
|
|
29
|
+
* into what the app may ask the provider for and what a token it is
|
|
30
|
+
* handed may carry.
|
|
31
|
+
* - `service`: something the gateway does itself, with no upstream host
|
|
32
|
+
* an app names (sending email, listing the organization's members). An
|
|
33
|
+
* app lists it the same way and calls its routes,
|
|
34
|
+
* `/api/integrations/<id>/<route>`, through the SDK's own helper
|
|
35
|
+
* (`sendEmail()`, `listMembers()`).
|
|
36
|
+
*
|
|
37
|
+
* The gateway enforces these definitions, the manifest validator checks
|
|
38
|
+
* `capabilities` against them, and the SDK reads them for its local-dev
|
|
39
|
+
* fallback, which calls the provider directly with a developer's own key.
|
|
40
|
+
* All three import them from here so they cannot drift.
|
|
41
|
+
*/
|
|
42
|
+
/** What an app may ask to do with a capability. */
|
|
43
|
+
export type CapabilityAccess = "read" | "write";
|
|
44
|
+
/**
|
|
45
|
+
* Where an API-key provider's key goes on a request, as data: the same
|
|
46
|
+
* four kinds a remote MCP app's credential takes. `secret` is always the
|
|
47
|
+
* name of a Gateway setting (in local dev, the `.dev.vars` name), never a
|
|
48
|
+
* value. {@link authorizationFor} turns one into headers or a query
|
|
49
|
+
* parameter from the settings.
|
|
50
|
+
*/
|
|
51
|
+
export type ApiKeyAuth =
|
|
52
|
+
/** `Authorization: Bearer <key>`; `scheme` for a provider that spells it `Token` or `Api-Key`. */
|
|
53
|
+
{
|
|
54
|
+
kind: "bearer";
|
|
55
|
+
secret: string;
|
|
56
|
+
scheme?: string;
|
|
57
|
+
}
|
|
58
|
+
/** `<header>: <prefix><key>` (`x-api-key: <key>`, `Authorization: Klaviyo-API-Key <key>`). */
|
|
59
|
+
| {
|
|
60
|
+
kind: "header";
|
|
61
|
+
secret: string;
|
|
62
|
+
header: string;
|
|
63
|
+
prefix?: string;
|
|
64
|
+
}
|
|
65
|
+
/** `?<param>=<key>` on the query string. */
|
|
66
|
+
| {
|
|
67
|
+
kind: "query";
|
|
68
|
+
secret: string;
|
|
69
|
+
param: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* `Authorization: Basic base64(user:password)`, the placement said
|
|
73
|
+
* outright, never guessed from the value: the secret is the password
|
|
74
|
+
* beside `user` (a literal, Mailgun's `api`; or `{ secret }`, a second
|
|
75
|
+
* Gateway setting, Twilio's SID), the username with an empty password
|
|
76
|
+
* (Segment, Mixpanel, Crisp), or the whole `login:password` pair, which
|
|
77
|
+
* may already be base64-encoded (DataForSEO's rule: a base64 string
|
|
78
|
+
* never holds a colon).
|
|
79
|
+
*/
|
|
80
|
+
| {
|
|
81
|
+
kind: "basic";
|
|
82
|
+
secret: string;
|
|
83
|
+
as: "password";
|
|
84
|
+
user: string | {
|
|
85
|
+
secret: string;
|
|
86
|
+
};
|
|
87
|
+
} | {
|
|
88
|
+
kind: "basic";
|
|
89
|
+
secret: string;
|
|
90
|
+
as: "username";
|
|
91
|
+
} | {
|
|
92
|
+
kind: "basic";
|
|
93
|
+
secret: string;
|
|
94
|
+
as: "pair";
|
|
95
|
+
};
|
|
96
|
+
/** What a provider says about one of its Gateway settings, for whoever sets it. */
|
|
97
|
+
export interface ProviderSecretDetail {
|
|
98
|
+
name: string;
|
|
99
|
+
/** What kind of key, in one sentence: "A restricted key with read access to Customers is enough." */
|
|
100
|
+
hint?: string;
|
|
101
|
+
}
|
|
102
|
+
/** What a call costs, for the usage counters and the setup text. */
|
|
103
|
+
export interface ProviderCost {
|
|
104
|
+
unit: "call" | "result" | "token";
|
|
105
|
+
usd?: number;
|
|
106
|
+
note?: string;
|
|
107
|
+
/**
|
|
108
|
+
* The field of the provider's JSON answer that reports the call's cost
|
|
109
|
+
* in US dollars, added to the usage counters: a top-level name the
|
|
110
|
+
* capability proxy reads off the head of every answer (DataForSEO's
|
|
111
|
+
* `cost`), or a dotted path the AI proxy reads off the tail with the
|
|
112
|
+
* token usage (OpenRouter's `usage.cost`). Absent: nothing is read, and
|
|
113
|
+
* `usd` is the flat per-call price where the provider has one.
|
|
114
|
+
*/
|
|
115
|
+
responseField?: string;
|
|
116
|
+
}
|
|
117
|
+
/** The provider's rate limits, as hints beside the counters. */
|
|
118
|
+
export interface ProviderRate {
|
|
119
|
+
perSecond?: number;
|
|
120
|
+
perMinute?: number;
|
|
121
|
+
perDay?: number;
|
|
122
|
+
note?: string;
|
|
123
|
+
}
|
|
124
|
+
/** One request that costs nothing, for a setup guide's Verify step. */
|
|
125
|
+
export interface SmokeRequest {
|
|
126
|
+
method: "GET" | "HEAD" | "POST";
|
|
127
|
+
/** One of the provider's hosts; the first when absent. */
|
|
128
|
+
host?: string;
|
|
129
|
+
path: string;
|
|
130
|
+
/** The statuses that mean the key works. */
|
|
131
|
+
expect: readonly number[];
|
|
132
|
+
free: boolean;
|
|
133
|
+
note?: string;
|
|
134
|
+
}
|
|
135
|
+
/** Whether somebody checked the entry against the provider's docs, and how. */
|
|
136
|
+
export type ProviderVerification = {
|
|
137
|
+
on: string;
|
|
138
|
+
how: "docs" | "live";
|
|
139
|
+
} | false;
|
|
140
|
+
/** What every provider may say about itself beyond what the gateway enforces. */
|
|
141
|
+
export interface ProviderDetails {
|
|
142
|
+
/** What it is for, in one line, for lists and agents. */
|
|
143
|
+
description?: string;
|
|
144
|
+
/** The API reference, when it isn't the `docs` page. */
|
|
145
|
+
api?: string;
|
|
146
|
+
/**
|
|
147
|
+
* The setup sentence the "Needs setup" dialog and `everyapp status` show
|
|
148
|
+
* when there is no guide, or beside one: what the key is and where it
|
|
149
|
+
* comes from, 1 to 3 sentences.
|
|
150
|
+
*/
|
|
151
|
+
hint?: string;
|
|
152
|
+
/** Detail per Gateway setting `auth` names. */
|
|
153
|
+
secrets?: readonly ProviderSecretDetail[];
|
|
154
|
+
/** What to say to an agent to try it, after "Use <name> to". */
|
|
155
|
+
example?: string;
|
|
156
|
+
cost?: ProviderCost;
|
|
157
|
+
rate?: ProviderRate;
|
|
158
|
+
/** One request that costs nothing and proves the key works, for a person's terminal. */
|
|
159
|
+
smoke?: SmokeRequest;
|
|
160
|
+
verified?: ProviderVerification;
|
|
161
|
+
tags?: readonly string[];
|
|
162
|
+
}
|
|
163
|
+
export interface ApiKeyCapability extends ProviderDetails {
|
|
164
|
+
mode: "api_key";
|
|
165
|
+
/** The provider's name in errors and logs. */
|
|
166
|
+
label: string;
|
|
167
|
+
/** Where the key goes, and which Gateway setting holds it. */
|
|
168
|
+
auth: ApiKeyAuth;
|
|
169
|
+
/** Where an operator gets the key: the provider's API access page. */
|
|
170
|
+
docs: string;
|
|
171
|
+
/** The everyapp skill's setup guide for it, relative to the skill (`setup/dataforseo.md`); a row has none. */
|
|
172
|
+
setup?: string;
|
|
173
|
+
/** The only hosts the key is ever sent to, always over https; may be empty when `hostSetting` names the host. */
|
|
174
|
+
hosts: readonly string[];
|
|
175
|
+
/**
|
|
176
|
+
* A Gateway setting naming the provider's host, for a provider whose host
|
|
177
|
+
* is the operator's (Shopify's `<shop>.myshopify.com`): a bare host or an
|
|
178
|
+
* https origin with no path, held to the host rules when read
|
|
179
|
+
* ({@link apiKeyHosts}). Named after the provider like its key.
|
|
180
|
+
*/
|
|
181
|
+
hostSetting?: string;
|
|
182
|
+
/**
|
|
183
|
+
* Whose data the key reaches: `per-call` (search, scrape, inference:
|
|
184
|
+
* each call is its own) or `account` (every list is the whole account).
|
|
185
|
+
* A hosted gateway, where one key would be every tenant's, serves
|
|
186
|
+
* `account` providers to nobody until it holds per-organization keys.
|
|
187
|
+
*/
|
|
188
|
+
data?: "per-call" | "account";
|
|
189
|
+
/** The access levels the provider offers; the manifest may ask for these only. */
|
|
190
|
+
access: readonly CapabilityAccess[];
|
|
191
|
+
/** Methods an app asking for `access: "read"` may use. */
|
|
192
|
+
readMethods: readonly string[];
|
|
193
|
+
/** Methods an app asking for `access: "write"` may use besides, when the provider offers write; {@link DEFAULT_WRITE_METHODS} when absent. */
|
|
194
|
+
writeMethods?: readonly string[];
|
|
195
|
+
/**
|
|
196
|
+
* Paths no app may reach, each as its run of path segments, refused
|
|
197
|
+
* wherever those segments appear together in the upstream path however
|
|
198
|
+
* it is spelled (see {@link isAccountWidePath}). One key serves every app
|
|
199
|
+
* in every organization, so endpoints that list or describe the whole
|
|
200
|
+
* provider account would show one app another's work.
|
|
201
|
+
*/
|
|
202
|
+
accountWidePaths: readonly (readonly string[])[];
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* An AI provider (OpenAI, OpenRouter, Workers AI): the AI proxy's table as
|
|
206
|
+
* a catalog entry. The app's path is joined onto `origin` and `basePath`
|
|
207
|
+
* (with `{SETTING}` placeholders filled from the Gateway's settings, each
|
|
208
|
+
* URL-encoded) and must be one of `inferenceRoutes` (a POST), unless both
|
|
209
|
+
* the operator (`AI_PROXY_EXTRA_ROUTES`) and the app's manifest (`ai.routes`)
|
|
210
|
+
* allow more (`extraRoutes`). `unstoredRoutes` get `store: false`.
|
|
211
|
+
* `normalize` names the one response rewrite the gateway has.
|
|
212
|
+
*/
|
|
213
|
+
export interface AiProviderCapability extends ProviderDetails {
|
|
214
|
+
mode: "ai";
|
|
215
|
+
label: string;
|
|
216
|
+
/** Where the key goes: bearer for the three today; Anthropic's `x-api-key` header is a `header` kind. */
|
|
217
|
+
auth: ApiKeyAuth;
|
|
218
|
+
/**
|
|
219
|
+
* The auth setting is read when set and the entry works without it:
|
|
220
|
+
* Cloudflare AI Gateway's own token (`cf-aig-authorization`), which an
|
|
221
|
+
* authenticated gateway requires and an open one ignores. Never a need.
|
|
222
|
+
*/
|
|
223
|
+
authOptional?: true;
|
|
224
|
+
docs: string;
|
|
225
|
+
setup?: string;
|
|
226
|
+
/** `https://api.openai.com`. */
|
|
227
|
+
origin: string;
|
|
228
|
+
/** Gateway settings the URL needs besides the key (`CLOUDFLARE_ACCOUNT_ID`). */
|
|
229
|
+
alsoNeeds?: readonly string[];
|
|
230
|
+
/** Joined onto the origin before every path: `/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai`. */
|
|
231
|
+
basePath?: string;
|
|
232
|
+
inferenceRoutes: readonly string[];
|
|
233
|
+
unstoredRoutes?: readonly string[];
|
|
234
|
+
extraRoutes?: boolean;
|
|
235
|
+
normalize?: "workers-ai";
|
|
236
|
+
/**
|
|
237
|
+
* The request shape the provider's inference routes take: OpenAI's
|
|
238
|
+
* (chat completions and the OpenAI-compatible family: OpenRouter,
|
|
239
|
+
* Workers AI, Groq, Mistral, Gemini's `/v1beta/openai`), or Anthropic's
|
|
240
|
+
* Messages API, or the provider's own (Cohere's v2). The Gateway's
|
|
241
|
+
* default route (`/api/ai/default/…`) serves OpenAI-shaped chat, so only
|
|
242
|
+
* an `openai`-shaped entry can be the default; the others are pinned by
|
|
243
|
+
* an app that speaks them. Absent: `openai`.
|
|
244
|
+
*/
|
|
245
|
+
shape?: "openai" | "anthropic" | "other";
|
|
246
|
+
/**
|
|
247
|
+
* Chat through the default route: the entry's chat route (one of
|
|
248
|
+
* `inferenceRoutes`) that `/api/ai/default/v1/chat/completions` maps
|
|
249
|
+
* onto, and the model the Gateway fills in when the app names none or
|
|
250
|
+
* names `default`. Absent: the entry can't be the Gateway's default.
|
|
251
|
+
*/
|
|
252
|
+
chat?: AiRoute;
|
|
253
|
+
/** Embeddings through the default route (`/api/ai/default/v1/embeddings`), the same way. */
|
|
254
|
+
embeddings?: AiRoute;
|
|
255
|
+
/**
|
|
256
|
+
* How Cloudflare AI Gateway fronts the provider: its slug under
|
|
257
|
+
* `https://gateway.ai.cloudflare.com/v1/{account}/{gateway}/`, and the
|
|
258
|
+
* prefix of the provider's direct path the gateway's URL leaves out
|
|
259
|
+
* (OpenRouter's `/api`, OpenAI's `/v1`); or, for Workers AI, whose REST
|
|
260
|
+
* API is AI Gateway's own host, `header: true`: the call keeps its URL
|
|
261
|
+
* and carries `cf-aig-gateway-id`. With `AI_GATEWAY_ID` set, every call
|
|
262
|
+
* to an entry with an `aig` block goes through AI Gateway with the
|
|
263
|
+
* provider's own key still on it; an entry without one goes direct
|
|
264
|
+
* (Gemini's and Cohere's OpenAI-shaped paths have no documented AI
|
|
265
|
+
* Gateway form, 2026-10-25).
|
|
266
|
+
*/
|
|
267
|
+
aig?: {
|
|
268
|
+
slug: string;
|
|
269
|
+
trim?: string;
|
|
270
|
+
header?: true;
|
|
271
|
+
};
|
|
272
|
+
/**
|
|
273
|
+
* `proxy`: the entry fronts the other AI providers (Cloudflare AI
|
|
274
|
+
* Gateway) and serves no models of its own: never listed under
|
|
275
|
+
* `providers`, never the default, reached through the entries it fronts.
|
|
276
|
+
*/
|
|
277
|
+
kind?: "proxy";
|
|
278
|
+
/**
|
|
279
|
+
* The models the provider serves, when the entry says (a registered
|
|
280
|
+
* `ai` row's `models`): the proxy refuses an inference call naming
|
|
281
|
+
* another (`model_not_allowed`), and `provider show` lists them. Absent
|
|
282
|
+
* on the catalog's entries, whose model lists change weekly.
|
|
283
|
+
*/
|
|
284
|
+
models?: readonly string[];
|
|
285
|
+
}
|
|
286
|
+
/** A route of an AI provider the default route maps onto, with the model used when the app names none. */
|
|
287
|
+
export interface AiRoute {
|
|
288
|
+
/** One of the entry's `inferenceRoutes`: `/api/v1/chat/completions`. */
|
|
289
|
+
path: string;
|
|
290
|
+
/**
|
|
291
|
+
* The seed: the model the Gateway fills in when its operator set none
|
|
292
|
+
* for this provider (`everyapp ai model`, `org_settings.ai_models`), a
|
|
293
|
+
* cheap, capable one of the provider's. Data, never the only answer:
|
|
294
|
+
* read it through `resolveAiDefault` (./aiDefault.ts), which puts the
|
|
295
|
+
* operator's setting first.
|
|
296
|
+
*/
|
|
297
|
+
seedModel: string;
|
|
298
|
+
}
|
|
299
|
+
/** What `access: "write"` adds to a provider's read methods when its entry doesn't say. */
|
|
300
|
+
export declare const DEFAULT_WRITE_METHODS: readonly string[];
|
|
301
|
+
/**
|
|
302
|
+
* A capability the gateway performs itself, with no upstream host:
|
|
303
|
+
* reached at `/api/integrations/<id>/<route>`.
|
|
304
|
+
*/
|
|
305
|
+
export interface GatewayServiceCapability {
|
|
306
|
+
mode: "service";
|
|
307
|
+
/** The capability's name in errors and logs. */
|
|
308
|
+
label: string;
|
|
309
|
+
/** The access levels it offers; the manifest may ask for these only. */
|
|
310
|
+
access: readonly CapabilityAccess[];
|
|
311
|
+
/** Routes under `/api/integrations/<id>/`, each with the methods it takes. */
|
|
312
|
+
routes: Readonly<Record<string, readonly string[]>>;
|
|
313
|
+
/** The gateway settings that make it ready (status, the dev fallback). */
|
|
314
|
+
settings: readonly string[];
|
|
315
|
+
/** Settings it reads when set (another transport), ready or not. */
|
|
316
|
+
optionalSettings: readonly string[];
|
|
317
|
+
/** The everyapp skill's setup guide, when there is anything to set up. */
|
|
318
|
+
setup?: string;
|
|
319
|
+
}
|
|
320
|
+
/** Where the gateway puts an OAuth client on a token request. */
|
|
321
|
+
export type OAuthClientInjection = "form" | "basic";
|
|
322
|
+
/** A token endpoint an `oauth_client` capability completes, with its rule. */
|
|
323
|
+
export interface OAuthTokenEndpoint {
|
|
324
|
+
/** The endpoint's host, always over https. */
|
|
325
|
+
host: string;
|
|
326
|
+
/** The exact pathname. */
|
|
327
|
+
path: string;
|
|
328
|
+
methods: readonly ("GET" | "POST")[];
|
|
329
|
+
/**
|
|
330
|
+
* Where the client goes: the form body or HTTP Basic
|
|
331
|
+
* (injectClientCredentials() in ./oauthClient.ts).
|
|
332
|
+
*/
|
|
333
|
+
inject: OAuthClientInjection;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* One host's allowlist a scope set unlocks. Matched against the raw
|
|
337
|
+
* pathname, case preserved, by `scopeRouteAllows()` in ./oauthScopes.ts:
|
|
338
|
+
* the proxy boundary once the gateway holds tokens, tested data until then.
|
|
339
|
+
*/
|
|
340
|
+
export interface OAuthScopeRoute {
|
|
341
|
+
/** A bare https host, one of the capability's `api` hosts. */
|
|
342
|
+
host: string;
|
|
343
|
+
/**
|
|
344
|
+
* Raw-path entries: exact, or a prefix when the entry ends in `/`. GET
|
|
345
|
+
* and HEAD go through when one matches.
|
|
346
|
+
*/
|
|
347
|
+
paths: readonly string[];
|
|
348
|
+
/**
|
|
349
|
+
* The read-shaped POSTs a read set allows (queries, watches): anchored,
|
|
350
|
+
* flagless RegExps over the raw pathname. Every other POST is refused.
|
|
351
|
+
*/
|
|
352
|
+
posts?: readonly RegExp[];
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* A named bundle an app lists under `scopes`: what it asks the provider for
|
|
356
|
+
* and what that unlocks.
|
|
357
|
+
*/
|
|
358
|
+
export interface OAuthScopeSet {
|
|
359
|
+
/** What Admin → Apps and a consent page call it: "Gmail (read-only)". */
|
|
360
|
+
label: string;
|
|
361
|
+
/**
|
|
362
|
+
* A read set unlocks GET, HEAD and its `posts` only. No write set exists
|
|
363
|
+
* on the shared clients yet; adding one is a reviewed registry change.
|
|
364
|
+
*/
|
|
365
|
+
access: CapabilityAccess;
|
|
366
|
+
/** The provider's scope strings, requested verbatim (Slack: bot scopes). */
|
|
367
|
+
scopes: readonly string[];
|
|
368
|
+
/** Slack's `user_scope` strings, issued to the installing person's own token; absent elsewhere. */
|
|
369
|
+
userScopes?: readonly string[];
|
|
370
|
+
routes: readonly OAuthScopeRoute[];
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* How a provider spells granted scopes in its token response; each has a
|
|
374
|
+
* parser in ./oauthScopes.ts. `space` and `comma` are the plain spellings
|
|
375
|
+
* a registered provider names (`scopeDialect`): a token response without
|
|
376
|
+
* a `scope` field is taken as granted-as-requested (RFC 6749 §5.1).
|
|
377
|
+
*/
|
|
378
|
+
export type OAuthScopeDialect = "google" | "microsoft" | "slack" | "space" | "comma";
|
|
379
|
+
/**
|
|
380
|
+
* Everything the gateway needs to hold an app to its scope sets at the
|
|
381
|
+
* token endpoint. Present means an app's entry must list `scopes` and the
|
|
382
|
+
* gateway refuses tokens outside them. Data only: the dialect selects the
|
|
383
|
+
* parser, so the registry stays a table.
|
|
384
|
+
*/
|
|
385
|
+
export interface OAuthScopePolicy {
|
|
386
|
+
sets: Readonly<Record<string, OAuthScopeSet>>;
|
|
387
|
+
/**
|
|
388
|
+
* Scopes a token may carry beyond the declared sets without refusal:
|
|
389
|
+
* identity and refresh scopes, in every spelling the provider uses.
|
|
390
|
+
* Never a data scope.
|
|
391
|
+
*/
|
|
392
|
+
tolerated: readonly string[];
|
|
393
|
+
/**
|
|
394
|
+
* Scopes every declaring app asks for whatever its sets, on the authorize
|
|
395
|
+
* URL and Microsoft's token leg (`offline_access`). Always tolerated.
|
|
396
|
+
*/
|
|
397
|
+
alwaysRequested: readonly string[];
|
|
398
|
+
dialect: OAuthScopeDialect;
|
|
399
|
+
/**
|
|
400
|
+
* The `tokenGrantType()` values the gateway completes through this
|
|
401
|
+
* client. `null` is a code exchange that carries no `grant_type` (Slack's
|
|
402
|
+
* oauth.v2.access).
|
|
403
|
+
*/
|
|
404
|
+
grantTypes: readonly (string | null)[];
|
|
405
|
+
/**
|
|
406
|
+
* What becomes of the token request's `scope` once it passes the check:
|
|
407
|
+
* `replace` it with the app's requested list (Microsoft's token-leg
|
|
408
|
+
* extension, which keeps a token to one resource), `drop` it (Google
|
|
409
|
+
* documents no `scope` on either token leg), or `keep` it (Slack).
|
|
410
|
+
*/
|
|
411
|
+
requestScope: "replace" | "drop" | "keep";
|
|
412
|
+
/**
|
|
413
|
+
* Decoded path segments no set unlocks on any host, compared
|
|
414
|
+
* case-insensitively: batch tunnels that carry other requests inside, and
|
|
415
|
+
* resources that reveal secrets under a read scope.
|
|
416
|
+
*/
|
|
417
|
+
deniedSegments: readonly string[];
|
|
418
|
+
}
|
|
419
|
+
/** How a provider names the account a new connection is for, read once after the exchange. */
|
|
420
|
+
export interface OAuthIdentity {
|
|
421
|
+
/** An https URL on one of the provider's `api` hosts, GET with the new token. */
|
|
422
|
+
url: string;
|
|
423
|
+
/** A dot path into the JSON answer for the label ("ben", "ben@example.com"). */
|
|
424
|
+
label: string;
|
|
425
|
+
/** A dot path for the provider's stable id of the account (optional). */
|
|
426
|
+
id?: string;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* What the Gateway needs to run a provider's authorization-code flow
|
|
430
|
+
* itself (docs/design/2026-10-oauth-providers.md section 5): present on a
|
|
431
|
+
* catalog entry that supports the Gateway-owned flow, and built from a
|
|
432
|
+
* registered row's `auth` (`kind: "oauth2-user"`). Absent: the entry
|
|
433
|
+
* keeps the app-driven flow only (the social networks).
|
|
434
|
+
*/
|
|
435
|
+
export interface OAuthFlow {
|
|
436
|
+
/** The token endpoint the Gateway posts the code and refresh token to (https). */
|
|
437
|
+
tokenUrl: string;
|
|
438
|
+
/** Where a disconnect revokes the token; absent means the tokens die at their expiry. */
|
|
439
|
+
revokeUrl?: string;
|
|
440
|
+
/** The revoke call's method (default POST). */
|
|
441
|
+
revokeMethod?: "POST" | "DELETE";
|
|
442
|
+
/** Whether the authorize request carries a PKCE S256 challenge (default true). */
|
|
443
|
+
pkce: boolean;
|
|
444
|
+
/** How the token response spells what it granted. */
|
|
445
|
+
scopeDialect: OAuthScopeDialect;
|
|
446
|
+
/** Extra query on the authorize URL (Google's `access_type=offline`). */
|
|
447
|
+
authorizeParams?: Readonly<Record<string, string>>;
|
|
448
|
+
/** Extra headers on the token request (GitHub's `Accept: application/json`). */
|
|
449
|
+
tokenHeaders?: Readonly<Record<string, string>>;
|
|
450
|
+
identity?: OAuthIdentity;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* A provider's OAuth client the gateway holds. The gateway completes its
|
|
454
|
+
* token endpoints only (`token`), putting the client on each request; the
|
|
455
|
+
* app builds the authorize URL from the public client id and calls the
|
|
456
|
+
* provider's API with the user tokens it keeps.
|
|
457
|
+
*/
|
|
458
|
+
export interface OAuthClientCapability {
|
|
459
|
+
mode: "oauth_client";
|
|
460
|
+
/** The provider's name in errors and logs. */
|
|
461
|
+
label: string;
|
|
462
|
+
/** Gateway secret names. No `clientSecret`: a public client, the id alone. */
|
|
463
|
+
secrets: {
|
|
464
|
+
clientId: string;
|
|
465
|
+
clientSecret?: string;
|
|
466
|
+
};
|
|
467
|
+
/** The only calls the gateway completes; anything else is refused. */
|
|
468
|
+
token: readonly OAuthTokenEndpoint[];
|
|
469
|
+
/**
|
|
470
|
+
* Obtaining and refreshing user tokens with the operator's client
|
|
471
|
+
* writes, so a catalog client is `["write"]`. A registered OAuth
|
|
472
|
+
* provider says what the proxy may do with the held token: read, write
|
|
473
|
+
* or both (docs/design/2026-10-oauth-providers.md section 7).
|
|
474
|
+
*/
|
|
475
|
+
access: readonly CapabilityAccess[];
|
|
476
|
+
/** Where the operator registers the client. */
|
|
477
|
+
console: string;
|
|
478
|
+
/** The everyapp skill's setup guide for the client, when one exists. */
|
|
479
|
+
setup?: string;
|
|
480
|
+
/**
|
|
481
|
+
* The authorize endpoint the app sends people to and the scopes the
|
|
482
|
+
* client must be allowed: the operator's checklist and the docs. With
|
|
483
|
+
* a `scopePolicy`, the union of its sets' scopes and `alwaysRequested`.
|
|
484
|
+
*/
|
|
485
|
+
authorize: {
|
|
486
|
+
url: string;
|
|
487
|
+
scopes: readonly string[];
|
|
488
|
+
};
|
|
489
|
+
/**
|
|
490
|
+
* Named scope sets an app lists in its manifest entry's `scopes`, for a
|
|
491
|
+
* client several apps share with different needs. Absent: the whole
|
|
492
|
+
* client is the grant.
|
|
493
|
+
*/
|
|
494
|
+
scopePolicy?: OAuthScopePolicy;
|
|
495
|
+
/**
|
|
496
|
+
* Hosts the app calls afterwards with the user's token; the Gateway's
|
|
497
|
+
* held-token branch forwards to these alone, and a scope policy's
|
|
498
|
+
* routes are on them.
|
|
499
|
+
*/
|
|
500
|
+
api: readonly string[];
|
|
501
|
+
/** The Gateway-owned flow, when the entry supports it. */
|
|
502
|
+
flow?: OAuthFlow;
|
|
503
|
+
/** A registered OAuth provider's spec fields (a catalog client has `setup` instead). */
|
|
504
|
+
description?: string;
|
|
505
|
+
/** The API reference (a spec's `api`), optional. */
|
|
506
|
+
reference?: string;
|
|
507
|
+
hint?: string;
|
|
508
|
+
example?: string;
|
|
509
|
+
tags?: readonly string[];
|
|
510
|
+
/**
|
|
511
|
+
* A registered OAuth provider's methods: what a read grant may use
|
|
512
|
+
* (default GET and HEAD) and what a write grant adds (default the
|
|
513
|
+
* API-key default). A catalog client leaves both unset.
|
|
514
|
+
*/
|
|
515
|
+
readMethods?: readonly string[];
|
|
516
|
+
writeMethods?: readonly string[];
|
|
517
|
+
}
|
|
518
|
+
export type Capability = ApiKeyCapability | AiProviderCapability | OAuthClientCapability | GatewayServiceCapability;
|
|
519
|
+
export declare const CAPABILITIES: {
|
|
520
|
+
readonly firecrawl: {
|
|
521
|
+
readonly mode: "api_key";
|
|
522
|
+
readonly label: "Firecrawl";
|
|
523
|
+
readonly description: "Scrapes, crawls, maps and searches the web, returning clean markdown or structured data.";
|
|
524
|
+
readonly auth: {
|
|
525
|
+
readonly kind: "bearer";
|
|
526
|
+
readonly secret: "FIRECRAWL_API_KEY";
|
|
527
|
+
};
|
|
528
|
+
readonly docs: "https://www.firecrawl.dev/app/api-keys";
|
|
529
|
+
readonly api: "https://docs.firecrawl.dev/api-reference/introduction";
|
|
530
|
+
readonly hosts: readonly ["api.firecrawl.dev"];
|
|
531
|
+
readonly data: "per-call";
|
|
532
|
+
readonly access: readonly ["read", "write"];
|
|
533
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
534
|
+
readonly writeMethods: readonly ["DELETE"];
|
|
535
|
+
readonly accountWidePaths: readonly [readonly ["team"], readonly ["crawl", "active"], readonly ["monitor"], readonly ["agent"], readonly ["interact"], readonly ["support", "ask"]];
|
|
536
|
+
readonly hint: "An API key from Firecrawl's API keys page; the Gateway sends it as a bearer token. Scrape, crawl, map, search and extract are POSTs and job status is a GET; cancelling a crawl or batch (DELETE) needs write.";
|
|
537
|
+
readonly secrets: readonly [{
|
|
538
|
+
readonly name: "FIRECRAWL_API_KEY";
|
|
539
|
+
readonly hint: "An API key from Firecrawl's API keys page; it starts with fc-.";
|
|
540
|
+
}];
|
|
541
|
+
readonly smoke: {
|
|
542
|
+
readonly method: "GET";
|
|
543
|
+
readonly path: "/v2/team/credit-usage";
|
|
544
|
+
readonly expect: readonly [200];
|
|
545
|
+
readonly free: true;
|
|
546
|
+
readonly note: "Remaining credits; account-wide, so the Gateway refuses it for apps: run it from the person's terminal.";
|
|
547
|
+
};
|
|
548
|
+
readonly cost: {
|
|
549
|
+
readonly unit: "result";
|
|
550
|
+
readonly note: "Credits: 1 per page scraped or crawled, 1 per map call, 2 per 10 search results; JSON extraction and other options add more.";
|
|
551
|
+
};
|
|
552
|
+
readonly rate: {
|
|
553
|
+
readonly note: "Per team per minute, by plan: /scrape 10 on Free, 100 Hobby, 500 Standard, 5,000 Growth; /crawl 2, 20, 100, 1,000.";
|
|
554
|
+
};
|
|
555
|
+
readonly example: "scrape https://example.com/pricing into markdown";
|
|
556
|
+
readonly verified: {
|
|
557
|
+
readonly on: "2026-10-25";
|
|
558
|
+
readonly how: "docs";
|
|
559
|
+
};
|
|
560
|
+
readonly tags: readonly ["scrape", "crawl", "search"];
|
|
561
|
+
};
|
|
562
|
+
readonly exa: {
|
|
563
|
+
readonly mode: "api_key";
|
|
564
|
+
readonly label: "Exa";
|
|
565
|
+
readonly description: "Web search built for AI: search results, page contents, similar links and cited answers.";
|
|
566
|
+
readonly auth: {
|
|
567
|
+
readonly kind: "header";
|
|
568
|
+
readonly secret: "EXA_API_KEY";
|
|
569
|
+
readonly header: "x-api-key";
|
|
570
|
+
};
|
|
571
|
+
readonly docs: "https://dashboard.exa.ai/api-keys";
|
|
572
|
+
readonly api: "https://exa.ai/docs/reference/search";
|
|
573
|
+
readonly hosts: readonly ["api.exa.ai"];
|
|
574
|
+
readonly data: "per-call";
|
|
575
|
+
readonly access: readonly ["read"];
|
|
576
|
+
readonly readMethods: readonly ["POST"];
|
|
577
|
+
readonly accountWidePaths: readonly [readonly ["websets"], readonly ["monitors"], readonly ["agent"], readonly ["batches"]];
|
|
578
|
+
readonly hint: "An API key from the Exa dashboard (the free tier gives $10 of credit a month); the Gateway sends it in the x-api-key header. Search, contents, find-similar and answer are POSTs.";
|
|
579
|
+
readonly secrets: readonly [{
|
|
580
|
+
readonly name: "EXA_API_KEY";
|
|
581
|
+
readonly hint: "An API key from the API keys page of the Exa dashboard.";
|
|
582
|
+
}];
|
|
583
|
+
readonly smoke: {
|
|
584
|
+
readonly method: "GET";
|
|
585
|
+
readonly path: "/websets/v0/teams/me";
|
|
586
|
+
readonly expect: readonly [200];
|
|
587
|
+
readonly free: true;
|
|
588
|
+
readonly note: "Team info under the Websets API (the docs page leaves out the /websets prefix); account-wide, so run it from the person's terminal.";
|
|
589
|
+
};
|
|
590
|
+
readonly cost: {
|
|
591
|
+
readonly unit: "call";
|
|
592
|
+
readonly usd: 0.007;
|
|
593
|
+
readonly note: "Search $7 per 1k (auto and fast; lite $4), contents $1 per 1k pages, answer $5 per 1k; up to 10 results included.";
|
|
594
|
+
};
|
|
595
|
+
readonly rate: {
|
|
596
|
+
readonly perSecond: 10;
|
|
597
|
+
readonly note: "Per team: /search and /answer 10 QPS, deep search 5, /contents 100.";
|
|
598
|
+
};
|
|
599
|
+
readonly example: "find recent articles about solid-state batteries";
|
|
600
|
+
readonly verified: {
|
|
601
|
+
readonly on: "2026-10-25";
|
|
602
|
+
readonly how: "docs";
|
|
603
|
+
};
|
|
604
|
+
readonly tags: readonly ["search"];
|
|
605
|
+
};
|
|
606
|
+
readonly tavily: {
|
|
607
|
+
readonly mode: "api_key";
|
|
608
|
+
readonly label: "Tavily";
|
|
609
|
+
readonly description: "Web search, page extraction, crawling and site maps for AI agents, plus research reports.";
|
|
610
|
+
readonly auth: {
|
|
611
|
+
readonly kind: "bearer";
|
|
612
|
+
readonly secret: "TAVILY_API_KEY";
|
|
613
|
+
};
|
|
614
|
+
readonly docs: "https://app.tavily.com";
|
|
615
|
+
readonly api: "https://docs.tavily.com/documentation/api-reference/endpoint/search";
|
|
616
|
+
readonly hosts: readonly ["api.tavily.com"];
|
|
617
|
+
readonly data: "per-call";
|
|
618
|
+
readonly access: readonly ["read"];
|
|
619
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
620
|
+
readonly accountWidePaths: readonly [readonly ["usage"], readonly ["logs"], readonly ["org-usage"]];
|
|
621
|
+
readonly hint: "An API key from app.tavily.com (1,000 free credits a month); the Gateway sends it as a bearer token. Search, extract, crawl, map and research are POSTs; a research result is a GET.";
|
|
622
|
+
readonly secrets: readonly [{
|
|
623
|
+
readonly name: "TAVILY_API_KEY";
|
|
624
|
+
readonly hint: "An API key from the Tavily dashboard; it starts with tvly-.";
|
|
625
|
+
}];
|
|
626
|
+
readonly smoke: {
|
|
627
|
+
readonly method: "GET";
|
|
628
|
+
readonly path: "/usage";
|
|
629
|
+
readonly expect: readonly [200];
|
|
630
|
+
readonly free: true;
|
|
631
|
+
readonly note: "Key and account usage, not an endpoint that costs credits; account-wide, so run it from the person's terminal (10 calls per 10 minutes).";
|
|
632
|
+
};
|
|
633
|
+
readonly cost: {
|
|
634
|
+
readonly unit: "call";
|
|
635
|
+
readonly usd: 0.008;
|
|
636
|
+
readonly note: "Pay as you go $0.008 per credit: basic search 1 credit, advanced 2; extract 1 credit per 5 URLs; map 1 per 10 pages.";
|
|
637
|
+
};
|
|
638
|
+
readonly rate: {
|
|
639
|
+
readonly perMinute: 100;
|
|
640
|
+
readonly note: "Development keys 100 per minute, production keys 1,000; crawl 100 and research 20 per minute for both.";
|
|
641
|
+
};
|
|
642
|
+
readonly example: "search the web for this week's news on EU AI rules";
|
|
643
|
+
readonly verified: {
|
|
644
|
+
readonly on: "2026-10-25";
|
|
645
|
+
readonly how: "docs";
|
|
646
|
+
};
|
|
647
|
+
readonly tags: readonly ["search", "scrape"];
|
|
648
|
+
};
|
|
649
|
+
readonly serper: {
|
|
650
|
+
readonly mode: "api_key";
|
|
651
|
+
readonly label: "Serper";
|
|
652
|
+
readonly description: "Google search results as JSON: web, news, images, places, shopping, scholar and patents.";
|
|
653
|
+
readonly auth: {
|
|
654
|
+
readonly kind: "header";
|
|
655
|
+
readonly secret: "SERPER_API_KEY";
|
|
656
|
+
readonly header: "X-API-KEY";
|
|
657
|
+
};
|
|
658
|
+
readonly docs: "https://serper.dev/api-keys";
|
|
659
|
+
readonly api: "https://serper.dev/playground";
|
|
660
|
+
readonly hosts: readonly ["google.serper.dev", "scrape.serper.dev"];
|
|
661
|
+
readonly data: "per-call";
|
|
662
|
+
readonly access: readonly ["read"];
|
|
663
|
+
readonly readMethods: readonly ["POST"];
|
|
664
|
+
readonly accountWidePaths: readonly [];
|
|
665
|
+
readonly hint: "An API key from serper.dev (2,500 free queries to start); the Gateway sends it in the X-API-KEY header. Every search is a POST to google.serper.dev/<type> (search, news, images, places, …) with a JSON body such as {\"q\": \"…\"}.";
|
|
666
|
+
readonly secrets: readonly [{
|
|
667
|
+
readonly name: "SERPER_API_KEY";
|
|
668
|
+
readonly hint: "The API key on serper.dev's API keys page.";
|
|
669
|
+
}];
|
|
670
|
+
readonly cost: {
|
|
671
|
+
readonly unit: "call";
|
|
672
|
+
readonly usd: 0.001;
|
|
673
|
+
readonly note: "Prepaid credits, one per successful query: $1.00 per 1k on the 50k pack, down to $0.30 per 1k on the largest.";
|
|
674
|
+
};
|
|
675
|
+
readonly rate: {
|
|
676
|
+
readonly perSecond: 50;
|
|
677
|
+
readonly note: "Starter credits 50 queries per second; Standard 100, Scale 200, Ultimate 300.";
|
|
678
|
+
};
|
|
679
|
+
readonly example: "get the top Google results for best project management software";
|
|
680
|
+
readonly verified: false;
|
|
681
|
+
readonly tags: readonly ["search", "serp"];
|
|
682
|
+
};
|
|
683
|
+
readonly "brave-search": {
|
|
684
|
+
readonly mode: "api_key";
|
|
685
|
+
readonly label: "Brave Search";
|
|
686
|
+
readonly description: "Brave's independent web index: web, news, images, videos, places, LLM context and answers.";
|
|
687
|
+
readonly auth: {
|
|
688
|
+
readonly kind: "header";
|
|
689
|
+
readonly secret: "BRAVE_SEARCH_API_KEY";
|
|
690
|
+
readonly header: "X-Subscription-Token";
|
|
691
|
+
};
|
|
692
|
+
readonly docs: "https://api-dashboard.search.brave.com/app/keys";
|
|
693
|
+
readonly api: "https://api-dashboard.search.brave.com/documentation";
|
|
694
|
+
readonly hosts: readonly ["api.search.brave.com"];
|
|
695
|
+
readonly data: "per-call";
|
|
696
|
+
readonly access: readonly ["read"];
|
|
697
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
698
|
+
readonly accountWidePaths: readonly [];
|
|
699
|
+
readonly hint: "Activate a plan (it includes $5 of free credit a month), then create a key under API Keys; the Gateway sends it in the X-Subscription-Token header. Searches are GETs (POST works too); answers are a POST to /res/v1/chat/completions.";
|
|
700
|
+
readonly secrets: readonly [{
|
|
701
|
+
readonly name: "BRAVE_SEARCH_API_KEY";
|
|
702
|
+
readonly hint: "A key from the API Keys section of the Brave Search API dashboard, made after activating a plan.";
|
|
703
|
+
}];
|
|
704
|
+
readonly cost: {
|
|
705
|
+
readonly unit: "call";
|
|
706
|
+
readonly usd: 0.005;
|
|
707
|
+
readonly note: "Search $5 per 1k requests; Answers $4 per 1k plus $5 per million tokens; $5 free credit a month; only successful calls count.";
|
|
708
|
+
};
|
|
709
|
+
readonly rate: {
|
|
710
|
+
readonly perSecond: 50;
|
|
711
|
+
readonly note: "Search plan 50 queries per second; Answers 2 per second.";
|
|
712
|
+
};
|
|
713
|
+
readonly example: "search the web for the latest Cloudflare Workers release notes";
|
|
714
|
+
readonly verified: {
|
|
715
|
+
readonly on: "2026-10-25";
|
|
716
|
+
readonly how: "docs";
|
|
717
|
+
};
|
|
718
|
+
readonly tags: readonly ["search"];
|
|
719
|
+
};
|
|
720
|
+
readonly apify: {
|
|
721
|
+
readonly mode: "api_key";
|
|
722
|
+
readonly label: "Apify";
|
|
723
|
+
readonly description: "Runs Apify Actors (ready-made scrapers and automations) and reads their datasets and stores.";
|
|
724
|
+
readonly auth: {
|
|
725
|
+
readonly kind: "bearer";
|
|
726
|
+
readonly secret: "APIFY_API_TOKEN";
|
|
727
|
+
};
|
|
728
|
+
readonly docs: "https://console.apify.com/settings/integrations";
|
|
729
|
+
readonly api: "https://docs.apify.com/api/v2";
|
|
730
|
+
readonly hosts: readonly ["api.apify.com"];
|
|
731
|
+
readonly data: "account";
|
|
732
|
+
readonly access: readonly ["read", "write"];
|
|
733
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
734
|
+
readonly writeMethods: readonly ["POST", "PUT", "DELETE"];
|
|
735
|
+
readonly accountWidePaths: readonly [readonly ["users"], readonly ["webhooks"], readonly ["webhook-dispatches"], readonly ["env-vars"]];
|
|
736
|
+
readonly hint: "The API token from Apify Console, Settings > API & Integrations; the Gateway sends it as a bearer token. Reading Actors, runs and datasets needs read; starting a run is a POST, so it needs write.";
|
|
737
|
+
readonly secrets: readonly [{
|
|
738
|
+
readonly name: "APIFY_API_TOKEN";
|
|
739
|
+
readonly hint: "The API token under Settings > API & Integrations in Apify Console.";
|
|
740
|
+
}];
|
|
741
|
+
readonly smoke: {
|
|
742
|
+
readonly method: "GET";
|
|
743
|
+
readonly path: "/v2/users/me";
|
|
744
|
+
readonly expect: readonly [200];
|
|
745
|
+
readonly free: true;
|
|
746
|
+
readonly note: "The docs' verify call; account-wide, so the Gateway refuses it for apps: run it from the person's terminal.";
|
|
747
|
+
};
|
|
748
|
+
readonly rate: {
|
|
749
|
+
readonly perSecond: 60;
|
|
750
|
+
readonly note: "60 requests per second per resource (one Actor, run, dataset or store); 250,000 requests per minute per user overall.";
|
|
751
|
+
};
|
|
752
|
+
readonly example: "run the Google Maps scraper Actor for coffee shops in Austin and list the results";
|
|
753
|
+
readonly verified: {
|
|
754
|
+
readonly on: "2026-10-25";
|
|
755
|
+
readonly how: "docs";
|
|
756
|
+
};
|
|
757
|
+
readonly tags: readonly ["scrape", "automation"];
|
|
758
|
+
};
|
|
759
|
+
readonly deepgram: {
|
|
760
|
+
readonly mode: "api_key";
|
|
761
|
+
readonly label: "Deepgram";
|
|
762
|
+
readonly description: "Speech to text, text to speech and text analysis.";
|
|
763
|
+
readonly auth: {
|
|
764
|
+
readonly kind: "bearer";
|
|
765
|
+
readonly secret: "DEEPGRAM_API_KEY";
|
|
766
|
+
readonly scheme: "Token";
|
|
767
|
+
};
|
|
768
|
+
readonly docs: "https://console.deepgram.com/";
|
|
769
|
+
readonly api: "https://developers.deepgram.com/reference/deepgram-api-overview";
|
|
770
|
+
readonly hosts: readonly ["api.deepgram.com", "api.eu.deepgram.com", "api.au.deepgram.com", "api.in.deepgram.com"];
|
|
771
|
+
readonly data: "per-call";
|
|
772
|
+
readonly access: readonly ["read"];
|
|
773
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
774
|
+
readonly accountWidePaths: readonly [readonly ["projects"], readonly ["auth", "grant"]];
|
|
775
|
+
readonly hint: "An API key from the Deepgram Console; the Gateway sends it as Authorization: Token <key>, and the EU, Australia and India hosts take the same key. Transcription (/v1/listen), speech (/v1/speak) and text analysis (/v1/read) are POSTs.";
|
|
776
|
+
readonly secrets: readonly [{
|
|
777
|
+
readonly name: "DEEPGRAM_API_KEY";
|
|
778
|
+
readonly hint: "A project API key created in the Deepgram Console.";
|
|
779
|
+
}];
|
|
780
|
+
readonly smoke: {
|
|
781
|
+
readonly method: "GET";
|
|
782
|
+
readonly path: "/v1/models";
|
|
783
|
+
readonly expect: readonly [200];
|
|
784
|
+
readonly free: true;
|
|
785
|
+
readonly note: "Lists the public models; it needs the key and processes no audio.";
|
|
786
|
+
};
|
|
787
|
+
readonly cost: {
|
|
788
|
+
readonly unit: "call";
|
|
789
|
+
readonly note: "Nova-3 pre-recorded $0.0043 per audio minute (pay as you go); Aura-2 speech $0.030 per 1k characters; $200 free credit.";
|
|
790
|
+
};
|
|
791
|
+
readonly rate: {
|
|
792
|
+
readonly note: "Concurrency per project on pay as you go: 50 pre-recorded transcriptions, 15 text-to-speech requests.";
|
|
793
|
+
};
|
|
794
|
+
readonly example: "transcribe this podcast episode and label the speakers";
|
|
795
|
+
readonly verified: {
|
|
796
|
+
readonly on: "2026-10-25";
|
|
797
|
+
readonly how: "docs";
|
|
798
|
+
};
|
|
799
|
+
readonly tags: readonly ["speech", "transcription"];
|
|
800
|
+
};
|
|
801
|
+
readonly elevenlabs: {
|
|
802
|
+
readonly mode: "api_key";
|
|
803
|
+
readonly label: "ElevenLabs";
|
|
804
|
+
readonly description: "Text to speech, speech to text, sound effects, music and voice changing.";
|
|
805
|
+
readonly auth: {
|
|
806
|
+
readonly kind: "header";
|
|
807
|
+
readonly secret: "ELEVENLABS_API_KEY";
|
|
808
|
+
readonly header: "xi-api-key";
|
|
809
|
+
};
|
|
810
|
+
readonly docs: "https://elevenlabs.io/app/settings/api-keys";
|
|
811
|
+
readonly api: "https://elevenlabs.io/docs/api-reference/introduction";
|
|
812
|
+
readonly hosts: readonly ["api.elevenlabs.io"];
|
|
813
|
+
readonly data: "per-call";
|
|
814
|
+
readonly access: readonly ["read"];
|
|
815
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
816
|
+
readonly accountWidePaths: readonly [readonly ["v1", "user"], readonly ["v1", "usage"], readonly ["v1", "workspace"], readonly ["v1", "workspaces"], readonly ["v1", "service-accounts"], readonly ["v1", "history"], readonly ["v1", "single-use-token"], readonly ["v1", "convai"], readonly ["v1", "dubbing"], readonly ["v1", "studio"], readonly ["v1", "pronunciation-dictionaries"], readonly ["v1", "voices", "add"], readonly ["v1", "voices", "pvc"], readonly ["v1", "voices", "collections"], readonly ["edit"], readonly ["replicate-to-isolated-environment"], readonly ["v1", "text-to-voice"], readonly ["v1", "audio-native"], readonly ["v1", "productions"], readonly ["v1", "speech-engine"], readonly ["v1", "music", "finetunes"], readonly ["v1", "flows"], readonly ["v1", "assets"], readonly ["v1", "audio-isolation", "history"]];
|
|
817
|
+
readonly hint: "An API key from ElevenLabs' API keys page; the Gateway sends it in the xi-api-key header. Speech, transcription and sound generation are POSTs; listing voices and models are GETs.";
|
|
818
|
+
readonly secrets: readonly [{
|
|
819
|
+
readonly name: "ELEVENLABS_API_KEY";
|
|
820
|
+
readonly hint: "An API key from ElevenLabs' API keys page; it can be scoped to the endpoints the app uses and given a credit cap.";
|
|
821
|
+
}];
|
|
822
|
+
readonly smoke: {
|
|
823
|
+
readonly method: "GET";
|
|
824
|
+
readonly path: "/v1/models";
|
|
825
|
+
readonly expect: readonly [200];
|
|
826
|
+
readonly free: true;
|
|
827
|
+
readonly note: "The first request in ElevenLabs' authentication docs; it generates nothing.";
|
|
828
|
+
};
|
|
829
|
+
readonly example: "read this paragraph aloud in a calm narrator voice";
|
|
830
|
+
readonly verified: {
|
|
831
|
+
readonly on: "2026-10-25";
|
|
832
|
+
readonly how: "docs";
|
|
833
|
+
};
|
|
834
|
+
readonly tags: readonly ["speech", "audio"];
|
|
835
|
+
};
|
|
836
|
+
readonly assemblyai: {
|
|
837
|
+
readonly mode: "api_key";
|
|
838
|
+
readonly label: "AssemblyAI";
|
|
839
|
+
readonly description: "Transcribes recorded audio and video, with speaker labels, redaction and subtitles.";
|
|
840
|
+
readonly auth: {
|
|
841
|
+
readonly kind: "header";
|
|
842
|
+
readonly secret: "ASSEMBLYAI_API_KEY";
|
|
843
|
+
readonly header: "Authorization";
|
|
844
|
+
};
|
|
845
|
+
readonly docs: "https://www.assemblyai.com/dashboard/home";
|
|
846
|
+
readonly api: "https://www.assemblyai.com/docs";
|
|
847
|
+
readonly hosts: readonly ["api.assemblyai.com", "api.eu.assemblyai.com"];
|
|
848
|
+
readonly data: "account";
|
|
849
|
+
readonly access: readonly ["read", "write"];
|
|
850
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
851
|
+
readonly writeMethods: readonly ["DELETE"];
|
|
852
|
+
readonly accountWidePaths: readonly [];
|
|
853
|
+
readonly hint: "The API key from your AssemblyAI dashboard; the Gateway sends it as the whole Authorization header, with no Bearer word. Audio is submitted with a POST to /v2/transcript and the app polls GET /v2/transcript/<id>; deleting a transcript needs write.";
|
|
854
|
+
readonly secrets: readonly [{
|
|
855
|
+
readonly name: "ASSEMBLYAI_API_KEY";
|
|
856
|
+
readonly hint: "The API key on your AssemblyAI dashboard.";
|
|
857
|
+
}];
|
|
858
|
+
readonly smoke: {
|
|
859
|
+
readonly method: "GET";
|
|
860
|
+
readonly path: "/v2/transcript?limit=1";
|
|
861
|
+
readonly expect: readonly [200];
|
|
862
|
+
readonly free: true;
|
|
863
|
+
readonly note: "Lists the account's latest transcript; it transcribes nothing.";
|
|
864
|
+
};
|
|
865
|
+
readonly cost: {
|
|
866
|
+
readonly unit: "call";
|
|
867
|
+
readonly note: "Per hour of audio submitted: Universal-3.5 Pro $0.21, Universal-2 $0.15; the free tier covers up to 185 hours of pre-recorded audio.";
|
|
868
|
+
};
|
|
869
|
+
readonly rate: {
|
|
870
|
+
readonly perMinute: 4000;
|
|
871
|
+
readonly note: "20,000 requests per 5 minutes per account; 5 transcriptions in parallel on free accounts, 200 or more on paid.";
|
|
872
|
+
};
|
|
873
|
+
readonly example: "transcribe this sales call recording with speaker labels";
|
|
874
|
+
readonly verified: {
|
|
875
|
+
readonly on: "2026-10-25";
|
|
876
|
+
readonly how: "docs";
|
|
877
|
+
};
|
|
878
|
+
readonly tags: readonly ["speech", "transcription"];
|
|
879
|
+
};
|
|
880
|
+
readonly newsapi: {
|
|
881
|
+
readonly mode: "api_key";
|
|
882
|
+
readonly label: "NewsAPI";
|
|
883
|
+
readonly description: "Searches news articles and live headlines from over 150,000 sources.";
|
|
884
|
+
readonly auth: {
|
|
885
|
+
readonly kind: "header";
|
|
886
|
+
readonly secret: "NEWSAPI_API_KEY";
|
|
887
|
+
readonly header: "X-Api-Key";
|
|
888
|
+
};
|
|
889
|
+
readonly docs: "https://newsapi.org/register";
|
|
890
|
+
readonly api: "https://newsapi.org/docs";
|
|
891
|
+
readonly hosts: readonly ["newsapi.org"];
|
|
892
|
+
readonly data: "per-call";
|
|
893
|
+
readonly access: readonly ["read"];
|
|
894
|
+
readonly readMethods: readonly ["GET"];
|
|
895
|
+
readonly accountWidePaths: readonly [];
|
|
896
|
+
readonly hint: "An API key from newsapi.org/register; the Gateway sends it in the X-Api-Key header. The free Developer plan allows 100 requests a day, delays articles by 24 hours and is for development only; production needs a paid plan.";
|
|
897
|
+
readonly secrets: readonly [{
|
|
898
|
+
readonly name: "NEWSAPI_API_KEY";
|
|
899
|
+
readonly hint: "The API key NewsAPI shows after you register.";
|
|
900
|
+
}];
|
|
901
|
+
readonly cost: {
|
|
902
|
+
readonly unit: "call";
|
|
903
|
+
readonly usd: 0.0018;
|
|
904
|
+
readonly note: "Developer plan free (100 requests a day, development only); Business $449 a month for 250,000 requests, then $0.0018 each.";
|
|
905
|
+
};
|
|
906
|
+
readonly rate: {
|
|
907
|
+
readonly perDay: 100;
|
|
908
|
+
readonly note: "Developer plan; Business includes 250,000 requests a month, Advanced 2,000,000.";
|
|
909
|
+
};
|
|
910
|
+
readonly example: "find today's top business headlines in the US";
|
|
911
|
+
readonly verified: {
|
|
912
|
+
readonly on: "2026-10-25";
|
|
913
|
+
readonly how: "docs";
|
|
914
|
+
};
|
|
915
|
+
readonly tags: readonly ["news"];
|
|
916
|
+
};
|
|
917
|
+
readonly anthropic: {
|
|
918
|
+
readonly mode: "ai";
|
|
919
|
+
readonly label: "Anthropic";
|
|
920
|
+
readonly description: "Claude models through the Messages API.";
|
|
921
|
+
readonly auth: {
|
|
922
|
+
readonly kind: "bearer";
|
|
923
|
+
readonly secret: "ANTHROPIC_API_KEY";
|
|
924
|
+
};
|
|
925
|
+
readonly docs: "https://platform.claude.com/settings/keys";
|
|
926
|
+
readonly api: "https://platform.claude.com/docs/en/api/overview";
|
|
927
|
+
readonly origin: "https://api.anthropic.com";
|
|
928
|
+
readonly inferenceRoutes: readonly ["/v1/messages", "/v1/messages/count_tokens", "/v1/chat/completions"];
|
|
929
|
+
readonly unstoredRoutes: readonly ["/v1/chat/completions"];
|
|
930
|
+
readonly shape: "anthropic";
|
|
931
|
+
readonly chat: {
|
|
932
|
+
readonly path: "/v1/chat/completions";
|
|
933
|
+
readonly seedModel: "claude-haiku-5-5";
|
|
934
|
+
};
|
|
935
|
+
readonly aig: {
|
|
936
|
+
readonly slug: "anthropic";
|
|
937
|
+
};
|
|
938
|
+
readonly hint: "An API key from the Claude Console's API keys page; the Gateway sends it as a bearer token. Apps send the anthropic-version header themselves.";
|
|
939
|
+
readonly secrets: readonly [{
|
|
940
|
+
readonly name: "ANTHROPIC_API_KEY";
|
|
941
|
+
readonly hint: "A key scoped to one workspace; the Gateway strips any anthropic-workspace-id header an app sends, so the key alone decides the workspace.";
|
|
942
|
+
}];
|
|
943
|
+
readonly smoke: {
|
|
944
|
+
readonly method: "GET";
|
|
945
|
+
readonly path: "/v1/models";
|
|
946
|
+
readonly expect: readonly [200];
|
|
947
|
+
readonly free: true;
|
|
948
|
+
readonly note: "Send an anthropic-version header, as every call does.";
|
|
949
|
+
};
|
|
950
|
+
readonly rate: {
|
|
951
|
+
readonly note: "Requests and tokens per minute by usage tier, on the Console's Rate limits page; token counting is free, with its own per-minute limit.";
|
|
952
|
+
};
|
|
953
|
+
readonly example: "summarize this support thread in three bullet points";
|
|
954
|
+
readonly verified: {
|
|
955
|
+
readonly on: "2026-10-25";
|
|
956
|
+
readonly how: "docs";
|
|
957
|
+
};
|
|
958
|
+
readonly tags: readonly ["ai", "llm"];
|
|
959
|
+
};
|
|
960
|
+
readonly gemini: {
|
|
961
|
+
readonly mode: "ai";
|
|
962
|
+
readonly label: "Google Gemini";
|
|
963
|
+
readonly description: "Google's Gemini models through their OpenAI-compatible endpoint: chat, embeddings, images.";
|
|
964
|
+
readonly auth: {
|
|
965
|
+
readonly kind: "bearer";
|
|
966
|
+
readonly secret: "GEMINI_API_KEY";
|
|
967
|
+
};
|
|
968
|
+
readonly docs: "https://aistudio.google.com/apikey";
|
|
969
|
+
readonly api: "https://ai.google.dev/gemini-api/docs/openai";
|
|
970
|
+
readonly origin: "https://generativelanguage.googleapis.com";
|
|
971
|
+
readonly inferenceRoutes: readonly ["/v1beta/openai/chat/completions", "/v1beta/openai/embeddings", "/v1beta/openai/images/generations"];
|
|
972
|
+
readonly chat: {
|
|
973
|
+
readonly path: "/v1beta/openai/chat/completions";
|
|
974
|
+
readonly seedModel: "gemini-3.1-flash-lite";
|
|
975
|
+
};
|
|
976
|
+
readonly embeddings: {
|
|
977
|
+
readonly path: "/v1beta/openai/embeddings";
|
|
978
|
+
readonly seedModel: "gemini-embedding-001";
|
|
979
|
+
};
|
|
980
|
+
readonly hint: "An API key from Google AI Studio; the Gateway sends it as a bearer token. Apps call Gemini's OpenAI-shaped paths under /v1beta/openai.";
|
|
981
|
+
readonly secrets: readonly [{
|
|
982
|
+
readonly name: "GEMINI_API_KEY";
|
|
983
|
+
readonly hint: "A Google AI Studio key restricted to the Gemini API only.";
|
|
984
|
+
}];
|
|
985
|
+
readonly smoke: {
|
|
986
|
+
readonly method: "GET";
|
|
987
|
+
readonly path: "/v1beta/openai/models";
|
|
988
|
+
readonly expect: readonly [200];
|
|
989
|
+
readonly free: true;
|
|
990
|
+
};
|
|
991
|
+
readonly rate: {
|
|
992
|
+
readonly note: "Per project, not per key: requests and tokens per minute and requests per day, by tier (Free, then Tiers 1 to 3).";
|
|
993
|
+
};
|
|
994
|
+
readonly example: "describe what is in this product photo";
|
|
995
|
+
readonly verified: {
|
|
996
|
+
readonly on: "2026-10-25";
|
|
997
|
+
readonly how: "docs";
|
|
998
|
+
};
|
|
999
|
+
readonly tags: readonly ["ai", "llm", "embeddings", "images"];
|
|
1000
|
+
};
|
|
1001
|
+
readonly mistral: {
|
|
1002
|
+
readonly mode: "ai";
|
|
1003
|
+
readonly label: "Mistral AI";
|
|
1004
|
+
readonly description: "Mistral's models: chat, code completion, embeddings, moderation, OCR, speech.";
|
|
1005
|
+
readonly auth: {
|
|
1006
|
+
readonly kind: "bearer";
|
|
1007
|
+
readonly secret: "MISTRAL_API_KEY";
|
|
1008
|
+
};
|
|
1009
|
+
readonly docs: "https://console.mistral.ai";
|
|
1010
|
+
readonly api: "https://docs.mistral.ai/api/";
|
|
1011
|
+
readonly origin: "https://api.mistral.ai";
|
|
1012
|
+
readonly inferenceRoutes: readonly ["/v1/chat/completions", "/v1/fim/completions", "/v1/embeddings", "/v1/moderations", "/v1/chat/moderations", "/v1/classifications", "/v1/chat/classifications", "/v1/ocr", "/v1/audio/transcriptions", "/v1/audio/speech"];
|
|
1013
|
+
readonly chat: {
|
|
1014
|
+
readonly path: "/v1/chat/completions";
|
|
1015
|
+
readonly seedModel: "mistral-small-latest";
|
|
1016
|
+
};
|
|
1017
|
+
readonly embeddings: {
|
|
1018
|
+
readonly path: "/v1/embeddings";
|
|
1019
|
+
readonly seedModel: "mistral-embed";
|
|
1020
|
+
};
|
|
1021
|
+
readonly aig: {
|
|
1022
|
+
readonly slug: "mistral";
|
|
1023
|
+
};
|
|
1024
|
+
readonly hint: "An API key from API Keys in the Mistral Studio console; the Gateway sends it as a bearer token. Free mode needs no card; usage and rate limits apply.";
|
|
1025
|
+
readonly secrets: readonly [{
|
|
1026
|
+
readonly name: "MISTRAL_API_KEY";
|
|
1027
|
+
readonly hint: "A key from API Keys in the Studio console, with an expiry date.";
|
|
1028
|
+
}];
|
|
1029
|
+
readonly smoke: {
|
|
1030
|
+
readonly method: "GET";
|
|
1031
|
+
readonly path: "/v1/models";
|
|
1032
|
+
readonly expect: readonly [200];
|
|
1033
|
+
readonly free: true;
|
|
1034
|
+
};
|
|
1035
|
+
readonly example: "extract the text from this scanned invoice";
|
|
1036
|
+
readonly verified: {
|
|
1037
|
+
readonly on: "2026-10-25";
|
|
1038
|
+
readonly how: "docs";
|
|
1039
|
+
};
|
|
1040
|
+
readonly tags: readonly ["ai", "llm", "ocr", "embeddings"];
|
|
1041
|
+
};
|
|
1042
|
+
readonly groq: {
|
|
1043
|
+
readonly mode: "ai";
|
|
1044
|
+
readonly label: "Groq";
|
|
1045
|
+
readonly description: "Open models on Groq through OpenAI's API shape: chat, responses, transcription, speech.";
|
|
1046
|
+
readonly auth: {
|
|
1047
|
+
readonly kind: "bearer";
|
|
1048
|
+
readonly secret: "GROQ_API_KEY";
|
|
1049
|
+
};
|
|
1050
|
+
readonly docs: "https://console.groq.com/keys";
|
|
1051
|
+
readonly api: "https://console.groq.com/docs/api-reference";
|
|
1052
|
+
readonly origin: "https://api.groq.com";
|
|
1053
|
+
readonly inferenceRoutes: readonly ["/openai/v1/chat/completions", "/openai/v1/responses", "/openai/v1/audio/transcriptions", "/openai/v1/audio/translations", "/openai/v1/audio/speech"];
|
|
1054
|
+
readonly chat: {
|
|
1055
|
+
readonly path: "/openai/v1/chat/completions";
|
|
1056
|
+
readonly seedModel: "openai/gpt-oss-20b";
|
|
1057
|
+
};
|
|
1058
|
+
readonly aig: {
|
|
1059
|
+
readonly slug: "groq";
|
|
1060
|
+
readonly trim: "/openai/v1";
|
|
1061
|
+
};
|
|
1062
|
+
readonly hint: "An API key from the Groq console; the Gateway sends it as a bearer token. Apps call the OpenAI-shaped paths under /openai/v1.";
|
|
1063
|
+
readonly secrets: readonly [{
|
|
1064
|
+
readonly name: "GROQ_API_KEY";
|
|
1065
|
+
readonly hint: "A key from the API Keys page of the Groq console.";
|
|
1066
|
+
}];
|
|
1067
|
+
readonly smoke: {
|
|
1068
|
+
readonly method: "GET";
|
|
1069
|
+
readonly path: "/openai/v1/models";
|
|
1070
|
+
readonly expect: readonly [200];
|
|
1071
|
+
readonly free: true;
|
|
1072
|
+
};
|
|
1073
|
+
readonly rate: {
|
|
1074
|
+
readonly note: "Requests and tokens per minute and per day, per model and plan, for the whole organization; the console Limits page shows them.";
|
|
1075
|
+
};
|
|
1076
|
+
readonly example: "transcribe this voice memo";
|
|
1077
|
+
readonly verified: {
|
|
1078
|
+
readonly on: "2026-10-25";
|
|
1079
|
+
readonly how: "docs";
|
|
1080
|
+
};
|
|
1081
|
+
readonly tags: readonly ["ai", "llm", "speech"];
|
|
1082
|
+
};
|
|
1083
|
+
readonly cohere: {
|
|
1084
|
+
readonly mode: "ai";
|
|
1085
|
+
readonly label: "Cohere";
|
|
1086
|
+
readonly description: "Cohere's models: chat, embeddings, reranking, classification, transcription, document parsing.";
|
|
1087
|
+
readonly auth: {
|
|
1088
|
+
readonly kind: "bearer";
|
|
1089
|
+
readonly secret: "COHERE_API_KEY";
|
|
1090
|
+
};
|
|
1091
|
+
readonly docs: "https://dashboard.cohere.com/api-keys";
|
|
1092
|
+
readonly api: "https://docs.cohere.com/reference/about";
|
|
1093
|
+
readonly origin: "https://api.cohere.com";
|
|
1094
|
+
readonly inferenceRoutes: readonly ["/v2/chat", "/v2/embed", "/v2/rerank", "/v1/classify", "/v2/audio/transcriptions", "/v2/parse", "/v1/tokenize", "/v1/detokenize"];
|
|
1095
|
+
readonly shape: "other";
|
|
1096
|
+
readonly hint: "An API key from the Cohere dashboard; the Gateway sends it as a bearer token. Trial keys are free and limited; production keys are paid.";
|
|
1097
|
+
readonly secrets: readonly [{
|
|
1098
|
+
readonly name: "COHERE_API_KEY";
|
|
1099
|
+
readonly hint: "A production key; a trial key is limited to 1,000 calls a month.";
|
|
1100
|
+
}];
|
|
1101
|
+
readonly smoke: {
|
|
1102
|
+
readonly method: "GET";
|
|
1103
|
+
readonly path: "/v1/models";
|
|
1104
|
+
readonly expect: readonly [200];
|
|
1105
|
+
readonly free: true;
|
|
1106
|
+
};
|
|
1107
|
+
readonly rate: {
|
|
1108
|
+
readonly note: "Production: 500 calls a minute for Command A chat and most endpoints, rerank 1,000. Trial: 20 chat calls a minute, 1,000 calls a month.";
|
|
1109
|
+
};
|
|
1110
|
+
readonly example: "rerank these search results for the query refund policy";
|
|
1111
|
+
readonly verified: {
|
|
1112
|
+
readonly on: "2026-10-25";
|
|
1113
|
+
readonly how: "docs";
|
|
1114
|
+
};
|
|
1115
|
+
readonly tags: readonly ["ai", "llm", "embeddings", "rerank"];
|
|
1116
|
+
};
|
|
1117
|
+
readonly voyage: {
|
|
1118
|
+
readonly mode: "api_key";
|
|
1119
|
+
readonly label: "Voyage AI";
|
|
1120
|
+
readonly description: "Embeddings and rerankers for search and retrieval: text, code, multimodal, contextualized chunks.";
|
|
1121
|
+
readonly auth: {
|
|
1122
|
+
readonly kind: "bearer";
|
|
1123
|
+
readonly secret: "VOYAGE_API_KEY";
|
|
1124
|
+
};
|
|
1125
|
+
readonly docs: "https://dashboard.voyageai.com/organization/api-keys";
|
|
1126
|
+
readonly api: "https://docs.voyageai.com/reference/embeddings-api";
|
|
1127
|
+
readonly hosts: readonly ["api.voyageai.com"];
|
|
1128
|
+
readonly data: "per-call";
|
|
1129
|
+
readonly access: readonly ["read"];
|
|
1130
|
+
readonly readMethods: readonly ["POST"];
|
|
1131
|
+
readonly accountWidePaths: readonly [readonly ["v1", "files"], readonly ["v1", "batches"]];
|
|
1132
|
+
readonly hint: "A secret key from the Voyage dashboard; the Gateway sends it as a bearer token. Apps POST to /v1/embeddings, /v1/multimodalembeddings, /v1/contextualizedembeddings and /v1/rerank.";
|
|
1133
|
+
readonly secrets: readonly [{
|
|
1134
|
+
readonly name: "VOYAGE_API_KEY";
|
|
1135
|
+
readonly hint: "A secret key from API keys in the Voyage dashboard.";
|
|
1136
|
+
}];
|
|
1137
|
+
readonly smoke: {
|
|
1138
|
+
readonly method: "GET";
|
|
1139
|
+
readonly path: "/v1/batches";
|
|
1140
|
+
readonly expect: readonly [200];
|
|
1141
|
+
readonly free: true;
|
|
1142
|
+
readonly note: "Lists the organization's batches, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
1143
|
+
};
|
|
1144
|
+
readonly cost: {
|
|
1145
|
+
readonly unit: "token";
|
|
1146
|
+
readonly note: "voyage-4 $0.06 per million tokens; the first 200 million tokens of the voyage-4 family are free per account.";
|
|
1147
|
+
};
|
|
1148
|
+
readonly rate: {
|
|
1149
|
+
readonly perMinute: 2000;
|
|
1150
|
+
readonly note: "2,000 requests a minute at tier 1, doubled at tier 2, tripled at tier 3; tokens per minute vary by model.";
|
|
1151
|
+
};
|
|
1152
|
+
readonly example: "embed these product descriptions for semantic search";
|
|
1153
|
+
readonly verified: {
|
|
1154
|
+
readonly on: "2026-10-25";
|
|
1155
|
+
readonly how: "docs";
|
|
1156
|
+
};
|
|
1157
|
+
readonly tags: readonly ["embeddings", "rerank", "search"];
|
|
1158
|
+
};
|
|
1159
|
+
readonly perplexity: {
|
|
1160
|
+
readonly mode: "api_key";
|
|
1161
|
+
readonly label: "Perplexity";
|
|
1162
|
+
readonly description: "Web-grounded answers from the Agent API, raw web search results, and embeddings.";
|
|
1163
|
+
readonly auth: {
|
|
1164
|
+
readonly kind: "bearer";
|
|
1165
|
+
readonly secret: "PERPLEXITY_API_KEY";
|
|
1166
|
+
};
|
|
1167
|
+
readonly docs: "https://console.perplexity.ai/project/keys";
|
|
1168
|
+
readonly api: "https://docs.perplexity.ai/api-reference/agent-post";
|
|
1169
|
+
readonly hosts: readonly ["api.perplexity.ai"];
|
|
1170
|
+
readonly data: "per-call";
|
|
1171
|
+
readonly access: readonly ["read"];
|
|
1172
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
1173
|
+
readonly accountWidePaths: readonly [readonly ["v1", "batches"], readonly ["v1", "files"], readonly ["v1", "skills"], readonly ["v1", "analytics"], readonly ["v2", "analytics"], readonly ["generate_auth_token"], readonly ["revoke_auth_token"]];
|
|
1174
|
+
readonly hint: "An API key from the Perplexity console; the Gateway sends it as a bearer token. Apps POST to /v1/agent for researched answers and /search for result lists, and GET /v1/agent/{id} to poll a background run.";
|
|
1175
|
+
readonly secrets: readonly [{
|
|
1176
|
+
readonly name: "PERPLEXITY_API_KEY";
|
|
1177
|
+
readonly hint: "An API key from the project's API keys page in the Perplexity console.";
|
|
1178
|
+
}];
|
|
1179
|
+
readonly smoke: {
|
|
1180
|
+
readonly method: "GET";
|
|
1181
|
+
readonly path: "/orchestrator/v1/models";
|
|
1182
|
+
readonly expect: readonly [200];
|
|
1183
|
+
readonly free: true;
|
|
1184
|
+
};
|
|
1185
|
+
readonly cost: {
|
|
1186
|
+
readonly unit: "token";
|
|
1187
|
+
readonly note: "Agent API per token plus tool fees (web_search $0.0025 a call); Search API $5 per 1,000 requests.";
|
|
1188
|
+
};
|
|
1189
|
+
readonly example: "research the latest pricing changes from our three main competitors";
|
|
1190
|
+
readonly verified: {
|
|
1191
|
+
readonly on: "2026-10-25";
|
|
1192
|
+
readonly how: "docs";
|
|
1193
|
+
};
|
|
1194
|
+
readonly tags: readonly ["search", "ai", "research"];
|
|
1195
|
+
};
|
|
1196
|
+
readonly jina: {
|
|
1197
|
+
readonly mode: "api_key";
|
|
1198
|
+
readonly label: "Jina AI";
|
|
1199
|
+
readonly description: "Reads web pages as Markdown, searches the web, and embeds and reranks text and images.";
|
|
1200
|
+
readonly auth: {
|
|
1201
|
+
readonly kind: "bearer";
|
|
1202
|
+
readonly secret: "JINA_API_KEY";
|
|
1203
|
+
};
|
|
1204
|
+
readonly docs: "https://jina.ai/api-dashboard/key-manager";
|
|
1205
|
+
readonly api: "https://docs.jina.ai/";
|
|
1206
|
+
readonly hosts: readonly ["api.jina.ai", "r.jina.ai", "s.jina.ai"];
|
|
1207
|
+
readonly data: "per-call";
|
|
1208
|
+
readonly access: readonly ["read"];
|
|
1209
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
1210
|
+
readonly accountWidePaths: readonly [readonly ["v1", "batches"], readonly ["echo"]];
|
|
1211
|
+
readonly hint: "An API key from the Jina API dashboard; the Gateway sends it as a bearer token. Reader is r.jina.ai (POST {\"url\": ...}), Search is s.jina.ai, and embeddings and rerank are on api.jina.ai.";
|
|
1212
|
+
readonly secrets: readonly [{
|
|
1213
|
+
readonly name: "JINA_API_KEY";
|
|
1214
|
+
readonly hint: "A key starting jina_, from Manage API Key in the Jina API dashboard.";
|
|
1215
|
+
}];
|
|
1216
|
+
readonly smoke: {
|
|
1217
|
+
readonly method: "GET";
|
|
1218
|
+
readonly host: "api.jina.ai";
|
|
1219
|
+
readonly path: "/v1/batches";
|
|
1220
|
+
readonly expect: readonly [200];
|
|
1221
|
+
readonly free: true;
|
|
1222
|
+
readonly note: "Lists the account's batch jobs, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
1223
|
+
};
|
|
1224
|
+
readonly cost: {
|
|
1225
|
+
readonly unit: "token";
|
|
1226
|
+
readonly note: "Billed in tokens against the account balance; GET /v1/models lists each model's price.";
|
|
1227
|
+
};
|
|
1228
|
+
readonly rate: {
|
|
1229
|
+
readonly note: "Reader 500 requests a minute, Search 100, embeddings and rerank 500; premium keys get ten times more.";
|
|
1230
|
+
};
|
|
1231
|
+
readonly example: "read this article as Markdown and pull out the key claims";
|
|
1232
|
+
readonly verified: {
|
|
1233
|
+
readonly on: "2026-10-25";
|
|
1234
|
+
readonly how: "docs";
|
|
1235
|
+
};
|
|
1236
|
+
readonly tags: readonly ["scrape", "search", "embeddings", "rerank"];
|
|
1237
|
+
};
|
|
1238
|
+
readonly replicate: {
|
|
1239
|
+
readonly mode: "api_key";
|
|
1240
|
+
readonly label: "Replicate";
|
|
1241
|
+
readonly description: "Runs open-source and official models by API: images, video, audio and language.";
|
|
1242
|
+
readonly auth: {
|
|
1243
|
+
readonly kind: "bearer";
|
|
1244
|
+
readonly secret: "REPLICATE_API_TOKEN";
|
|
1245
|
+
};
|
|
1246
|
+
readonly docs: "https://replicate.com/account/api-tokens";
|
|
1247
|
+
readonly api: "https://replicate.com/docs/reference/http";
|
|
1248
|
+
readonly hosts: readonly ["api.replicate.com"];
|
|
1249
|
+
readonly data: "per-call";
|
|
1250
|
+
readonly access: readonly ["read"];
|
|
1251
|
+
readonly readMethods: readonly ["POST"];
|
|
1252
|
+
readonly accountWidePaths: readonly [readonly ["v1", "account"], readonly ["v1", "deployments"], readonly ["v1", "files"], readonly ["v1", "webhooks"], readonly ["trainings"]];
|
|
1253
|
+
readonly hint: "An API token from Replicate's API tokens page; the Gateway sends it as a bearer token. Apps POST to /v1/models/{owner}/{name}/predictions or /v1/predictions with Prefer: wait (up to 60 seconds), or pass a webhook URL for longer runs.";
|
|
1254
|
+
readonly secrets: readonly [{
|
|
1255
|
+
readonly name: "REPLICATE_API_TOKEN";
|
|
1256
|
+
readonly hint: "An API token from the API tokens page of the Replicate account.";
|
|
1257
|
+
}];
|
|
1258
|
+
readonly smoke: {
|
|
1259
|
+
readonly method: "GET";
|
|
1260
|
+
readonly path: "/v1/account";
|
|
1261
|
+
readonly expect: readonly [200];
|
|
1262
|
+
readonly free: true;
|
|
1263
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
1264
|
+
};
|
|
1265
|
+
readonly rate: {
|
|
1266
|
+
readonly perMinute: 600;
|
|
1267
|
+
readonly note: "Creating predictions 600 a minute; every other endpoint 3,000 a minute.";
|
|
1268
|
+
};
|
|
1269
|
+
readonly example: "generate a product photo of a ceramic mug on a wooden table";
|
|
1270
|
+
readonly verified: {
|
|
1271
|
+
readonly on: "2026-10-25";
|
|
1272
|
+
readonly how: "docs";
|
|
1273
|
+
};
|
|
1274
|
+
readonly tags: readonly ["ai", "images", "video", "audio"];
|
|
1275
|
+
};
|
|
1276
|
+
readonly huggingface: {
|
|
1277
|
+
readonly mode: "api_key";
|
|
1278
|
+
readonly label: "Hugging Face Inference";
|
|
1279
|
+
readonly description: "Open models from Hugging Face's inference providers through one router: chat, embeddings, images, speech.";
|
|
1280
|
+
readonly auth: {
|
|
1281
|
+
readonly kind: "bearer";
|
|
1282
|
+
readonly secret: "HUGGINGFACE_API_TOKEN";
|
|
1283
|
+
};
|
|
1284
|
+
readonly docs: "https://huggingface.co/settings/tokens/new?ownUserPermissions=inference.serverless.write&tokenType=fineGrained";
|
|
1285
|
+
readonly api: "https://huggingface.co/docs/inference-providers/index";
|
|
1286
|
+
readonly hosts: readonly ["router.huggingface.co"];
|
|
1287
|
+
readonly data: "per-call";
|
|
1288
|
+
readonly access: readonly ["read"];
|
|
1289
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
1290
|
+
readonly accountWidePaths: readonly [];
|
|
1291
|
+
readonly hint: "A fine-grained access token from Hugging Face settings with the Inference Providers permission; the Gateway sends it as a bearer token. Apps POST OpenAI-style chat to /v1/chat/completions, or other tasks under /<provider>/, such as /hf-inference/models/<model>.";
|
|
1292
|
+
readonly secrets: readonly [{
|
|
1293
|
+
readonly name: "HUGGINGFACE_API_TOKEN";
|
|
1294
|
+
readonly hint: "A fine-grained token with only the Make calls to Inference Providers permission.";
|
|
1295
|
+
}];
|
|
1296
|
+
readonly cost: {
|
|
1297
|
+
readonly unit: "call";
|
|
1298
|
+
readonly note: "Pay as you go at each provider's own rate with no markup; PRO accounts get $2 of compute credits a month.";
|
|
1299
|
+
};
|
|
1300
|
+
readonly example: "embed these support articles for semantic search";
|
|
1301
|
+
readonly verified: {
|
|
1302
|
+
readonly on: "2026-10-25";
|
|
1303
|
+
readonly how: "docs";
|
|
1304
|
+
};
|
|
1305
|
+
readonly tags: readonly ["ai", "llm", "embeddings", "images"];
|
|
1306
|
+
};
|
|
1307
|
+
readonly cloudflare: {
|
|
1308
|
+
readonly mode: "api_key";
|
|
1309
|
+
readonly label: "Cloudflare";
|
|
1310
|
+
readonly description: "Cloudflare's API: zones, DNS, Workers, R2, D1, KV and the rest of an account.";
|
|
1311
|
+
readonly auth: {
|
|
1312
|
+
readonly kind: "bearer";
|
|
1313
|
+
readonly secret: "CLOUDFLARE_PROVIDER_API_TOKEN";
|
|
1314
|
+
};
|
|
1315
|
+
readonly docs: "https://dash.cloudflare.com/profile/api-tokens";
|
|
1316
|
+
readonly api: "https://developers.cloudflare.com/api/";
|
|
1317
|
+
readonly hosts: readonly ["api.cloudflare.com"];
|
|
1318
|
+
readonly data: "account";
|
|
1319
|
+
readonly access: readonly ["read", "write"];
|
|
1320
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1321
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1322
|
+
readonly accountWidePaths: readonly [readonly ["client", "v4", "user"], readonly ["client", "v4", "memberships"], readonly ["client", "v4", "organizations"], readonly ["client", "v4", "tenants"], readonly ["members"], readonly ["tokens"], readonly ["roles"], readonly ["iam"], readonly ["subscriptions"], readonly ["payment-methods"], readonly ["pay-invoice"], readonly ["receipts"], readonly ["invoices"], readonly ["client-secret"], readonly ["billing"], readonly ["logs", "audit"], readonly ["audit_logs"], readonly ["alerting", "v3", "destinations", "webhooks"], readonly ["ai", "run"], readonly ["ai", "v1"]];
|
|
1323
|
+
readonly hint: "An API token from My Profile > API Tokens with only the permissions the app needs; the Gateway sends it as a bearer token. A token on the Gateway's own account can read and change the Gateway, so keep it narrow or use another account.";
|
|
1324
|
+
readonly secrets: readonly [{
|
|
1325
|
+
readonly name: "CLOUDFLARE_PROVIDER_API_TOKEN";
|
|
1326
|
+
readonly hint: "A user or account-owned API token scoped to the zones and permissions the app needs, never a Global API Key.";
|
|
1327
|
+
}];
|
|
1328
|
+
readonly smoke: {
|
|
1329
|
+
readonly method: "GET";
|
|
1330
|
+
readonly path: "/client/v4/user/tokens/verify";
|
|
1331
|
+
readonly expect: readonly [200];
|
|
1332
|
+
readonly free: true;
|
|
1333
|
+
readonly note: "For a user token; account-owned tokens use /client/v4/accounts/<id>/tokens/verify. Account-wide, so run it from the person's terminal.";
|
|
1334
|
+
};
|
|
1335
|
+
readonly rate: {
|
|
1336
|
+
readonly note: "1,200 requests per 5 minutes per user or account token; 200 a second per IP; GraphQL by query cost, at most 320 per 5 minutes.";
|
|
1337
|
+
};
|
|
1338
|
+
readonly example: "list the DNS records for my domain";
|
|
1339
|
+
readonly verified: {
|
|
1340
|
+
readonly on: "2026-10-25";
|
|
1341
|
+
readonly how: "docs";
|
|
1342
|
+
};
|
|
1343
|
+
readonly tags: readonly ["infrastructure", "dns", "hosting"];
|
|
1344
|
+
};
|
|
1345
|
+
readonly posthog: {
|
|
1346
|
+
readonly mode: "api_key";
|
|
1347
|
+
readonly label: "PostHog";
|
|
1348
|
+
readonly description: "Product analytics: insights, feature flags, persons, cohorts, experiments and HogQL queries.";
|
|
1349
|
+
readonly auth: {
|
|
1350
|
+
readonly kind: "bearer";
|
|
1351
|
+
readonly secret: "POSTHOG_PERSONAL_API_KEY";
|
|
1352
|
+
};
|
|
1353
|
+
readonly docs: "https://us.posthog.com/settings/user-api-keys";
|
|
1354
|
+
readonly api: "https://posthog.com/docs/api";
|
|
1355
|
+
readonly hosts: readonly ["us.posthog.com", "eu.posthog.com"];
|
|
1356
|
+
readonly data: "account";
|
|
1357
|
+
readonly access: readonly ["read", "write"];
|
|
1358
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1359
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1360
|
+
readonly accountWidePaths: readonly [readonly ["api", "users"], readonly ["api", "user"], readonly ["api", "organizations"], readonly ["api", "billing"], readonly ["api", "revoke_leaked_key"], readonly ["project_secret_api_keys"], readonly ["billing"], readonly ["activity_log"], readonly ["advanced_activity_logs"], readonly ["hog_functions"], readonly ["batch_exports"], readonly ["integrations"]];
|
|
1361
|
+
readonly hint: "A personal API key from Settings > Personal API keys, with only the scopes the app needs; the Gateway sends it as a bearer token to us.posthog.com or eu.posthog.com. HogQL queries are POSTs, so an app that runs them asks for write.";
|
|
1362
|
+
readonly secrets: readonly [{
|
|
1363
|
+
readonly name: "POSTHOG_PERSONAL_API_KEY";
|
|
1364
|
+
readonly hint: "A personal API key (phx_...) with only the scopes the app needs, from the region the project lives in; never the project token.";
|
|
1365
|
+
}];
|
|
1366
|
+
readonly smoke: {
|
|
1367
|
+
readonly method: "GET";
|
|
1368
|
+
readonly host: "us.posthog.com";
|
|
1369
|
+
readonly path: "/api/users/@me/";
|
|
1370
|
+
readonly expect: readonly [200];
|
|
1371
|
+
readonly free: true;
|
|
1372
|
+
readonly note: "Needs the user:read scope; use eu.posthog.com for an EU project. Account-wide, so run it from the person's terminal.";
|
|
1373
|
+
};
|
|
1374
|
+
readonly rate: {
|
|
1375
|
+
readonly perMinute: 480;
|
|
1376
|
+
readonly note: "Create, read, update and delete endpoints 480 a minute and 4,800 an hour; analytics endpoints 240 a minute; the query endpoint 2,400 an hour.";
|
|
1377
|
+
};
|
|
1378
|
+
readonly example: "list the feature flags in my project and whether each is on";
|
|
1379
|
+
readonly verified: {
|
|
1380
|
+
readonly on: "2026-10-25";
|
|
1381
|
+
readonly how: "docs";
|
|
1382
|
+
};
|
|
1383
|
+
readonly tags: readonly ["analytics", "product", "feature-flags"];
|
|
1384
|
+
};
|
|
1385
|
+
readonly mixpanel: {
|
|
1386
|
+
readonly mode: "api_key";
|
|
1387
|
+
readonly label: "Mixpanel";
|
|
1388
|
+
readonly description: "Product analytics: saved reports, profiles, raw event export and event import.";
|
|
1389
|
+
readonly auth: {
|
|
1390
|
+
readonly kind: "basic";
|
|
1391
|
+
readonly secret: "MIXPANEL_SERVICE_ACCOUNT_SECRET";
|
|
1392
|
+
readonly as: "password";
|
|
1393
|
+
readonly user: {
|
|
1394
|
+
readonly secret: "MIXPANEL_SERVICE_ACCOUNT_USERNAME";
|
|
1395
|
+
};
|
|
1396
|
+
};
|
|
1397
|
+
readonly docs: "https://mixpanel.com/settings/org#serviceaccounts";
|
|
1398
|
+
readonly api: "https://docs.mixpanel.com/reference/overview";
|
|
1399
|
+
readonly hosts: readonly ["mixpanel.com", "eu.mixpanel.com", "in.mixpanel.com", "data.mixpanel.com", "data-eu.mixpanel.com", "data-in.mixpanel.com", "api.mixpanel.com", "api-eu.mixpanel.com", "api-in.mixpanel.com"];
|
|
1400
|
+
readonly data: "account";
|
|
1401
|
+
readonly access: readonly ["read", "write"];
|
|
1402
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1403
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1404
|
+
readonly accountWidePaths: readonly [readonly ["api", "app", "me"], readonly ["api", "app", "organizations"], readonly ["service-accounts"], readonly ["data-retrievals"], readonly ["data-deletions"], readonly ["nessie"]];
|
|
1405
|
+
readonly hint: "A service account from Organization Settings > Service Accounts; the Gateway sends its username and secret as HTTP Basic. Most calls also need the project_id parameter, and an EU or India project uses its own hosts.";
|
|
1406
|
+
readonly secrets: readonly [{
|
|
1407
|
+
readonly name: "MIXPANEL_SERVICE_ACCOUNT_USERNAME";
|
|
1408
|
+
readonly hint: "The service account's username, shown when it is created in Organization Settings > Service Accounts.";
|
|
1409
|
+
}, {
|
|
1410
|
+
readonly name: "MIXPANEL_SERVICE_ACCOUNT_SECRET";
|
|
1411
|
+
readonly hint: "The service account's secret, shown once when it is created; give the account the narrowest role and only the projects the app needs.";
|
|
1412
|
+
}];
|
|
1413
|
+
readonly smoke: {
|
|
1414
|
+
readonly method: "GET";
|
|
1415
|
+
readonly host: "mixpanel.com";
|
|
1416
|
+
readonly path: "/api/app/me";
|
|
1417
|
+
readonly expect: readonly [200];
|
|
1418
|
+
readonly free: true;
|
|
1419
|
+
readonly note: "Lists the organizations and projects the service account reaches. Account-wide, so run it from the person's terminal.";
|
|
1420
|
+
};
|
|
1421
|
+
readonly rate: {
|
|
1422
|
+
readonly note: "Per project: Query API 60 queries an hour, 5 at once; Raw Data Export 60 an hour, 3 a second, 100 at once; ingestion about 2 GB a minute.";
|
|
1423
|
+
};
|
|
1424
|
+
readonly example: "pull last week's numbers from my saved Insights report";
|
|
1425
|
+
readonly verified: {
|
|
1426
|
+
readonly on: "2026-10-25";
|
|
1427
|
+
readonly how: "docs";
|
|
1428
|
+
};
|
|
1429
|
+
readonly tags: readonly ["analytics", "product"];
|
|
1430
|
+
};
|
|
1431
|
+
readonly segment: {
|
|
1432
|
+
readonly mode: "api_key";
|
|
1433
|
+
readonly label: "Segment";
|
|
1434
|
+
readonly description: "Sends identify, track, page, group and alias events to a Segment source.";
|
|
1435
|
+
readonly auth: {
|
|
1436
|
+
readonly kind: "basic";
|
|
1437
|
+
readonly secret: "SEGMENT_WRITE_KEY";
|
|
1438
|
+
readonly as: "username";
|
|
1439
|
+
};
|
|
1440
|
+
readonly docs: "https://www.twilio.com/docs/segment/connections/find-writekey";
|
|
1441
|
+
readonly api: "https://www.twilio.com/docs/segment/connections/sources/catalog/libraries/server/http-api";
|
|
1442
|
+
readonly hosts: readonly ["api.segment.io", "events.eu1.segmentapis.com"];
|
|
1443
|
+
readonly data: "account";
|
|
1444
|
+
readonly access: readonly ["write"];
|
|
1445
|
+
readonly readMethods: readonly [];
|
|
1446
|
+
readonly writeMethods: readonly ["POST"];
|
|
1447
|
+
readonly accountWidePaths: readonly [];
|
|
1448
|
+
readonly hint: "The write key of an HTTP API source, from the source's Settings > API Keys; the Gateway sends it as the Basic username with an empty password. It only sends events; an EU workspace uses events.eu1.segmentapis.com.";
|
|
1449
|
+
readonly secrets: readonly [{
|
|
1450
|
+
readonly name: "SEGMENT_WRITE_KEY";
|
|
1451
|
+
readonly hint: "The write key of an HTTP API source, from the source's Settings > API Keys.";
|
|
1452
|
+
}];
|
|
1453
|
+
readonly rate: {
|
|
1454
|
+
readonly perSecond: 1000;
|
|
1455
|
+
readonly note: "Recommended ceiling per workspace; 32 KB per call, 500 KB and 2,500 events per batch.";
|
|
1456
|
+
};
|
|
1457
|
+
readonly example: "record a Signed Up event for a new user";
|
|
1458
|
+
readonly verified: {
|
|
1459
|
+
readonly on: "2026-10-25";
|
|
1460
|
+
readonly how: "docs";
|
|
1461
|
+
};
|
|
1462
|
+
readonly tags: readonly ["analytics", "events", "cdp"];
|
|
1463
|
+
};
|
|
1464
|
+
readonly supabase: {
|
|
1465
|
+
readonly mode: "api_key";
|
|
1466
|
+
readonly label: "Supabase";
|
|
1467
|
+
readonly description: "A Supabase project's Postgres REST API and Storage, with its secret key.";
|
|
1468
|
+
readonly auth: {
|
|
1469
|
+
readonly kind: "header";
|
|
1470
|
+
readonly secret: "SUPABASE_SECRET_KEY";
|
|
1471
|
+
readonly header: "apikey";
|
|
1472
|
+
};
|
|
1473
|
+
readonly docs: "https://supabase.com/dashboard/project/_/settings/api-keys";
|
|
1474
|
+
readonly api: "https://supabase.com/docs/guides/api";
|
|
1475
|
+
readonly hosts: readonly [];
|
|
1476
|
+
readonly hostSetting: "SUPABASE_HOST";
|
|
1477
|
+
readonly data: "account";
|
|
1478
|
+
readonly access: readonly ["read", "write"];
|
|
1479
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1480
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1481
|
+
readonly accountWidePaths: readonly [readonly ["auth", "v1", "admin"], readonly ["pg"]];
|
|
1482
|
+
readonly hint: "A secret key (sb_secret_...) from Settings > API Keys and the project's host; the Gateway sends the key in the apikey header. The key bypasses Row Level Security, and RPC calls are POSTs, so they need write.";
|
|
1483
|
+
readonly secrets: readonly [{
|
|
1484
|
+
readonly name: "SUPABASE_SECRET_KEY";
|
|
1485
|
+
readonly hint: "A secret key (sb_secret_...) from Settings > API Keys, made for this Gateway alone; it bypasses Row Level Security.";
|
|
1486
|
+
}, {
|
|
1487
|
+
readonly name: "SUPABASE_HOST";
|
|
1488
|
+
readonly hint: "The project's host, <project-ref>.supabase.co, from the project URL.";
|
|
1489
|
+
}];
|
|
1490
|
+
readonly smoke: {
|
|
1491
|
+
readonly method: "GET";
|
|
1492
|
+
readonly path: "/rest/v1/";
|
|
1493
|
+
readonly expect: readonly [200];
|
|
1494
|
+
readonly free: true;
|
|
1495
|
+
readonly note: "The REST API's OpenAPI root, which only a secret key may read; sent to the host in SUPABASE_HOST.";
|
|
1496
|
+
};
|
|
1497
|
+
readonly example: "list the ten newest rows in my orders table";
|
|
1498
|
+
readonly verified: {
|
|
1499
|
+
readonly on: "2026-10-25";
|
|
1500
|
+
readonly how: "docs";
|
|
1501
|
+
};
|
|
1502
|
+
readonly tags: readonly ["database", "postgres", "storage"];
|
|
1503
|
+
};
|
|
1504
|
+
readonly turso: {
|
|
1505
|
+
readonly mode: "api_key";
|
|
1506
|
+
readonly label: "Turso";
|
|
1507
|
+
readonly description: "Turso's Platform API: databases, groups, locations and usage for one organization.";
|
|
1508
|
+
readonly auth: {
|
|
1509
|
+
readonly kind: "bearer";
|
|
1510
|
+
readonly secret: "TURSO_API_TOKEN";
|
|
1511
|
+
};
|
|
1512
|
+
readonly docs: "https://docs.turso.tech/api-reference/authentication";
|
|
1513
|
+
readonly api: "https://docs.turso.tech/api-reference/introduction";
|
|
1514
|
+
readonly hosts: readonly ["api.turso.tech"];
|
|
1515
|
+
readonly data: "account";
|
|
1516
|
+
readonly access: readonly ["read", "write"];
|
|
1517
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1518
|
+
readonly writeMethods: readonly ["POST", "PATCH", "DELETE"];
|
|
1519
|
+
readonly accountWidePaths: readonly [readonly ["auth"], readonly ["api-tokens"], readonly ["members"], readonly ["invites"], readonly ["invoices"], readonly ["subscription"], readonly ["plans"], readonly ["audit-logs"], readonly ["v1", "user"]];
|
|
1520
|
+
readonly hint: "An organization-scoped Platform API token (turso auth api-tokens mint <name> --org <org>); the Gateway sends it as a bearer token to api.turso.tech. It manages databases and cannot query them: that is the turso-db entry.";
|
|
1521
|
+
readonly secrets: readonly [{
|
|
1522
|
+
readonly name: "TURSO_API_TOKEN";
|
|
1523
|
+
readonly hint: "An organization-scoped or group-scoped Platform API token from turso auth api-tokens mint <name> --org <org>; never an unrestricted one.";
|
|
1524
|
+
}];
|
|
1525
|
+
readonly smoke: {
|
|
1526
|
+
readonly method: "GET";
|
|
1527
|
+
readonly path: "/v1/auth/validate";
|
|
1528
|
+
readonly expect: readonly [200];
|
|
1529
|
+
readonly free: true;
|
|
1530
|
+
readonly note: "Account-wide, so run it from the person's terminal.";
|
|
1531
|
+
};
|
|
1532
|
+
readonly example: "list the databases in my Turso organization";
|
|
1533
|
+
readonly verified: {
|
|
1534
|
+
readonly on: "2026-10-25";
|
|
1535
|
+
readonly how: "docs";
|
|
1536
|
+
};
|
|
1537
|
+
readonly tags: readonly ["database", "sqlite"];
|
|
1538
|
+
};
|
|
1539
|
+
readonly "turso-db": {
|
|
1540
|
+
readonly mode: "api_key";
|
|
1541
|
+
readonly label: "Turso database";
|
|
1542
|
+
readonly description: "SQL over HTTP to one Turso database: queries, dumps and migration status.";
|
|
1543
|
+
readonly auth: {
|
|
1544
|
+
readonly kind: "bearer";
|
|
1545
|
+
readonly secret: "TURSO_DB_AUTH_TOKEN";
|
|
1546
|
+
};
|
|
1547
|
+
readonly docs: "https://docs.turso.tech/sdk/authorization/tokens";
|
|
1548
|
+
readonly api: "https://docs.turso.tech/sdk/http/reference";
|
|
1549
|
+
readonly hosts: readonly [];
|
|
1550
|
+
readonly hostSetting: "TURSO_DB_HOST";
|
|
1551
|
+
readonly data: "account";
|
|
1552
|
+
readonly access: readonly ["read", "write"];
|
|
1553
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1554
|
+
readonly writeMethods: readonly ["POST"];
|
|
1555
|
+
readonly accountWidePaths: readonly [];
|
|
1556
|
+
readonly hint: "A database token (turso db tokens create <db>) and the database's HTTP host; the Gateway sends the token as a bearer token. Every query is a POST to /v2/pipeline, so an app that queries asks for write; a --read-only token keeps it to reads.";
|
|
1557
|
+
readonly secrets: readonly [{
|
|
1558
|
+
readonly name: "TURSO_DB_AUTH_TOKEN";
|
|
1559
|
+
readonly hint: "A database token from turso db tokens create <db>, with --read-only or fine-grained permissions when the app only reads.";
|
|
1560
|
+
}, {
|
|
1561
|
+
readonly name: "TURSO_DB_HOST";
|
|
1562
|
+
readonly hint: "The database's HTTP host, <db>-<org>.turso.io, from turso db show <db> --http-url.";
|
|
1563
|
+
}];
|
|
1564
|
+
readonly example: "count the rows in my users table";
|
|
1565
|
+
readonly verified: {
|
|
1566
|
+
readonly on: "2026-10-25";
|
|
1567
|
+
readonly how: "docs";
|
|
1568
|
+
};
|
|
1569
|
+
readonly tags: readonly ["database", "sqlite", "sql"];
|
|
1570
|
+
};
|
|
1571
|
+
readonly neon: {
|
|
1572
|
+
readonly mode: "api_key";
|
|
1573
|
+
readonly label: "Neon";
|
|
1574
|
+
readonly description: "Neon's management API: Postgres projects, branches, databases, roles and endpoints.";
|
|
1575
|
+
readonly auth: {
|
|
1576
|
+
readonly kind: "bearer";
|
|
1577
|
+
readonly secret: "NEON_API_KEY";
|
|
1578
|
+
};
|
|
1579
|
+
readonly docs: "https://neon.com/docs/manage/api-keys";
|
|
1580
|
+
readonly api: "https://neon.com/docs/reference/api";
|
|
1581
|
+
readonly hosts: readonly ["console.neon.tech"];
|
|
1582
|
+
readonly data: "account";
|
|
1583
|
+
readonly access: readonly ["read", "write"];
|
|
1584
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1585
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1586
|
+
readonly accountWidePaths: readonly [readonly ["api", "v2", "auth"], readonly ["api", "v2", "organizations"], readonly ["users", "me"], readonly ["api_keys"], readonly ["members"], readonly ["invitations"], readonly ["permissions"], readonly ["transfer_requests"], readonly ["billing"], readonly ["consumption_history"], readonly ["connection_uri"], readonly ["reveal_password"], readonly ["reset_password"], readonly ["credentials"], readonly ["realtime", "secret"], readonly ["rotate_secret"], readonly ["auth", "keys"], readonly ["auth", "webhooks"], readonly ["oauth_providers"], readonly ["email_server"], readonly ["email_provider"], readonly ["auth", "plugins"]];
|
|
1587
|
+
readonly hint: "A project-scoped or organization API key from Settings > API keys; the Gateway sends it as a bearer token to console.neon.tech. It manages projects and branches; the database itself takes Postgres credentials, not this key.";
|
|
1588
|
+
readonly secrets: readonly [{
|
|
1589
|
+
readonly name: "NEON_API_KEY";
|
|
1590
|
+
readonly hint: "A project-scoped or organization API key from Settings > API keys; a project-scoped key reaches one project only.";
|
|
1591
|
+
}];
|
|
1592
|
+
readonly smoke: {
|
|
1593
|
+
readonly method: "GET";
|
|
1594
|
+
readonly path: "/api/v2/auth";
|
|
1595
|
+
readonly expect: readonly [200];
|
|
1596
|
+
readonly free: true;
|
|
1597
|
+
readonly note: "Says which credential and identity the key is. Account-wide, so run it from the person's terminal.";
|
|
1598
|
+
};
|
|
1599
|
+
readonly rate: {
|
|
1600
|
+
readonly perMinute: 700;
|
|
1601
|
+
readonly note: "About 11 a second, with bursts of 40 a second per route.";
|
|
1602
|
+
};
|
|
1603
|
+
readonly example: "list my Neon projects and their branches";
|
|
1604
|
+
readonly verified: {
|
|
1605
|
+
readonly on: "2026-10-25";
|
|
1606
|
+
readonly how: "docs";
|
|
1607
|
+
};
|
|
1608
|
+
readonly tags: readonly ["database", "postgres"];
|
|
1609
|
+
};
|
|
1610
|
+
readonly pinecone: {
|
|
1611
|
+
readonly mode: "api_key";
|
|
1612
|
+
readonly label: "Pinecone";
|
|
1613
|
+
readonly description: "Vector database: indexes, namespaces, vectors and documents, plus hosted embedding and rerank.";
|
|
1614
|
+
readonly auth: {
|
|
1615
|
+
readonly kind: "header";
|
|
1616
|
+
readonly secret: "PINECONE_API_KEY";
|
|
1617
|
+
readonly header: "Api-Key";
|
|
1618
|
+
};
|
|
1619
|
+
readonly docs: "https://app.pinecone.io/organizations/-/projects/-/keys";
|
|
1620
|
+
readonly api: "https://docs.pinecone.io/reference/api/introduction";
|
|
1621
|
+
readonly hosts: readonly ["api.pinecone.io"];
|
|
1622
|
+
readonly hostSetting: "PINECONE_HOST";
|
|
1623
|
+
readonly data: "account";
|
|
1624
|
+
readonly access: readonly ["read", "write"];
|
|
1625
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1626
|
+
readonly writeMethods: readonly ["POST", "PATCH", "DELETE"];
|
|
1627
|
+
readonly accountWidePaths: readonly [readonly ["admin"], readonly ["api-keys"]];
|
|
1628
|
+
readonly hint: "An API key from the project's API keys page and the host of the index the app uses; the Gateway sends the key in the Api-Key header to api.pinecone.io and that host. Query, search, embed and rerank are POSTs, so an app that uses them asks for write.";
|
|
1629
|
+
readonly secrets: readonly [{
|
|
1630
|
+
readonly name: "PINECONE_API_KEY";
|
|
1631
|
+
readonly hint: "An API key from the project's API keys page in the Pinecone console.";
|
|
1632
|
+
}, {
|
|
1633
|
+
readonly name: "PINECONE_HOST";
|
|
1634
|
+
readonly hint: "The host of the index the app uses, <index>-<id>.svc.<env>.pinecone.io, from describe_index or the console.";
|
|
1635
|
+
}];
|
|
1636
|
+
readonly smoke: {
|
|
1637
|
+
readonly method: "GET";
|
|
1638
|
+
readonly host: "api.pinecone.io";
|
|
1639
|
+
readonly path: "/indexes";
|
|
1640
|
+
readonly expect: readonly [200];
|
|
1641
|
+
readonly free: true;
|
|
1642
|
+
readonly note: "Lists the project's indexes; the app sends X-Pinecone-Api-Version itself.";
|
|
1643
|
+
};
|
|
1644
|
+
readonly example: "list my Pinecone indexes and their dimensions";
|
|
1645
|
+
readonly verified: {
|
|
1646
|
+
readonly on: "2026-10-25";
|
|
1647
|
+
readonly how: "docs";
|
|
1648
|
+
};
|
|
1649
|
+
readonly tags: readonly ["vector", "database", "search"];
|
|
1650
|
+
};
|
|
1651
|
+
readonly mapbox: {
|
|
1652
|
+
readonly mode: "api_key";
|
|
1653
|
+
readonly label: "Mapbox";
|
|
1654
|
+
readonly description: "Maps and location: geocoding, directions, styles, tilesets and datasets.";
|
|
1655
|
+
readonly auth: {
|
|
1656
|
+
readonly kind: "query";
|
|
1657
|
+
readonly secret: "MAPBOX_ACCESS_TOKEN";
|
|
1658
|
+
readonly param: "access_token";
|
|
1659
|
+
};
|
|
1660
|
+
readonly docs: "https://console.mapbox.com/account/access-tokens/";
|
|
1661
|
+
readonly api: "https://docs.mapbox.com/api/overview/";
|
|
1662
|
+
readonly hosts: readonly ["api.mapbox.com"];
|
|
1663
|
+
readonly data: "account";
|
|
1664
|
+
readonly access: readonly ["read", "write"];
|
|
1665
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1666
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1667
|
+
readonly accountWidePaths: readonly [readonly ["tokens"]];
|
|
1668
|
+
readonly hint: "An access token from Access tokens in the Mapbox console, with only the scopes the app needs; the Gateway adds it to every call as the access_token parameter.";
|
|
1669
|
+
readonly secrets: readonly [{
|
|
1670
|
+
readonly name: "MAPBOX_ACCESS_TOKEN";
|
|
1671
|
+
readonly hint: "An access token with only the scopes the app needs, from Access tokens in the Mapbox console.";
|
|
1672
|
+
}];
|
|
1673
|
+
readonly rate: {
|
|
1674
|
+
readonly note: "Per token and per API: Geocoding 1,000 a minute, Directions 300, Static Images 1,250; the Tokens API 100 a minute per account.";
|
|
1675
|
+
};
|
|
1676
|
+
readonly example: "turn a street address into map coordinates";
|
|
1677
|
+
readonly verified: {
|
|
1678
|
+
readonly on: "2026-10-25";
|
|
1679
|
+
readonly how: "docs";
|
|
1680
|
+
};
|
|
1681
|
+
readonly tags: readonly ["maps", "geocoding", "location"];
|
|
1682
|
+
};
|
|
1683
|
+
readonly openweather: {
|
|
1684
|
+
readonly mode: "api_key";
|
|
1685
|
+
readonly label: "OpenWeather";
|
|
1686
|
+
readonly description: "Weather data: current conditions, forecasts, One Call, history and weather map tiles.";
|
|
1687
|
+
readonly auth: {
|
|
1688
|
+
readonly kind: "query";
|
|
1689
|
+
readonly secret: "OPENWEATHER_API_KEY";
|
|
1690
|
+
readonly param: "appid";
|
|
1691
|
+
};
|
|
1692
|
+
readonly docs: "https://home.openweathermap.org/api_keys";
|
|
1693
|
+
readonly api: "https://openweathermap.org/api";
|
|
1694
|
+
readonly hosts: readonly ["api.openweathermap.org", "pro.openweathermap.org", "history.openweathermap.org", "tile.openweathermap.org", "maps.openweathermap.org"];
|
|
1695
|
+
readonly data: "per-call";
|
|
1696
|
+
readonly access: readonly ["read"];
|
|
1697
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1698
|
+
readonly accountWidePaths: readonly [readonly ["data", "3", "stations"], readonly ["data", "3", "measurements"]];
|
|
1699
|
+
readonly hint: "An API key from the API keys tab of your OpenWeather account; the Gateway adds it to every call as the appid parameter. Paid products (hourly forecast, history, Weather Maps 2.0) need a plan that includes them.";
|
|
1700
|
+
readonly secrets: readonly [{
|
|
1701
|
+
readonly name: "OPENWEATHER_API_KEY";
|
|
1702
|
+
readonly hint: "An API key from the API keys tab of the OpenWeather account; a new key can take up to two hours to activate.";
|
|
1703
|
+
}];
|
|
1704
|
+
readonly smoke: {
|
|
1705
|
+
readonly method: "GET";
|
|
1706
|
+
readonly host: "api.openweathermap.org";
|
|
1707
|
+
readonly path: "/data/2.5/weather?lat=51.51&lon=-0.13";
|
|
1708
|
+
readonly expect: readonly [200];
|
|
1709
|
+
readonly free: true;
|
|
1710
|
+
readonly note: "Counts one call against the plan's quota; free within it. A bad or not yet active key answers 401.";
|
|
1711
|
+
};
|
|
1712
|
+
readonly cost: {
|
|
1713
|
+
readonly unit: "call";
|
|
1714
|
+
readonly note: "One Call API 3.0 includes 1,000 calls a day free, then is paid per call.";
|
|
1715
|
+
};
|
|
1716
|
+
readonly rate: {
|
|
1717
|
+
readonly perMinute: 60;
|
|
1718
|
+
readonly note: "The Free plan answers 429 past 60 calls a minute.";
|
|
1719
|
+
};
|
|
1720
|
+
readonly example: "get the current weather in Lisbon";
|
|
1721
|
+
readonly verified: {
|
|
1722
|
+
readonly on: "2026-10-25";
|
|
1723
|
+
readonly how: "docs";
|
|
1724
|
+
};
|
|
1725
|
+
readonly tags: readonly ["weather", "forecast"];
|
|
1726
|
+
};
|
|
1727
|
+
readonly postmark: {
|
|
1728
|
+
readonly mode: "api_key";
|
|
1729
|
+
readonly label: "Postmark";
|
|
1730
|
+
readonly description: "Transactional email: single, batch and templated messages from one Postmark server.";
|
|
1731
|
+
readonly auth: {
|
|
1732
|
+
readonly kind: "header";
|
|
1733
|
+
readonly secret: "POSTMARK_API_TOKEN";
|
|
1734
|
+
readonly header: "X-Postmark-Server-Token";
|
|
1735
|
+
};
|
|
1736
|
+
readonly docs: "https://postmarkapp.com/support/article/1008-what-are-the-account-and-server-api-tokens";
|
|
1737
|
+
readonly api: "https://postmarkapp.com/developer/api/overview";
|
|
1738
|
+
readonly hosts: readonly ["api.postmarkapp.com"];
|
|
1739
|
+
readonly data: "account";
|
|
1740
|
+
readonly access: readonly ["write"];
|
|
1741
|
+
readonly readMethods: readonly [];
|
|
1742
|
+
readonly writeMethods: readonly ["POST"];
|
|
1743
|
+
readonly accountWidePaths: readonly [readonly ["server"], readonly ["servers"], readonly ["domains"], readonly ["senders"], readonly ["webhooks"], readonly ["message-streams"], readonly ["triggers"], readonly ["data-removals"]];
|
|
1744
|
+
readonly hint: "A Server API token from the API Tokens tab of the Postmark server the app sends from; the Gateway sends it in the X-Postmark-Server-Token header.";
|
|
1745
|
+
readonly secrets: readonly [{
|
|
1746
|
+
readonly name: "POSTMARK_API_TOKEN";
|
|
1747
|
+
readonly hint: "A Server API token from the server's API Tokens tab, never the Account API token.";
|
|
1748
|
+
}];
|
|
1749
|
+
readonly smoke: {
|
|
1750
|
+
readonly method: "GET";
|
|
1751
|
+
readonly path: "/server";
|
|
1752
|
+
readonly expect: readonly [200];
|
|
1753
|
+
readonly free: true;
|
|
1754
|
+
readonly note: "Returns the server's settings; account-wide, so run it from a terminal.";
|
|
1755
|
+
};
|
|
1756
|
+
readonly example: "send a password reset email";
|
|
1757
|
+
readonly verified: {
|
|
1758
|
+
readonly on: "2026-10-25";
|
|
1759
|
+
readonly how: "docs";
|
|
1760
|
+
};
|
|
1761
|
+
readonly tags: readonly ["email", "transactional"];
|
|
1762
|
+
};
|
|
1763
|
+
readonly sendgrid: {
|
|
1764
|
+
readonly mode: "api_key";
|
|
1765
|
+
readonly label: "SendGrid";
|
|
1766
|
+
readonly description: "Twilio SendGrid email: send transactional and marketing mail through the v3 Mail Send API.";
|
|
1767
|
+
readonly auth: {
|
|
1768
|
+
readonly kind: "bearer";
|
|
1769
|
+
readonly secret: "SENDGRID_API_KEY";
|
|
1770
|
+
};
|
|
1771
|
+
readonly docs: "https://app.sendgrid.com/settings/api_keys";
|
|
1772
|
+
readonly api: "https://www.twilio.com/docs/sendgrid/api-reference";
|
|
1773
|
+
readonly hosts: readonly ["api.sendgrid.com", "api.eu.sendgrid.com"];
|
|
1774
|
+
readonly data: "account";
|
|
1775
|
+
readonly access: readonly ["write"];
|
|
1776
|
+
readonly readMethods: readonly [];
|
|
1777
|
+
readonly writeMethods: readonly ["POST"];
|
|
1778
|
+
readonly accountWidePaths: readonly [readonly ["api_keys"], readonly ["scopes"], readonly ["user"], readonly ["subusers"], readonly ["teammates"], readonly ["sso"], readonly ["access_settings"], readonly ["whitelabel"], readonly ["ips"], readonly ["send_ips"], readonly ["partners"], readonly ["partner_settings"], readonly ["alerts"], readonly ["mail_settings"], readonly ["tracking_settings"], readonly ["verified_senders"], readonly ["senders"], readonly ["marketing", "integrations"], readonly ["recipients", "erasejob"]];
|
|
1779
|
+
readonly hint: "An API key from Settings > API Keys in SendGrid, sent as a bearer token; Custom Access with Mail Send alone is enough to send. EU regional subusers call api.eu.sendgrid.com.";
|
|
1780
|
+
readonly secrets: readonly [{
|
|
1781
|
+
readonly name: "SENDGRID_API_KEY";
|
|
1782
|
+
readonly hint: "A Custom Access key with Mail Send only, never a Full Access key.";
|
|
1783
|
+
}];
|
|
1784
|
+
readonly smoke: {
|
|
1785
|
+
readonly method: "GET";
|
|
1786
|
+
readonly path: "/v3/scopes";
|
|
1787
|
+
readonly expect: readonly [200];
|
|
1788
|
+
readonly free: true;
|
|
1789
|
+
readonly note: "Lists the key's own scopes (the docs don't say whether a Mail-Send-only key may call it); account-wide, so run it from a terminal.";
|
|
1790
|
+
};
|
|
1791
|
+
readonly rate: {
|
|
1792
|
+
readonly note: "Each endpoint has its own limit; answers carry X-RateLimit-Limit, -Remaining and -Reset.";
|
|
1793
|
+
};
|
|
1794
|
+
readonly example: "send an order confirmation email";
|
|
1795
|
+
readonly verified: {
|
|
1796
|
+
readonly on: "2026-10-25";
|
|
1797
|
+
readonly how: "docs";
|
|
1798
|
+
};
|
|
1799
|
+
readonly tags: readonly ["email", "transactional", "marketing"];
|
|
1800
|
+
};
|
|
1801
|
+
readonly twilio: {
|
|
1802
|
+
readonly mode: "api_key";
|
|
1803
|
+
readonly label: "Twilio";
|
|
1804
|
+
readonly description: "SMS, MMS and voice: send text messages and place calls from your Twilio numbers.";
|
|
1805
|
+
readonly auth: {
|
|
1806
|
+
readonly kind: "basic";
|
|
1807
|
+
readonly secret: "TWILIO_API_SECRET";
|
|
1808
|
+
readonly as: "password";
|
|
1809
|
+
readonly user: {
|
|
1810
|
+
readonly secret: "TWILIO_API_KEY";
|
|
1811
|
+
};
|
|
1812
|
+
};
|
|
1813
|
+
readonly docs: "https://www.twilio.com/docs/iam/api-keys/keys-in-console";
|
|
1814
|
+
readonly api: "https://www.twilio.com/docs/usage/requests-to-twilio";
|
|
1815
|
+
readonly hosts: readonly ["api.twilio.com"];
|
|
1816
|
+
readonly data: "account";
|
|
1817
|
+
readonly access: readonly ["write"];
|
|
1818
|
+
readonly readMethods: readonly [];
|
|
1819
|
+
readonly writeMethods: readonly ["POST"];
|
|
1820
|
+
readonly accountWidePaths: readonly [readonly ["keys"], readonly ["signingkeys"], readonly ["incomingphonenumbers"], readonly ["outgoingcallerids"], readonly ["applications"], readonly ["connectapps"], readonly ["authorizedconnectapps"], readonly ["addresses"], readonly ["sip"], readonly ["usage"], readonly ["balance"]];
|
|
1821
|
+
readonly hint: "A Standard or Restricted API key from Account settings > API keys & auth tokens in the Twilio Console, sent as HTTP Basic (the key's SID and secret); a Standard key can't reach the Accounts or Keys resources. Every path names the account, so the app puts its Account SID in it: /2010-04-01/Accounts/<Account SID>/Messages.json, with a form-encoded body.";
|
|
1822
|
+
readonly secrets: readonly [{
|
|
1823
|
+
readonly name: "TWILIO_API_SECRET";
|
|
1824
|
+
readonly hint: "The API key's secret, shown once when the key is created.";
|
|
1825
|
+
}, {
|
|
1826
|
+
readonly name: "TWILIO_API_KEY";
|
|
1827
|
+
readonly hint: "The SID of a Standard or Restricted API key, never a Main key or the Auth Token.";
|
|
1828
|
+
}];
|
|
1829
|
+
readonly example: "text a reminder to a customer's phone number";
|
|
1830
|
+
readonly verified: {
|
|
1831
|
+
readonly on: "2026-10-25";
|
|
1832
|
+
readonly how: "docs";
|
|
1833
|
+
};
|
|
1834
|
+
readonly tags: readonly ["sms", "voice", "messaging"];
|
|
1835
|
+
};
|
|
1836
|
+
readonly intercom: {
|
|
1837
|
+
readonly mode: "api_key";
|
|
1838
|
+
readonly label: "Intercom";
|
|
1839
|
+
readonly description: "Customer messaging: contacts, companies, conversations, tickets and help center articles.";
|
|
1840
|
+
readonly auth: {
|
|
1841
|
+
readonly kind: "bearer";
|
|
1842
|
+
readonly secret: "INTERCOM_API_TOKEN";
|
|
1843
|
+
};
|
|
1844
|
+
readonly docs: "https://app.intercom.com/a/apps/_/developer-hub";
|
|
1845
|
+
readonly api: "https://developers.intercom.com/docs/build-an-integration/learn-more/rest-apis";
|
|
1846
|
+
readonly hosts: readonly ["api.intercom.io", "api.eu.intercom.io", "api.au.intercom.io"];
|
|
1847
|
+
readonly data: "account";
|
|
1848
|
+
readonly access: readonly ["read", "write"];
|
|
1849
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1850
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1851
|
+
readonly accountWidePaths: readonly [readonly ["me"], readonly ["admins"], readonly ["teams"], readonly ["export"], readonly ["download"], readonly ["ip_allowlist"]];
|
|
1852
|
+
readonly hint: "The Access Token of a private app in your workspace's Developer Hub, sent as a bearer token. Searching contacts, conversations or tickets is a POST, so an app that searches asks for write.";
|
|
1853
|
+
readonly secrets: readonly [{
|
|
1854
|
+
readonly name: "INTERCOM_API_TOKEN";
|
|
1855
|
+
readonly hint: "The Access Token on your private app's Configure > Authentication page in the Developer Hub.";
|
|
1856
|
+
}];
|
|
1857
|
+
readonly smoke: {
|
|
1858
|
+
readonly method: "GET";
|
|
1859
|
+
readonly path: "/me";
|
|
1860
|
+
readonly expect: readonly [200];
|
|
1861
|
+
readonly free: true;
|
|
1862
|
+
readonly note: "Returns the admin behind the token; account-wide, so run it from a terminal.";
|
|
1863
|
+
};
|
|
1864
|
+
readonly rate: {
|
|
1865
|
+
readonly perMinute: 10000;
|
|
1866
|
+
readonly note: "Per workspace, shared by its private apps; 25,000 a minute across all apps; counted in 10-second windows.";
|
|
1867
|
+
};
|
|
1868
|
+
readonly example: "list the latest open conversations";
|
|
1869
|
+
readonly verified: {
|
|
1870
|
+
readonly on: "2026-10-25";
|
|
1871
|
+
readonly how: "docs";
|
|
1872
|
+
};
|
|
1873
|
+
readonly tags: readonly ["support", "crm", "messaging"];
|
|
1874
|
+
};
|
|
1875
|
+
readonly crisp: {
|
|
1876
|
+
readonly mode: "api_key";
|
|
1877
|
+
readonly label: "Crisp";
|
|
1878
|
+
readonly description: "Customer chat: conversations, messages, people and visitors of one Crisp workspace.";
|
|
1879
|
+
readonly auth: {
|
|
1880
|
+
readonly kind: "basic";
|
|
1881
|
+
readonly secret: "CRISP_API_KEY";
|
|
1882
|
+
readonly as: "password";
|
|
1883
|
+
readonly user: {
|
|
1884
|
+
readonly secret: "CRISP_API_IDENTIFIER";
|
|
1885
|
+
};
|
|
1886
|
+
};
|
|
1887
|
+
readonly docs: "https://docs.crisp.chat/guides/rest-api/authentication/website-token/";
|
|
1888
|
+
readonly api: "https://docs.crisp.chat/references/rest-api/v1/";
|
|
1889
|
+
readonly hosts: readonly ["api.crisp.chat"];
|
|
1890
|
+
readonly data: "account";
|
|
1891
|
+
readonly access: readonly ["read", "write"];
|
|
1892
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1893
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1894
|
+
readonly accountWidePaths: readonly [readonly ["operators"], readonly ["operator"], readonly ["teams"], readonly ["team"], readonly ["settings"], readonly ["verify"], readonly ["audit"], readonly ["plans"], readonly ["plugins"], readonly ["plugin"], readonly ["connect"]];
|
|
1895
|
+
readonly hint: "A website token, which the workspace owner generates under Settings > Workspace Settings > Advanced configuration > API Token. The Gateway sends the identifier and key as HTTP Basic; the app sends X-Crisp-Tier: website on every call.";
|
|
1896
|
+
readonly secrets: readonly [{
|
|
1897
|
+
readonly name: "CRISP_API_KEY";
|
|
1898
|
+
readonly hint: "The token's key, shown once when the workspace owner generates it.";
|
|
1899
|
+
}, {
|
|
1900
|
+
readonly name: "CRISP_API_IDENTIFIER";
|
|
1901
|
+
readonly hint: "The token's identifier, shown beside the key.";
|
|
1902
|
+
}];
|
|
1903
|
+
readonly rate: {
|
|
1904
|
+
readonly perDay: 10000;
|
|
1905
|
+
readonly note: "The website token's daily quota.";
|
|
1906
|
+
};
|
|
1907
|
+
readonly example: "list the latest chat conversations on my website";
|
|
1908
|
+
readonly verified: {
|
|
1909
|
+
readonly on: "2026-10-25";
|
|
1910
|
+
readonly how: "docs";
|
|
1911
|
+
};
|
|
1912
|
+
readonly tags: readonly ["support", "chat", "messaging"];
|
|
1913
|
+
};
|
|
1914
|
+
readonly granola: {
|
|
1915
|
+
readonly mode: "api_key";
|
|
1916
|
+
readonly label: "Granola";
|
|
1917
|
+
readonly description: "Meeting notes: list, search and read notes with their AI summaries, transcripts, folders and spaces.";
|
|
1918
|
+
readonly auth: {
|
|
1919
|
+
readonly kind: "bearer";
|
|
1920
|
+
readonly secret: "GRANOLA_API_KEY";
|
|
1921
|
+
};
|
|
1922
|
+
readonly docs: "https://docs.granola.ai/help-center/sharing/integrations/granola-api";
|
|
1923
|
+
readonly api: "https://docs.granola.ai/introduction";
|
|
1924
|
+
readonly hosts: readonly ["public-api.granola.ai"];
|
|
1925
|
+
readonly data: "account";
|
|
1926
|
+
readonly access: readonly ["read"];
|
|
1927
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
1928
|
+
readonly accountWidePaths: readonly [readonly ["audit"], readonly ["webhook-endpoints"], readonly ["legal-holds"]];
|
|
1929
|
+
readonly hint: "An API key (grn_...) from the Granola desktop app's Settings > Connectors > API keys, on a Business or Enterprise plan; the Gateway sends it as a bearer token. It reads only the notes its scopes allow.";
|
|
1930
|
+
readonly secrets: readonly [{
|
|
1931
|
+
readonly name: "GRANOLA_API_KEY";
|
|
1932
|
+
readonly hint: "A personal or workspace API key (grn_...), with only the note scopes the apps need.";
|
|
1933
|
+
}];
|
|
1934
|
+
readonly rate: {
|
|
1935
|
+
readonly perSecond: 5;
|
|
1936
|
+
readonly note: "Bursts of 25 requests in 5 seconds; per user or per workspace, by the key's scope.";
|
|
1937
|
+
};
|
|
1938
|
+
readonly smoke: {
|
|
1939
|
+
readonly method: "GET";
|
|
1940
|
+
readonly path: "/v1/notes?page_size=1";
|
|
1941
|
+
readonly expect: readonly [200];
|
|
1942
|
+
readonly free: true;
|
|
1943
|
+
};
|
|
1944
|
+
readonly example: "summarize what we decided in this week's customer calls";
|
|
1945
|
+
readonly verified: {
|
|
1946
|
+
readonly on: "2026-10-30";
|
|
1947
|
+
readonly how: "docs";
|
|
1948
|
+
};
|
|
1949
|
+
readonly tags: readonly ["meetings", "notes", "transcripts"];
|
|
1950
|
+
};
|
|
1951
|
+
readonly linear: {
|
|
1952
|
+
readonly mode: "api_key";
|
|
1953
|
+
readonly label: "Linear";
|
|
1954
|
+
readonly description: "Issue tracking over GraphQL: issues, projects, cycles, comments and teams.";
|
|
1955
|
+
readonly auth: {
|
|
1956
|
+
readonly kind: "header";
|
|
1957
|
+
readonly secret: "LINEAR_API_KEY";
|
|
1958
|
+
readonly header: "Authorization";
|
|
1959
|
+
};
|
|
1960
|
+
readonly docs: "https://linear.app/settings/account/security";
|
|
1961
|
+
readonly api: "https://linear.app/developers/graphql";
|
|
1962
|
+
readonly hosts: readonly ["api.linear.app"];
|
|
1963
|
+
readonly data: "account";
|
|
1964
|
+
readonly access: readonly ["write"];
|
|
1965
|
+
readonly readMethods: readonly [];
|
|
1966
|
+
readonly writeMethods: readonly ["POST"];
|
|
1967
|
+
readonly accountWidePaths: readonly [];
|
|
1968
|
+
readonly hint: "A personal API key from Settings > Account > Security & access; the Gateway sends it as the Authorization header with no Bearer word. Every call is a POST to /graphql, queries included, so the app asks for write.";
|
|
1969
|
+
readonly secrets: readonly [{
|
|
1970
|
+
readonly name: "LINEAR_API_KEY";
|
|
1971
|
+
readonly hint: "A personal API key, restricted to the permissions and teams the app needs.";
|
|
1972
|
+
}];
|
|
1973
|
+
readonly rate: {
|
|
1974
|
+
readonly note: "2,500 requests and 3,000,000 complexity points an hour per API key.";
|
|
1975
|
+
};
|
|
1976
|
+
readonly example: "create an issue for this bug in the Engineering team";
|
|
1977
|
+
readonly verified: {
|
|
1978
|
+
readonly on: "2026-10-25";
|
|
1979
|
+
readonly how: "docs";
|
|
1980
|
+
};
|
|
1981
|
+
readonly tags: readonly ["issues", "project-management", "graphql"];
|
|
1982
|
+
};
|
|
1983
|
+
readonly github: {
|
|
1984
|
+
readonly mode: "api_key";
|
|
1985
|
+
readonly label: "GitHub";
|
|
1986
|
+
readonly description: "Code hosting: repositories, issues, pull requests, Actions and releases through the REST API.";
|
|
1987
|
+
readonly auth: {
|
|
1988
|
+
readonly kind: "bearer";
|
|
1989
|
+
readonly secret: "GITHUB_API_TOKEN";
|
|
1990
|
+
};
|
|
1991
|
+
readonly docs: "https://github.com/settings/personal-access-tokens/new";
|
|
1992
|
+
readonly api: "https://docs.github.com/en/rest";
|
|
1993
|
+
readonly hosts: readonly ["api.github.com"];
|
|
1994
|
+
readonly data: "account";
|
|
1995
|
+
readonly access: readonly ["read", "write"];
|
|
1996
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
1997
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
1998
|
+
readonly accountWidePaths: readonly [readonly ["user", "email"], readonly ["user", "emails"], readonly ["user", "public_emails"], readonly ["user", "gpg_keys"], readonly ["user", "ssh_signing_keys"], readonly ["user", "social_accounts"], readonly ["keys"], readonly ["hooks"], readonly ["secrets"], readonly ["members"], readonly ["memberships"], readonly ["invitations"], readonly ["failed_invitations"], readonly ["collaborators"], readonly ["outside_collaborators"], readonly ["blocks"], readonly ["installations"], readonly ["personal-access-tokens"], readonly ["personal-access-token-requests"], readonly ["credential-authorizations"], readonly ["audit-log"], readonly ["billing"]];
|
|
1999
|
+
readonly hint: "A fine-grained personal access token from Settings > Developer settings, limited to one owner, the repositories the app needs and the least permissions; sent as a bearer token. GraphQL is a POST to /graphql, so it needs write.";
|
|
2000
|
+
readonly secrets: readonly [{
|
|
2001
|
+
readonly name: "GITHUB_API_TOKEN";
|
|
2002
|
+
readonly hint: "A fine-grained personal access token limited to the repositories and permissions the app needs.";
|
|
2003
|
+
}];
|
|
2004
|
+
readonly smoke: {
|
|
2005
|
+
readonly method: "GET";
|
|
2006
|
+
readonly path: "/user";
|
|
2007
|
+
readonly expect: readonly [200];
|
|
2008
|
+
readonly free: true;
|
|
2009
|
+
readonly note: "Returns the token's owner; 401 means the token is wrong.";
|
|
2010
|
+
};
|
|
2011
|
+
readonly rate: {
|
|
2012
|
+
readonly note: "5,000 requests an hour per token; at most 100 concurrent requests and 900 points a minute across REST endpoints.";
|
|
2013
|
+
};
|
|
2014
|
+
readonly example: "list the open pull requests in my repository";
|
|
2015
|
+
readonly verified: {
|
|
2016
|
+
readonly on: "2026-10-25";
|
|
2017
|
+
readonly how: "docs";
|
|
2018
|
+
};
|
|
2019
|
+
readonly tags: readonly ["code", "git", "issues"];
|
|
2020
|
+
};
|
|
2021
|
+
readonly gitlab: {
|
|
2022
|
+
readonly mode: "api_key";
|
|
2023
|
+
readonly label: "GitLab";
|
|
2024
|
+
readonly description: "Code hosting on GitLab.com: projects, issues, merge requests, pipelines and releases.";
|
|
2025
|
+
readonly auth: {
|
|
2026
|
+
readonly kind: "header";
|
|
2027
|
+
readonly secret: "GITLAB_API_TOKEN";
|
|
2028
|
+
readonly header: "PRIVATE-TOKEN";
|
|
2029
|
+
};
|
|
2030
|
+
readonly docs: "https://gitlab.com/-/user_settings/personal_access_tokens";
|
|
2031
|
+
readonly api: "https://docs.gitlab.com/api/rest/";
|
|
2032
|
+
readonly hosts: readonly ["gitlab.com"];
|
|
2033
|
+
readonly data: "account";
|
|
2034
|
+
readonly access: readonly ["read", "write"];
|
|
2035
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2036
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2037
|
+
readonly accountWidePaths: readonly [readonly ["user"], readonly ["personal_access_tokens"], readonly ["access_tokens"], readonly ["deploy_tokens"], readonly ["deploy_keys"], readonly ["project_deploy_keys"], readonly ["hooks"], readonly ["members"], readonly ["pending_members"], readonly ["billable_members"], readonly ["invitations"], readonly ["variables"], readonly ["audit_events"]];
|
|
2038
|
+
readonly hint: "A personal, project or group access token from GitLab.com, sent in the PRIVATE-TOKEN header; read_api is enough to read. Paths start with /api/v4. A self-managed GitLab needs its own registered provider.";
|
|
2039
|
+
readonly secrets: readonly [{
|
|
2040
|
+
readonly name: "GITLAB_API_TOKEN";
|
|
2041
|
+
readonly hint: "A personal, project or group access token with read_api, or api when the app writes.";
|
|
2042
|
+
}];
|
|
2043
|
+
readonly smoke: {
|
|
2044
|
+
readonly method: "GET";
|
|
2045
|
+
readonly path: "/api/v4/personal_access_tokens/self";
|
|
2046
|
+
readonly expect: readonly [200];
|
|
2047
|
+
readonly free: true;
|
|
2048
|
+
readonly note: "Describes a personal access token itself (401 when it is wrong or revoked); account-wide, so run it from a terminal.";
|
|
2049
|
+
};
|
|
2050
|
+
readonly rate: {
|
|
2051
|
+
readonly perMinute: 2000;
|
|
2052
|
+
readonly note: "Authenticated API traffic per user on GitLab.com.";
|
|
2053
|
+
};
|
|
2054
|
+
readonly example: "list the open merge requests in my project";
|
|
2055
|
+
readonly verified: {
|
|
2056
|
+
readonly on: "2026-10-25";
|
|
2057
|
+
readonly how: "docs";
|
|
2058
|
+
};
|
|
2059
|
+
readonly tags: readonly ["code", "git", "ci"];
|
|
2060
|
+
};
|
|
2061
|
+
readonly vercel: {
|
|
2062
|
+
readonly mode: "api_key";
|
|
2063
|
+
readonly label: "Vercel";
|
|
2064
|
+
readonly description: "Frontend hosting: projects, deployments, domains and logs through the Vercel REST API.";
|
|
2065
|
+
readonly auth: {
|
|
2066
|
+
readonly kind: "bearer";
|
|
2067
|
+
readonly secret: "VERCEL_API_TOKEN";
|
|
2068
|
+
};
|
|
2069
|
+
readonly docs: "https://vercel.com/account/tokens";
|
|
2070
|
+
readonly api: "https://vercel.com/docs/rest-api";
|
|
2071
|
+
readonly hosts: readonly ["api.vercel.com"];
|
|
2072
|
+
readonly data: "account";
|
|
2073
|
+
readonly access: readonly ["read", "write"];
|
|
2074
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2075
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2076
|
+
readonly accountWidePaths: readonly [readonly ["user"], readonly ["teams"], readonly ["members"], readonly ["organizations"], readonly ["access-groups"], readonly ["billing"], readonly ["webhooks"], readonly ["drains"], readonly ["env"], readonly ["v3", "events"], readonly ["v1", "events"], readonly ["v1", "integrations"], readonly ["installations"], readonly ["connect"], readonly ["kms"], readonly ["api-keys"], readonly ["ai-gateway"], readonly ["token"], readonly ["tokens"], readonly ["registrar"], readonly ["transfer-request"]];
|
|
2077
|
+
readonly hint: "An access token from your account's Tokens page, sent as a bearer token; scope it to one team or one project. A team- or project-scoped token needs no teamId parameter.";
|
|
2078
|
+
readonly secrets: readonly [{
|
|
2079
|
+
readonly name: "VERCEL_API_TOKEN";
|
|
2080
|
+
readonly hint: "An access token scoped to one team or one project, never Full Account.";
|
|
2081
|
+
}];
|
|
2082
|
+
readonly smoke: {
|
|
2083
|
+
readonly method: "GET";
|
|
2084
|
+
readonly path: "/v10/projects";
|
|
2085
|
+
readonly expect: readonly [200];
|
|
2086
|
+
readonly free: true;
|
|
2087
|
+
readonly note: "Lists the projects the token can reach.";
|
|
2088
|
+
};
|
|
2089
|
+
readonly rate: {
|
|
2090
|
+
readonly note: "Limits are per action (deployments, domains, teams), listed on Vercel's limits page.";
|
|
2091
|
+
};
|
|
2092
|
+
readonly example: "list the latest deployments of my project";
|
|
2093
|
+
readonly verified: {
|
|
2094
|
+
readonly on: "2026-10-25";
|
|
2095
|
+
readonly how: "docs";
|
|
2096
|
+
};
|
|
2097
|
+
readonly tags: readonly ["hosting", "deploy", "frontend"];
|
|
2098
|
+
};
|
|
2099
|
+
readonly stripe: {
|
|
2100
|
+
readonly mode: "api_key";
|
|
2101
|
+
readonly label: "Stripe";
|
|
2102
|
+
readonly description: "Payments: customers, subscriptions, invoices, charges and payouts.";
|
|
2103
|
+
readonly auth: {
|
|
2104
|
+
readonly kind: "bearer";
|
|
2105
|
+
readonly secret: "STRIPE_API_KEY";
|
|
2106
|
+
};
|
|
2107
|
+
readonly docs: "https://dashboard.stripe.com/apikeys";
|
|
2108
|
+
readonly api: "https://docs.stripe.com/api";
|
|
2109
|
+
readonly hosts: readonly ["api.stripe.com", "files.stripe.com"];
|
|
2110
|
+
readonly data: "account";
|
|
2111
|
+
readonly access: readonly ["read", "write"];
|
|
2112
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2113
|
+
readonly writeMethods: readonly ["POST", "DELETE"];
|
|
2114
|
+
readonly accountWidePaths: readonly [readonly ["v1", "account"], readonly ["v1", "accounts"], readonly ["v2", "core", "accounts"], readonly ["v1", "webhook_endpoints"], readonly ["v2", "core", "event_destinations"], readonly ["v1", "apps", "secrets"]];
|
|
2115
|
+
readonly 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.";
|
|
2116
|
+
readonly secrets: readonly [{
|
|
2117
|
+
readonly name: "STRIPE_API_KEY";
|
|
2118
|
+
readonly hint: "A restricted key (rk_live_...) with only the permissions the app needs; a sandbox key (rk_test_... or sk_test_...) to try it.";
|
|
2119
|
+
}];
|
|
2120
|
+
readonly smoke: {
|
|
2121
|
+
readonly method: "GET";
|
|
2122
|
+
readonly path: "/v1/balance";
|
|
2123
|
+
readonly expect: readonly [200];
|
|
2124
|
+
readonly free: true;
|
|
2125
|
+
readonly note: "A restricted key needs Balance read for this one.";
|
|
2126
|
+
};
|
|
2127
|
+
readonly cost: {
|
|
2128
|
+
readonly unit: "call";
|
|
2129
|
+
readonly note: "No per-call price; reads should average under 500 per transaction over 30 days, with at least 10,000 a month allowed.";
|
|
2130
|
+
};
|
|
2131
|
+
readonly rate: {
|
|
2132
|
+
readonly perSecond: 100;
|
|
2133
|
+
readonly note: "Live mode, per account; sandbox 25/s; most single endpoints 25/s; Search 20/s.";
|
|
2134
|
+
};
|
|
2135
|
+
readonly example: "list my latest customers and their subscriptions";
|
|
2136
|
+
readonly verified: {
|
|
2137
|
+
readonly on: "2026-10-25";
|
|
2138
|
+
readonly how: "docs";
|
|
2139
|
+
};
|
|
2140
|
+
readonly tags: readonly ["payments", "billing"];
|
|
2141
|
+
};
|
|
2142
|
+
readonly lemonsqueezy: {
|
|
2143
|
+
readonly mode: "api_key";
|
|
2144
|
+
readonly label: "Lemon Squeezy";
|
|
2145
|
+
readonly description: "Merchant of record for software: stores, products, orders, subscriptions, license keys.";
|
|
2146
|
+
readonly auth: {
|
|
2147
|
+
readonly kind: "bearer";
|
|
2148
|
+
readonly secret: "LEMONSQUEEZY_API_KEY";
|
|
2149
|
+
};
|
|
2150
|
+
readonly docs: "https://app.lemonsqueezy.com/settings/api";
|
|
2151
|
+
readonly api: "https://docs.lemonsqueezy.com/api";
|
|
2152
|
+
readonly hosts: readonly ["api.lemonsqueezy.com"];
|
|
2153
|
+
readonly data: "account";
|
|
2154
|
+
readonly access: readonly ["read", "write"];
|
|
2155
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2156
|
+
readonly writeMethods: readonly ["POST", "PATCH", "DELETE"];
|
|
2157
|
+
readonly accountWidePaths: readonly [readonly ["v1", "users"], readonly ["v1", "webhooks"]];
|
|
2158
|
+
readonly 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.";
|
|
2159
|
+
readonly secrets: readonly [{
|
|
2160
|
+
readonly name: "LEMONSQUEEZY_API_KEY";
|
|
2161
|
+
readonly hint: "An API key from Settings > API; a test mode key reaches test mode store data only.";
|
|
2162
|
+
}];
|
|
2163
|
+
readonly smoke: {
|
|
2164
|
+
readonly method: "GET";
|
|
2165
|
+
readonly path: "/v1/users/me";
|
|
2166
|
+
readonly expect: readonly [200];
|
|
2167
|
+
readonly free: true;
|
|
2168
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
2169
|
+
};
|
|
2170
|
+
readonly rate: {
|
|
2171
|
+
readonly perMinute: 300;
|
|
2172
|
+
readonly note: "300 API calls per minute.";
|
|
2173
|
+
};
|
|
2174
|
+
readonly example: "list this month's orders and active subscriptions";
|
|
2175
|
+
readonly verified: {
|
|
2176
|
+
readonly on: "2026-10-25";
|
|
2177
|
+
readonly how: "docs";
|
|
2178
|
+
};
|
|
2179
|
+
readonly tags: readonly ["payments", "billing"];
|
|
2180
|
+
};
|
|
2181
|
+
readonly paddle: {
|
|
2182
|
+
readonly mode: "api_key";
|
|
2183
|
+
readonly label: "Paddle";
|
|
2184
|
+
readonly description: "Paddle Billing: products, prices, customers, subscriptions and transactions.";
|
|
2185
|
+
readonly auth: {
|
|
2186
|
+
readonly kind: "bearer";
|
|
2187
|
+
readonly secret: "PADDLE_API_KEY";
|
|
2188
|
+
};
|
|
2189
|
+
readonly docs: "https://developer.paddle.com/api-reference/about/authentication/";
|
|
2190
|
+
readonly api: "https://developer.paddle.com/api-reference/";
|
|
2191
|
+
readonly hosts: readonly ["api.paddle.com", "sandbox-api.paddle.com"];
|
|
2192
|
+
readonly data: "account";
|
|
2193
|
+
readonly access: readonly ["read", "write"];
|
|
2194
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2195
|
+
readonly writeMethods: readonly ["POST", "PATCH", "DELETE"];
|
|
2196
|
+
readonly accountWidePaths: readonly [readonly ["account"], readonly ["settings"], readonly ["notification-settings"], readonly ["notifications"], readonly ["simulations"], readonly ["simulation-runs"], readonly ["client-tokens"], readonly ["checkout-domains"], readonly ["verifications"]];
|
|
2197
|
+
readonly 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.";
|
|
2198
|
+
readonly secrets: readonly [{
|
|
2199
|
+
readonly name: "PADDLE_API_KEY";
|
|
2200
|
+
readonly 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.";
|
|
2201
|
+
}];
|
|
2202
|
+
readonly smoke: {
|
|
2203
|
+
readonly method: "GET";
|
|
2204
|
+
readonly path: "/event-types";
|
|
2205
|
+
readonly expect: readonly [200];
|
|
2206
|
+
readonly free: true;
|
|
2207
|
+
readonly note: "Paddle's own first request: needs no permissions. Send it to sandbox-api.paddle.com with a sandbox key.";
|
|
2208
|
+
};
|
|
2209
|
+
readonly rate: {
|
|
2210
|
+
readonly perMinute: 240;
|
|
2211
|
+
readonly note: "Per IP address; pricing previews 1,000 a minute; 20 immediate-charge updates per subscription an hour.";
|
|
2212
|
+
};
|
|
2213
|
+
readonly example: "list the active subscriptions that renew this week";
|
|
2214
|
+
readonly verified: {
|
|
2215
|
+
readonly on: "2026-10-25";
|
|
2216
|
+
readonly how: "docs";
|
|
2217
|
+
};
|
|
2218
|
+
readonly tags: readonly ["payments", "billing"];
|
|
2219
|
+
};
|
|
2220
|
+
readonly shopify: {
|
|
2221
|
+
readonly mode: "api_key";
|
|
2222
|
+
readonly label: "Shopify";
|
|
2223
|
+
readonly description: "One store's Admin API (GraphQL): products, orders, customers and inventory.";
|
|
2224
|
+
readonly auth: {
|
|
2225
|
+
readonly kind: "header";
|
|
2226
|
+
readonly secret: "SHOPIFY_API_TOKEN";
|
|
2227
|
+
readonly header: "X-Shopify-Access-Token";
|
|
2228
|
+
};
|
|
2229
|
+
readonly docs: "https://shopify.dev/docs/apps/build/authentication-authorization/legacy/admin-custom-apps";
|
|
2230
|
+
readonly api: "https://shopify.dev/docs/api/admin-graphql";
|
|
2231
|
+
readonly hosts: readonly [];
|
|
2232
|
+
readonly hostSetting: "SHOPIFY_HOST";
|
|
2233
|
+
readonly data: "account";
|
|
2234
|
+
readonly access: readonly ["write"];
|
|
2235
|
+
readonly readMethods: readonly [];
|
|
2236
|
+
readonly writeMethods: readonly ["POST"];
|
|
2237
|
+
readonly accountWidePaths: readonly [readonly ["webhooks"], readonly ["storefront_access_tokens"]];
|
|
2238
|
+
readonly 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.";
|
|
2239
|
+
readonly secrets: readonly [{
|
|
2240
|
+
readonly name: "SHOPIFY_API_TOKEN";
|
|
2241
|
+
readonly 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.";
|
|
2242
|
+
}, {
|
|
2243
|
+
readonly name: "SHOPIFY_HOST";
|
|
2244
|
+
readonly hint: "The store's own host, like your-store.myshopify.com.";
|
|
2245
|
+
}];
|
|
2246
|
+
readonly smoke: {
|
|
2247
|
+
readonly method: "GET";
|
|
2248
|
+
readonly path: "/admin/api/2026-10/shop.json";
|
|
2249
|
+
readonly expect: readonly [200];
|
|
2250
|
+
readonly free: true;
|
|
2251
|
+
readonly note: "The legacy REST read of the store; the Gateway forwards no GET for this entry, so run it from the person's terminal.";
|
|
2252
|
+
};
|
|
2253
|
+
readonly rate: {
|
|
2254
|
+
readonly note: "GraphQL cost points per second by plan: Standard 100, Advanced 200, Plus 1,000, enterprise 2,000.";
|
|
2255
|
+
};
|
|
2256
|
+
readonly example: "list the ten newest orders and what was in them";
|
|
2257
|
+
readonly verified: {
|
|
2258
|
+
readonly on: "2026-10-25";
|
|
2259
|
+
readonly how: "docs";
|
|
2260
|
+
};
|
|
2261
|
+
readonly tags: readonly ["ecommerce"];
|
|
2262
|
+
};
|
|
2263
|
+
readonly plaid: {
|
|
2264
|
+
readonly mode: "api_key";
|
|
2265
|
+
readonly label: "Plaid";
|
|
2266
|
+
readonly description: "Bank data: accounts, balances, transactions and identity, for the Items an app links.";
|
|
2267
|
+
readonly auth: {
|
|
2268
|
+
readonly kind: "header";
|
|
2269
|
+
readonly secret: "PLAID_SECRET";
|
|
2270
|
+
readonly header: "PLAID-SECRET";
|
|
2271
|
+
};
|
|
2272
|
+
readonly docs: "https://dashboard.plaid.com/developers/keys";
|
|
2273
|
+
readonly api: "https://plaid.com/docs/api/";
|
|
2274
|
+
readonly hosts: readonly ["sandbox.plaid.com", "production.plaid.com"];
|
|
2275
|
+
readonly data: "account";
|
|
2276
|
+
readonly access: readonly ["read"];
|
|
2277
|
+
readonly readMethods: readonly ["POST"];
|
|
2278
|
+
readonly accountWidePaths: readonly [readonly ["item", "webhook", "update"], readonly ["item", "access_token", "invalidate"], readonly ["item", "remove"], readonly ["webhook_verification_key"], readonly ["dashboard_user"], readonly ["transfer"], readonly ["payment_initiation"]];
|
|
2279
|
+
readonly 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.";
|
|
2280
|
+
readonly secrets: readonly [{
|
|
2281
|
+
readonly name: "PLAID_SECRET";
|
|
2282
|
+
readonly hint: "The secret for one environment (Sandbox or Production) from the Keys page of the Plaid Dashboard.";
|
|
2283
|
+
}];
|
|
2284
|
+
readonly rate: {
|
|
2285
|
+
readonly note: "Set per endpoint and per Item: /accounts/get allows 15 a minute per Item and 15,000 a minute per client.";
|
|
2286
|
+
};
|
|
2287
|
+
readonly example: "list the last 30 days of transactions on a linked account";
|
|
2288
|
+
readonly verified: false;
|
|
2289
|
+
readonly tags: readonly ["finance", "banking"];
|
|
2290
|
+
};
|
|
2291
|
+
readonly attio: {
|
|
2292
|
+
readonly mode: "api_key";
|
|
2293
|
+
readonly label: "Attio";
|
|
2294
|
+
readonly description: "CRM: people, companies, deals, lists, notes and tasks in one Attio workspace.";
|
|
2295
|
+
readonly auth: {
|
|
2296
|
+
readonly kind: "bearer";
|
|
2297
|
+
readonly secret: "ATTIO_API_KEY";
|
|
2298
|
+
};
|
|
2299
|
+
readonly docs: "https://attio.com/help/reference/apps/generating-an-api-key";
|
|
2300
|
+
readonly api: "https://docs.attio.com/rest-api/overview";
|
|
2301
|
+
readonly hosts: readonly ["api.attio.com"];
|
|
2302
|
+
readonly data: "account";
|
|
2303
|
+
readonly access: readonly ["read", "write"];
|
|
2304
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2305
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2306
|
+
readonly accountWidePaths: readonly [readonly ["v2", "self"], readonly ["v2", "webhooks"], readonly ["v2", "workspace_members"]];
|
|
2307
|
+
readonly 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.";
|
|
2308
|
+
readonly secrets: readonly [{
|
|
2309
|
+
readonly name: "ATTIO_API_KEY";
|
|
2310
|
+
readonly hint: "An access token from Workspace settings > Developers, with only the scopes the app needs.";
|
|
2311
|
+
}];
|
|
2312
|
+
readonly smoke: {
|
|
2313
|
+
readonly method: "GET";
|
|
2314
|
+
readonly path: "/v2/objects";
|
|
2315
|
+
readonly expect: readonly [200];
|
|
2316
|
+
readonly free: true;
|
|
2317
|
+
readonly note: "Lists the workspace's objects; needs the object_configuration:read scope. /v2/self answers 200 even for a revoked token.";
|
|
2318
|
+
};
|
|
2319
|
+
readonly rate: {
|
|
2320
|
+
readonly perSecond: 100;
|
|
2321
|
+
readonly note: "100 reads and 25 writes per second; listing records and entries also has score-based limits.";
|
|
2322
|
+
};
|
|
2323
|
+
readonly example: "find the companies we added this week and their open deals";
|
|
2324
|
+
readonly verified: {
|
|
2325
|
+
readonly on: "2026-10-25";
|
|
2326
|
+
readonly how: "docs";
|
|
2327
|
+
};
|
|
2328
|
+
readonly tags: readonly ["crm"];
|
|
2329
|
+
};
|
|
2330
|
+
readonly hubspot: {
|
|
2331
|
+
readonly mode: "api_key";
|
|
2332
|
+
readonly label: "HubSpot";
|
|
2333
|
+
readonly description: "CRM and marketing: contacts, companies, deals, tickets and more in one HubSpot account.";
|
|
2334
|
+
readonly auth: {
|
|
2335
|
+
readonly kind: "bearer";
|
|
2336
|
+
readonly secret: "HUBSPOT_API_TOKEN";
|
|
2337
|
+
};
|
|
2338
|
+
readonly docs: "https://developers.hubspot.com/docs/apps/legacy-apps/private-apps/overview";
|
|
2339
|
+
readonly api: "https://developers.hubspot.com/docs/api-reference/latest/overview";
|
|
2340
|
+
readonly hosts: readonly ["api.hubapi.com"];
|
|
2341
|
+
readonly data: "account";
|
|
2342
|
+
readonly access: readonly ["read", "write"];
|
|
2343
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2344
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2345
|
+
readonly accountWidePaths: readonly [readonly ["account-info"], readonly ["settings", "users"], readonly ["settings", "v3", "users"], readonly ["settings", "teams"], readonly ["app-webhooks"], readonly ["webhooks"], readonly ["webhooks-journal"], readonly ["oauth"]];
|
|
2346
|
+
readonly 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.";
|
|
2347
|
+
readonly secrets: readonly [{
|
|
2348
|
+
readonly name: "HUBSPOT_API_TOKEN";
|
|
2349
|
+
readonly hint: "The access token of a legacy private app (Development > Legacy apps > the app > Auth), with only the scopes the app needs.";
|
|
2350
|
+
}];
|
|
2351
|
+
readonly smoke: {
|
|
2352
|
+
readonly method: "GET";
|
|
2353
|
+
readonly path: "/account-info/2026-09/details";
|
|
2354
|
+
readonly expect: readonly [200];
|
|
2355
|
+
readonly free: true;
|
|
2356
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
2357
|
+
};
|
|
2358
|
+
readonly rate: {
|
|
2359
|
+
readonly perDay: 250000;
|
|
2360
|
+
readonly 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.";
|
|
2361
|
+
};
|
|
2362
|
+
readonly example: "list the deals that moved to closed won this month";
|
|
2363
|
+
readonly verified: {
|
|
2364
|
+
readonly on: "2026-10-25";
|
|
2365
|
+
readonly how: "docs";
|
|
2366
|
+
};
|
|
2367
|
+
readonly tags: readonly ["crm", "marketing"];
|
|
2368
|
+
};
|
|
2369
|
+
readonly pipedrive: {
|
|
2370
|
+
readonly mode: "api_key";
|
|
2371
|
+
readonly label: "Pipedrive";
|
|
2372
|
+
readonly description: "Sales CRM: deals, persons, organizations, activities and pipelines.";
|
|
2373
|
+
readonly auth: {
|
|
2374
|
+
readonly kind: "header";
|
|
2375
|
+
readonly secret: "PIPEDRIVE_API_TOKEN";
|
|
2376
|
+
readonly header: "x-api-token";
|
|
2377
|
+
};
|
|
2378
|
+
readonly docs: "https://app.pipedrive.com/settings/api";
|
|
2379
|
+
readonly api: "https://developers.pipedrive.com/docs/api/v1";
|
|
2380
|
+
readonly hosts: readonly ["api.pipedrive.com"];
|
|
2381
|
+
readonly data: "account";
|
|
2382
|
+
readonly access: readonly ["read", "write"];
|
|
2383
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2384
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2385
|
+
readonly accountWidePaths: readonly [readonly ["v1", "users"], readonly ["v1", "webhooks"], readonly ["v1", "billing"], readonly ["v1", "permissionsets"], readonly ["v1", "roles"], readonly ["v1", "usersettings"], readonly ["v1", "userconnections"], readonly ["v1", "legacyteams"]];
|
|
2386
|
+
readonly 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.";
|
|
2387
|
+
readonly secrets: readonly [{
|
|
2388
|
+
readonly name: "PIPEDRIVE_API_TOKEN";
|
|
2389
|
+
readonly hint: "Your personal API token from Settings > Personal preferences > API; it acts as you, and each company you belong to has its own.";
|
|
2390
|
+
}];
|
|
2391
|
+
readonly smoke: {
|
|
2392
|
+
readonly method: "GET";
|
|
2393
|
+
readonly path: "/v1/users/me";
|
|
2394
|
+
readonly expect: readonly [200];
|
|
2395
|
+
readonly free: true;
|
|
2396
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
2397
|
+
};
|
|
2398
|
+
readonly cost: {
|
|
2399
|
+
readonly unit: "call";
|
|
2400
|
+
readonly note: "Each endpoint spends API tokens from a daily company budget of 30,000 x plan multiplier (1 to 7) x seats.";
|
|
2401
|
+
};
|
|
2402
|
+
readonly rate: {
|
|
2403
|
+
readonly note: "Per API token: 20 (Lite) to 120 (Ultimate) requests per 2 seconds; Search 10 per 2 seconds.";
|
|
2404
|
+
};
|
|
2405
|
+
readonly example: "list the open deals in my main pipeline";
|
|
2406
|
+
readonly verified: {
|
|
2407
|
+
readonly on: "2026-10-25";
|
|
2408
|
+
readonly how: "docs";
|
|
2409
|
+
};
|
|
2410
|
+
readonly tags: readonly ["crm", "sales"];
|
|
2411
|
+
};
|
|
2412
|
+
readonly airtable: {
|
|
2413
|
+
readonly mode: "api_key";
|
|
2414
|
+
readonly label: "Airtable";
|
|
2415
|
+
readonly description: "Bases, tables and records in the Airtable workspaces a token can reach.";
|
|
2416
|
+
readonly auth: {
|
|
2417
|
+
readonly kind: "bearer";
|
|
2418
|
+
readonly secret: "AIRTABLE_API_TOKEN";
|
|
2419
|
+
};
|
|
2420
|
+
readonly docs: "https://airtable.com/create/tokens";
|
|
2421
|
+
readonly api: "https://airtable.com/developers/web/api/introduction";
|
|
2422
|
+
readonly hosts: readonly ["api.airtable.com"];
|
|
2423
|
+
readonly data: "account";
|
|
2424
|
+
readonly access: readonly ["read", "write"];
|
|
2425
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2426
|
+
readonly writeMethods: readonly ["POST", "PUT", "PATCH", "DELETE"];
|
|
2427
|
+
readonly accountWidePaths: readonly [readonly ["v0", "meta", "whoami"], readonly ["v0", "meta", "enterpriseaccounts"], readonly ["v0", "meta", "workspaces"], readonly ["v0", "meta", "groups"], readonly ["v0", "bases"], readonly ["scim"], readonly ["collaborators"], readonly ["invites"], readonly ["shares"], readonly ["blockinstallations"]];
|
|
2428
|
+
readonly 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.";
|
|
2429
|
+
readonly secrets: readonly [{
|
|
2430
|
+
readonly name: "AIRTABLE_API_TOKEN";
|
|
2431
|
+
readonly hint: "A personal access token limited to the scopes and bases the app needs.";
|
|
2432
|
+
}];
|
|
2433
|
+
readonly smoke: {
|
|
2434
|
+
readonly method: "GET";
|
|
2435
|
+
readonly path: "/v0/meta/whoami";
|
|
2436
|
+
readonly expect: readonly [200];
|
|
2437
|
+
readonly free: true;
|
|
2438
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
2439
|
+
};
|
|
2440
|
+
readonly rate: {
|
|
2441
|
+
readonly perSecond: 5;
|
|
2442
|
+
readonly note: "5 requests per second per base; 50 per second across all of one user's personal access tokens.";
|
|
2443
|
+
};
|
|
2444
|
+
readonly example: "list this week's new rows in my Leads table";
|
|
2445
|
+
readonly verified: {
|
|
2446
|
+
readonly on: "2026-10-25";
|
|
2447
|
+
readonly how: "docs";
|
|
2448
|
+
};
|
|
2449
|
+
readonly tags: readonly ["database", "spreadsheet"];
|
|
2450
|
+
};
|
|
2451
|
+
readonly notion: {
|
|
2452
|
+
readonly mode: "api_key";
|
|
2453
|
+
readonly label: "Notion";
|
|
2454
|
+
readonly description: "Pages, databases and blocks that a Notion connection has been given.";
|
|
2455
|
+
readonly auth: {
|
|
2456
|
+
readonly kind: "bearer";
|
|
2457
|
+
readonly secret: "NOTION_API_TOKEN";
|
|
2458
|
+
};
|
|
2459
|
+
readonly docs: "https://app.notion.com/developers/connections";
|
|
2460
|
+
readonly api: "https://developers.notion.com/reference/intro";
|
|
2461
|
+
readonly hosts: readonly ["api.notion.com"];
|
|
2462
|
+
readonly data: "account";
|
|
2463
|
+
readonly access: readonly ["read", "write"];
|
|
2464
|
+
readonly readMethods: readonly ["GET", "HEAD"];
|
|
2465
|
+
readonly writeMethods: readonly ["POST", "PATCH", "DELETE"];
|
|
2466
|
+
readonly accountWidePaths: readonly [readonly ["v1", "users"], readonly ["v1", "oauth"], readonly ["admin"]];
|
|
2467
|
+
readonly 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.";
|
|
2468
|
+
readonly secrets: readonly [{
|
|
2469
|
+
readonly name: "NOTION_API_TOKEN";
|
|
2470
|
+
readonly hint: "The API token on an internal connection's Configuration tab; share the pages it should reach with the connection.";
|
|
2471
|
+
}];
|
|
2472
|
+
readonly smoke: {
|
|
2473
|
+
readonly method: "GET";
|
|
2474
|
+
readonly path: "/v1/users/me";
|
|
2475
|
+
readonly expect: readonly [200];
|
|
2476
|
+
readonly free: true;
|
|
2477
|
+
readonly note: "Send Notion-Version: 2026-03-11 with it; account-wide, so run it from the person's terminal.";
|
|
2478
|
+
};
|
|
2479
|
+
readonly rate: {
|
|
2480
|
+
readonly perMinute: 180;
|
|
2481
|
+
readonly note: "Per connection: 180 a minute, 600 on Business and Enterprise; data source queries about 3 per second.";
|
|
2482
|
+
};
|
|
2483
|
+
readonly example: "find the pages in my Projects database that are due this week";
|
|
2484
|
+
readonly verified: {
|
|
2485
|
+
readonly on: "2026-10-25";
|
|
2486
|
+
readonly how: "docs";
|
|
2487
|
+
};
|
|
2488
|
+
readonly tags: readonly ["docs", "notes", "database"];
|
|
2489
|
+
};
|
|
2490
|
+
readonly openai: {
|
|
2491
|
+
readonly mode: "ai";
|
|
2492
|
+
readonly label: "OpenAI";
|
|
2493
|
+
readonly description: "OpenAI's models: responses, chat, embeddings, audio, images.";
|
|
2494
|
+
readonly auth: {
|
|
2495
|
+
readonly kind: "bearer";
|
|
2496
|
+
readonly secret: "OPENAI_API_KEY";
|
|
2497
|
+
};
|
|
2498
|
+
readonly docs: "https://platform.openai.com/api-keys";
|
|
2499
|
+
readonly api: "https://platform.openai.com/docs/api-reference";
|
|
2500
|
+
readonly setup: "setup/openai.md";
|
|
2501
|
+
readonly origin: "https://api.openai.com";
|
|
2502
|
+
readonly inferenceRoutes: readonly ["/v1/responses", "/v1/chat/completions", "/v1/embeddings", "/v1/audio/speech", "/v1/audio/transcriptions", "/v1/audio/translations", "/v1/images/generations", "/v1/images/edits", "/v1/images/variations"];
|
|
2503
|
+
readonly unstoredRoutes: readonly ["/v1/responses", "/v1/chat/completions"];
|
|
2504
|
+
readonly extraRoutes: true;
|
|
2505
|
+
readonly chat: {
|
|
2506
|
+
readonly path: "/v1/chat/completions";
|
|
2507
|
+
readonly seedModel: "gpt-6-luna";
|
|
2508
|
+
};
|
|
2509
|
+
readonly embeddings: {
|
|
2510
|
+
readonly path: "/v1/embeddings";
|
|
2511
|
+
readonly seedModel: "text-embedding-3-small";
|
|
2512
|
+
};
|
|
2513
|
+
readonly aig: {
|
|
2514
|
+
readonly slug: "openai";
|
|
2515
|
+
readonly trim: "/v1";
|
|
2516
|
+
};
|
|
2517
|
+
readonly hint: "A secret key from the API keys page; the Gateway puts it on every call as a bearer token.";
|
|
2518
|
+
readonly verified: {
|
|
2519
|
+
readonly on: "2026-10-25";
|
|
2520
|
+
readonly how: "live";
|
|
2521
|
+
};
|
|
2522
|
+
};
|
|
2523
|
+
readonly openrouter: {
|
|
2524
|
+
readonly mode: "ai";
|
|
2525
|
+
readonly label: "OpenRouter";
|
|
2526
|
+
readonly description: "One key for many models, through OpenAI's API shape.";
|
|
2527
|
+
readonly auth: {
|
|
2528
|
+
readonly kind: "bearer";
|
|
2529
|
+
readonly secret: "OPENROUTER_API_KEY";
|
|
2530
|
+
};
|
|
2531
|
+
readonly docs: "https://openrouter.ai/settings/keys";
|
|
2532
|
+
readonly api: "https://openrouter.ai/docs";
|
|
2533
|
+
readonly setup: "setup/openrouter.md";
|
|
2534
|
+
readonly origin: "https://openrouter.ai";
|
|
2535
|
+
readonly inferenceRoutes: readonly ["/api/v1/chat/completions", "/api/v1/completions", "/api/v1/responses", "/api/v1/embeddings"];
|
|
2536
|
+
readonly chat: {
|
|
2537
|
+
readonly path: "/api/v1/chat/completions";
|
|
2538
|
+
readonly seedModel: "anthropic/claude-haiku-5.5";
|
|
2539
|
+
};
|
|
2540
|
+
readonly embeddings: {
|
|
2541
|
+
readonly path: "/api/v1/embeddings";
|
|
2542
|
+
readonly seedModel: "openai/text-embedding-3-small";
|
|
2543
|
+
};
|
|
2544
|
+
readonly aig: {
|
|
2545
|
+
readonly slug: "openrouter";
|
|
2546
|
+
readonly trim: "/api";
|
|
2547
|
+
};
|
|
2548
|
+
readonly hint: "An API key from OpenRouter's keys page; the Gateway puts it on every call as a bearer token.";
|
|
2549
|
+
readonly cost: {
|
|
2550
|
+
readonly unit: "token";
|
|
2551
|
+
readonly responseField: "usage.cost";
|
|
2552
|
+
readonly note: "The answer's usage.cost is the call's price in USD, per model.";
|
|
2553
|
+
};
|
|
2554
|
+
readonly verified: {
|
|
2555
|
+
readonly on: "2026-10-25";
|
|
2556
|
+
readonly how: "live";
|
|
2557
|
+
};
|
|
2558
|
+
};
|
|
2559
|
+
readonly "workers-ai": {
|
|
2560
|
+
readonly mode: "ai";
|
|
2561
|
+
readonly label: "Workers AI";
|
|
2562
|
+
readonly description: "Cloudflare's models, in the Gateway's own account.";
|
|
2563
|
+
readonly auth: {
|
|
2564
|
+
readonly kind: "bearer";
|
|
2565
|
+
readonly secret: "WORKERS_AI_API_TOKEN";
|
|
2566
|
+
};
|
|
2567
|
+
readonly docs: "https://dash.cloudflare.com/profile/api-tokens";
|
|
2568
|
+
readonly api: "https://developers.cloudflare.com/workers-ai/";
|
|
2569
|
+
readonly setup: "setup/workers-ai.md";
|
|
2570
|
+
readonly origin: "https://api.cloudflare.com";
|
|
2571
|
+
readonly alsoNeeds: readonly ["CLOUDFLARE_ACCOUNT_ID"];
|
|
2572
|
+
readonly basePath: "/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai";
|
|
2573
|
+
readonly inferenceRoutes: readonly ["/v1/chat/completions", "/v1/embeddings", "/v1/responses"];
|
|
2574
|
+
readonly normalize: "workers-ai";
|
|
2575
|
+
readonly chat: {
|
|
2576
|
+
readonly path: "/v1/chat/completions";
|
|
2577
|
+
readonly seedModel: "@cf/meta/llama-4-scout-17b-16e-instruct";
|
|
2578
|
+
};
|
|
2579
|
+
readonly embeddings: {
|
|
2580
|
+
readonly path: "/v1/embeddings";
|
|
2581
|
+
readonly seedModel: "@cf/baai/bge-m3";
|
|
2582
|
+
};
|
|
2583
|
+
readonly aig: {
|
|
2584
|
+
readonly slug: "workers-ai";
|
|
2585
|
+
readonly header: true;
|
|
2586
|
+
};
|
|
2587
|
+
readonly hint: "A Cloudflare API token with Workers AI Read (the Workers AI page's prefilled token); the account is the Gateway's own.";
|
|
2588
|
+
readonly verified: {
|
|
2589
|
+
readonly on: "2026-10-25";
|
|
2590
|
+
readonly how: "live";
|
|
2591
|
+
};
|
|
2592
|
+
};
|
|
2593
|
+
readonly "ai-gateway": {
|
|
2594
|
+
readonly mode: "ai";
|
|
2595
|
+
readonly kind: "proxy";
|
|
2596
|
+
readonly label: "Cloudflare AI Gateway";
|
|
2597
|
+
readonly description: "Cloudflare's proxy in front of the other AI providers: logs, caching, rate limits and spend, with each provider's own key.";
|
|
2598
|
+
readonly auth: {
|
|
2599
|
+
readonly kind: "header";
|
|
2600
|
+
readonly header: "cf-aig-authorization";
|
|
2601
|
+
readonly prefix: "Bearer ";
|
|
2602
|
+
readonly secret: "AI_GATEWAY_API_KEY";
|
|
2603
|
+
};
|
|
2604
|
+
readonly authOptional: true;
|
|
2605
|
+
readonly docs: "https://dash.cloudflare.com/?to=/:account/ai/ai-gateway";
|
|
2606
|
+
readonly api: "https://developers.cloudflare.com/ai-gateway/";
|
|
2607
|
+
readonly setup: "setup/ai-gateway.md";
|
|
2608
|
+
readonly origin: "https://gateway.ai.cloudflare.com";
|
|
2609
|
+
readonly alsoNeeds: readonly ["CLOUDFLARE_ACCOUNT_ID", "AI_GATEWAY_ID"];
|
|
2610
|
+
readonly basePath: "/v1/{CLOUDFLARE_ACCOUNT_ID}/{AI_GATEWAY_ID}";
|
|
2611
|
+
readonly inferenceRoutes: readonly [];
|
|
2612
|
+
readonly hint: "The gateway's id from the AI Gateway page (everyapp ai gateway on makes one named everyapp); AI_GATEWAY_API_KEY only for an authenticated gateway, sent as cf-aig-authorization.";
|
|
2613
|
+
readonly secrets: readonly [{
|
|
2614
|
+
readonly name: "AI_GATEWAY_ID";
|
|
2615
|
+
readonly hint: "The AI Gateway's id (its name in the dashboard), in the Gateway's own Cloudflare account.";
|
|
2616
|
+
}, {
|
|
2617
|
+
readonly name: "AI_GATEWAY_API_KEY";
|
|
2618
|
+
readonly hint: "An AI Gateway token with Run permission, only when the gateway is authenticated; leave unset for an open gateway.";
|
|
2619
|
+
}];
|
|
2620
|
+
readonly verified: {
|
|
2621
|
+
readonly on: "2026-10-25";
|
|
2622
|
+
readonly how: "docs";
|
|
2623
|
+
};
|
|
2624
|
+
};
|
|
2625
|
+
readonly dataforseo: {
|
|
2626
|
+
readonly mode: "api_key";
|
|
2627
|
+
readonly label: "DataForSEO";
|
|
2628
|
+
readonly description: "SEO data: keyword metrics, live search results, domain rankings, backlinks.";
|
|
2629
|
+
readonly auth: {
|
|
2630
|
+
readonly kind: "basic";
|
|
2631
|
+
readonly secret: "DATAFORSEO_API_KEY";
|
|
2632
|
+
readonly as: "pair";
|
|
2633
|
+
};
|
|
2634
|
+
readonly docs: "https://app.dataforseo.com/api-access";
|
|
2635
|
+
readonly api: "https://docs.dataforseo.com/v3/";
|
|
2636
|
+
readonly setup: "setup/dataforseo.md";
|
|
2637
|
+
readonly hosts: readonly ["api.dataforseo.com", "sandbox.dataforseo.com"];
|
|
2638
|
+
readonly access: readonly ["read"];
|
|
2639
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
2640
|
+
readonly accountWidePaths: readonly [readonly ["tasks_ready"], readonly ["tasks_fixed"], readonly ["id_list"], readonly ["errors"], readonly ["appendix", "user_data"], readonly ["appendix", "webhook_resend"]];
|
|
2641
|
+
readonly hint: "The API login and password from API Access, as login:password (or that pair base64-encoded); the Gateway sends them as HTTP Basic.";
|
|
2642
|
+
readonly secrets: readonly [{
|
|
2643
|
+
readonly name: "DATAFORSEO_API_KEY";
|
|
2644
|
+
readonly hint: "login:password, or its base64; never the dashboard sign-in password.";
|
|
2645
|
+
}];
|
|
2646
|
+
readonly cost: {
|
|
2647
|
+
readonly unit: "call";
|
|
2648
|
+
readonly responseField: "cost";
|
|
2649
|
+
readonly note: "A Google SERP $0.002 per 10 results; a Labs task $0.012 plus $0.00012 per item.";
|
|
2650
|
+
};
|
|
2651
|
+
readonly smoke: {
|
|
2652
|
+
readonly method: "GET";
|
|
2653
|
+
readonly path: "/v3/appendix/user_data";
|
|
2654
|
+
readonly expect: readonly [200];
|
|
2655
|
+
readonly free: true;
|
|
2656
|
+
readonly note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.";
|
|
2657
|
+
};
|
|
2658
|
+
readonly example: "find keyword ideas for a page about running shoes";
|
|
2659
|
+
readonly verified: {
|
|
2660
|
+
readonly on: "2026-10-25";
|
|
2661
|
+
readonly how: "live";
|
|
2662
|
+
};
|
|
2663
|
+
};
|
|
2664
|
+
readonly context: {
|
|
2665
|
+
readonly mode: "api_key";
|
|
2666
|
+
readonly label: "Context.dev";
|
|
2667
|
+
readonly description: "Scrapes and renders web pages, JavaScript included.";
|
|
2668
|
+
readonly auth: {
|
|
2669
|
+
readonly kind: "bearer";
|
|
2670
|
+
readonly secret: "CONTEXT_API_KEY";
|
|
2671
|
+
};
|
|
2672
|
+
readonly docs: "https://context.dev/";
|
|
2673
|
+
readonly setup: "setup/context.md";
|
|
2674
|
+
readonly hosts: readonly ["api.context.dev"];
|
|
2675
|
+
readonly access: readonly ["read"];
|
|
2676
|
+
readonly readMethods: readonly ["GET", "POST"];
|
|
2677
|
+
readonly accountWidePaths: readonly [];
|
|
2678
|
+
readonly hint: "An API key from the Context.dev dashboard; the Gateway puts it on every call as a bearer token.";
|
|
2679
|
+
readonly verified: {
|
|
2680
|
+
readonly on: "2026-10-25";
|
|
2681
|
+
readonly how: "live";
|
|
2682
|
+
};
|
|
2683
|
+
};
|
|
2684
|
+
readonly email: {
|
|
2685
|
+
readonly mode: "service";
|
|
2686
|
+
readonly label: "Email";
|
|
2687
|
+
readonly access: readonly ["write"];
|
|
2688
|
+
readonly routes: {
|
|
2689
|
+
readonly send: readonly ["POST"];
|
|
2690
|
+
};
|
|
2691
|
+
readonly settings: readonly ["EMAIL_FROM", "EMAIL_FROM_NAME"];
|
|
2692
|
+
readonly optionalSettings: readonly ["EMAIL_REST_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID", "RESEND_API_KEY", "EMAIL_PROVIDER"];
|
|
2693
|
+
readonly setup: "setup/email.md";
|
|
2694
|
+
};
|
|
2695
|
+
readonly members: {
|
|
2696
|
+
readonly mode: "service";
|
|
2697
|
+
readonly label: "Members";
|
|
2698
|
+
readonly access: readonly ["read"];
|
|
2699
|
+
readonly routes: {
|
|
2700
|
+
readonly list: readonly ["GET"];
|
|
2701
|
+
};
|
|
2702
|
+
readonly settings: readonly [];
|
|
2703
|
+
readonly optionalSettings: readonly [];
|
|
2704
|
+
};
|
|
2705
|
+
readonly slack: {
|
|
2706
|
+
readonly mode: "oauth_client";
|
|
2707
|
+
readonly label: "Slack";
|
|
2708
|
+
readonly secrets: {
|
|
2709
|
+
readonly clientId: "SLACK_CLIENT_ID";
|
|
2710
|
+
readonly clientSecret: "SLACK_CLIENT_SECRET";
|
|
2711
|
+
};
|
|
2712
|
+
readonly token: readonly [{
|
|
2713
|
+
readonly host: "slack.com";
|
|
2714
|
+
readonly path: "/api/oauth.v2.access";
|
|
2715
|
+
readonly methods: readonly ["POST"];
|
|
2716
|
+
readonly inject: "form";
|
|
2717
|
+
}];
|
|
2718
|
+
readonly access: readonly ["write"];
|
|
2719
|
+
readonly console: "https://api.slack.com/apps";
|
|
2720
|
+
readonly setup: "setup/slack.md";
|
|
2721
|
+
readonly authorize: {
|
|
2722
|
+
readonly url: "https://slack.com/oauth/v2/authorize";
|
|
2723
|
+
readonly scopes: readonly ["channels:read", "groups:read", "users:read", "users:read.email", "chat:write", "chat:write.public", "chat:write.customize", "channels:join", "channels:manage", "groups:write", "channels:write.invites", "groups:write.invites", "im:write", "files:write", "channels:write"];
|
|
2724
|
+
};
|
|
2725
|
+
readonly scopePolicy: {
|
|
2726
|
+
readonly dialect: "slack";
|
|
2727
|
+
readonly grantTypes: readonly [null, "refresh_token"];
|
|
2728
|
+
readonly requestScope: "keep";
|
|
2729
|
+
readonly alwaysRequested: readonly [];
|
|
2730
|
+
readonly tolerated: readonly [];
|
|
2731
|
+
readonly deniedSegments: readonly [];
|
|
2732
|
+
readonly sets: {
|
|
2733
|
+
readonly "channels.read": {
|
|
2734
|
+
readonly label: "Channels (read-only)";
|
|
2735
|
+
readonly access: "read";
|
|
2736
|
+
readonly scopes: readonly ["channels:read", "groups:read"];
|
|
2737
|
+
readonly routes: readonly [{
|
|
2738
|
+
readonly host: "slack.com";
|
|
2739
|
+
readonly paths: readonly ["/api/conversations.list", "/api/conversations.info", "/api/conversations.members", "/api/users.conversations"];
|
|
2740
|
+
readonly posts: readonly [RegExp, RegExp];
|
|
2741
|
+
}];
|
|
2742
|
+
};
|
|
2743
|
+
readonly "users.read": {
|
|
2744
|
+
readonly label: "Members (read-only)";
|
|
2745
|
+
readonly access: "read";
|
|
2746
|
+
readonly scopes: readonly ["users:read"];
|
|
2747
|
+
readonly routes: readonly [{
|
|
2748
|
+
readonly host: "slack.com";
|
|
2749
|
+
readonly paths: readonly ["/api/users.list", "/api/users.info", "/api/users.getPresence", "/api/bots.info"];
|
|
2750
|
+
readonly posts: readonly [RegExp, RegExp];
|
|
2751
|
+
}];
|
|
2752
|
+
};
|
|
2753
|
+
readonly "users.email": {
|
|
2754
|
+
readonly label: "Members' email addresses (read-only)";
|
|
2755
|
+
readonly access: "read";
|
|
2756
|
+
readonly scopes: readonly ["users:read.email"];
|
|
2757
|
+
readonly routes: readonly [{
|
|
2758
|
+
readonly host: "slack.com";
|
|
2759
|
+
readonly paths: readonly ["/api/users.lookupByEmail"];
|
|
2760
|
+
readonly posts: readonly [RegExp];
|
|
2761
|
+
}];
|
|
2762
|
+
};
|
|
2763
|
+
readonly "messages.write": {
|
|
2764
|
+
readonly label: "Messages (post as the app)";
|
|
2765
|
+
readonly access: "write";
|
|
2766
|
+
readonly scopes: readonly ["chat:write", "chat:write.public", "chat:write.customize"];
|
|
2767
|
+
readonly routes: readonly [{
|
|
2768
|
+
readonly host: "slack.com";
|
|
2769
|
+
readonly paths: readonly ["/api/chat.scheduledMessages.list"];
|
|
2770
|
+
readonly posts: readonly [RegExp];
|
|
2771
|
+
}];
|
|
2772
|
+
};
|
|
2773
|
+
readonly "channels.join": {
|
|
2774
|
+
readonly label: "Channels (join public ones)";
|
|
2775
|
+
readonly access: "write";
|
|
2776
|
+
readonly scopes: readonly ["channels:join"];
|
|
2777
|
+
readonly routes: readonly [{
|
|
2778
|
+
readonly host: "slack.com";
|
|
2779
|
+
readonly paths: readonly [];
|
|
2780
|
+
readonly posts: readonly [RegExp];
|
|
2781
|
+
}];
|
|
2782
|
+
};
|
|
2783
|
+
readonly "channels.manage": {
|
|
2784
|
+
readonly label: "Channels (create, manage and invite to; open DMs)";
|
|
2785
|
+
readonly access: "write";
|
|
2786
|
+
readonly scopes: readonly ["channels:manage", "groups:write", "channels:write.invites", "groups:write.invites", "im:write"];
|
|
2787
|
+
readonly routes: readonly [{
|
|
2788
|
+
readonly host: "slack.com";
|
|
2789
|
+
readonly paths: readonly [];
|
|
2790
|
+
readonly posts: readonly [RegExp];
|
|
2791
|
+
}];
|
|
2792
|
+
};
|
|
2793
|
+
readonly "files.write": {
|
|
2794
|
+
readonly label: "Files (upload)";
|
|
2795
|
+
readonly access: "write";
|
|
2796
|
+
readonly scopes: readonly ["files:write"];
|
|
2797
|
+
readonly routes: readonly [{
|
|
2798
|
+
readonly host: "slack.com";
|
|
2799
|
+
readonly paths: readonly [];
|
|
2800
|
+
readonly posts: readonly [RegExp];
|
|
2801
|
+
}];
|
|
2802
|
+
};
|
|
2803
|
+
readonly "user-channels.manage": {
|
|
2804
|
+
readonly label: "Channels (as the installing person: read, manage, invite to)";
|
|
2805
|
+
readonly access: "write";
|
|
2806
|
+
readonly scopes: readonly [];
|
|
2807
|
+
readonly userScopes: readonly ["channels:read", "channels:write", "groups:read", "groups:write"];
|
|
2808
|
+
readonly routes: readonly [{
|
|
2809
|
+
readonly host: "slack.com";
|
|
2810
|
+
readonly paths: readonly ["/api/conversations.list", "/api/conversations.info", "/api/conversations.members", "/api/users.conversations"];
|
|
2811
|
+
readonly posts: readonly [RegExp, RegExp];
|
|
2812
|
+
}];
|
|
2813
|
+
};
|
|
2814
|
+
};
|
|
2815
|
+
};
|
|
2816
|
+
readonly api: readonly ["slack.com"];
|
|
2817
|
+
readonly flow: {
|
|
2818
|
+
readonly tokenUrl: "https://slack.com/api/oauth.v2.access";
|
|
2819
|
+
readonly revokeUrl: "https://slack.com/api/auth.revoke";
|
|
2820
|
+
readonly pkce: false;
|
|
2821
|
+
readonly scopeDialect: "slack";
|
|
2822
|
+
readonly identity: {
|
|
2823
|
+
readonly url: "https://slack.com/api/auth.test";
|
|
2824
|
+
readonly label: "team";
|
|
2825
|
+
readonly id: "user_id";
|
|
2826
|
+
};
|
|
2827
|
+
};
|
|
2828
|
+
};
|
|
2829
|
+
readonly "google-workspace": {
|
|
2830
|
+
readonly mode: "oauth_client";
|
|
2831
|
+
readonly label: "Google (Gmail, Calendar, Search Console and Analytics)";
|
|
2832
|
+
readonly secrets: {
|
|
2833
|
+
readonly clientId: "GOOGLE_WORKSPACE_CLIENT_ID";
|
|
2834
|
+
readonly clientSecret: "GOOGLE_WORKSPACE_CLIENT_SECRET";
|
|
2835
|
+
};
|
|
2836
|
+
readonly token: readonly [{
|
|
2837
|
+
readonly host: "oauth2.googleapis.com";
|
|
2838
|
+
readonly path: "/token";
|
|
2839
|
+
readonly methods: readonly ["POST"];
|
|
2840
|
+
readonly inject: "form";
|
|
2841
|
+
}];
|
|
2842
|
+
readonly access: readonly ["write"];
|
|
2843
|
+
readonly console: "https://console.cloud.google.com/apis/credentials";
|
|
2844
|
+
readonly setup: "setup/google.md";
|
|
2845
|
+
readonly authorize: {
|
|
2846
|
+
readonly url: "https://accounts.google.com/o/oauth2/v2/auth";
|
|
2847
|
+
readonly scopes: readonly ["openid", "email", "profile", "https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/webmasters.readonly", "https://www.googleapis.com/auth/analytics.readonly"];
|
|
2848
|
+
};
|
|
2849
|
+
readonly scopePolicy: {
|
|
2850
|
+
readonly dialect: "google";
|
|
2851
|
+
readonly grantTypes: readonly ["authorization_code", "refresh_token"];
|
|
2852
|
+
readonly requestScope: "drop";
|
|
2853
|
+
readonly alwaysRequested: readonly [];
|
|
2854
|
+
readonly tolerated: readonly ["openid", "email", "profile", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"];
|
|
2855
|
+
readonly deniedSegments: readonly ["batch", "measurementProtocolSecrets"];
|
|
2856
|
+
readonly sets: {
|
|
2857
|
+
readonly identity: {
|
|
2858
|
+
readonly label: "Google account (who you are)";
|
|
2859
|
+
readonly access: "read";
|
|
2860
|
+
readonly scopes: readonly ["openid", "email", "profile"];
|
|
2861
|
+
readonly routes: readonly [{
|
|
2862
|
+
readonly host: "openidconnect.googleapis.com";
|
|
2863
|
+
readonly paths: readonly ["/v1/userinfo"];
|
|
2864
|
+
}, {
|
|
2865
|
+
readonly host: "www.googleapis.com";
|
|
2866
|
+
readonly paths: readonly ["/oauth2/v2/userinfo", "/oauth2/v3/userinfo", "/userinfo/v2/me"];
|
|
2867
|
+
}];
|
|
2868
|
+
};
|
|
2869
|
+
readonly "gmail.read": {
|
|
2870
|
+
readonly label: "Gmail (read-only)";
|
|
2871
|
+
readonly access: "read";
|
|
2872
|
+
readonly scopes: readonly ["https://www.googleapis.com/auth/gmail.readonly"];
|
|
2873
|
+
readonly routes: readonly [{
|
|
2874
|
+
readonly host: "gmail.googleapis.com";
|
|
2875
|
+
readonly paths: readonly ["/gmail/v1/users/"];
|
|
2876
|
+
readonly posts: readonly [RegExp];
|
|
2877
|
+
}];
|
|
2878
|
+
};
|
|
2879
|
+
readonly "calendar.read": {
|
|
2880
|
+
readonly label: "Google Calendar (read-only)";
|
|
2881
|
+
readonly access: "read";
|
|
2882
|
+
readonly scopes: readonly ["https://www.googleapis.com/auth/calendar.readonly"];
|
|
2883
|
+
readonly routes: readonly [{
|
|
2884
|
+
readonly host: "www.googleapis.com";
|
|
2885
|
+
readonly paths: readonly ["/calendar/v3/"];
|
|
2886
|
+
readonly posts: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
2887
|
+
}];
|
|
2888
|
+
};
|
|
2889
|
+
readonly "search-console.read": {
|
|
2890
|
+
readonly label: "Search Console (read-only)";
|
|
2891
|
+
readonly access: "read";
|
|
2892
|
+
readonly scopes: readonly ["https://www.googleapis.com/auth/webmasters.readonly"];
|
|
2893
|
+
readonly routes: readonly [{
|
|
2894
|
+
readonly host: "www.googleapis.com";
|
|
2895
|
+
readonly paths: readonly ["/webmasters/v3/"];
|
|
2896
|
+
readonly posts: readonly [RegExp];
|
|
2897
|
+
}, {
|
|
2898
|
+
readonly host: "searchconsole.googleapis.com";
|
|
2899
|
+
readonly paths: readonly ["/webmasters/v3/"];
|
|
2900
|
+
readonly posts: readonly [RegExp, RegExp];
|
|
2901
|
+
}];
|
|
2902
|
+
};
|
|
2903
|
+
readonly "analytics.read": {
|
|
2904
|
+
readonly label: "Google Analytics (read-only)";
|
|
2905
|
+
readonly access: "read";
|
|
2906
|
+
readonly scopes: readonly ["https://www.googleapis.com/auth/analytics.readonly"];
|
|
2907
|
+
readonly routes: readonly [{
|
|
2908
|
+
readonly host: "analyticsdata.googleapis.com";
|
|
2909
|
+
readonly paths: readonly ["/v1beta/properties/"];
|
|
2910
|
+
readonly posts: readonly [RegExp];
|
|
2911
|
+
}, {
|
|
2912
|
+
readonly host: "analyticsadmin.googleapis.com";
|
|
2913
|
+
readonly paths: readonly ["/v1beta/accountSummaries", "/v1beta/accounts", "/v1beta/accounts/", "/v1beta/properties", "/v1beta/properties/", "/v1alpha/properties/"];
|
|
2914
|
+
}];
|
|
2915
|
+
};
|
|
2916
|
+
};
|
|
2917
|
+
};
|
|
2918
|
+
readonly api: readonly ["gmail.googleapis.com", "www.googleapis.com", "searchconsole.googleapis.com", "analyticsdata.googleapis.com", "analyticsadmin.googleapis.com", "openidconnect.googleapis.com"];
|
|
2919
|
+
readonly flow: {
|
|
2920
|
+
readonly tokenUrl: "https://oauth2.googleapis.com/token";
|
|
2921
|
+
readonly pkce: true;
|
|
2922
|
+
readonly scopeDialect: "google";
|
|
2923
|
+
readonly authorizeParams: {
|
|
2924
|
+
readonly access_type: "offline";
|
|
2925
|
+
readonly prompt: "consent";
|
|
2926
|
+
};
|
|
2927
|
+
readonly identity: {
|
|
2928
|
+
readonly url: "https://openidconnect.googleapis.com/v1/userinfo";
|
|
2929
|
+
readonly label: "email";
|
|
2930
|
+
readonly id: "sub";
|
|
2931
|
+
};
|
|
2932
|
+
};
|
|
2933
|
+
};
|
|
2934
|
+
readonly "microsoft-365": {
|
|
2935
|
+
readonly mode: "oauth_client";
|
|
2936
|
+
readonly label: "Microsoft 365 (Outlook mail and calendar)";
|
|
2937
|
+
readonly secrets: {
|
|
2938
|
+
readonly clientId: "MICROSOFT_365_CLIENT_ID";
|
|
2939
|
+
readonly clientSecret: "MICROSOFT_365_CLIENT_SECRET";
|
|
2940
|
+
};
|
|
2941
|
+
readonly token: readonly [{
|
|
2942
|
+
readonly host: "login.microsoftonline.com";
|
|
2943
|
+
readonly path: "/common/oauth2/v2.0/token";
|
|
2944
|
+
readonly methods: readonly ["POST"];
|
|
2945
|
+
readonly inject: "form";
|
|
2946
|
+
}];
|
|
2947
|
+
readonly access: readonly ["write"];
|
|
2948
|
+
readonly console: "https://entra.microsoft.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade";
|
|
2949
|
+
readonly setup: "setup/microsoft-365.md";
|
|
2950
|
+
readonly authorize: {
|
|
2951
|
+
readonly url: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
|
|
2952
|
+
readonly scopes: readonly ["offline_access", "User.Read", "Mail.Read", "Calendars.Read"];
|
|
2953
|
+
};
|
|
2954
|
+
readonly scopePolicy: {
|
|
2955
|
+
readonly dialect: "microsoft";
|
|
2956
|
+
readonly grantTypes: readonly ["authorization_code", "refresh_token"];
|
|
2957
|
+
readonly requestScope: "replace";
|
|
2958
|
+
readonly alwaysRequested: readonly ["offline_access"];
|
|
2959
|
+
readonly tolerated: readonly ["openid", "profile", "email", "offline_access", "User.Read"];
|
|
2960
|
+
readonly deniedSegments: readonly ["$batch", "beta"];
|
|
2961
|
+
readonly sets: {
|
|
2962
|
+
readonly identity: {
|
|
2963
|
+
readonly label: "Microsoft account (who you are)";
|
|
2964
|
+
readonly access: "read";
|
|
2965
|
+
readonly scopes: readonly ["User.Read"];
|
|
2966
|
+
readonly routes: readonly [{
|
|
2967
|
+
readonly host: "graph.microsoft.com";
|
|
2968
|
+
readonly paths: readonly ["/v1.0/me", "/oidc/userinfo"];
|
|
2969
|
+
}];
|
|
2970
|
+
};
|
|
2971
|
+
readonly "mail.read": {
|
|
2972
|
+
readonly label: "Outlook mail (read-only)";
|
|
2973
|
+
readonly access: "read";
|
|
2974
|
+
readonly scopes: readonly ["Mail.Read"];
|
|
2975
|
+
readonly routes: readonly [{
|
|
2976
|
+
readonly host: "graph.microsoft.com";
|
|
2977
|
+
readonly paths: readonly ["/v1.0/me/messages", "/v1.0/me/messages/", "/v1.0/me/mailFolders", "/v1.0/me/mailFolders/"];
|
|
2978
|
+
}];
|
|
2979
|
+
};
|
|
2980
|
+
readonly "calendar.read": {
|
|
2981
|
+
readonly label: "Outlook calendar (read-only)";
|
|
2982
|
+
readonly access: "read";
|
|
2983
|
+
readonly scopes: readonly ["Calendars.Read"];
|
|
2984
|
+
readonly routes: readonly [{
|
|
2985
|
+
readonly host: "graph.microsoft.com";
|
|
2986
|
+
readonly paths: readonly ["/v1.0/me/calendar", "/v1.0/me/calendar/", "/v1.0/me/calendars", "/v1.0/me/calendars/", "/v1.0/me/events", "/v1.0/me/events/", "/v1.0/me/calendarView", "/v1.0/me/calendarView/"];
|
|
2987
|
+
readonly posts: readonly [RegExp];
|
|
2988
|
+
}];
|
|
2989
|
+
};
|
|
2990
|
+
};
|
|
2991
|
+
};
|
|
2992
|
+
readonly api: readonly ["graph.microsoft.com"];
|
|
2993
|
+
readonly flow: {
|
|
2994
|
+
readonly tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token";
|
|
2995
|
+
readonly pkce: true;
|
|
2996
|
+
readonly scopeDialect: "microsoft";
|
|
2997
|
+
readonly identity: {
|
|
2998
|
+
readonly url: "https://graph.microsoft.com/v1.0/me";
|
|
2999
|
+
readonly label: "userPrincipalName";
|
|
3000
|
+
readonly id: "id";
|
|
3001
|
+
};
|
|
3002
|
+
};
|
|
3003
|
+
};
|
|
3004
|
+
};
|
|
3005
|
+
export type CapabilityId = keyof typeof CAPABILITIES;
|
|
3006
|
+
type CapabilityIdOf<Mode extends Capability["mode"]> = {
|
|
3007
|
+
[K in CapabilityId]: (typeof CAPABILITIES)[K]["mode"] extends Mode ? K : never;
|
|
3008
|
+
}[CapabilityId];
|
|
3009
|
+
/** Capabilities an app calls with `integrationFetch()`: providers whose key the gateway holds. */
|
|
3010
|
+
export type ApiKeyCapabilityId = CapabilityIdOf<"api_key">;
|
|
3011
|
+
/** The AI providers an app lists under `providers` and calls with `createGatewayFetch()`. */
|
|
3012
|
+
export type AiProviderId = CapabilityIdOf<"ai">;
|
|
3013
|
+
/** Capabilities the gateway performs itself, each with its SDK helper. */
|
|
3014
|
+
export type ServiceCapabilityId = CapabilityIdOf<"service">;
|
|
3015
|
+
/** OAuth clients whose token endpoints apps reach with `integrationFetch()`. */
|
|
3016
|
+
export type OAuthClientCapabilityId = CapabilityIdOf<"oauth_client">;
|
|
3017
|
+
/**
|
|
3018
|
+
* The scope set names an OAuth client offers; `never` for a client without
|
|
3019
|
+
* a scope policy. Distributes over a union of ids, so a generic over two
|
|
3020
|
+
* clients gets every name either offers rather than the names they share.
|
|
3021
|
+
*/
|
|
3022
|
+
export type OAuthScopeSetName<Id extends OAuthClientCapabilityId> = Id extends unknown ? (typeof CAPABILITIES)[Id] extends {
|
|
3023
|
+
scopePolicy: {
|
|
3024
|
+
sets: infer S;
|
|
3025
|
+
};
|
|
3026
|
+
} ? keyof S & string : never : never;
|
|
3027
|
+
/** The Gateway settings an `auth` block names: the key, and a Basic username held as a setting. */
|
|
3028
|
+
type AuthSettingsOf<A> = (A extends {
|
|
3029
|
+
secret: infer S extends string;
|
|
3030
|
+
} ? S : never) | (A extends {
|
|
3031
|
+
user: {
|
|
3032
|
+
secret: infer U extends string;
|
|
3033
|
+
};
|
|
3034
|
+
} ? U : never);
|
|
3035
|
+
type SettingsOf<C> = C extends {
|
|
3036
|
+
settings: readonly (infer S extends string)[];
|
|
3037
|
+
optionalSettings: readonly (infer O extends string)[];
|
|
3038
|
+
} ? S | O : C extends {
|
|
3039
|
+
secrets: infer S;
|
|
3040
|
+
token: unknown;
|
|
3041
|
+
} ? S[keyof S] & string : C extends {
|
|
3042
|
+
auth: infer A;
|
|
3043
|
+
} ? AuthSettingsOf<A> | (C extends {
|
|
3044
|
+
alsoNeeds: readonly (infer N extends string)[];
|
|
3045
|
+
} ? N : never) : never;
|
|
3046
|
+
/** The gateway settings capabilities read: keys, clients, senders, transports. */
|
|
3047
|
+
export type CapabilitySecret = SettingsOf<(typeof CAPABILITIES)[CapabilityId]>;
|
|
3048
|
+
/** The Gateway settings an API-key or AI provider's `auth` names: the key first, then a Basic username held as a setting. */
|
|
3049
|
+
export declare function authSettingNames(auth: ApiKeyAuth): string[];
|
|
3050
|
+
/** Every gateway setting `capability` reads, the ones it needs first. */
|
|
3051
|
+
export declare function capabilitySettings(capability: Capability): readonly string[];
|
|
3052
|
+
export declare const CAPABILITY_IDS: CapabilityId[];
|
|
3053
|
+
export declare function isCapabilityId(value: unknown): value is CapabilityId;
|
|
3054
|
+
/**
|
|
3055
|
+
* Where a provider id is looked up: the built-in catalog alone
|
|
3056
|
+
* ({@link CATALOG}), or the catalog and one gateway's registered rows
|
|
3057
|
+
* (`providerRegistry()` in ./providerRegistry.ts). Everything that brokers,
|
|
3058
|
+
* validates or describes a provider takes one, so a registered row is a
|
|
3059
|
+
* provider wherever a catalog entry is.
|
|
3060
|
+
*/
|
|
3061
|
+
export interface CapabilityLookup {
|
|
3062
|
+
get(id: string): Capability | undefined;
|
|
3063
|
+
/** Every id, in order: the catalog's, then a gateway's rows. */
|
|
3064
|
+
ids(): readonly string[];
|
|
3065
|
+
/**
|
|
3066
|
+
* Whether `id`'s settings may be read now: a registered row's only while
|
|
3067
|
+
* its key was set for the hosts and auth it has (the registry's rule);
|
|
3068
|
+
* absent, as for the catalog alone, every entry's may.
|
|
3069
|
+
*/
|
|
3070
|
+
bound?(id: string): boolean;
|
|
3071
|
+
}
|
|
3072
|
+
/** The built-in catalog as a lookup: what every surface reads without a gateway's rows. */
|
|
3073
|
+
export declare const CATALOG: CapabilityLookup;
|
|
3074
|
+
/** The ids an app may list under `capabilities`: every provider but the AI ones, which go under `providers`. */
|
|
3075
|
+
export declare function capabilityIdsOf(lookup: CapabilityLookup): string[];
|
|
3076
|
+
/**
|
|
3077
|
+
* The settings `capability` needs on a request, read from the Gateway's
|
|
3078
|
+
* settings (or `.dev.vars`): the headers to set and the query parameters
|
|
3079
|
+
* to add, or null while any setting its `auth` names is unset or blank.
|
|
3080
|
+
* Values are trimmed. A Basic key without a username is `login:password`
|
|
3081
|
+
* to encode, or taken as already encoded when it holds no colon.
|
|
3082
|
+
*/
|
|
3083
|
+
export declare function authorizationFor(capability: ApiKeyCapability | AiProviderCapability, settings: CapabilitySettings): Authorization | null;
|
|
3084
|
+
/** What {@link authorizationFor} puts on a request. */
|
|
3085
|
+
export interface Authorization {
|
|
3086
|
+
headers: Record<string, string>;
|
|
3087
|
+
query: Record<string, string>;
|
|
3088
|
+
}
|
|
3089
|
+
/** {@link authorizationFor} for an `auth` block alone (the SDK's AI fallback holds the block, not the entry). */
|
|
3090
|
+
export declare function authorizationOf(auth: ApiKeyAuth, settings: CapabilitySettings): Authorization | null;
|
|
3091
|
+
/**
|
|
3092
|
+
* The host a provider's `hostSetting` names, from its value: a bare host
|
|
3093
|
+
* or an https origin with nothing else (no path, port, query, userinfo),
|
|
3094
|
+
* lowercased; null when unset or not of that shape. The host rules a row
|
|
3095
|
+
* must pass apply to it when the registry reads the row.
|
|
3096
|
+
*/
|
|
3097
|
+
export declare function hostSettingValue(value: unknown): string | null;
|
|
3098
|
+
/**
|
|
3099
|
+
* The hosts an API-key provider's key may be sent to: the entry's own,
|
|
3100
|
+
* and the one its `hostSetting` names when that is set and well-formed.
|
|
3101
|
+
*/
|
|
3102
|
+
export declare function apiKeyHosts(capability: ApiKeyCapability, settings?: CapabilitySettings): string[];
|
|
3103
|
+
/** Where AppGateway serves capability calls. */
|
|
3104
|
+
export declare const INTEGRATION_PROXY_PREFIX = "/api/integrations";
|
|
3105
|
+
/**
|
|
3106
|
+
* The AppGateway path for a call to `upstream`:
|
|
3107
|
+
* `/api/integrations/<id>/<host><path>?<query>`. The host is in the path so
|
|
3108
|
+
* a provider with several API hosts needs no other channel.
|
|
3109
|
+
*/
|
|
3110
|
+
export declare function integrationProxyPath(id: ApiKeyCapabilityId | OAuthClientCapabilityId | (string & {}), upstream: URL): string;
|
|
3111
|
+
/** The AppGateway path of a service capability's route: `/api/integrations/<id>/<route>`. */
|
|
3112
|
+
export declare function serviceRoutePath(id: ServiceCapabilityId, route: string): string;
|
|
3113
|
+
/** What an AppGateway capability path names. */
|
|
3114
|
+
export type IntegrationProxyRoute =
|
|
3115
|
+
/** A call the gateway forwards to the provider's `upstream` with its key. */
|
|
3116
|
+
{
|
|
3117
|
+
kind: "api_key";
|
|
3118
|
+
id: string;
|
|
3119
|
+
capability: ApiKeyCapability;
|
|
3120
|
+
upstream: URL;
|
|
3121
|
+
}
|
|
3122
|
+
/** A call to one of an OAuth client's token endpoints, with its rule. */
|
|
3123
|
+
| {
|
|
3124
|
+
kind: "oauth_client";
|
|
3125
|
+
id: string;
|
|
3126
|
+
capability: OAuthClientCapability;
|
|
3127
|
+
upstream: URL;
|
|
3128
|
+
endpoint: OAuthTokenEndpoint;
|
|
3129
|
+
}
|
|
3130
|
+
/** A call to one of the routes a service capability declares. */
|
|
3131
|
+
| {
|
|
3132
|
+
kind: "service";
|
|
3133
|
+
id: ServiceCapabilityId;
|
|
3134
|
+
capability: GatewayServiceCapability;
|
|
3135
|
+
route: string;
|
|
3136
|
+
};
|
|
3137
|
+
/** Gateway settings by name: the gateway's env, or `.dev.vars` in dev. */
|
|
3138
|
+
export type CapabilitySettings = Readonly<Record<string, unknown>>;
|
|
3139
|
+
/**
|
|
3140
|
+
* The capability call an AppGateway path names, or null when the path names
|
|
3141
|
+
* an unknown capability (or an AI provider, which has its own route), a
|
|
3142
|
+
* host outside the provider's, a path that could leave that host, a path
|
|
3143
|
+
* that isn't one of an OAuth client's token endpoints, or a route a service
|
|
3144
|
+
* capability doesn't declare. `settings` resolves an API-key provider's
|
|
3145
|
+
* `hostSetting` (a Shopify store's host); `lookup` is where the id is found,
|
|
3146
|
+
* the catalog alone by default.
|
|
3147
|
+
*/
|
|
3148
|
+
export declare function parseIntegrationProxyPath(pathname: string, search: string, settings?: CapabilitySettings, lookup?: CapabilityLookup): IntegrationProxyRoute | null;
|
|
3149
|
+
/**
|
|
3150
|
+
* The token endpoint `upstream` is, by its exact host and path, or null.
|
|
3151
|
+
* Its method is the caller's to check.
|
|
3152
|
+
*/
|
|
3153
|
+
export declare function tokenEndpointFor(capability: OAuthClientCapability, upstream: URL): OAuthTokenEndpoint | null;
|
|
3154
|
+
/** An OAuth client's token endpoints, as `POST https://host/path` lines for messages. */
|
|
3155
|
+
export declare function describeTokenEndpoints(capability: OAuthClientCapability): string;
|
|
3156
|
+
/**
|
|
3157
|
+
* The command that gives the gateway `capability`'s client:
|
|
3158
|
+
* `pnpm everyapp secret set <ID> <SECRET>`.
|
|
3159
|
+
*/
|
|
3160
|
+
export declare function oauthClientSecretSetCommand(capability: OAuthClientCapability): string;
|
|
3161
|
+
/**
|
|
3162
|
+
* Whether `pathname` reaches one of the capability's account-wide paths,
|
|
3163
|
+
* however it is spelled: percent-encoded (twice, even), in another case,
|
|
3164
|
+
* with a suffix on a segment, with doubled or backslash separators, or with
|
|
3165
|
+
* a trailing segment. A path that doesn't decode, or that holds control
|
|
3166
|
+
* characters or whitespace once decoded, counts as one; so does anything
|
|
3167
|
+
* outside ASCII for a provider that has account-wide paths, since how it
|
|
3168
|
+
* folds case is its own business.
|
|
3169
|
+
*/
|
|
3170
|
+
export declare function isAccountWidePath(capability: ApiKeyCapability, pathname: string): boolean;
|
|
3171
|
+
/** The base64 of `text`'s UTF-8 bytes (`btoa` takes Latin-1 only). */
|
|
3172
|
+
export declare function base64Utf8(text: string): string;
|
|
3173
|
+
export {};
|
|
3174
|
+
//# sourceMappingURL=capabilities.d.ts.map
|