@jskit-ai/connectors-catalog 0.1.1
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/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Salesforce
|
|
2
|
+
|
|
3
|
+
Use `salesforceProvider` from `@jskit-ai/connectors-catalog/server/salesforce`.
|
|
4
|
+
This initial library connects an org through an own confidential OAuth web
|
|
5
|
+
registration, verifies API access and exposes object metadata and SOQL reads.
|
|
6
|
+
It uses Salesforce REST API v66.0. CLI and editor configuration share one schema;
|
|
7
|
+
the connection service handles consent, encrypted file state and refresh.
|
|
8
|
+
|
|
9
|
+
## Portable configuration
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"schemaVersion": 1,
|
|
14
|
+
"integrations": {
|
|
15
|
+
"crm": {
|
|
16
|
+
"provider": "salesforce",
|
|
17
|
+
"displayName": "Customer CRM",
|
|
18
|
+
"accountMode": "per-user",
|
|
19
|
+
"scopes": ["api", "refresh_token"],
|
|
20
|
+
"settings": {
|
|
21
|
+
"environment": "production",
|
|
22
|
+
"accountUrl": "https://acme.my.salesforce.com"
|
|
23
|
+
},
|
|
24
|
+
"authentication": { "method": "oauth2", "registrationRef": "salesforce" }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"registrations": {
|
|
28
|
+
"salesforce": {
|
|
29
|
+
"source": "own",
|
|
30
|
+
"clientId": "replace-with-consumer-key",
|
|
31
|
+
"clientSecretRef": "env:SALESFORCE_CLIENT_SECRET",
|
|
32
|
+
"callbackUrlRef": "env:SALESFORCE_CALLBACK_URL"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The client ID is public configuration. Resolve secret/callback references from
|
|
39
|
+
Env or the application's secret owner. Never paste a secret or an actual
|
|
40
|
+
callback URL into a reference field. File runtime state belongs outside source,
|
|
41
|
+
protected with a durable operator-owned encryption key. No editor database is
|
|
42
|
+
required. See the packaged `connectors/oauth-connection` AI pattern for the
|
|
43
|
+
shared server/CLI composition and its Salesforce example.
|
|
44
|
+
|
|
45
|
+
| Input | Stored value and behavior |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Display name | Application-owned label, independent of the provider app name. |
|
|
48
|
+
| Account ownership | `shared`, `per-user` or `assistant`; the host authorizes the real stable subject. |
|
|
49
|
+
| Environment | `production` (default) or `sandbox`. Developer Edition uses Production. |
|
|
50
|
+
| Account URL | Lowercase HTTPS My Domain root. Production accepts `.my.salesforce.com` and `.develop.my.salesforce.com`; Sandbox requires `.sandbox.my.salesforce.com`. An optional trailing slash is preserved. |
|
|
51
|
+
| Client ID | Consumer Key issued to the External Client App. |
|
|
52
|
+
| Client secret reference | Indirect server secret; the runtime uses POST client authentication. |
|
|
53
|
+
| Callback reference | The exact registered backend callback, resolved at runtime. |
|
|
54
|
+
| Permissions | `api` for these operations; `refresh_token` for unattended renewal. |
|
|
55
|
+
|
|
56
|
+
Paths, query strings, userinfo, ports, generic login/test URLs, other hosts and
|
|
57
|
+
mismatched environments fail validation. Both OAuth endpoints and all API
|
|
58
|
+
requests use the configured My Domain. A token for a different `instance_url`
|
|
59
|
+
is rejected, rather than redirecting credentials to the returned destination.
|
|
60
|
+
Legacy instance hosts, Experience Cloud and sovereign domains are outside this
|
|
61
|
+
fragment. My Domain changes require updating configuration and reconnecting.
|
|
62
|
+
|
|
63
|
+
The `api` scope can authorize writes according to the Salesforce user's rights;
|
|
64
|
+
it is not a read-only scope. This adapter exposes reads only, and the application
|
|
65
|
+
must authorize the requested objects, fields and queries. `per-user` selects
|
|
66
|
+
individual connection ownership; it does not implement Salesforce login or
|
|
67
|
+
create an application session.
|
|
68
|
+
|
|
69
|
+
## Create and configure the provider app
|
|
70
|
+
|
|
71
|
+
Use an org whose edition and user permissions support API access. Current
|
|
72
|
+
Salesforce guidance restricts creation of old Connected Apps; use an External
|
|
73
|
+
Client App for a new integration. Existing registrations can continue subject
|
|
74
|
+
to their policies. [Salesforce's migration notice](https://help.salesforce.com/s/articleView?id=005228017&language=en_US&type=1).
|
|
75
|
+
|
|
76
|
+
1. Sign into the intended Salesforce org. Open the gear menu, then **Setup**.
|
|
77
|
+
Enter **My Domain** in Quick Find and copy the current login URL. Use that
|
|
78
|
+
root in Account URL; select the matching environment.
|
|
79
|
+
2. Search Setup for **External Client App Manager**. Select **New External
|
|
80
|
+
Client App** (also available through App Manager in supported org UIs).
|
|
81
|
+
Enter the app name, unique API name and contact email. Add a meaningful
|
|
82
|
+
description. Keep distribution **Local** for an app used only by this org.
|
|
83
|
+
3. Enable the app's OAuth settings. Enter your backend's exact callback URL;
|
|
84
|
+
preserve its scheme, host and path. Select **Manage user data via APIs
|
|
85
|
+
(api)** and **Perform requests at any time (refresh_token, offline_access)**.
|
|
86
|
+
This configuration requests the `refresh_token` spelling of that permission.
|
|
87
|
+
4. Keep **Require Proof Key for Code Exchange (PKCE)** enabled. Require the
|
|
88
|
+
secret for **Web Server Flow** and **Refresh Token Flow**. The runtime
|
|
89
|
+
implements confidential authorization-code exchange with S256 PKCE.
|
|
90
|
+
5. Save/create the app. Open its **Settings**, then **OAuth Settings** and
|
|
91
|
+
**Consumer Key and Secret**. Complete any email verification Salesforce
|
|
92
|
+
requires. Copy Consumer Key into Client ID; save Consumer Secret in the
|
|
93
|
+
secret binding referenced by the configuration.
|
|
94
|
+
6. An org administrator reviews the app's **Policies**: permitted users,
|
|
95
|
+
session/refresh lifetime, IP restrictions and refresh-token rotation.
|
|
96
|
+
If admin preauthorization is required, grant the app to the intended users
|
|
97
|
+
through their permission sets/profiles. Ensure those users have API access
|
|
98
|
+
and only the object/field/record permissions the application needs.
|
|
99
|
+
7. Set the callback binding to the registered URL. Save `integrations.json`,
|
|
100
|
+
then begin authorization from the application. Choose the intended Salesforce
|
|
101
|
+
account and approve access. Verification reads limits; saving the editor form
|
|
102
|
+
alone never completes consent.
|
|
103
|
+
|
|
104
|
+
The two responsibilities are separate: app developers control its settings;
|
|
105
|
+
subscriber administrators control their org's policies. A Local app is limited
|
|
106
|
+
to its own org. A distributable External Client App uses **Packaged** distribution
|
|
107
|
+
and a second-generation managed package, installed into each subscriber org.
|
|
108
|
+
[External Client App ownership and distribution](https://trailhead.salesforce.com/content/learn/modules/external-client-app-basics/use-external-client-apps-when-connected-apps-wont-do).
|
|
109
|
+
|
|
110
|
+
## Operations
|
|
111
|
+
|
|
112
|
+
| Operation | Input | Result |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `limits.read` | `{}` | Current org allocations; also the connection check. |
|
|
115
|
+
| `objects.list` | `{}` | Available object summaries, including queryability. |
|
|
116
|
+
| `objects.describe` | `{ "object": "Account" }` | Fields and metadata for exactly that object API name. Custom names such as `ns__Widget__c` are supported. |
|
|
117
|
+
| `query.read` | `{ "q": "SELECT Id, Name FROM Account ORDER BY Id LIMIT 20" }` | One SOQL result page, preserving records, `totalSize`, `done` and any continuation. |
|
|
118
|
+
| `query.next` | `{ "nextRecordsUrl": "/services/data/v66.0/query/<locator>-2000" }` | One continuation page, with the same configured host and connection. |
|
|
119
|
+
|
|
120
|
+
Queries are single-line SELECT statements, at most 2,000 characters and 3,000
|
|
121
|
+
UTF-8 bytes. This fragment rejects `FOR UPDATE`, `FOR VIEW` and `FOR REFERENCE`;
|
|
122
|
+
it has no record write, MRU-update or explicit locking operation. The query
|
|
123
|
+
endpoint itself enforces SOQL syntax and user access. Never build SOQL by
|
|
124
|
+
concatenating untrusted request text. Use server-owned queries with deliberately
|
|
125
|
+
validated/escaped values and authorize the complete operation input.
|
|
126
|
+
|
|
127
|
+
Pages contain at most 2,000 top-level records. Subqueries can contain nested
|
|
128
|
+
records; the host must bound its query and overall rendering/workload. `done`
|
|
129
|
+
controls continuation, not the number of returned records. Only a relative
|
|
130
|
+
v66.0 Query cursor path is accepted; foreign URLs, other API resources, query
|
|
131
|
+
strings and path traversal fail before transport. Keep each cursor associated
|
|
132
|
+
with its originating query and owner in application state. There is no automatic
|
|
133
|
+
crawl. An expired locator returns `connector_cursor_expired`; start an authorized
|
|
134
|
+
query again. [Salesforce query and pagination behavior](https://developer.salesforce.com/blogs/2022/12/processing-large-amounts-of-data-with-apis-part-1-of-2).
|
|
135
|
+
|
|
136
|
+
## Token lifecycle and errors
|
|
137
|
+
|
|
138
|
+
Salesforce may omit access-token expiry because session lifetime is controlled
|
|
139
|
+
by org/app policy. For that response, this adapter schedules local renewal after
|
|
140
|
+
five minutes (the core refreshes shortly before that boundary). This is a renewal
|
|
141
|
+
policy, not a promise that the provider session lasts five minutes. An explicit
|
|
142
|
+
`expires_in` is honored. Renewal occurs on the next operation, not from a
|
|
143
|
+
background timer. Rotated refresh tokens persist under the existing file lock;
|
|
144
|
+
a response without a new refresh token retains the previous token. If none was
|
|
145
|
+
granted, renewal requires consent again.
|
|
146
|
+
[Web server flow](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_web_server_flow.htm&language=en_US&type=5),
|
|
147
|
+
[refresh flow](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_refresh_token_flow.htm&language=en_US&type=5).
|
|
148
|
+
|
|
149
|
+
An invalid session or revoked refresh requires reconnecting; operations are not
|
|
150
|
+
automatically replayed. Failed replacement consent preserves a previous grant.
|
|
151
|
+
Org, registration or ownership changes cannot reuse an existing grant. A changed
|
|
152
|
+
secret binding is resolved on the next exchange. Scope reductions remain visible
|
|
153
|
+
and block operations without API permission. Disconnect removes the local
|
|
154
|
+
connection/attempts; revoke provider access separately in Salesforce when needed.
|
|
155
|
+
|
|
156
|
+
`REQUEST_LIMIT_EXCEEDED` is reported as an org rate limit even when Salesforce
|
|
157
|
+
returns HTTP 403. Other permission failures, invalid queries, missing resources,
|
|
158
|
+
expired cursors and reconnect states remain distinct. Provider error bodies are
|
|
159
|
+
not exposed as user messages. Cancellation/deadlines do not replay a request.
|
|
160
|
+
|
|
161
|
+
## Application ownership, callbacks and capacity
|
|
162
|
+
|
|
163
|
+
The application owner creates the provider registration and stores its secret
|
|
164
|
+
in the application's private Env. Public Vibe64, Vibe64 Online and CLI users use
|
|
165
|
+
this same ownership model. The configuration file holds the client ID and Env
|
|
166
|
+
references; the editor does not own the application's grants.
|
|
167
|
+
|
|
168
|
+
Register the exact callback implemented by the application. For a hosted project,
|
|
169
|
+
start with its assigned application URL and append the implemented callback path.
|
|
170
|
+
Save that same URL through the application's callback Env reference. On a domain
|
|
171
|
+
or host change, update both the provider registration and callback Env if the URL
|
|
172
|
+
changes. Preserve the application's identity and persistent grant store when
|
|
173
|
+
moving it; neither a new editor URL nor a new hosting address creates a new owner.
|
|
174
|
+
See the [callback guide](../../connectors-core/docs/oauth-callbacks.md) and
|
|
175
|
+
[application setup command](../../connectors-core/docs/setup-command.md).
|
|
176
|
+
|
|
177
|
+
For cross-customer org access, package and install the application as described
|
|
178
|
+
above; creating a Local app does not make it universally available. The app owns
|
|
179
|
+
its distribution, secrets and policy decisions, with each Salesforce org granting
|
|
180
|
+
its required access.
|
|
181
|
+
|
|
182
|
+
Separate client IDs do not divide an org's Daily API Request allowance. Apps
|
|
183
|
+
using the same org share that capacity; no registration name grants extra quota.
|
|
184
|
+
[Salesforce API allocation ownership](https://developer.salesforce.com/blogs/2024/11/api-limits-and-monitoring-your-api-usage).
|
|
185
|
+
|
|
186
|
+
## Automation feasibility and verification
|
|
187
|
+
|
|
188
|
+
An AI with authorized Salesforce developer/admin tooling can prepare External
|
|
189
|
+
Client App metadata and deploy it through Salesforce CLI/Metadata API. The
|
|
190
|
+
provider's documented types include `ExternalClientApplication`,
|
|
191
|
+
`ExtlClntAppGlobalOauthSettings` and `ExtlClntAppOauthSettings`. Their settings
|
|
192
|
+
cover distribution, callbacks and scopes; sensitive OAuth settings have separate
|
|
193
|
+
handling. Use an already authorized org and the exact supported metadata version.
|
|
194
|
+
[Salesforce's metadata/CLI walkthrough](https://trailhead.salesforce.com/content/learn/projects/create-an-external-client-app-using-metadata-api/create-an-external-client-app).
|
|
195
|
+
|
|
196
|
+
The operator still owns account creation, authorization, sensitive consumer-detail
|
|
197
|
+
access, subscriber installation and policies. No unattended signup, approval or
|
|
198
|
+
secret retrieval is promised. Prepare and review the application's metadata
|
|
199
|
+
before an authorized deployment; this adapter performs none of those provisioning
|
|
200
|
+
writes. It does not bypass the restrictions on old Connected App creation.
|
|
201
|
+
|
|
202
|
+
Automated evidence uses controlled HTTP responses, actual encrypted temporary
|
|
203
|
+
files and the editor form. It covers both environments, PKCE, renewal/rotation,
|
|
204
|
+
owner/org binding, query/cursor limits, malformed replies, cancellation and
|
|
205
|
+
save/reload. Live org access, real consent, queries against
|
|
206
|
+
customer data and application generation are outside this delivery's tests.
|
|
207
|
+
Writes, Bulk API, SOAP, streaming, MCP, client-credentials/JWT grants, identity
|
|
208
|
+
login and additional domains remain outside the initial runtime fragment.
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
## Existing-scope closeout — 13 September 2026
|
|
212
|
+
|
|
213
|
+
Supported operations are `limits.read`, `objects.list`, `objects.describe`,
|
|
214
|
+
`query.read` and `query.next`, through project-owned confidential OAuth on the
|
|
215
|
+
configured production/developer/sandbox My Domain. Source and offline installed
|
|
216
|
+
public-export tests each pass 13/13, including the packaged configuration example.
|
|
217
|
+
Historical editor form proof is retained; no new browser run or runtime/form
|
|
218
|
+
change was needed for this closeout.
|
|
219
|
+
|
|
220
|
+
Deferred work and limitations: record create/update/delete and relationship
|
|
221
|
+
mutations, bulk/partial-write handling, SOAP, streaming/events, MCP, automatic
|
|
222
|
+
pagination, query building/parameter binding, client-credentials/JWT or other
|
|
223
|
+
grants, identity login, Experience Cloud/sovereign/legacy instance hosts and API
|
|
224
|
+
versions other than v66.0. Queries are bounded single-line SELECT inputs, not an
|
|
225
|
+
unrestricted query console; host policy must authorize objects, fields and query
|
|
226
|
+
text. The adapter rejects FOR UPDATE/VIEW/REFERENCE effects. It does not provision
|
|
227
|
+
orgs/apps, assign permissions or bypass API capacity. API-limit verification alone
|
|
228
|
+
does not establish access to a particular object or field. A missing token expiry
|
|
229
|
+
uses a five-minute local renewal policy, not a provider lifetime guarantee.
|
|
230
|
+
Disconnect removes local grants only; provider revocation remains an org/admin
|
|
231
|
+
action. Native framework routes, business UI, app sessions and access policy are
|
|
232
|
+
application-owned. Editor coding-agent attachment, live org/consent/data outcomes
|
|
233
|
+
and generated-app execution remain deferred or unverified. The original broader
|
|
234
|
+
CRM checklist stays backlog; this is not full Lovable parity.
|
package/docs/sanity.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Sanity assistant MCP connection
|
|
2
|
+
|
|
3
|
+
Import `sanityProvider` from `@jskit-ai/connectors-catalog/server/sanity`.
|
|
4
|
+
Configure `accountMode: "assistant"`. OAuth uses a project-owned MCP client,
|
|
5
|
+
`global` scope and callback/secret Env references. API-key mode instead uses a
|
|
6
|
+
Sanity token reference. Transport remains fixed at `https://mcp.sanity.io/`;
|
|
7
|
+
this is builder context, not a generated-app login or REST content service.
|
|
8
|
+
|
|
9
|
+
## OAuth registration and consent
|
|
10
|
+
|
|
11
|
+
Sanity's public metadata advertises issuer `https://mcp.sanity.io`, resource
|
|
12
|
+
`https://mcp.sanity.io` (no trailing slash), `/authorize`, `/token`, `/register`,
|
|
13
|
+
S256 and the single `global` scope. Keep the resource value exact even though
|
|
14
|
+
MCP transport uses the root URL. Metadata was read without authentication;
|
|
15
|
+
no client or provider account was created during implementation.
|
|
16
|
+
|
|
17
|
+
In Vibe64 development settings, choose **Register client and connect** after
|
|
18
|
+
setting the suggested callback. The existing owner-authorized action saves the
|
|
19
|
+
client ID in configuration, saves secret/callback/recovery ID in Env and starts
|
|
20
|
+
the application's setup command. It refuses occupied Env keys and stale source.
|
|
21
|
+
An uncertain outcome requires inspection before retrying. This does not register
|
|
22
|
+
a central Vibe64 client.
|
|
23
|
+
|
|
24
|
+
For manual setup, use the OAuth client registration screen's JSON, or invoke
|
|
25
|
+
`registerSanityClient({ clientName, callbackUrl, scopes: ["global"] })` from
|
|
26
|
+
`@jskit-ai/connectors-catalog/server/sanity` in an authorized CLI. Register once,
|
|
27
|
+
then save the returned client ID and private client secret into your own
|
|
28
|
+
configuration/Env. Investigate an interrupted request before retrying, because
|
|
29
|
+
the provider may already have created the client. Use the exact backend callback
|
|
30
|
+
suggested by your project. No central Vibe64 callback or managed registration.
|
|
31
|
+
|
|
32
|
+
Connect and consent only after the backend serves that callback. Sanity account
|
|
33
|
+
permissions govern the grant; the host must still authorize project/dataset
|
|
34
|
+
arguments and tools. The single global scope is not a per-project permission UI.
|
|
35
|
+
The token mode below remains an alternative.
|
|
36
|
+
|
|
37
|
+
## Manual setup
|
|
38
|
+
|
|
39
|
+
1. Sign in to **sanity.io/manage** and select the project.
|
|
40
|
+
2. Open **Settings → API → Tokens → Add new token** with an appropriate admin
|
|
41
|
+
role. Set a descriptive name, the required role and optional expiry.
|
|
42
|
+
3. Copy the token once displayed. Store it in Env and enter its reference in
|
|
43
|
+
the integration's **MCP API token reference** field.
|
|
44
|
+
4. Save configuration and verify MCP discovery before approving tool calls.
|
|
45
|
+
|
|
46
|
+
Sanity documents both [token creation](https://www.sanity.io/docs/content-lake/http-auth)
|
|
47
|
+
and [MCP bearer authentication](https://www.sanity.io/docs/ai/mcp-server).
|
|
48
|
+
A project token has project authority; personal and organization tokens have
|
|
49
|
+
different reach. Choose the credential for the actual tools required, and
|
|
50
|
+
avoid distributing a personal account's broad token to an application.
|
|
51
|
+
|
|
52
|
+
## Runtime and assistant policy
|
|
53
|
+
|
|
54
|
+
The runtime shares the core's authorization, secret resolution and encrypted
|
|
55
|
+
text storage. It verifies initialization and `tools.list`, not every tool's
|
|
56
|
+
permission. `tools.list` accepts an opaque optional cursor. `tools.call` requires
|
|
57
|
+
the advertised tool `name` and an `arguments` object. The assistant host must
|
|
58
|
+
authorize both values through its existing delegated-access policy before the
|
|
59
|
+
call. It must also validate arguments against the chosen tool contract and
|
|
60
|
+
handle untrusted tool descriptions and results as external data.
|
|
61
|
+
|
|
62
|
+
Sanity tools may modify content or administer resources. Selecting this
|
|
63
|
+
connector does not grant permission for such actions. The host decides which
|
|
64
|
+
tools are available and when user approval is needed. No automatic SDK resource,
|
|
65
|
+
prompt, elicitation or sampling capabilities are enabled here.
|
|
66
|
+
|
|
67
|
+
JSON and SSE responses use the official MCP client. Each operation initializes
|
|
68
|
+
a temporary session, carries credentials only to the fixed endpoint, attempts
|
|
69
|
+
session deletion, and closes local streams. The 15-second request bound and
|
|
70
|
+
cancellation do not roll back remote changes. Tool `isError` results remain
|
|
71
|
+
visible to the caller; failed protocol exchanges are sanitized. An HTTP 401
|
|
72
|
+
requires reconnecting. Token rotation resolves the current Env value on each
|
|
73
|
+
call without putting it into source.
|
|
74
|
+
|
|
75
|
+
## Useful context and native framework wiring
|
|
76
|
+
|
|
77
|
+
An explicitly wired assistant host first calls `tools.list` and inspects the
|
|
78
|
+
returned input schemas. Choose the authorized project and dataset in tool inputs;
|
|
79
|
+
these are not global editor credentials or application login settings. For schema
|
|
80
|
+
context, use `get_schema`; when multiple deployed schemas exist, use
|
|
81
|
+
`list_workspace_schemas` to select the intended schema. For content, use
|
|
82
|
+
`query_documents` with a bounded GROQ projection and slice. Treat tool availability
|
|
83
|
+
and argument schemas as provider-owned discovery, not a permanently copied list.
|
|
84
|
+
|
|
85
|
+
The JSKIT host invokes `service.invoke({ context, integrationId,
|
|
86
|
+
operation: "tools.call", input: { name, arguments } })`. Its authorization callback
|
|
87
|
+
must approve the exact project, dataset and arguments before execution. A proposed
|
|
88
|
+
content write needs that same review, not merely permission to list tools. Keep
|
|
89
|
+
results as data; do not execute instructions embedded in content.
|
|
90
|
+
|
|
91
|
+
A non-JavaScript host uses its framework's MCP client, OAuth implementation and
|
|
92
|
+
private token store with the same fixed endpoint and Env references. It does not
|
|
93
|
+
run JSKIT or call an editor server for content. The generated application can use
|
|
94
|
+
its own Sanity SDK for runtime content; this builder-context connection does not
|
|
95
|
+
automatically become a public site's credential. CLI composition uses the same
|
|
96
|
+
configuration and runtime API without Vibe64. Neither path automatically attaches
|
|
97
|
+
these tools to Vibe64's coding assistant.
|
|
98
|
+
|
|
99
|
+
## Automation and application ownership
|
|
100
|
+
|
|
101
|
+
After authorized login, AI can use the documented
|
|
102
|
+
[Sanity tokens CLI](https://www.sanity.io/docs/cli-reference/tokens) to manage
|
|
103
|
+
tokens. Sanity's [Access API](https://www.sanity.io/docs/content-lake/http-auth)
|
|
104
|
+
also supports robot-token creation with permissions. Our fragment does not
|
|
105
|
+
perform provisioning or request account administration automatically.
|
|
106
|
+
|
|
107
|
+
The API-token mode has no OAuth client ID. The application owner supplies its project
|
|
108
|
+
token through private Env. Separate tokens on one project do not promise separate
|
|
109
|
+
provider quotas or billing. Confirm the project/organization limits for the
|
|
110
|
+
application's usage. OAuth uses the same MCP transport with a separately issued user grant.
|
|
111
|
+
|
|
112
|
+
## Proof and limits
|
|
113
|
+
|
|
114
|
+
The shared MCP suite exercises the real SDK with local response fixtures and
|
|
115
|
+
real encrypted files: JSON/SSE, protocol negotiation, discovery/calls, scoped
|
|
116
|
+
owner policy, restart, token rotation, failures and cancellation. OAuth fixtures additionally cover issuer/resource/PKCE binding, restart/refresh,
|
|
117
|
+
registration failure, schema and bounded content retrieval, denied dataset/query
|
|
118
|
+
changes and disconnection cleanup. Tool payloads/results are controlled fixtures;
|
|
119
|
+
this does not certify current live Sanity schemas. Editor proof covers token
|
|
120
|
+
reference validation/reload and OAuth registration, cancellation, reconnect and
|
|
121
|
+
disconnect on phone and desktop. Live Sanity access, real OAuth consent,
|
|
122
|
+
automatic assistant attachment and generated applications are not exercised.
|
package/docs/semrush.md
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# Semrush
|
|
2
|
+
|
|
3
|
+
Import `semrushProvider` from `@jskit-ai/connectors-catalog/server/semrush`.
|
|
4
|
+
This adapter manages Projects API V4 records and reads keyword/backlink reports using an application-owned V4 API key.
|
|
5
|
+
It works with the shared CLI/server connection service and encrypted file store;
|
|
6
|
+
Vibe64 edits the same portable configuration. Saving fields does not verify a key.
|
|
7
|
+
|
|
8
|
+
## Create and configure a key
|
|
9
|
+
|
|
10
|
+
1. Sign into the Semrush account that will own the usage. Projects API access
|
|
11
|
+
requires SEO Business and available API units. Check that account's entitlement
|
|
12
|
+
before provisioning; a key alone does not supply API access.
|
|
13
|
+
2. Open the top-right profile icon. In **My profile**, choose **API Keys**.
|
|
14
|
+
3. Choose **+ Create API key** and create a **V4** key. Give it an application
|
|
15
|
+
name, select **Read-only** for reads or **Read and write** for creating or
|
|
16
|
+
renaming or deleting projects, and choose an expiry appropriate for the host.
|
|
17
|
+
4. Copy the value when shown. Store it in the runtime's environment or secret
|
|
18
|
+
store; configure only its reference below. The full value is shown once.
|
|
19
|
+
5. Save the JSON through the CLI or Vibe64. Explicitly call `connectApiKey` to
|
|
20
|
+
verify accessible projects. Empty project lists are valid.
|
|
21
|
+
6. For rotation, create a replacement V4 key, update the same binding, verify
|
|
22
|
+
access, then revoke the old key in the provider portal. Changing just the
|
|
23
|
+
environment value does not require rewriting source configuration.
|
|
24
|
+
|
|
25
|
+
Sources: [key creation](https://developer.semrush.com/api/v4/get-started/quick-start/),
|
|
26
|
+
[permissions and expiry](https://developer.semrush.com/api/v4/get-started/authorization/),
|
|
27
|
+
[Projects prerequisites](https://developer.semrush.com/api/v4/projects/overview/).
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"schemaVersion": 1,
|
|
32
|
+
"registrations": {},
|
|
33
|
+
"integrations": {
|
|
34
|
+
"seo": {
|
|
35
|
+
"provider": "semrush",
|
|
36
|
+
"displayName": "Marketing projects",
|
|
37
|
+
"accountMode": "shared",
|
|
38
|
+
"scopes": [],
|
|
39
|
+
"authentication": {
|
|
40
|
+
"method": "api-key",
|
|
41
|
+
"secretRef": "env:SEMRUSH_V4_KEY"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`assistant` is also supported when the host authorizes that assistant. Neither
|
|
49
|
+
mode creates individual provider accounts for app users. The current form has
|
|
50
|
+
no client registration, callback or scope checkboxes. API-key permissions are
|
|
51
|
+
chosen in Semrush. V3 keys cannot be substituted for V4 keys; OAuth access tokens
|
|
52
|
+
are another credential type. [API versions](https://developer.semrush.com/api/v4/introduction/api-versions/)
|
|
53
|
+
|
|
54
|
+
## Runtime operations
|
|
55
|
+
|
|
56
|
+
| Operation | Input | Result |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| `projects.list` (verification) | Optional `scope`: `OWN` (default), `ALL`, `SHARED`, `CORPORATE`; `limit`: 1–1000 (default 100); `offset`: nonnegative safe integer (default 0) | Original `meta` and `data` envelope, including total count and project permissions |
|
|
59
|
+
| `projects.get` | Required positive safe-integer `projectId` | Project envelope; returned ID must match the request |
|
|
60
|
+
| `projects.create` | `domain` without a protocol/path and `project_name` | Created project envelope with assigned ID; the name/domain must match the request |
|
|
61
|
+
| `projects.update` | `projectId` and nonempty `project_name` | Renamed project envelope; changing the domain is not supported |
|
|
62
|
+
|
|
63
|
+
The adapter uses `https://api.semrush.com/apis/v4/projects/v1/projects` and the
|
|
64
|
+
documented `Apikey` header. It makes one explicit request per operation, does
|
|
65
|
+
not follow redirects or fetch later pages, and rejects malformed responses,
|
|
66
|
+
unsafe numeric IDs and mismatched pagination. Project results include provider
|
|
67
|
+
ownership and permission metadata; the host must still authorize the caller
|
|
68
|
+
and the particular project. List scope is an operation filter, not an OAuth scope.
|
|
69
|
+
[Projects API](https://developer.semrush.com/api/v4/projects/projects/)
|
|
70
|
+
|
|
71
|
+
Creation uses POST; rename uses PATCH. These operations require a provider key
|
|
72
|
+
with Read and write access plus application authorization before key resolution.
|
|
73
|
+
They are never automatic connection checks. Save the returned provider project ID
|
|
74
|
+
in application-owned data. If a request fails after submission, inspect the
|
|
75
|
+
project list/current name before deciding whether to repeat it; a failed response
|
|
76
|
+
is not proof that Semrush made no change. No automatic retry or idempotency
|
|
77
|
+
guarantee is supplied.
|
|
78
|
+
|
|
79
|
+
`projects.delete({ projectId })` permanently removes the provider project, including
|
|
80
|
+
its tools, settings and history. The application must authorize deletion and obtain
|
|
81
|
+
user confirmation before invoking it. A successful response contains the matching
|
|
82
|
+
project ID. This is separate from disconnecting a local connection. An uncertain
|
|
83
|
+
response is never retried automatically; inspect the provider before proceeding.
|
|
84
|
+
Reports are implemented as described below. OAuth and individual app-user login are not supported; project-owned API keys are the accepted authentication scope.
|
|
85
|
+
|
|
86
|
+
HTTP-200 error envelopes are failures. Bad-key codes require reconnection;
|
|
87
|
+
disabled access becomes a permission error; exhausted capacity becomes
|
|
88
|
+
`connector_quota_limited`; missing projects become `connector_resource_not_found`.
|
|
89
|
+
Provider error messages are not exposed. HTTP transport failures use the common
|
|
90
|
+
connector errors. An aborted read is not replayed. Local disconnect removes
|
|
91
|
+
connection state; it does not revoke the provider key.
|
|
92
|
+
[Error codes](https://developer.semrush.com/api/v4/projects/overview/)
|
|
93
|
+
|
|
94
|
+
## Application and callback ownership
|
|
95
|
+
|
|
96
|
+
The application owner supplies the Semrush account and key. CLI, installed
|
|
97
|
+
editor and hosted editor use the same configuration file and private Env
|
|
98
|
+
reference. The editor does not provide a provider account, retain the key in a
|
|
99
|
+
central connector service or assign capacity based on the editor subscription.
|
|
100
|
+
|
|
101
|
+
For this V4 key flow, a universal OAuth callback is **not applicable**. VPS
|
|
102
|
+
addresses and custom domains do not change provider key authentication. The
|
|
103
|
+
application owner supplies its authorized key through private Env and retains
|
|
104
|
+
that ownership when moving hosts.
|
|
105
|
+
|
|
106
|
+
Separate keys on one account share its capacity. The documented general limits
|
|
107
|
+
are per account, including 10 requests per second and 10 simultaneous requests;
|
|
108
|
+
API-unit and subscription limits also apply. Independent capacity needs an
|
|
109
|
+
approved account/subscription arrangement, not just two named keys. The guide
|
|
110
|
+
does not establish permission to redistribute provider data through arbitrary
|
|
111
|
+
customer apps. [Usage restrictions](https://developer.semrush.com/api/v4/introduction/api-usage-restrictions/)
|
|
112
|
+
|
|
113
|
+
## Captured OAuth variant and automation
|
|
114
|
+
|
|
115
|
+
The reference UI offered `user.id`, `user.limits`, `url.info`, `domains.info`,
|
|
116
|
+
`backlinks.info`, `subfolders.info`, `projects.info`, and `positiontracking.info`.
|
|
117
|
+
That journey is an explicit accepted limitation of this connector. Semrush now deprecates the previous
|
|
118
|
+
OAuth Projects endpoints and recommends the current V4 API for new integrations.
|
|
119
|
+
Its documented OAuth client credentials require contacting support; device
|
|
120
|
+
authorization is a different flow. Do not invent a universal redirect approval
|
|
121
|
+
or claim that these eight permissions are implemented by the V4 key adapter.
|
|
122
|
+
[OAuth guidance](https://developer.semrush.com/api/v4/get-started/authorization/)
|
|
123
|
+
|
|
124
|
+
| Task | Automation assessment |
|
|
125
|
+
|---|---|
|
|
126
|
+
| Create or rotate application keys | No general key-provisioning API was found in the reviewed public setup documentation. An authorized browser operator can assist with the portal steps; account access remains required. |
|
|
127
|
+
| Create an application-owned OAuth registration | Provider support is the documented prerequisite. Scope/callback approval and the runtime journey remain unfinished. |
|
|
128
|
+
| Configure a CLI or application | AI can write the JSON, compose the library and wire host authorization using externally supplied references. No generated template is required. |
|
|
129
|
+
| Read provider projects | Implemented through the documented API with controlled local tests. No actual provider account was used. |
|
|
130
|
+
|
|
131
|
+
## Verification
|
|
132
|
+
|
|
133
|
+
Fifteen focused runtime tests cover file persistence/restart, ownership, rotation,
|
|
134
|
+
input and response validation, pagination, error codes, transport errors and
|
|
135
|
+
interruption, project creation/rename/deletion, write authorization and no replay after
|
|
136
|
+
uncertain results. All fifteen also pass in an isolated consumer installed from
|
|
137
|
+
the packed catalogue, importing only public package exports. Current phone and
|
|
138
|
+
desktop editor checks cover V4 and optional V3 references, raw-secret rejection,
|
|
139
|
+
ownership, exact file content, setup instructions and reload persistence. The
|
|
140
|
+
phone flow explicitly dismisses the saved notification before its next edit.
|
|
141
|
+
Live registrations, provider data, generated applications and managed onboarding
|
|
142
|
+
have not been tested.
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Keyword metrics
|
|
146
|
+
|
|
147
|
+
Invoke `keywords.metrics` with `keyword` (1–255 characters), uppercase two-letter
|
|
148
|
+
`country` and optional `month` (`YYYY-MM`, 2012-01 through the current month).
|
|
149
|
+
Semrush determines available countries; its documented United Kingdom code is
|
|
150
|
+
`UK`. Omit month for the provider's current snapshot. The adapter requests JSON
|
|
151
|
+
and returns the report envelope, preserving numeric strings such as search volume
|
|
152
|
+
and result counts without precision loss. Framework code owns presentation and
|
|
153
|
+
any caching; the connector does not fetch reports during connection checks.
|
|
154
|
+
V4 keyword reporting is Early Access and consumes account API units. Provider
|
|
155
|
+
entitlement and country availability are checked by Semrush. See the
|
|
156
|
+
[current report contract](https://developer.semrush.com/api/v4/seo/keyword-reports/).
|
|
157
|
+
Domain and position-tracking operations are described below. Captured OAuth and final provider acceptance remain open.
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
## Backlink reports
|
|
161
|
+
|
|
162
|
+
| Operation | Result |
|
|
163
|
+
|---|---|
|
|
164
|
+
| `backlinks.overview` | Aggregate backlink, referring-domain/page counts and authority score. |
|
|
165
|
+
| `backlinks.list` | Individual backlinks, anchors, source and target URLs and link attributes. |
|
|
166
|
+
| `backlinks.referringDomains` | Referring domains, backlink counts and domain scores. |
|
|
167
|
+
| `backlinks.anchors` | Anchor text, backlink counts and referring-domain counts. |
|
|
168
|
+
|
|
169
|
+
Supply `url` (domain or URL, at most 2000 characters) and `scope` (`ROOT_DOMAIN`,
|
|
170
|
+
`SUBDOMAIN`, `SUBFOLDER`, `PAGE`). The target is a Semrush query parameter, never
|
|
171
|
+
a destination fetched by this connector. Reports always return JSON and retain
|
|
172
|
+
provider fields. Page operations accept `limit` (default 100, local maximum 1000),
|
|
173
|
+
`offset` (default 0), optional `order_by`, `direction` (`ASC`/`DESC`, default DESC),
|
|
174
|
+
and optional provider `filter` expression (local maximum 4000 characters).
|
|
175
|
+
Semrush validates sort fields and filter syntax. No local filter parser is added.
|
|
176
|
+
All provider fields are requested; selecting columns is left to application code.
|
|
177
|
+
|
|
178
|
+
A page request makes one API call. The caller owns pagination, cost limits and
|
|
179
|
+
stopping when no further rows are available. Metadata differs between reports;
|
|
180
|
+
anchors may omit totals and page context. The adapter preserves metadata and
|
|
181
|
+
validates supplied pagination values. Empty arrays are valid. Report URLs and
|
|
182
|
+
anchor text are provider data: use the framework's normal escaping when rendering
|
|
183
|
+
and do not interpret them as executable HTML or automatic network destinations.
|
|
184
|
+
|
|
185
|
+
The V4 reports are Early Access and consume account units. They do not run during
|
|
186
|
+
connection checks. A project-access check does not prove entitlement to every
|
|
187
|
+
report. See [Semrush's current backlink API](https://developer.semrush.com/api/v4/seo/backlinks/).
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
## Domain overview and the separate V3 key
|
|
191
|
+
|
|
192
|
+
`domains.overview({ domain: "example.com", database: "us" })` retrieves one
|
|
193
|
+
regional domain overview: rank, organic keywords/traffic/cost and paid
|
|
194
|
+
keywords/traffic/cost. It returns `{ columns, rows }`, retaining provider strings
|
|
195
|
+
and decimal precision. No data is `{ columns, rows: [] }`. Quoted CSV is decoded;
|
|
196
|
+
unexpected columns, malformed rows and decoded reports over 2 MB are rejected.
|
|
197
|
+
|
|
198
|
+
In **My profile > API Keys**, locate the autogenerated **Version 3** key and put
|
|
199
|
+
it in the project's private Env as `SEMRUSH_V3_KEY`. Add
|
|
200
|
+
`settings: { "v3ApiKeyRef": "env:SEMRUSH_V3_KEY" }` to the integration JSON or
|
|
201
|
+
fill **V3 API key reference (optional)** in Vibe64 and use **Set credential in Env**.
|
|
202
|
+
The normal authentication reference still points to the separate V4 key.
|
|
203
|
+
Leave the V3 field empty when using only V4 reports and projects.
|
|
204
|
+
|
|
205
|
+
This extra key is resolved only for V3 reports after application authorization.
|
|
206
|
+
It travels in the provider-required `key` query parameter over HTTPS; custom
|
|
207
|
+
transport instrumentation must redact query credentials. It is never sent as
|
|
208
|
+
V4 authorization. Connecting still verifies V4 projects; the V3 report itself
|
|
209
|
+
checks its own entitlement and consumes the account's API units. V3 key errors
|
|
210
|
+
do not invalidate a working V4 connection. The editor supplies neither account.
|
|
211
|
+
Other frameworks use the same Env reference and Semrush's native HTTP/CSV contract.
|
|
212
|
+
|
|
213
|
+
Sources: [V3 key setup](https://developer.semrush.com/api/v3/get-started/quick-start/),
|
|
214
|
+
[V3 authentication](https://developer.semrush.com/api/v3/get-started/authorization/),
|
|
215
|
+
[domain overview](https://developer.semrush.com/api/v3/seo/overview-reports/),
|
|
216
|
+
[report errors](https://developer.semrush.com/api/v3/seo/overview/).
|
|
217
|
+
Position tracking is described below; captured OAuth is outside the accepted API-key scope.
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
## Organic and paid keyword detail
|
|
221
|
+
|
|
222
|
+
The same optional V3 key powers these explicit report operations:
|
|
223
|
+
|
|
224
|
+
| Operation pair | Required target |
|
|
225
|
+
|---|---|
|
|
226
|
+
| `domains.organicKeywords`, `domains.paidKeywords` | `domain` |
|
|
227
|
+
| `urls.organicKeywords`, `urls.paidKeywords` | `url` |
|
|
228
|
+
| `subfolders.organicKeywords`, `subfolders.paidKeywords` | `subfolder` |
|
|
229
|
+
|
|
230
|
+
All require a lowercase regional `database` such as `us`. Use `limit` (1–1000,
|
|
231
|
+
default 100) and `offset` (default 0). The adapter translates them to Semrush's
|
|
232
|
+
`display_limit = offset + limit` contract, bounded by the provider's 4,000,000
|
|
233
|
+
result window. It does not automatically fetch the next page. Optional
|
|
234
|
+
`display_sort` supports position, traffic or volume ascending/descending;
|
|
235
|
+
`display_filter` accepts the provider's expression syntax (up to 4000 characters).
|
|
236
|
+
Optional `display_date` uses `YYYYMM15`; database-specific history and entitlement
|
|
237
|
+
are provider decisions. Historical queries can cost more units than current ones.
|
|
238
|
+
|
|
239
|
+
Results use `{ columns, rows }` with Keyword, Position, Search Volume, CPC,
|
|
240
|
+
Competition, Traffic (%) and Number of Results. Values remain strings, including
|
|
241
|
+
large counts, decimals and escaped keyword text. No-data responses return an
|
|
242
|
+
empty row list. The application owns cost approval, pagination, presentation and
|
|
243
|
+
additional storage. Vibe64 does not execute keyword reports during connection.
|
|
244
|
+
Other provider columns are not currently exposed by these focused operations.
|
|
245
|
+
|
|
246
|
+
Sources: [domain keyword reports](https://developer.semrush.com/api/v3/seo/domain-reports/),
|
|
247
|
+
[URL keyword reports](https://developer.semrush.com/api/v3/seo/url-reports/),
|
|
248
|
+
[subfolder keyword reports](https://developer.semrush.com/api/v3/seo/subfolder-reports/).
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
## Position tracking
|
|
252
|
+
|
|
253
|
+
The optional V3 key also supports `tracking.campaigns({ projectId })`,
|
|
254
|
+
`tracking.dates({ campaignId })`, `tracking.organicPositions` and
|
|
255
|
+
`tracking.paidPositions`. Start with the application-authorized project ID from
|
|
256
|
+
project discovery. Campaign discovery returns campaign IDs, devices, tracked URLs
|
|
257
|
+
and harvesting state. Use that returned campaign ID (for example `123_45`),
|
|
258
|
+
not the project ID, in dates and position reports. Existing configured campaigns
|
|
259
|
+
and harvested data are prerequisites; these operations do not create campaigns.
|
|
260
|
+
|
|
261
|
+
Position reports accept `campaignId`, optional provider-masked `url` (for example
|
|
262
|
+
`*.example.com/*`), `date_begin`/`date_end` as `YYYYMMDD`, optional provider
|
|
263
|
+
`display_filter`, and `display_limit` (1–1000, default 10)/`display_offset`
|
|
264
|
+
(default 0). These tracking pagination fields are sent directly, unlike SEO CSV
|
|
265
|
+
keyword report pagination. Use `tracking.dates` to discover available snapshots.
|
|
266
|
+
The provider determines availability for a campaign's engine and device.
|
|
267
|
+
|
|
268
|
+
The JSON response preserves keyword IDs, date-keyed rankings, visibility and
|
|
269
|
+
other provider fields. `data` may be an indexed object rather than a JS array;
|
|
270
|
+
use the framework's object-value iteration when rendering rows. The application
|
|
271
|
+
must authorize project/campaign access, review unit usage and decide whether to
|
|
272
|
+
request another page. Neither Vibe64 nor this adapter automatically polls campaigns.
|
|
273
|
+
Connecting only checks V4 project access. Errors from tracking do not invalidate
|
|
274
|
+
that separate V4 connection. No live campaigns were queried during verification.
|
|
275
|
+
|
|
276
|
+
[Position-tracking contract](https://developer.semrush.com/api/v3/projects/position-tracking/)
|