@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.
Files changed (399) hide show
  1. package/README.md +192 -0
  2. package/docs/ai-upstream-notices.md +51 -0
  3. package/docs/ai.md +191 -0
  4. package/docs/airtable.md +130 -0
  5. package/docs/algolia.md +190 -0
  6. package/docs/amazon-redshift.md +229 -0
  7. package/docs/amplitude.md +210 -0
  8. package/docs/apify.md +162 -0
  9. package/docs/apollo-io.md +200 -0
  10. package/docs/asana.md +126 -0
  11. package/docs/ashby.md +188 -0
  12. package/docs/atlassian.md +224 -0
  13. package/docs/attention.md +162 -0
  14. package/docs/aws-athena.md +150 -0
  15. package/docs/aws-credentials.md +75 -0
  16. package/docs/aws-s3.md +193 -0
  17. package/docs/bigquery.md +146 -0
  18. package/docs/brevo.md +122 -0
  19. package/docs/calendly.md +158 -0
  20. package/docs/canva.md +191 -0
  21. package/docs/chargebee.md +192 -0
  22. package/docs/clay.md +194 -0
  23. package/docs/clickhouse.md +242 -0
  24. package/docs/confidence-exp.md +74 -0
  25. package/docs/confidence-flags.md +75 -0
  26. package/docs/confidence-oauth.md +137 -0
  27. package/docs/contentful.md +123 -0
  28. package/docs/databricks.md +180 -0
  29. package/docs/dbt-semantic-layer.md +175 -0
  30. package/docs/elevenlabs.md +102 -0
  31. package/docs/figma.md +132 -0
  32. package/docs/firebase-cloud-messaging.md +262 -0
  33. package/docs/firecrawl.md +137 -0
  34. package/docs/fireflies.md +95 -0
  35. package/docs/fireworks-ai.md +53 -0
  36. package/docs/gatewayapi.md +113 -0
  37. package/docs/gemini-enterprise.md +224 -0
  38. package/docs/github-api.md +133 -0
  39. package/docs/gitlab-api.md +138 -0
  40. package/docs/gmail.md +133 -0
  41. package/docs/gong.md +205 -0
  42. package/docs/google-ads.md +156 -0
  43. package/docs/google-analytics.md +202 -0
  44. package/docs/google-docs.md +105 -0
  45. package/docs/google-drive.md +108 -0
  46. package/docs/google-maps-platform.md +208 -0
  47. package/docs/google-oauth.md +123 -0
  48. package/docs/google-search-console.md +124 -0
  49. package/docs/google-sheets.md +94 -0
  50. package/docs/google-slides.md +95 -0
  51. package/docs/granola.md +178 -0
  52. package/docs/hex.md +161 -0
  53. package/docs/heygen.md +124 -0
  54. package/docs/hubspot.md +142 -0
  55. package/docs/incident-io.md +118 -0
  56. package/docs/inngest.md +178 -0
  57. package/docs/klipy.md +149 -0
  58. package/docs/lexware.md +144 -0
  59. package/docs/lightspeed.md +193 -0
  60. package/docs/linear.md +137 -0
  61. package/docs/linkedin.md +196 -0
  62. package/docs/logo-dev.md +152 -0
  63. package/docs/mailgun.md +153 -0
  64. package/docs/mapbox.md +174 -0
  65. package/docs/microsoft-excel.md +97 -0
  66. package/docs/microsoft-fabric.md +249 -0
  67. package/docs/microsoft-oauth.md +143 -0
  68. package/docs/microsoft-onedrive.md +76 -0
  69. package/docs/microsoft-onenote.md +75 -0
  70. package/docs/microsoft-outlook.md +90 -0
  71. package/docs/microsoft-powerpoint.md +119 -0
  72. package/docs/microsoft-sharepoint.md +75 -0
  73. package/docs/microsoft-teams.md +72 -0
  74. package/docs/microsoft-word.md +119 -0
  75. package/docs/miro.md +117 -0
  76. package/docs/n8n.md +169 -0
  77. package/docs/notion.md +137 -0
  78. package/docs/oura.md +161 -0
  79. package/docs/paddle.md +168 -0
  80. package/docs/perplexity.md +85 -0
  81. package/docs/pipedrive.md +120 -0
  82. package/docs/polar.md +63 -0
  83. package/docs/posthog.md +227 -0
  84. package/docs/prestashop.md +151 -0
  85. package/docs/replicate.md +60 -0
  86. package/docs/resend.md +153 -0
  87. package/docs/salesforce.md +234 -0
  88. package/docs/sanity.md +122 -0
  89. package/docs/semrush.md +276 -0
  90. package/docs/sentry.md +112 -0
  91. package/docs/sevdesk.md +107 -0
  92. package/docs/shopify.md +206 -0
  93. package/docs/slack.md +257 -0
  94. package/docs/snowflake.md +271 -0
  95. package/docs/storyblok.md +130 -0
  96. package/docs/stripe.md +77 -0
  97. package/docs/supabase.md +51 -0
  98. package/docs/tally.md +105 -0
  99. package/docs/telegram.md +165 -0
  100. package/docs/tiktok.md +201 -0
  101. package/docs/twilio.md +284 -0
  102. package/docs/twitch.md +428 -0
  103. package/docs/wave.md +440 -0
  104. package/docs/wix.md +1249 -0
  105. package/docs/wiz.md +177 -0
  106. package/docs/woocommerce.md +400 -0
  107. package/docs/wordpress-com.md +358 -0
  108. package/docs/wordpress-self-hosted.md +252 -0
  109. package/docs/workday.md +292 -0
  110. package/docs/x-twitter.md +188 -0
  111. package/docs/xero.md +429 -0
  112. package/docs/zoho-books.md +214 -0
  113. package/docs/zoho-crm.md +192 -0
  114. package/package.json +153 -0
  115. package/patterns/ai-connections/PATTERN.md +84 -0
  116. package/patterns/ai-connections/example/ai-model.js +11 -0
  117. package/patterns/ai-connections/example/perplexity-answer.js +29 -0
  118. package/patterns/api-key-connection/PATTERN.md +368 -0
  119. package/patterns/api-key-connection/example/connections.js +18 -0
  120. package/patterns/api-key-connection/example/integrations.json +19 -0
  121. package/patterns/assistant-mcp/PATTERN.md +110 -0
  122. package/patterns/assistant-mcp/example/integrations.json +13 -0
  123. package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
  124. package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
  125. package/patterns/aws-storage-queries/PATTERN.md +169 -0
  126. package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
  127. package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
  128. package/patterns/aws-storage-queries/example/formats/package.json +12 -0
  129. package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
  130. package/patterns/aws-storage-queries/example/integrations.json +38 -0
  131. package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
  132. package/patterns/event-delivery/PATTERN.md +151 -0
  133. package/patterns/event-delivery/example/integrations.json +17 -0
  134. package/patterns/firebase-messaging/PATTERN.md +156 -0
  135. package/patterns/firebase-messaging/example/server/notifications.js +23 -0
  136. package/patterns/google-ads-search/PATTERN.md +92 -0
  137. package/patterns/google-ads-search/example/ads-setup.js +25 -0
  138. package/patterns/oauth-connection/PATTERN.md +724 -0
  139. package/patterns/oauth-connection/example/integrations.json +20 -0
  140. package/patterns/paddle-catalogue/PATTERN.md +78 -0
  141. package/patterns/paddle-catalogue/example/create-products.js +38 -0
  142. package/patterns/public-image/PATTERN.md +84 -0
  143. package/patterns/public-image/example/integrations.json +13 -0
  144. package/patterns/public-image/example/logo-url.js +16 -0
  145. package/patterns/redshift-queries/PATTERN.md +150 -0
  146. package/patterns/redshift-queries/example/integrations.json +33 -0
  147. package/patterns/source-scanning/PATTERN.md +83 -0
  148. package/patterns/source-scanning/example/source-scanner.js +13 -0
  149. package/src/client/firebase-cloud-messaging.js +10 -0
  150. package/src/client/google-analytics.js +72 -0
  151. package/src/client/google-maps-platform.js +39 -0
  152. package/src/client/logo-dev.js +36 -0
  153. package/src/server/ai.js +46 -0
  154. package/src/server/airtable.js +67 -0
  155. package/src/server/algolia.js +63 -0
  156. package/src/server/amazon-redshift.js +96 -0
  157. package/src/server/amplitude.js +31 -0
  158. package/src/server/apify.js +68 -0
  159. package/src/server/apollo-io.js +85 -0
  160. package/src/server/asana.js +64 -0
  161. package/src/server/ashby.js +61 -0
  162. package/src/server/atlassian.js +32 -0
  163. package/src/server/attention.js +93 -0
  164. package/src/server/aws-athena.js +82 -0
  165. package/src/server/aws-s3.js +49 -0
  166. package/src/server/awsTransport.js +75 -0
  167. package/src/server/bigquery.js +97 -0
  168. package/src/server/brevo.js +97 -0
  169. package/src/server/calendly.js +77 -0
  170. package/src/server/canva.js +13 -0
  171. package/src/server/chargebee.js +88 -0
  172. package/src/server/clay.js +78 -0
  173. package/src/server/clickhouse.js +66 -0
  174. package/src/server/confidence.js +29 -0
  175. package/src/server/contentful.js +40 -0
  176. package/src/server/databricks.js +55 -0
  177. package/src/server/dbt-semantic-layer.js +95 -0
  178. package/src/server/elevenlabs.js +81 -0
  179. package/src/server/figma.js +24 -0
  180. package/src/server/firebase-cloud-messaging.js +111 -0
  181. package/src/server/firecrawl.js +70 -0
  182. package/src/server/fireflies.js +31 -0
  183. package/src/server/fireworks-ai.js +16 -0
  184. package/src/server/gatewayapi.js +48 -0
  185. package/src/server/gemini-enterprise.js +47 -0
  186. package/src/server/github-api.js +90 -0
  187. package/src/server/gitlab-api.js +67 -0
  188. package/src/server/gmail.js +60 -0
  189. package/src/server/gong.js +52 -0
  190. package/src/server/google-ads-search.js +134 -0
  191. package/src/server/google-ads.js +80 -0
  192. package/src/server/google-docs.js +36 -0
  193. package/src/server/google-drive.js +71 -0
  194. package/src/server/google-maps-platform.js +90 -0
  195. package/src/server/google-search-console.js +31 -0
  196. package/src/server/google-sheets.js +60 -0
  197. package/src/server/google-slides.js +36 -0
  198. package/src/server/google.js +61 -0
  199. package/src/server/granola.js +115 -0
  200. package/src/server/graphqlOperation.js +15 -0
  201. package/src/server/hex.js +29 -0
  202. package/src/server/heygen.js +54 -0
  203. package/src/server/hubspot.js +85 -0
  204. package/src/server/incident-io.js +68 -0
  205. package/src/server/inngest.js +86 -0
  206. package/src/server/jsonOperation.js +34 -0
  207. package/src/server/klipy.js +34 -0
  208. package/src/server/lexware.js +59 -0
  209. package/src/server/lightspeed.js +82 -0
  210. package/src/server/linear.js +52 -0
  211. package/src/server/linkedin.js +74 -0
  212. package/src/server/mailgun.js +76 -0
  213. package/src/server/mapbox.js +46 -0
  214. package/src/server/mcpRegistration.js +41 -0
  215. package/src/server/mcpTransport.js +60 -0
  216. package/src/server/microsoft-excel.js +67 -0
  217. package/src/server/microsoft-fabric.js +81 -0
  218. package/src/server/microsoft-onedrive.js +58 -0
  219. package/src/server/microsoft-onenote.js +52 -0
  220. package/src/server/microsoft-outlook.js +58 -0
  221. package/src/server/microsoft-powerpoint.js +5 -0
  222. package/src/server/microsoft-sharepoint.js +46 -0
  223. package/src/server/microsoft-teams.js +29 -0
  224. package/src/server/microsoft-word.js +5 -0
  225. package/src/server/microsoft.js +88 -0
  226. package/src/server/miro.js +29 -0
  227. package/src/server/n8n.js +78 -0
  228. package/src/server/notion.js +76 -0
  229. package/src/server/oura.js +48 -0
  230. package/src/server/paddle.js +83 -0
  231. package/src/server/perplexity.js +15 -0
  232. package/src/server/pipedrive.js +95 -0
  233. package/src/server/polar.js +20 -0
  234. package/src/server/posthog.js +44 -0
  235. package/src/server/prestashop.js +42 -0
  236. package/src/server/replicate.js +42 -0
  237. package/src/server/resend.js +93 -0
  238. package/src/server/salesforce.js +84 -0
  239. package/src/server/sanity.js +31 -0
  240. package/src/server/semrush.js +359 -0
  241. package/src/server/sentry.js +30 -0
  242. package/src/server/sevdesk.js +20 -0
  243. package/src/server/shopify.js +99 -0
  244. package/src/server/slack.js +143 -0
  245. package/src/server/snowflake.js +139 -0
  246. package/src/server/storyblok.js +49 -0
  247. package/src/server/stripe.js +13 -0
  248. package/src/server/supabase.js +13 -0
  249. package/src/server/tally.js +78 -0
  250. package/src/server/telegram.js +55 -0
  251. package/src/server/tiktok.js +86 -0
  252. package/src/server/twilio.js +90 -0
  253. package/src/server/twitch.js +409 -0
  254. package/src/server/wave.js +520 -0
  255. package/src/server/wix.js +1048 -0
  256. package/src/server/wiz.js +117 -0
  257. package/src/server/woocommerce.js +412 -0
  258. package/src/server/wordpress-com.js +236 -0
  259. package/src/server/wordpress-self-hosted.js +134 -0
  260. package/src/server/workday.js +136 -0
  261. package/src/server/x-twitter.js +110 -0
  262. package/src/server/xero.js +397 -0
  263. package/src/server/zoho-books.js +90 -0
  264. package/src/server/zoho-crm.js +89 -0
  265. package/src/server/zohoOAuth.js +21 -0
  266. package/src/shared/ai-models.json +8049 -0
  267. package/src/shared/ai.js +63 -0
  268. package/src/shared/algolia.js +29 -0
  269. package/src/shared/amazon-redshift.js +51 -0
  270. package/src/shared/amplitude.js +28 -0
  271. package/src/shared/atlassian.js +43 -0
  272. package/src/shared/aws.js +72 -0
  273. package/src/shared/canva.js +66 -0
  274. package/src/shared/chargebee.js +26 -0
  275. package/src/shared/clickhouse.js +38 -0
  276. package/src/shared/confidence.js +28 -0
  277. package/src/shared/databricks.js +33 -0
  278. package/src/shared/dbt-semantic-layer.js +32 -0
  279. package/src/shared/definitions.js +140 -0
  280. package/src/shared/figma.js +21 -0
  281. package/src/shared/firebase-cloud-messaging.js +45 -0
  282. package/src/shared/gemini-enterprise.js +33 -0
  283. package/src/shared/gong.js +33 -0
  284. package/src/shared/google-ads-search.js +31 -0
  285. package/src/shared/google-ads.js +28 -0
  286. package/src/shared/google-maps-platform.js +28 -0
  287. package/src/shared/google.js +133 -0
  288. package/src/shared/granola.js +25 -0
  289. package/src/shared/hex.js +28 -0
  290. package/src/shared/inngest.js +35 -0
  291. package/src/shared/lightspeed.js +75 -0
  292. package/src/shared/linkedin.js +27 -0
  293. package/src/shared/logo-dev.js +21 -0
  294. package/src/shared/mapbox.js +38 -0
  295. package/src/shared/mcp.js +92 -0
  296. package/src/shared/microsoft-fabric.js +47 -0
  297. package/src/shared/microsoft.js +231 -0
  298. package/src/shared/miro.js +27 -0
  299. package/src/shared/oura.js +23 -0
  300. package/src/shared/posthog.js +33 -0
  301. package/src/shared/prestashop.js +23 -0
  302. package/src/shared/salesforce.js +36 -0
  303. package/src/shared/semrush.js +24 -0
  304. package/src/shared/shopify.js +51 -0
  305. package/src/shared/siteUrl.js +12 -0
  306. package/src/shared/slack.js +88 -0
  307. package/src/shared/snowflake.js +55 -0
  308. package/src/shared/tiktok.js +22 -0
  309. package/src/shared/tokens.js +747 -0
  310. package/src/shared/twilio.js +41 -0
  311. package/src/shared/twitch.js +49 -0
  312. package/src/shared/wave.js +52 -0
  313. package/src/shared/wix.js +40 -0
  314. package/src/shared/wiz.js +41 -0
  315. package/src/shared/wordpress-com.js +30 -0
  316. package/src/shared/wordpress.js +69 -0
  317. package/src/shared/workday.js +50 -0
  318. package/src/shared/x-twitter.js +19 -0
  319. package/src/shared/xero.js +46 -0
  320. package/src/shared/zoho-books.js +39 -0
  321. package/src/shared/zoho-crm.js +43 -0
  322. package/src/shared/zoho-regions.js +12 -0
  323. package/test/ai.test.js +136 -0
  324. package/test/airtable.test.js +125 -0
  325. package/test/algolia.test.js +207 -0
  326. package/test/amazon-redshift.test.js +272 -0
  327. package/test/amplitude.test.js +239 -0
  328. package/test/apify.test.js +93 -0
  329. package/test/apollo-io.test.js +125 -0
  330. package/test/asana.test.js +99 -0
  331. package/test/ashby.test.js +97 -0
  332. package/test/atlassian.test.js +249 -0
  333. package/test/attention.test.js +79 -0
  334. package/test/aws.test.js +405 -0
  335. package/test/brevo.test.js +71 -0
  336. package/test/calendly.test.js +136 -0
  337. package/test/canva.test.js +258 -0
  338. package/test/chargebee.test.js +195 -0
  339. package/test/clickhouse.test.js +278 -0
  340. package/test/confidence.test.js +205 -0
  341. package/test/databricks.test.js +253 -0
  342. package/test/dbt-semantic-layer.test.js +221 -0
  343. package/test/designMcp.test.js +336 -0
  344. package/test/elevenlabs.test.js +52 -0
  345. package/test/firebase-cloud-messaging.test.js +242 -0
  346. package/test/firecrawl.test.js +66 -0
  347. package/test/gemini-enterprise.test.js +218 -0
  348. package/test/github-api.test.js +167 -0
  349. package/test/gitlab-api.test.js +160 -0
  350. package/test/gong.test.js +192 -0
  351. package/test/google-ads.test.js +350 -0
  352. package/test/google-maps-platform.test.js +191 -0
  353. package/test/google.test.js +710 -0
  354. package/test/granola.test.js +240 -0
  355. package/test/hex.test.js +253 -0
  356. package/test/heygen.test.js +121 -0
  357. package/test/hubspot.test.js +103 -0
  358. package/test/inngest.test.js +219 -0
  359. package/test/lightspeed.test.js +250 -0
  360. package/test/linear.test.js +146 -0
  361. package/test/linkedin.test.js +243 -0
  362. package/test/logo-dev.test.js +79 -0
  363. package/test/mailgun.test.js +107 -0
  364. package/test/mapbox.test.js +181 -0
  365. package/test/mcp.test.js +227 -0
  366. package/test/microsoft-fabric.test.js +258 -0
  367. package/test/microsoft.test.js +554 -0
  368. package/test/n8nOAuth.test.js +188 -0
  369. package/test/notionOAuth.test.js +183 -0
  370. package/test/oura.test.js +211 -0
  371. package/test/paddleCatalogue.test.js +51 -0
  372. package/test/paddlePermissions.test.js +101 -0
  373. package/test/perplexityComposition.test.js +39 -0
  374. package/test/pipedriveOAuth.test.js +140 -0
  375. package/test/posthog.test.js +200 -0
  376. package/test/prestashop.test.js +207 -0
  377. package/test/resend.test.js +163 -0
  378. package/test/salesforce.test.js +276 -0
  379. package/test/semrush.test.js +479 -0
  380. package/test/sentry.test.js +35 -0
  381. package/test/shopify.test.js +247 -0
  382. package/test/slack.test.js +320 -0
  383. package/test/snowflake.test.js +391 -0
  384. package/test/tally.test.js +75 -0
  385. package/test/telegram.test.js +58 -0
  386. package/test/tiktok.test.js +243 -0
  387. package/test/tokens.test.js +1079 -0
  388. package/test/twilio.test.js +221 -0
  389. package/test/twitch.test.js +573 -0
  390. package/test/wave.test.js +678 -0
  391. package/test/wix.test.js +1099 -0
  392. package/test/wiz.test.js +185 -0
  393. package/test/wordpress-com.test.js +469 -0
  394. package/test/wordpress.test.js +660 -0
  395. package/test/workday.test.js +314 -0
  396. package/test/x-twitter.test.js +256 -0
  397. package/test/xero.test.js +700 -0
  398. package/test/zoho-books.test.js +253 -0
  399. 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.
@@ -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/)