@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,292 @@
1
+ # Workday
2
+
3
+ This adapter connects each application's authenticated user to their own
4
+ Workday account and reads workers, organizations, time off and custom reports.
5
+ It uses a customer-owned confidential OAuth client, Staffing v7, Absence
6
+ Management v5 and tenant RaaS JSON reports. The user's Workday security profile determines the
7
+ records returned. Saving configuration does not authorize or contact Workday.
8
+
9
+ ## Portable configuration
10
+
11
+ ```json
12
+ {
13
+ "schemaVersion": 1,
14
+ "registrations": {
15
+ "workday-tenant": {
16
+ "source": "own",
17
+ "clientId": "replace-with-workday-client-id",
18
+ "clientSecretRef": "env:WORKDAY_CLIENT_SECRET",
19
+ "callbackUrlRef": "env:WORKDAY_CALLBACK_URL"
20
+ }
21
+ },
22
+ "integrations": {
23
+ "workday": {
24
+ "provider": "workday",
25
+ "accountMode": "per-user",
26
+ "settings": {
27
+ "restApiEndpoint": "https://wd5-services1.myworkday.com/ccx/api/v1/acme_corp",
28
+ "tokenEndpoint": "https://wd5-services1.myworkday.com/ccx/oauth2/acme_corp/token",
29
+ "authorizationEndpoint": "https://acme.wd5.myworkday.com/acme_corp/authorize"
30
+ },
31
+ "scopes": [],
32
+ "authentication": { "method": "oauth2", "registrationRef": "workday-tenant" }
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ The editor and CLI use this same schema. Optional `displayName` and `access`
39
+ use the core configuration contract; access to configuring a registration is
40
+ separate from ownership of each connected user's tokens. Store the real secret
41
+ and callback in the application's environment. Keep encrypted runtime files and
42
+ their durable encryption key outside exported source.
43
+
44
+ The REST endpoint accepts the captured `/ccx/api/v1/{tenant}` base or an explicit
45
+ `/ccx/api/staffing/v7/{tenant}` base. It also accepts these API paths without the
46
+ `/ccx` prefix, as documented in Workday's current REST fundamentals. Worker URLs
47
+ retain the configured host, prefix and tenant and select Staffing v7. No host
48
+ discovery or retry on another base path occurs. Check the copied endpoint for
49
+ your tenant before use; these forms have fixture coverage, not live-tenant proof.
50
+ Token URLs must match the REST host and tenant. Authorization may use a different
51
+ Workday host, but must name the same tenant. HTTPS subdomains of `myworkday.com`
52
+ are supported; custom gateways, ports, URL credentials, queries and fragments
53
+ are excluded from this initial adapter.
54
+
55
+ ## Register the provider client
56
+
57
+ These are tenant administrator tasks, not Workday Developer Site/Extend client
58
+ registration. Task availability depends on the administrator's permissions.
59
+
60
+ 1. Sign into the intended production or sandbox Workday tenant. Confirm its name
61
+ and environment; sandbox credentials must not be copied into production.
62
+ 2. If OAuth clients are disabled, have the security administrator open **Edit
63
+ Tenant Setup – Security**, enable **OAuth 2.0 Clients Enabled**, and apply the
64
+ organization's normal security-change process.
65
+ 3. Search for **Register API Client**. Enter a recognizable client name such as
66
+ `DogAndGroom — production` or `DogAndGroom — sandbox`.
67
+ Choose **Authorization Code Grant** and **Bearer** access tokens.
68
+ 4. Leave **Support Proof Key for Code Exchange (PKCE)** disabled for this
69
+ confidential setup. The captured Workday connector expects the client secret
70
+ issued by that flow. This adapter explicitly omits PKCE; other providers keep
71
+ the core's S256 default. Public clients without a secret are unsupported here.
72
+ 5. Set **Redirection URI** to the exact backend callback owned by your app. For
73
+ an ordinary CLI, run that same backend flow with a callback accepted by Workday;
74
+ do not embed the client secret in browser code or invent a device-code flow.
75
+ 6. In **Scope (Functional Areas)**, select **Staffing** for these worker reads.
76
+ Follow the tenant's policy for Workday-owned scopes; additional functional
77
+ areas do not add operations to this adapter. No scope strings are sent in
78
+ the authorization request: functional areas are configured in Workday.
79
+ 7. Retain a refresh-token timeout approved by the tenant administrator. Workday
80
+ exposes **Non-Expiring Refresh Tokens**, but enabling it is not required by
81
+ this library and does not prevent manual revocation or other access changes.
82
+ 8. Save and copy the **Client ID** and **Client Secret**. Store the secret in Env
83
+ and its reference in the file. Workday may show the secret only at creation.
84
+ 9. Open **View API Clients**, find this client and copy **Workday REST API
85
+ Endpoint**, **Token Endpoint** and **Authorization Endpoint** exactly. The
86
+ authorization host normally differs from the REST/token host.
87
+ 10. Grant the intended users **View** in the **Report/Task Permissions** of the
88
+ domains securing `GET /workers` and `GET /workers/{ID}`. Staffing v7 lists
89
+ FLW Service, Self-Service: Current Staffing Information and Worker Data:
90
+ Public Worker Reports. Select the appropriate tenant security groups and
91
+ activate approved pending policy changes. SOAP Integration Permissions do
92
+ not substitute for REST Report/Task Permissions.
93
+ 11. Save the file or editor form. From the application's authenticated connection
94
+ screen, start consent. Workday signs in each person; `workers.me` verifies
95
+ their worker resource before the connection is marked connected. A user
96
+ without an accessible worker record cannot pass this initial check.
97
+
98
+ ## Runtime composition and operations
99
+
100
+ Import `workdayProvider` from `@jskit-ai/connectors-catalog/server/workday` and
101
+ register it in `parseIntegrationConfiguration` and `createConnectionService`.
102
+ Use the packaged OAuth connection pattern for file storage, reference resolution,
103
+ `beginAuthorization`, `completeAuthorization`, cancellation and disconnect.
104
+ The host authenticates callers and derives a stable application/user identity;
105
+ never accept that ownership from a callback query or request body.
106
+
107
+ | Operation | Inputs | Result |
108
+ | --- | --- | --- |
109
+ | `workers.me` | None | The connected person's worker object; used for verification. |
110
+ | `workers.list` | `limit` 1–100 (default 20), `offset` nonnegative safe integer (default 0), optional `search` 1–512 characters, `includeTerminatedWorkers`, `filterByOrgVisibility` | One `{ data, total }` page, preserved with provider metadata. |
111
+
112
+ `search` is Workday's name/worker-ID search, not a general query language.
113
+ `filterByOrgVisibility` needs the corresponding Workday tenant setting. Empty
114
+ pages are valid. The library validates worker identifiers and the page envelope;
115
+ the application still chooses which returned personal data it displays or stores.
116
+ Provider `href` values remain data and are never followed automatically. No
117
+ operation accepts an alternate host, tenant or token endpoint. The absence reads
118
+ require an explicit worker ID; the app must authorize that selection and Workday
119
+ still applies the connected user's permissions.
120
+
121
+ The confidential client defaults to `client_secret_post`; the optional registration
122
+ setting `tokenEndpointAuthMethod: "client_secret_basic"` selects HTTP Basic.
123
+ State is random, time-limited, one-use and bound to owner, configuration and
124
+ callback. Provider metadata alone cannot switch that attempt to another flow.
125
+ When Workday supplies an expiry, the core refreshes before expiry and retains
126
+ rotated refresh tokens. Without expiry metadata, a later HTTP 401 requires
127
+ reconnection; this fragment does not guess a tenant session lifetime. HTTP 403
128
+ reports missing Workday access, 429 rate limiting, and provider failures expose
129
+ sanitized errors. Cancellation consumes only the pending attempt. Local
130
+ disconnect removes local credentials; revoke the client/grant in Workday when
131
+ provider-side revocation is required.
132
+
133
+ This implements data connections, not application login, shared ISU access,
134
+ Workday Extend, Agent Gateway, Live Data Query, SOAP, custom report creation, payroll
135
+ updates, employment changes, bulk sync or automatic pagination.
136
+
137
+ ## Application ownership, callbacks and capacity
138
+
139
+ The application owner creates the provider registration and stores its secret
140
+ in the application's private Env. Public Vibe64, Vibe64 Online and CLI users use
141
+ this same ownership model. The configuration file holds the client ID and Env
142
+ references; the editor does not own the application's grants.
143
+
144
+ Register the exact callback implemented by the application. For a hosted project,
145
+ start with its assigned application URL and append the implemented callback path.
146
+ Save that same URL through the application's callback Env reference. On a domain
147
+ or host change, update both the provider registration and callback Env if the URL
148
+ changes. Preserve the application's identity and persistent grant store when
149
+ moving it; neither a new editor URL nor a new hosting address creates a new owner.
150
+ See the [callback guide](../../connectors-core/docs/oauth-callbacks.md) and
151
+ [application setup command](../../connectors-core/docs/setup-command.md).
152
+
153
+ Each Workday tenant administrator must register and approve the application's
154
+ client. There is no universal credential that accesses arbitrary customer tenants.
155
+ Separate clients can separate credentials and revocation within a tenant; their
156
+ names alone do not split tenant API capacity, licensing or rate limits. Keep
157
+ sandbox and production credentials and grants separate.
158
+
159
+ ## What AI can provision
160
+
161
+ AI can generate and validate this file, compose existing JSKIT APIs, explain
162
+ functional-area/domain requirements and prepare project-specific production/sandbox
163
+ client names and callback values. With explicitly authorized browser access, it may
164
+ assist an administrator through the visible Workday tasks. A general public API
165
+ for creating these tenant OAuth clients has not been established by this packet;
166
+ do not promise autonomous registration, licensing or security-policy activation.
167
+ An authorized administrator owns tenant access, consent and policy decisions.
168
+
169
+ ## Evidence and testing boundary
170
+
171
+ - [Workday REST API fundamentals](https://developer.workday.com/documentation/GUID-85810465-bcfb-4fdf-a26d-55eaff3968a8-enHYPHENus/) documents tenant base paths, paging and worker identifiers.
172
+ - [Workday REST API security](https://developer.workday.com/documentation/dan1370797986071/) distinguishes REST Report/Task policies from SOAP permissions.
173
+ - [Official Staffing v7 specification](https://community.workday.com/sites/default/files/file-hosting/restapi/staffing_v7_20260905_oas2.json) defines the implemented worker endpoints and functional areas.
174
+ - [Workday's tenant token exchange example](https://doc.workday.com/admin-guide/en-us/workday-ai/agents/external-agents/register-and-define-your-agent-through-an-api.html) documents the `/ccx/oauth2/{tenant}/token` client-secret exchange; its ASOR operations are not implemented here.
175
+ - [Workday OAuth client setup example](https://doc.workday.com/peakon/en-us/workday-peakon-employee-voice/integrations/workday-integration/nfa1667304944189.html) describes tenant OAuth enablement and registration.
176
+ - [Lovable's Workday setup](https://docs.lovable.dev/integrations/workday) documents the captured per-user fields and non-PKCE confidential registration.
177
+
178
+ Protocol, storage, ownership, validation and editor tests use controlled fixtures.
179
+ No live Workday account, administrator task, provider consent or generated app is
180
+ part of this proof. The host application must still compose its authentication,
181
+ callback and connection screens using its framework; saving the editor form does
182
+ not generate or run those screens.
183
+
184
+ ## Organization directory and reporting relationships
185
+
186
+ `organizations.list` accepts `limit`, `offset` and `includeInactive` and returns
187
+ one native `{ data, total }` page. `organizations.get({ id })` reads one
188
+ supervisory organization. `organizations.members({ id, limit, offset })` returns
189
+ member job data; `organizations.orgChart({ id, limit, offset })` returns superior
190
+ and subordinate organization relationships. No recursive tree traversal occurs.
191
+ The app owns rendering the directory/chart and requesting additional pages.
192
+
193
+ Use a returned Workday ID or `Organization_Reference_ID=value`. Identifiers are
194
+ encoded as a single path segment. All requests retain the configured API host,
195
+ prefix and tenant, using `/api/staffing/v7/{tenant}/supervisoryOrganizations`.
196
+ The connected person's grant is used; the adapter never switches to an ISU or
197
+ administrator account when permission is denied.
198
+
199
+ In Register API Client, enable **Organizations and Roles** in functional areas.
200
+ Organization list/details require a permitted domain such as **View: Supervisory
201
+ Organization**; members and org chart require **Reports: Organization**. Ask the
202
+ tenant security administrator to assign suitable Report/Task permissions and
203
+ activate approved changes. A successful workers.me connection check is not an
204
+ organization authorization check. A 403 must be shown as missing access.
205
+
206
+ Other frameworks call these same GET routes with the app user's bearer token,
207
+ validate the page envelope, preserve returned relationships and perform their
208
+ own application authorization. Provider links in results are data, not a reason
209
+ to forward credentials to another host. The operation contract is documented in
210
+ [Staffing v7](https://community.workday.com/sites/default/files/file-hosting/restapi/staffing_v7_20260912_oas2.json).
211
+
212
+ ## Time-off balances and entries
213
+
214
+ Enable **Time Off and Leave** in the tenant client's functional areas. The
215
+ security administrator grants the appropriate **Self-Service: Time Off Balances**
216
+ and **Self-Service: Time Off** domains, or the corresponding **Worker Data: Time
217
+ Off** domains for the intended role. Activate approved Report/Task security
218
+ changes. Worker or organization access does not establish absence access.
219
+
220
+ - `timeOff.balances({ worker, effective, category, limit, offset })` reads
221
+ `/api/absenceManagement/v5/{tenant}/balances`. `worker` is required: use a
222
+ returned 32-character Workday worker ID, including the ID from `workers.me`.
223
+ `effective` is an optional YYYY-MM-DD date; category is an optional returned
224
+ Workday ID. Quantities retain their native units; do not assume days or hours.
225
+ - `timeOff.details({ worker, fromDate, toDate, status, timeOffType, limit, offset })`
226
+ reads `/workers/{worker}/timeOffDetails` under that absence base. Optional date
227
+ bounds must be valid and ordered. Status/type filters contain Workday IDs,
228
+ encoded as repeated query parameters. No comma-joined filter or guessed status
229
+ label is sent. Limits are 20 statuses and 100 time-off types.
230
+ - `timeOff.statuses()` reads `/values/timeOff/status/`. Use its returned IDs for
231
+ status filters. Workday omits canceled/denied entries from the details endpoint;
232
+ status filters can select a historical version of a corrected entry. Do not
233
+ present these results as a complete audit history.
234
+
235
+ Paged reads use limit 1–100 and offset, preserving native `{ data, total }`.
236
+ The application decides whether to request another page, renders status/units
237
+ and authorizes the selected worker. Requests always use the connected user's
238
+ grant and configured tenant; Workday enforces its own data access. These are
239
+ reads only, with no submission, approval, cancellation or balance adjustment.
240
+ Other frameworks use the same bearer-token routes and repeated query encoding.
241
+ See the official [Absence Management v5 contract](https://community.workday.com/sites/default/files/file-hosting/restapi/absenceManagement_v5_20260912_oas2.json).
242
+
243
+ ## Tenant-owned custom reports
244
+
245
+ `reports.read({ owner, report, prompts })` reads a RaaS JSON report at the configured
246
+ API host's `/ccx/service/customreport2/{tenant}/{owner}/{report}` path. It uses
247
+ the current app user's bearer token; it never acquires the report owner's grant.
248
+ The report owner identifies the report location, not the identity executing it.
249
+
250
+ For RaaS, select **Tenant Non-Configurable** and **Include Workday Owned Scope**
251
+ on the API client, in addition to the functional areas for the report's data.
252
+ The tenant administrator must also authorize report execution and its underlying
253
+ data for the intended users. This does not replace report sharing or widen a
254
+ user's own access. Reconnect after changing the client permissions.
255
+
256
+ The report owner enables the custom report as a web service and shares access
257
+ with the intended users. In its related actions, choose **Web Services → View
258
+ URLs**, supply required prompts and copy the JSON output URL. Confirm its host
259
+ and tenant match the configured connection. Pass its decoded owner and report
260
+ name as input (spaces in report names are normally underscores). This operation
261
+ supports the tenant RaaS path above; an Extend API gateway URL is not interchangeable.
262
+ Do not change credentials or silently follow a different host to make a report run.
263
+
264
+ Each prompt is `{ name, value }`, using the report's **Label for Prompt XML Alias**,
265
+ not a guessed application field. For instance prompts, use a name ending `!WID`;
266
+ join multiple WIDs in its value with `!`. The adapter encodes query values and
267
+ fixes format to JSON. Each alias is supplied once. Limits are 50 prompts, 4096
268
+ characters per value and a 16384-character request URL.
269
+
270
+ The result preserves the native `Report_Entry` objects and any result/facet
271
+ metadata. Column meanings, required prompts and filtering belong to the report
272
+ and application. There is no universal report schema or automatic pagination;
273
+ large reports must be bounded through the report's own filters and the runtime's
274
+ response limit. An empty Report_Entry array is valid. Missing access, incompatible
275
+ report output and provider failures remain errors, never empty successful reports.
276
+
277
+ The app authorizes which reports/prompts a visitor may request. Workday also
278
+ checks the user's report/data permissions and tenant OAuth policy; a worker probe
279
+ cannot certify RaaS access. This has controlled request/response proof, not live
280
+ tenant OAuth interoperability proof. Other frameworks use the same HTTPS GET,
281
+ user token, prompt encoding and report-defined schema. Report creation, Basic/ISU
282
+ fallback, CSV/XML output and asynchronous report execution are not implemented.
283
+
284
+ References: [Workday RaaS output and prompts](https://doc.workday.com/admin-guide/en-us/reporting-and-analytics/custom-reports-and-analytics/reports-as-a-service-raas-/dan1370797813643.html),
285
+ [RaaS report enablement](https://doc.workday.com/admin-guide/en-us/reporting-and-analytics/custom-reports-and-analytics/reports-as-a-service-raas-/dan1370796320263.html),
286
+ [official JSON report example](https://developer.workday.com/documentation/rpv1519338225087),
287
+ and [Microsoft's tenant RaaS setup example](https://learn.microsoft.com/en-us/viva/learning/workday-create-raas-report).
288
+
289
+ The [OpenAI Workday integration example](https://github.com/openai/openai-cookbook/blob/main/examples/chatgpt/gpt_actions_library/gpt_action_workday.md)
290
+ documents these OAuth functional-area settings and a RaaS report evaluated as
291
+ the authenticated user. It supports the registration guidance; the operation
292
+ schemas here follow the Workday contracts above, not its illustrative schema.
@@ -0,0 +1,188 @@
1
+ # X (Twitter)
2
+
3
+ Import `xTwitterProvider` from `@jskit-ai/connectors-catalog/server/x-twitter`.
4
+ This adapter reads public profiles, post timelines and recent search using an app-only
5
+ bearer token. The shared connection service and file store work from a CLI or
6
+ application server. Vibe64 edits the same JSON; saving does not contact X.
7
+
8
+ ## Create the provider application
9
+
10
+ 1. Sign into [Developer Console](https://console.x.com). Complete developer
11
+ onboarding, including the account profile, use case and provider agreements.
12
+ 2. Choose **New App**. Enter the application name, description and use case.
13
+ Use a name that identifies the actual operator and application purpose.
14
+ 3. In the created application's credentials, copy its **Bearer Token** for
15
+ app-only access. Keep it in the backend environment or secret store. The
16
+ credentials shown during creation must be retained securely.
17
+ 4. In Developer Console, check API access, credits and spending controls for
18
+ the owning account. Verification is a real profile lookup and can consume
19
+ credits. A token's existence does not establish usable API access.
20
+ 5. Save only the reference in the JSON below. Do not paste the token into source
21
+ or include the `Bearer ` prefix in its environment value.
22
+ 6. Explicitly verify with `connectApiKey` and a known public username without
23
+ `@`. A missing profile is a failed check, not evidence that the token is bad;
24
+ choose an accessible profile and retry deliberately.
25
+
26
+ The console's application credentials include several authentication types;
27
+ this fragment uses its app-only token. [Access setup](https://docs.x.com/x-api/getting-started/getting-access)
28
+ and [usage billing](https://docs.x.com/x-api/getting-started/pricing).
29
+
30
+ ```json
31
+ {
32
+ "schemaVersion": 1,
33
+ "registrations": {},
34
+ "integrations": {
35
+ "social": {
36
+ "provider": "x-twitter",
37
+ "displayName": "Public research",
38
+ "accountMode": "shared",
39
+ "scopes": [],
40
+ "authentication": {
41
+ "method": "api-key",
42
+ "secretRef": "env:X_APP_BEARER_TOKEN"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ `assistant` ownership is also supported through the host's authorization policy.
50
+ The file has no OAuth registration or permission checkboxes for this credential
51
+ type. X calls this OAuth 2.0 application-only authentication; the shared library's
52
+ `api-key` method means that it consumes an externally supplied credential rather
53
+ than starting an authorization journey.
54
+
55
+ ## Runtime composition and operations
56
+
57
+ Use the API-key connection pattern to construct `connections` with this provider,
58
+ the parsed file, encrypted file storage, reference resolution and host access
59
+ policy. The catalogue contains the actual transport and validation implementation;
60
+ no copied app template is required. Both configuration parsing and the service
61
+ must receive `xTwitterProvider` in their `providers` arrays.
62
+
63
+ ```js
64
+ await connections.connectApiKey({
65
+ context: authenticatedOwner,
66
+ integrationId: "social",
67
+ verificationInput: { username: "example" }
68
+ });
69
+ const profile = await connections.invoke({
70
+ context: authenticatedOwner,
71
+ integrationId: "social",
72
+ operation: "users.lookup",
73
+ input: { username: "example" }
74
+ });
75
+ const firstPage = await connections.invoke({
76
+ context: authenticatedOwner,
77
+ integrationId: "social",
78
+ operation: "users.posts",
79
+ input: { userId: profile.data.id, maxResults: 10 }
80
+ });
81
+ // Request another page explicitly, only when the caller wants it.
82
+ const nextCursor = firstPage.meta.next_token;
83
+ ```
84
+
85
+ The username above is illustrative; supply a real, authorized target. The
86
+ application determines `authenticatedOwner` from its trusted CLI operator or
87
+ authenticated session and authorizes the particular operation and target.
88
+ It must not copy ownership IDs from arbitrary browser input.
89
+
90
+ | Operation | Input | Request/result |
91
+ |---|---|---|
92
+ | `users.lookup` (verification) | Required `username`, 1–15 letters, digits or underscores, without `@` | GET `/2/users/by/username/{username}` with description, image and public metrics fields; original profile envelope |
93
+ | `posts.searchRecent` | Required `query` (1–512 characters), optional `maxResults` 10–100 and `nextToken` | GET `/2/tweets/search/recent`; posts, author/media expansions and metadata |
94
+ | `users.posts` | Required decimal-string `userId` (1–19 digits); optional `maxResults` 5–100 (default 10), `paginationToken` | GET `/2/users/{id}/tweets`; original post array and pagination metadata |
95
+
96
+ Requests use the fixed `https://api.x.com` origin. Keep IDs as strings to avoid
97
+ rounding. Empty timelines may omit `data`; their `meta.result_count` is zero.
98
+ Each invocation makes one request without redirects or automatic paging.
99
+ Returned cursors must stay with the same account, user and query; do not decode
100
+ or construct them. Search accepts provider query operators; no arbitrary URL or write route is exposed.
101
+ [Profile endpoint](https://docs.x.com/x-api/users/get-user-by-username),
102
+ [timeline endpoint](https://docs.x.com/x-api/users/get-posts).
103
+
104
+ The runtime rejects malformed envelopes and responses containing partial errors.
105
+ A missing resource becomes `connector_resource_not_found`; incomplete results
106
+ become `connector_response_incomplete`. HTTP 402 becomes
107
+ `connector_billing_required`; 401, 403 and 429 use the shared reconnection,
108
+ permission and rate-limit errors. Provider error text is omitted. Cancellation
109
+ and timeouts do not replay requests or discard a verified connection.
110
+
111
+ ## Application ownership and callbacks
112
+
113
+ An app-only token has no current user. A public profile lookup is not a login
114
+ check. Posting, private messages and access on behalf of individual app users
115
+ require a separate user authorization implementation. This fragment must not be
116
+ advertised as individual users connecting their X accounts.
117
+ [Authentication boundary](https://docs.x.com/fundamentals/authentication/oauth-2-0/application-only).
118
+
119
+ An OAuth callback is **not applicable to this bearer-token flow**. Neither a
120
+ customer's VPS hostname nor a custom application domain changes authentication.
121
+ The application owner supplies its authorized token through private Env and
122
+ retains that credential ownership when moving hosts.
123
+
124
+ Separate application registrations may identify traffic, but this guide
125
+ does not establish independent billing or quota pools merely from different
126
+ app IDs. Confirm the provider's permitted account arrangement and applicable
127
+ limits before promising independent capacity or redistribution to customer apps.
128
+ CLI and self-hosted apps can supply their own tokens using this same file format.
129
+
130
+ Local disconnect deletes the stored connection, without invalidating the
131
+ provider's application-wide token. An operator can replace its secret binding
132
+ and verify again. Provider token invalidation affects every consumer of that
133
+ app token; it is a separate operator action.
134
+ [Token lifecycle](https://docs.x.com/fundamentals/authentication/oauth-2-0/application-only).
135
+
136
+ ## Automation assessment
137
+
138
+ | Task | What an AI can do |
139
+ |---|---|
140
+ | Create the application-owned provider registration | The reviewed setup documents use Developer Console. No general application-provisioning API was established. An authorized operator can follow the steps above; onboarding and provider approval remain external work. |
141
+ | Obtain an app-only token from existing app credentials | X documents `POST /oauth2/token` using the app's consumer key and secret. That exchange can be automated separately; this fragment accepts the resulting token reference. |
142
+ | Configure a CLI, UI or runtime | Write and validate the same JSON, compose the existing library and file store, wire trusted authorization, and invoke explicit reads. |
143
+ | Grant individual users access or publish posts | Not implemented by this fragment. An app-only token cannot supply user consent or app login. |
144
+
145
+ Token issuance is documented in [application-only authentication](https://docs.x.com/fundamentals/authentication/oauth-2-0/application-only).
146
+ Do not infer unattended account creation or provider approval from an available
147
+ token endpoint.
148
+
149
+ ## Verification boundary
150
+
151
+ Focused fixtures cover file persistence, ownership, rotation, strict inputs and
152
+ responses, paging, errors, cancellation and the guide's actual JSON. Editor
153
+ checks cover token references, ownership, setup guidance and reload persistence.
154
+ These checks use controlled responses; no live X token, registration, generated
155
+ application has been exercised.
156
+
157
+
158
+ ## Recent-search display recipe
159
+
160
+ ```js
161
+ const results = await connections.invoke({
162
+ context: authenticatedOwner, integrationId: "social",
163
+ operation: "posts.searchRecent",
164
+ input: { query: '("pet grooming" OR #dogs) lang:en -is:retweet', maxResults: 10 }
165
+ });
166
+ // Join post.author_id to results.includes?.users by id.
167
+ // Join post.attachments?.media_keys to results.includes?.media by media_key.
168
+ // Keep results.meta.next_token with this exact query for a user-requested next page.
169
+ ```
170
+
171
+ This searches the recent seven-day window. Query operators provide author,
172
+ language and content filters; operator availability and entitlement are decided
173
+ by X. Full-archive search, streaming and explicit time-range parameters are not
174
+ implemented. The adapter requests author names/images, post timestamps/entities/
175
+ public metrics and media type/URL/preview/alt text. Missing expansions are not
176
+ invented. Results with provider errors fail as incomplete rather than silently
177
+ rendering a purported complete result.
178
+ [Search guide](https://docs.x.com/x-api/posts/search/integrate/overview),
179
+ [recent search](https://docs.x.com/x-api/posts/search/quickstart/recent-search).
180
+
181
+ A native framework uses the same Env token in its server-side HTTP client,
182
+ `Authorization: Bearer <value>`, and these fixed API paths/query parameters.
183
+ It does not require JSKIT or Vibe64 at runtime. The application owns query
184
+ permissions, pagination controls, spend limits, escaping post text, joining
185
+ expansions, attribution and links back to the original post. Do not turn returned
186
+ media URLs into arbitrary backend downloads or render post text as trusted HTML.
187
+ Consult the provider's current display requirements before release; a connector
188
+ is not a completed social feed UI.