@jskit-ai/connectors-catalog 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
package/docs/stripe.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Stripe
|
|
2
|
+
|
|
3
|
+
Import `stripeProvider` from `@jskit-ai/connectors-catalog/server/stripe`.
|
|
4
|
+
The initial fragment reads a merchant account's balance. It does not implement
|
|
5
|
+
checkout, subscriptions, refunds, webhooks or Stripe Connect onboarding.
|
|
6
|
+
|
|
7
|
+
## Configure access
|
|
8
|
+
|
|
9
|
+
Before creating a key, [create or sign into your own Stripe account](https://dashboard.stripe.com/register).
|
|
10
|
+
Select the business that will receive this application's payments. Complete
|
|
11
|
+
Stripe's requested activation information in its Dashboard before accepting live
|
|
12
|
+
payments. Saving a key does not create, activate or approve a merchant account.
|
|
13
|
+
Keep sandbox and live credentials separate.
|
|
14
|
+
|
|
15
|
+
1. Select the intended Stripe account and sandbox/live mode in the Dashboard.
|
|
16
|
+
Open **API keys**, then **Create restricted key**.
|
|
17
|
+
2. Start with zero permissions, give the key an application-specific name and
|
|
18
|
+
grant **Balance** read access. Leave unrelated resources disabled.
|
|
19
|
+
3. Choose **Create key**, complete the verification prompt and copy the value
|
|
20
|
+
while visible. Finish the note/save dialog. These controls and the option
|
|
21
|
+
to duplicate a key are described in the
|
|
22
|
+
[restricted-key guide](https://docs.stripe.com/keys/restricted-api-keys).
|
|
23
|
+
4. Put the value in backend Env as `STRIPE_API_KEY`. Save provider `stripe`,
|
|
24
|
+
mode `shared` or `assistant`, `scopes: []`, and authentication
|
|
25
|
+
`{ "method": "api-key", "secretRef": "env:STRIPE_API_KEY" }`.
|
|
26
|
+
5. Run `connectApiKey` to verify balance access. Publishable keys are unsuitable;
|
|
27
|
+
restricted and secret keys authenticate backend requests. Bearer auth is
|
|
28
|
+
supported alongside Basic auth.
|
|
29
|
+
[Authentication](https://docs.stripe.com/api/authentication).
|
|
30
|
+
|
|
31
|
+
## Runtime and AI composition
|
|
32
|
+
|
|
33
|
+
`balance.read` performs `GET https://api.stripe.com/v1/balance` with no input.
|
|
34
|
+
The returned object retains `available`, `pending`, currency amounts and
|
|
35
|
+
`livemode`. It uses the account's configured Stripe API version; no version
|
|
36
|
+
override or connected-account header is supplied by this fragment.
|
|
37
|
+
[Balance endpoint](https://docs.stripe.com/api/balance/balance_retrieve).
|
|
38
|
+
|
|
39
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with this
|
|
40
|
+
provider. The CLI and editor use identical JSON and file-store library wiring.
|
|
41
|
+
Applications must authorize who can see the shared merchant account's balance.
|
|
42
|
+
|
|
43
|
+
## Automation and application ownership
|
|
44
|
+
|
|
45
|
+
An AI can author the configuration and balance call after the owner supplies a
|
|
46
|
+
key. This pass establishes Dashboard key creation, not an API for bootstrapping
|
|
47
|
+
the merchant account or issuing its initial restricted key. Account activation
|
|
48
|
+
and any requested business verification remain owner tasks.
|
|
49
|
+
|
|
50
|
+
The application owner supplies a key for its merchant account through private
|
|
51
|
+
Env. Separate keys do not create separate merchants or prove separate capacity.
|
|
52
|
+
An application serving multiple merchants needs explicit merchant ownership and
|
|
53
|
+
its own Stripe Connect design; it cannot silently collect each merchant's revenue
|
|
54
|
+
into one unrelated account. That design is outside this balance fragment.
|
|
55
|
+
|
|
56
|
+
Automatic merchant onboarding uses Stripe Connect, a separate platform
|
|
57
|
+
integration with explicit account responsibilities and Dashboard access. It is
|
|
58
|
+
not provided by entering this project's API key. See Stripe's current
|
|
59
|
+
[connected-account configuration](https://docs.stripe.com/connect/accounts-v2/connected-account-configuration).
|
|
60
|
+
This connector does not create connected accounts or depend on a platform's
|
|
61
|
+
Connect credentials. Exported applications continue using their own merchant
|
|
62
|
+
credentials and application database.
|
|
63
|
+
|
|
64
|
+
Automated tests cover balance shape, headers, file-store restart, credential
|
|
65
|
+
replacement, isolation, disconnect and errors. They make no live Stripe calls.
|
|
66
|
+
|
|
67
|
+
## Full application payments
|
|
68
|
+
|
|
69
|
+
This connector's operations are only part of a billing implementation. For
|
|
70
|
+
checkout, subscriptions, feature access, renewal credits and durable catalogue
|
|
71
|
+
mappings, read [payments-core](../../payments-core/README.md) and its
|
|
72
|
+
[standalone composition guide](../../payments-core/docs/standalone.md). These
|
|
73
|
+
JavaScript libraries work from ordinary app code or a CLI without Vibe64 or
|
|
74
|
+
Genesis. Other frameworks consume the [portable contract](../../payments-core/docs/contract.md)
|
|
75
|
+
and its static examples using their own runtime libraries. Keep provider setup
|
|
76
|
+
from this guide; do not substitute a successful connection check for working
|
|
77
|
+
checkout, verified webhooks or merchant approval.
|
package/docs/supabase.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Supabase
|
|
2
|
+
|
|
3
|
+
Import `supabaseProvider` from `@jskit-ai/connectors-catalog/server/supabase`.
|
|
4
|
+
This fragment lists project metadata through the Management API. It does not
|
|
5
|
+
install storage, connect to Postgres, configure login or execute SQL.
|
|
6
|
+
|
|
7
|
+
## Configure access
|
|
8
|
+
|
|
9
|
+
1. Open Supabase's [account token settings](https://supabase.com/dashboard/account/tokens)
|
|
10
|
+
and generate a personal access token for this application.
|
|
11
|
+
2. Where available, choose a scoped token with the intended resources and
|
|
12
|
+
project-read permission. Scoped tokens are in a gradual alpha rollout;
|
|
13
|
+
classic tokens instead inherit the account's full access. Review that choice
|
|
14
|
+
before supplying a token. [Token guide](https://supabase.com/docs/guides/platform/personal-access-tokens).
|
|
15
|
+
3. Put the token into backend Env as `SUPABASE_ACCESS_TOKEN`. Project anon,
|
|
16
|
+
publishable, secret and service-role keys are different from Management API
|
|
17
|
+
credentials. [API authentication](https://supabase.com/docs/reference/api/introduction).
|
|
18
|
+
4. Save provider `supabase`, mode `shared` or `assistant`, `scopes: []`, and
|
|
19
|
+
authentication
|
|
20
|
+
`{ "method": "api-key", "secretRef": "env:SUPABASE_ACCESS_TOKEN" }`.
|
|
21
|
+
5. Run `connectApiKey`. The project-list endpoint requires `projects_read` for
|
|
22
|
+
a fine-grained token; its corresponding OAuth scope is `projects:read`.
|
|
23
|
+
Empty accessible-project lists are valid.
|
|
24
|
+
[Project endpoint](https://supabase.com/docs/reference/api/v1-list-all-projects).
|
|
25
|
+
|
|
26
|
+
## Runtime and AI composition
|
|
27
|
+
|
|
28
|
+
`projects.list` performs `GET https://api.supabase.com/v1/projects` with
|
|
29
|
+
Bearer authorization and no inputs. It returns the array of project metadata.
|
|
30
|
+
The fragment contains no project-creation or database-mutation operation.
|
|
31
|
+
|
|
32
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md), supplying
|
|
33
|
+
this provider and the JSON file store. Configuration and runtime state remain
|
|
34
|
+
files for the editor. A separate application may explicitly install a database
|
|
35
|
+
for its own purpose; this integration does not make that decision.
|
|
36
|
+
|
|
37
|
+
## Automation and application ownership
|
|
38
|
+
|
|
39
|
+
The Management API offers further provisioning endpoints after authentication,
|
|
40
|
+
so an AI can prepare API requests and application wiring with suitable owner
|
|
41
|
+
authority. This pass verifies token bootstrap through account settings, not an
|
|
42
|
+
API for creating the first personal token. OAuth registration for other users
|
|
43
|
+
is a distinct flow.
|
|
44
|
+
|
|
45
|
+
Personal tokens act for their owner and allowed resources. Each application
|
|
46
|
+
owner supplies its authorized token through private Env. Separate token names
|
|
47
|
+
are not sufficient evidence of independent organization limits or billing.
|
|
48
|
+
|
|
49
|
+
Fixtures cover project records, empty results, invalid payloads, credential
|
|
50
|
+
replacement, file-store restart, isolation and provider errors. No Supabase
|
|
51
|
+
project or database is created or accessed during these tests.
|
package/docs/tally.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Tally
|
|
2
|
+
|
|
3
|
+
Import `tallyProvider` from `@jskit-ai/connectors-catalog/server/tally`.
|
|
4
|
+
The adapter lists account forms and reads their submissions with an API key.
|
|
5
|
+
|
|
6
|
+
## Configure access
|
|
7
|
+
|
|
8
|
+
1. Sign into the intended Tally user account. Keys inherit that user's resource
|
|
9
|
+
access, including access changes made later.
|
|
10
|
+
2. Open **Settings → API keys → Create API key**.
|
|
11
|
+
3. Create and copy the key while it is displayed. This flow does not provide
|
|
12
|
+
per-form permission selection; do not invent scope checkboxes in application
|
|
13
|
+
setup that imply the provider enforces them.
|
|
14
|
+
4. Store the key in backend Env as `TALLY_API_KEY`.
|
|
15
|
+
5. Save provider `tally`, mode `shared` or `assistant`, `scopes: []`, and
|
|
16
|
+
authentication `{ "method": "api-key", "secretRef": "env:TALLY_API_KEY" }`.
|
|
17
|
+
6. Verify through `connectApiKey`. Manage keys in Settings; removing the owner
|
|
18
|
+
from an organization also affects their keys' access.
|
|
19
|
+
[Key ownership and setup](https://developers.tally.so/api-reference/api-keys).
|
|
20
|
+
|
|
21
|
+
## Runtime and AI composition
|
|
22
|
+
|
|
23
|
+
`forms.list` sends `GET https://api.tally.so/forms` with Bearer authorization
|
|
24
|
+
and `tally-version: 2025-02-01`. Inputs are `page` (starting at 1) and `limit`
|
|
25
|
+
(1–500, default 50). The response retains `items`, `page`, `limit`, `total`
|
|
26
|
+
and `hasMore`. Increment the page while `hasMore` is true. The connection check
|
|
27
|
+
uses the same operation; it does not create forms or fetch submission content during verification.
|
|
28
|
+
[Forms API](https://developers.tally.so/api-reference/endpoint/forms/list),
|
|
29
|
+
[version header](https://tally.so/help/api).
|
|
30
|
+
|
|
31
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) from CLI
|
|
32
|
+
code or an application service. The application owns which form metadata each
|
|
33
|
+
of its users may see; a shared provider key is not end-user authentication.
|
|
34
|
+
|
|
35
|
+
## Automation and application registrations
|
|
36
|
+
|
|
37
|
+
After interactive key setup, an AI can wire calls and prepare forms or webhooks
|
|
38
|
+
using documented provider APIs. The adapter exposes listing, draft creation, reading/updating forms and submission retrieval. No ordinary
|
|
39
|
+
API for creating the initial API key was verified; it remains an operator step.
|
|
40
|
+
|
|
41
|
+
This mode has no provider app/client ID. The application owner supplies its
|
|
42
|
+
user's authorized key through private Env. Distinct configuration names cannot
|
|
43
|
+
create independent capacity from one user's keys. Tests simulate pagination,
|
|
44
|
+
header versioning, bad keys, rate limits, malformed results, file-store restart,
|
|
45
|
+
rotation and cross-application isolation. No live forms were created or accessed.
|
|
46
|
+
|
|
47
|
+
## Submission retrieval
|
|
48
|
+
|
|
49
|
+
Invoke `submissions.list` with `formId`, optional `page` (default 1), `limit`
|
|
50
|
+
(1–500, default 50), `filter` (`completed` by default, or `all`/`partial`) and
|
|
51
|
+
`afterId` from an earlier submission. GET `/forms/{formId}/submissions` retains
|
|
52
|
+
questions, answers, provider totals and `hasMore`. Advance pages explicitly;
|
|
53
|
+
keep the form/filter with pagination state and deduplicate imported submissions
|
|
54
|
+
by ID. An empty page is valid. False, zero and structured answers are preserved.
|
|
55
|
+
|
|
56
|
+
The application owns who can read these responses and how they are retained.
|
|
57
|
+
A shared key does not grant every app user access to every form. Do not fetch
|
|
58
|
+
returned PDF/preview/file URLs automatically or render answers as trusted HTML.
|
|
59
|
+
Other frameworks can use their native server HTTP client with the same Env
|
|
60
|
+
Bearer token and version header; no JSKIT or Vibe64 process is required.
|
|
61
|
+
[Submission API](https://developers.tally.so/api-reference/endpoint/forms/submissions/list).
|
|
62
|
+
|
|
63
|
+
No live submission was read.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Create, review and publish
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
const draft = await connections.invoke({
|
|
70
|
+
context: authenticatedOwner, integrationId: "forms", operation: "forms.create",
|
|
71
|
+
input: { blocks: [
|
|
72
|
+
{ uuid: crypto.randomUUID(), type: "FORM_TITLE", groupUuid: crypto.randomUUID(),
|
|
73
|
+
groupType: "FORM_TITLE", payload: { title: "Booking request" } },
|
|
74
|
+
{ uuid: crypto.randomUUID(), type: "INPUT_TEXT", groupUuid: crypto.randomUUID(),
|
|
75
|
+
groupType: "INPUT_TEXT", payload: { isRequired: true, placeholder: "Your name" } }
|
|
76
|
+
] }
|
|
77
|
+
});
|
|
78
|
+
// After the application's explicit review/approval:
|
|
79
|
+
await connections.invoke({ context: authenticatedOwner, integrationId: "forms",
|
|
80
|
+
operation: "forms.update", input: { formId: draft.id, status: "PUBLISHED" } });
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`forms.create` accepts native `blocks` (up to 500), optional workspace/template/
|
|
84
|
+
folder IDs and status (default `DRAFT`). The provider uses the account's default
|
|
85
|
+
workspace when no workspace ID is supplied. Native block schema and account
|
|
86
|
+
access remain Tally's authority; local validation checks the outer block shape,
|
|
87
|
+
not every block-specific payload. Construct fresh UUIDs for new blocks and retain
|
|
88
|
+
existing identifiers when editing. Never blindly replay an uncertain creation:
|
|
89
|
+
list forms and reconcile the result before deliberately retrying.
|
|
90
|
+
|
|
91
|
+
`forms.get` returns blocks and metadata. `forms.update` accepts a name, status
|
|
92
|
+
(`BLANK`, `DRAFT`, `PUBLISHED`) or replacement blocks; omitted fields are not sent.
|
|
93
|
+
Fetch and review before replacing blocks, since existing submissions may refer
|
|
94
|
+
to old questions. No automatic publication, polling loop or form designer is
|
|
95
|
+
created by configuring the connector.
|
|
96
|
+
[Create](https://developers.tally.so/api-reference/endpoint/forms/post),
|
|
97
|
+
[read](https://developers.tally.so/api-reference/endpoint/forms/get),
|
|
98
|
+
[update](https://developers.tally.so/api-reference/endpoint/forms/patch).
|
|
99
|
+
|
|
100
|
+
Other frameworks send the same JSON via their own server HTTP client and Env
|
|
101
|
+
binding. The application owns review screens, publication decisions, ingestion
|
|
102
|
+
and retention. A native Tally embed or hosted form can collect answers without
|
|
103
|
+
exposing this administrative API key to the browser. Settings, webhooks, form
|
|
104
|
+
trash and response deletion are not implemented by this adapter; account-level
|
|
105
|
+
setup and advanced form editing remain available in Tally.
|
package/docs/telegram.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Telegram
|
|
2
|
+
|
|
3
|
+
Import `telegramProvider` from `@jskit-ai/connectors-catalog/server/telegram`.
|
|
4
|
+
The adapter reads bot identity/webhook status, sends plain text and chat actions,
|
|
5
|
+
and receives message updates through explicit polling. It does not change
|
|
6
|
+
webhooks or authenticate application users.
|
|
7
|
+
|
|
8
|
+
## Manual provider setup
|
|
9
|
+
|
|
10
|
+
1. Open Telegram and find the verified [BotFather](https://t.me/BotFather).
|
|
11
|
+
2. Send `/newbot`, supply a display name, then choose an available username
|
|
12
|
+
ending in `bot`. Keep the returned token private.
|
|
13
|
+
3. Store the token in your backend environment as `TELEGRAM_BOT_TOKEN`.
|
|
14
|
+
4. Add Telegram in Vibe64. Enter `env:TELEGRAM_BOT_TOKEN` in **Bot token
|
|
15
|
+
reference** and save. The CLI uses exactly the same JSON below.
|
|
16
|
+
5. Run the application's connection verification. Saving an editor form alone
|
|
17
|
+
does not contact Telegram or prove that the token works.
|
|
18
|
+
|
|
19
|
+
BotFather manages bot creation and tokens; the token belongs to a bot rather
|
|
20
|
+
than its owner's personal Telegram mailbox.
|
|
21
|
+
[Telegram bot tutorial](https://core.telegram.org/bots/tutorial).
|
|
22
|
+
|
|
23
|
+
## Portable configuration and runtime
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"schemaVersion": 1,
|
|
28
|
+
"registrations": {},
|
|
29
|
+
"integrations": {
|
|
30
|
+
"bot": {
|
|
31
|
+
"provider": "telegram",
|
|
32
|
+
"displayName": "Service bot",
|
|
33
|
+
"accountMode": "shared",
|
|
34
|
+
"scopes": [],
|
|
35
|
+
"authentication": { "method": "api-key", "secretRef": "env:TELEGRAM_BOT_TOKEN" }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Compose the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with
|
|
42
|
+
`providers: [telegramProvider]`, application authorization and a file connection
|
|
43
|
+
store. Runtime state is private text files outside the source tree; no editor
|
|
44
|
+
database or generated project is required to use the library from a CLI.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
await connections.connectApiKey({ context, integrationId: "bot" });
|
|
48
|
+
const status = await connections.invoke({
|
|
49
|
+
context, integrationId: "bot", operation: "webhook.read"
|
|
50
|
+
});
|
|
51
|
+
console.log(status.result.pending_update_count);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Operation | Telegram method | Input | Result |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| `profile.read` (verification) | `getMe` | `{}` | `{ ok: true, result: bot }` |
|
|
57
|
+
| `webhook.read` | `getWebhookInfo` | `{}` | `{ ok: true, result: webhook }` |
|
|
58
|
+
|
|
59
|
+
Bot API requests use `https://api.telegram.org/bot<TOKEN>/<METHOD>`.
|
|
60
|
+
`getMe` identifies the bot. `getWebhookInfo` reports delivery configuration and
|
|
61
|
+
pending updates; its URL is empty when no outgoing webhook is configured.
|
|
62
|
+
`getUpdates` and webhooks are alternative delivery mechanisms, so verification
|
|
63
|
+
must not start polling or acknowledge updates. Telegram error envelopes contain
|
|
64
|
+
`ok: false`, a description and an error code.
|
|
65
|
+
[Bot API methods and envelopes](https://core.telegram.org/bots/api).
|
|
66
|
+
|
|
67
|
+
The adapter checks the token's numeric-ID/colon/token shape before transport,
|
|
68
|
+
validates successful bot and webhook fields, and preserves extra response data.
|
|
69
|
+
Only the fixed API origin receives credentials. Source and connection records
|
|
70
|
+
contain references; update the environment binding for token rotation.
|
|
71
|
+
HTTP failures and unsuccessful JSON envelopes become safe connector errors;
|
|
72
|
+
an unauthorized token marks a previously verified connection as needing
|
|
73
|
+
reconnection. Provider descriptions are not returned. This fragment does not
|
|
74
|
+
schedule retries or expose Telegram's optional retry-delay payload.
|
|
75
|
+
|
|
76
|
+
The request pathname contains the credential. Redact it in application HTTP
|
|
77
|
+
logs and tracing. Authorize webhook reads because the returned URL can reveal
|
|
78
|
+
application configuration. Disconnect deletes local state only; it leaves the
|
|
79
|
+
bot and its delivery configuration intact.
|
|
80
|
+
|
|
81
|
+
## API provisioning and application ownership
|
|
82
|
+
|
|
83
|
+
For ordinary manual setup, create a bot for the application through BotFather
|
|
84
|
+
with an available username. Store its token in the application's private Env. Rotating a token for one bot retains that
|
|
85
|
+
bot's identity; it does not create independent message delivery or capacity.
|
|
86
|
+
|
|
87
|
+
Telegram also documents **managed bots**: a manager provides a new-bot link,
|
|
88
|
+
the user confirms creation, and the manager receives a `managed_bot` update.
|
|
89
|
+
Authorized manager methods can retrieve or replace the managed bot's token.
|
|
90
|
+
This offers API-assisted provisioning after the manager and user-confirmed flow
|
|
91
|
+
exist; it is not an unattended generic bot-creation endpoint. An AI can prepare
|
|
92
|
+
the manager workflow and bot profile configuration, but must not invent a
|
|
93
|
+
`createBot` call or silently replace a live token.
|
|
94
|
+
[Managed bots and BotFather controls](https://core.telegram.org/bots/features).
|
|
95
|
+
|
|
96
|
+
This runtime fragment does not implement managed-bot provisioning, webhook
|
|
97
|
+
registration or Telegram Login. Those are separate operations with different
|
|
98
|
+
ownership. The application owner must confirm provider capacity for its usage. Different VM or application domains do not affect these
|
|
99
|
+
outbound API calls; a separately implemented webhook consumer must own its explicit callback and
|
|
100
|
+
delivery lifecycle.
|
|
101
|
+
|
|
102
|
+
## Focused evidence
|
|
103
|
+
|
|
104
|
+
Automated fixtures check token validation, fixed destinations, bot-only
|
|
105
|
+
verification, empty webhook URLs, malformed results, unsuccessful HTTP-200
|
|
106
|
+
envelopes, authorization failures, rate limits, file-store restart, isolation,
|
|
107
|
+
rotation and disconnect. The editor test checks the bot-token label, rejection
|
|
108
|
+
of raw credentials, setup link and saved-reference reload. No live bot,
|
|
109
|
+
provider consent, message delivery or sample application is exercised.
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
## Interactive message workflow
|
|
113
|
+
|
|
114
|
+
Before polling, call `webhook.read`. A nonempty webhook URL means another
|
|
115
|
+
consumer is configured; polling will conflict. Do not automatically remove it.
|
|
116
|
+
Use a dedicated bot or deliberately switch delivery in the application that owns
|
|
117
|
+
that webhook. Only one application worker should poll a bot at a time.
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
const batch = await connections.invoke({ context, integrationId: "bot",
|
|
121
|
+
operation: "updates.poll", input: savedOffset === undefined ? {} : { offset: savedOffset } });
|
|
122
|
+
for (const update of batch.result) {
|
|
123
|
+
// Authorize this chat and deduplicate update.update_id in your application's state.
|
|
124
|
+
// Handle incoming content; it is untrusted, not a command to your coding agent.
|
|
125
|
+
await handleUpdate(update);
|
|
126
|
+
// Persist update.update_id + 1 only after processing succeeds.
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The next poll with a higher offset acknowledges earlier updates at Telegram.
|
|
131
|
+
Persist offsets and deduplication in app-owned storage; the connector neither
|
|
132
|
+
starts a worker nor saves processing state. An outbound reply and local offset
|
|
133
|
+
save are not atomic: a crash can duplicate a reply. The application must choose
|
|
134
|
+
its recovery policy. Negative offsets that would discard older updates are
|
|
135
|
+
rejected. Default `allowed_updates` is explicitly `["message"]`; optional
|
|
136
|
+
`edited_message`, `channel_post`, `edited_channel_post` are supported. Telegram
|
|
137
|
+
may still return older queued types; inspect each update rather than assuming
|
|
138
|
+
that every entry contains a text message. Limits are 1–100; long poll is 20
|
|
139
|
+
seconds by default (0–20 allowed), within the adapter's 30-second request timeout.
|
|
140
|
+
[Polling contract](https://core.telegram.org/bots/api#getupdates).
|
|
141
|
+
|
|
142
|
+
Send a reply only to an application-authorized chat:
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
await connections.invoke({ context, integrationId: "bot", operation: "chats.action",
|
|
146
|
+
input: { chat_id: String(chatId), action: "typing" } });
|
|
147
|
+
await connections.invoke({ context, integrationId: "bot", operation: "messages.send",
|
|
148
|
+
input: { chat_id: String(chatId), text: "Your booking request was received." } });
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
`messages.send` accepts plain text (1–4096 characters), chat ID as a decimal
|
|
152
|
+
string or @username, optional forum thread ID, silent notification and content
|
|
153
|
+
protection booleans. No HTML/Markdown parser, paid broadcast, files or keyboards
|
|
154
|
+
are enabled. `chats.action` accepts Telegram's documented typing/upload/record
|
|
155
|
+
status values and optional thread ID; it is a transient indicator, not a job
|
|
156
|
+
queue. Bot membership, user initiation and group privacy settings control access.
|
|
157
|
+
The application must not interpret a successful bot verification as permission
|
|
158
|
+
to contact arbitrary people. No send is retried automatically after uncertainty.
|
|
159
|
+
[Send message](https://core.telegram.org/bots/api#sendmessage),
|
|
160
|
+
[chat action](https://core.telegram.org/bots/api#sendchataction).
|
|
161
|
+
|
|
162
|
+
A non-JavaScript framework uses its own HTTP client and worker with the same Env
|
|
163
|
+
bot token, JSON payloads and offset contract. JSKIT is optional; Vibe64 hosts no
|
|
164
|
+
polling service. Local disconnect leaves the bot and queued updates intact.
|
|
165
|
+
Revoke/replace a compromised token with BotFather, change Env and verify again.
|
package/docs/tiktok.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# TikTok
|
|
2
|
+
|
|
3
|
+
Import `tiktokProvider` from `@jskit-ai/connectors-catalog/server/tiktok`.
|
|
4
|
+
The library reads the consenting creator's profile, statistics and public video
|
|
5
|
+
metadata. CLI and server consumers use the same configuration and connection
|
|
6
|
+
service; Vibe64 edits that file through shared fields and validation.
|
|
7
|
+
|
|
8
|
+
## Provider setup
|
|
9
|
+
|
|
10
|
+
1. At [TikTok for Developers](https://developers.tiktok.com/), sign in, open
|
|
11
|
+
your profile menu, choose **Manage apps**, then **Connect an app**.
|
|
12
|
+
Select the owning organization/account and confirm.
|
|
13
|
+
2. Complete the app's identity, icon, description and website under its details.
|
|
14
|
+
Select Web. In the products section add Login Kit and Display API.
|
|
15
|
+
3. In Login Kit's Web settings enter the backend callback described below.
|
|
16
|
+
Copy the **Client key**, not the separate App ID, and store the client secret
|
|
17
|
+
in the backend environment.
|
|
18
|
+
4. Before production submission, verify your configured website/policy URLs
|
|
19
|
+
through URL properties. Complete the review explanation and demo, save,
|
|
20
|
+
then submit the application-owned registration. [Registration and review](https://developers.tiktok.com/docs/en/getting-started-create-an-app).
|
|
21
|
+
5. In **Scopes**, add `user.info.basic`, `user.info.profile`, `user.info.stats`
|
|
22
|
+
and `video.list` as needed. Basic access verifies the account; users may
|
|
23
|
+
decline the others. The runtime blocks an operation lacking its granted
|
|
24
|
+
permission. [Scope selection](https://developers.tiktok.com/docs/en/scopes-overview).
|
|
25
|
+
6. Start in Sandbox with designated test accounts. Production availability
|
|
26
|
+
requires approval for the actual products and use case.
|
|
27
|
+
[Display API prerequisites](https://developers.tiktok.com/docs/en/display-api-get-started).
|
|
28
|
+
7. Set `TIKTOK_CLIENT_SECRET` and `TIKTOK_CALLBACK_URL` on the callback-owning
|
|
29
|
+
backend. Save their references in JSON. Saving configuration does not start
|
|
30
|
+
consent or prove provider approval.
|
|
31
|
+
|
|
32
|
+
For a Web registration, the callback must be an exact static HTTPS URI, shorter
|
|
33
|
+
than 512 characters, without a query or fragment. HTTP loopback callbacks are
|
|
34
|
+
not accepted by this adapter. The authorize URL uses `client_key` and comma
|
|
35
|
+
separated permissions. An operator CLI can invoke the same library through an
|
|
36
|
+
HTTPS callback-owning backend; this fragment does not implement TikTok's
|
|
37
|
+
separate native Desktop journey. Keep the confidential secret off distributed
|
|
38
|
+
clients. The shared runtime sends PKCE parameters, but TikTok's Web guide does
|
|
39
|
+
not establish enforcement of them. [Web flow](https://developers.tiktok.com/doc/login-kit-web/),
|
|
40
|
+
[Desktop flow](https://developers.tiktok.com/docs/en/login-kit-desktop).
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"schemaVersion": 1,
|
|
45
|
+
"registrations": {
|
|
46
|
+
"creator-app": {
|
|
47
|
+
"source": "own",
|
|
48
|
+
"clientId": "YOUR_TIKTOK_CLIENT_KEY",
|
|
49
|
+
"clientSecretRef": "env:TIKTOK_CLIENT_SECRET",
|
|
50
|
+
"callbackUrlRef": "env:TIKTOK_CALLBACK_URL"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"integrations": {
|
|
54
|
+
"creator": {
|
|
55
|
+
"provider": "tiktok",
|
|
56
|
+
"displayName": "Creator account",
|
|
57
|
+
"accountMode": "per-user",
|
|
58
|
+
"scopes": ["user.info.basic", "user.info.stats", "user.info.profile", "video.list"],
|
|
59
|
+
"authentication": { "method": "oauth2", "registrationRef": "creator-app" }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Runtime composition
|
|
66
|
+
|
|
67
|
+
Use the packaged [OAuth connection pattern](../patterns/oauth-connection/PATTERN.md) to construct `connections` from
|
|
68
|
+
this provider, parsed JSON, host authorization, reference resolution and the
|
|
69
|
+
encrypted file store. Pass `tiktokProvider` to both configuration validation and
|
|
70
|
+
the connection service. No copied application template or database is required.
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const pending = await connections.beginAuthorization({
|
|
74
|
+
context: authenticatedOwner, integrationId: "creator"
|
|
75
|
+
});
|
|
76
|
+
// Open pending.authorizationUrl in the user's browser.
|
|
77
|
+
// In the registered backend callback, recover the same trusted owner:
|
|
78
|
+
await connections.completeAuthorization({
|
|
79
|
+
context: authenticatedOwner, integrationId: "creator", callbackUrl
|
|
80
|
+
});
|
|
81
|
+
const page = await connections.invoke({
|
|
82
|
+
context: authenticatedOwner, integrationId: "creator",
|
|
83
|
+
operation: "videos.list", input: { max_count: 10 }
|
|
84
|
+
});
|
|
85
|
+
// If page.data.has_more, explicitly request its data.cursor on a later call.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The host derives ownership from an authenticated session or trusted CLI operator.
|
|
89
|
+
It must not accept application or subject identities from arbitrary browser
|
|
90
|
+
input. Shared and assistant modes require the host to authorize every caller
|
|
91
|
+
before mapping to the shared subject. A builder's connected account does not
|
|
92
|
+
become all app users' individual accounts.
|
|
93
|
+
|
|
94
|
+
| Operation | Permission | Input and result |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `profile.read` (verification) | `user.info.basic` | No input; `open_id`, `display_name`, `avatar_url` |
|
|
97
|
+
| `profile.extended` | `user.info.profile` | No input; username, bio, profile link and verification flag |
|
|
98
|
+
| `profile.stats` | `user.info.stats` | No input; follower, following, like and video counts |
|
|
99
|
+
| `videos.list` | `video.list` | `max_count` 1–20, default 10; optional nonnegative safe-integer `cursor`; one public video page with IDs, titles and cover URLs |
|
|
100
|
+
|
|
101
|
+
Profile operations use GET `/v2/user/info/`; video pages use POST
|
|
102
|
+
`/v2/video/list/`, both on `https://open.tiktokapis.com`. Each operation selects
|
|
103
|
+
only its own fields and returns the validated original envelope. Keep video
|
|
104
|
+
IDs as strings. Pagination cursors are millisecond timestamps; preserve them
|
|
105
|
+
with their connection/query rather than automatically crawling every page.
|
|
106
|
+
[Profile fields](https://developers.tiktok.com/docs/en/tiktok-api-v2-get-user-info),
|
|
107
|
+
[video pagination](https://developers.tiktok.com/docs/en/tiktok-api-v2-video-list).
|
|
108
|
+
|
|
109
|
+
The service verifies basic profile access before saving tokens. It encrypts
|
|
110
|
+
credentials outside source, binds attempts to their owner and consumes each
|
|
111
|
+
attempt once. Initial grants are bounded by configured scopes; refresh can
|
|
112
|
+
shrink existing permissions but cannot expand them. Rotated refresh tokens
|
|
113
|
+
replace previous ones. TikTok's `refresh_expires_in` is validated but not stored
|
|
114
|
+
as a proactive expiry cutoff in this initial implementation; provider rejection
|
|
115
|
+
requires reconnection. Local disconnect deletes local access only. Provider
|
|
116
|
+
revocation is a separate action, currently unwired.
|
|
117
|
+
[Token exchange, refresh and revocation](https://developers.tiktok.com/docs/en/oauth-user-access-token-management).
|
|
118
|
+
|
|
119
|
+
Provider error codes distinguish revoked/expired access from missing scopes,
|
|
120
|
+
including TikTok's scope error that uses HTTP 401. Permission failures preserve
|
|
121
|
+
the connection; invalid access marks it for reconnect. Rate-limit failures are
|
|
122
|
+
reported without automatic retries. Cancellation, timeout and malformed data
|
|
123
|
+
are explicit errors, and provider message/log text is omitted.
|
|
124
|
+
[API errors](https://developers.tiktok.com/docs/en/tiktok-api-v2-error-handling),
|
|
125
|
+
[OAuth errors](https://developers.tiktok.com/docs/en/oauth-error-handling).
|
|
126
|
+
|
|
127
|
+
## Creator gallery in an application
|
|
128
|
+
|
|
129
|
+
A useful first screen is a creator header and a paged list of public video
|
|
130
|
+
cards. The application's authenticated backend calls `profile.read` and
|
|
131
|
+
`videos.list`; it sends those results to that same authorized viewer, never the
|
|
132
|
+
connection record or tokens. For example, after the OAuth pattern has provided
|
|
133
|
+
`connections` and the host has derived `authenticatedOwner`:
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
const request = { context: authenticatedOwner, integrationId: "creator" };
|
|
137
|
+
const creator = await connections.invoke({ ...request, operation: "profile.read" });
|
|
138
|
+
const videos = await connections.invoke({ ...request, operation: "videos.list",
|
|
139
|
+
input: { max_count: 10, ...(cursor === undefined ? {} : { cursor }) } });
|
|
140
|
+
const gallery = {
|
|
141
|
+
name: creator.data.user.display_name,
|
|
142
|
+
avatarUrl: creator.data.user.avatar_url,
|
|
143
|
+
videos: videos.data.videos,
|
|
144
|
+
nextCursor: videos.data.has_more ? videos.data.cursor : null
|
|
145
|
+
};
|
|
146
|
+
// Return gallery through the framework's authenticated JSON response.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The frontend renders `name` and each video `title` as escaped text, uses HTTPS
|
|
150
|
+
image URLs for the avatar and covers, and offers **Load more** only when
|
|
151
|
+
`nextCursor !== null`. Append the next page with duplicate IDs removed. Keep the
|
|
152
|
+
cursor in the current account's gallery state; clear displayed data on account
|
|
153
|
+
switch or disconnect. Show an empty state for an account with no public videos.
|
|
154
|
+
When `video.list` was declined, keep the profile visible and offer reconnection
|
|
155
|
+
with that permission instead of presenting a broken gallery. A thumbnail can
|
|
156
|
+
expire or disappear: show an image fallback and refresh metadata on the next
|
|
157
|
+
explicit load. Do not permanently copy the media or interpret titles as HTML.
|
|
158
|
+
|
|
159
|
+
This composition shows metadata cards. It does not provide playback, posting,
|
|
160
|
+
downloads or a persistent mirror of the account. A removed/private video may
|
|
161
|
+
vanish between pages; do not assume the feed is an immutable snapshot.
|
|
162
|
+
[Public-video listing](https://developers.tiktok.com/docs/en/tiktok-api-v2-video-list).
|
|
163
|
+
|
|
164
|
+
A Node app or CLI consumes the same installed JSKIT exports and file without
|
|
165
|
+
Vibe64. A different framework owns its OAuth/token storage and native HTTP calls:
|
|
166
|
+
read the same registration references and ownership/scopes, call GET
|
|
167
|
+
`/v2/user/info/` and JSON POST `/v2/video/list/`, then build the same gallery
|
|
168
|
+
response. It must retain the provider-specific `client_key`, comma scopes and
|
|
169
|
+
refresh-token rules described above. JSKIT supplies no PHP implementation.
|
|
170
|
+
|
|
171
|
+
## Online, public and custom domains
|
|
172
|
+
|
|
173
|
+
Each application owns its provider registration, callback route, credentials
|
|
174
|
+
and grants. Hosted and installed editors configure the same app-owned setup;
|
|
175
|
+
neither supplies a shared Vibe64 registration or token gateway. Use the app's
|
|
176
|
+
assigned public URL as the initial callback origin, append the route the backend
|
|
177
|
+
actually implements, and register the exact URL with the provider. Keep the
|
|
178
|
+
client secret and callback binding in the application's Env.
|
|
179
|
+
|
|
180
|
+
A custom-domain or hosting move that changes the callback requires updating both
|
|
181
|
+
the provider registration and the app's Env. Preserve the application's identity
|
|
182
|
+
and private connection store, validate callback state and initiator, and allow
|
|
183
|
+
only application-approved return destinations. The editor's address is not the
|
|
184
|
+
provider callback. See the [callback contract](../../connectors-core/docs/oauth-callbacks.md)
|
|
185
|
+
and [setup command](../../connectors-core/docs/setup-command.md).
|
|
186
|
+
|
|
187
|
+
Separate registrations do not prove separate quota pools or provider approval.
|
|
188
|
+
The app developer must obtain approval for the actual integration and user flow.
|
|
189
|
+
|
|
190
|
+
## Automation assessment and limits
|
|
191
|
+
|
|
192
|
+
| Task | What can be automated |
|
|
193
|
+
|---|---|
|
|
194
|
+
| Create/configure the application registration | Reviewed documentation establishes console setup, not a general provisioning API. AI can guide an authorized operator and prepare configuration; registration/review approval is external work. |
|
|
195
|
+
| Configure callbacks and permissions | Prepare exact values and validate the file. Console setup and ownership verification remain operator steps until an authorized automation route is established. |
|
|
196
|
+
| Consent, refresh and reads | The library implements these exchanges once a valid registration and user consent exist. It cannot grant consent for the user. |
|
|
197
|
+
| Application login, posting, Research API | Outside this fragment. A successful data connection alone does not implement the app's login/session system. |
|
|
198
|
+
|
|
199
|
+
The initial fragment is tested with controlled token/API responses and the editor
|
|
200
|
+
configuration UI. No live TikTok registration, production approval, provider
|
|
201
|
+
consent or generated application has been exercised.
|