@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/wave.md
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
# Wave
|
|
2
|
+
|
|
3
|
+
`waveProvider` from `@jskit-ai/connectors-catalog/server/wave` provides OAuth
|
|
4
|
+
consent, profile verification, business/accounting reads, customer/product and
|
|
5
|
+
account/tax maintenance, invoice/estimate workflows and money-transaction creation. An ordinary CLI or backend composes the shared connection service
|
|
6
|
+
with encrypted file storage. Vibe64 edits the same portable JSON; saving it
|
|
7
|
+
does not connect an account.
|
|
8
|
+
|
|
9
|
+
## Provider registration
|
|
10
|
+
|
|
11
|
+
1. Sign in to Wave, open the [Create an application guide](https://developer.waveapps.com/hc/en-us/articles/50682251860884-2-Create-an-application),
|
|
12
|
+
and follow **Manage applications**. Applications belong to that Wave account;
|
|
13
|
+
separate applications can represent different environments.
|
|
14
|
+
2. Choose **Create New Application**. Enter your application name and the
|
|
15
|
+
redirect URI your backend actually serves, then create it. These fields and
|
|
16
|
+
the issued Client ID/Secret are described in Wave's
|
|
17
|
+
[application setup instructions](https://developer.waveapps.com/hc/en-us/articles/51070420388628-Webhooks-Setup-Guide).
|
|
18
|
+
3. Copy **Client ID** into the configuration below. Put **Client Secret** in
|
|
19
|
+
`WAVE_CLIENT_SECRET`; put the callback URL in `WAVE_CALLBACK_URL`. Keep both
|
|
20
|
+
environment values outside source. The form takes references to these values.
|
|
21
|
+
4. Use an exact registered HTTPS callback for deployment. For a local operator
|
|
22
|
+
CLI, register and serve a fixed loopback callback such as
|
|
23
|
+
`http://localhost:8080/connections/wave/callback`. Wave's matching rules check
|
|
24
|
+
host/port and permit subpaths; this runtime deliberately requires its exact
|
|
25
|
+
configured callback. Changing the callback requires new consent.
|
|
26
|
+
5. Start consent from your backend/CLI, sign in as the intended Wave user, and
|
|
27
|
+
review the requested permissions. Complete the callback in the same
|
|
28
|
+
authenticated application context. OAuth business access requires an active
|
|
29
|
+
**Pro or Wave Advisor** subscription. A later subscription loss can make
|
|
30
|
+
refresh return 403. See the [OAuth guide](https://developer.waveapps.com/hc/en-us/articles/360019493652-OAuth-Guide).
|
|
31
|
+
|
|
32
|
+
Wave's [authentication guide](https://developer.waveapps.com/hc/en-us/articles/50682277703188-3-Authentication)
|
|
33
|
+
also describes **Create token** under an application's full-access tokens.
|
|
34
|
+
Those tokens are for personal/development use and can reach all businesses in
|
|
35
|
+
the account. They are not a substitute for customer OAuth. This adapter
|
|
36
|
+
implements OAuth only; full-access-token configuration remains a separate flow.
|
|
37
|
+
Do not paste such a token into the Client Secret field.
|
|
38
|
+
|
|
39
|
+
## Portable configuration
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"schemaVersion": 1,
|
|
44
|
+
"integrations": {
|
|
45
|
+
"wave": {
|
|
46
|
+
"provider": "wave",
|
|
47
|
+
"displayName": "Business accounts",
|
|
48
|
+
"accountMode": "per-user",
|
|
49
|
+
"scopes": ["user:read", "business:read", "customer:read", "invoice:read"],
|
|
50
|
+
"authentication": { "method": "oauth2", "registrationRef": "wave" }
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"registrations": {
|
|
54
|
+
"wave": {
|
|
55
|
+
"source": "own",
|
|
56
|
+
"clientId": "replace-with-issued-client-id",
|
|
57
|
+
"clientSecretRef": "env:WAVE_CLIENT_SECRET",
|
|
58
|
+
"callbackUrlRef": "env:WAVE_CALLBACK_URL",
|
|
59
|
+
"tokenEndpointAuthMethod": "client_secret_post"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The editor exposes all ten captured permission choices and the documented
|
|
66
|
+
granular alternatives, 32 choices in total. Four read permissions are initially
|
|
67
|
+
selected. Wave's [scope contract](https://developer.waveapps.com/hc/en-us/articles/360032818132-OAuth-Scopes)
|
|
68
|
+
treats read/write independently: `customer:write` does not authorize a read;
|
|
69
|
+
`customer:*` does. Broad permissions also include future operations. Selecting
|
|
70
|
+
extra permissions does not implement additional library operations.
|
|
71
|
+
|
|
72
|
+
Use `shared` for an intentionally shared connection with application membership
|
|
73
|
+
checks. Use `per-user` for individual grants, or `assistant` for access governed
|
|
74
|
+
by the host's assistant/workspace policy. The host derives stable
|
|
75
|
+
`applicationId` and `subjectId`; it must not trust these identifiers from a
|
|
76
|
+
browser request. A connected profile is data, not an application login.
|
|
77
|
+
|
|
78
|
+
## Runtime operations
|
|
79
|
+
|
|
80
|
+
| Operation | Inputs | Returned data |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `user.read` | None | Connected user ID, first/last names and email; verifies new consent. |
|
|
83
|
+
| `businesses.list` | Optional `page`, `pageSize` | Business IDs, names, personal flags and paging. |
|
|
84
|
+
| `customers.list` | Required `businessId`; optional paging | One business's customers ordered by name, with ID/name/email. |
|
|
85
|
+
| `invoices.list` | Required `businessId`; optional paging | ID, number, date, status and currency for invoice summaries, newest creation first. |
|
|
86
|
+
| `accounts.list` | Required `businessId`; optional paging | Chart-of-accounts IDs, types/subtypes, currency, archived flag and decimal balance. |
|
|
87
|
+
| `products.list` | Required `businessId`; optional paging | Names, prices, sold/bought flags and income/expense account IDs, sorted by name. |
|
|
88
|
+
| `salesTaxes.list` | Required `businessId`; optional paging | Tax IDs, names, abbreviation, decimal rate and compound/recoverable/archived flags. |
|
|
89
|
+
| `vendors.list` | Required `businessId`; optional paging | Vendor IDs, names, email and phone. |
|
|
90
|
+
|
|
91
|
+
Results retain the GraphQL `{ data: ... }` envelope. Requests use fixed queries
|
|
92
|
+
and typed variables at Wave's [GraphQL endpoint](https://developer.waveapps.com/hc/en-us/articles/50682329964564-4-Making-API-calls).
|
|
93
|
+
The [business](https://developer.waveapps.com/hc/en-us/articles/360032908111-Query-List-businesses),
|
|
94
|
+
[customer](https://developer.waveapps.com/hc/en-us/articles/360032908311-Query-List-and-sort-customers)
|
|
95
|
+
and [invoice](https://developer.waveapps.com/hc/en-us/articles/360038426192-Query-List-invoices)
|
|
96
|
+
examples establish the selected query fields.
|
|
97
|
+
|
|
98
|
+
This fragment defaults to page 1 and 20 records, limits requested page size to
|
|
99
|
+
1–100, and requires positive GraphQL Int page numbers. These are library input
|
|
100
|
+
bounds, not a promised provider capacity. Wave's [pagination](https://developer.waveapps.com/hc/en-us/articles/360018856791-Pagination)
|
|
101
|
+
uses `currentPage`, `totalPages` and `totalCount`; the caller advances explicitly.
|
|
102
|
+
Empty pages and nullable edge nodes remain visible. Decimal prices, rates and
|
|
103
|
+
balances remain exact strings; this library never converts them to JavaScript
|
|
104
|
+
floating-point numbers. Applications choose their own decimal arithmetic library. The adapter rejects wrong
|
|
105
|
+
business IDs, inconsistent returned page numbers, excessive result counts and
|
|
106
|
+
malformed records. It does not crawl, calculate money or follow URLs in returned data. Sending
|
|
107
|
+
invoices and estimates requires a separate explicit operation.
|
|
108
|
+
|
|
109
|
+
Choose a business explicitly from `businesses.list` and authorize that choice
|
|
110
|
+
in the host before requesting records. A provider grant can cover more than one
|
|
111
|
+
business; the provider enforces its grant, while the application must enforce
|
|
112
|
+
its own business/workspace membership. No business defaults to the first entry.
|
|
113
|
+
|
|
114
|
+
The shared runtime handles state, code exchange, rotation and file locking.
|
|
115
|
+
Wave requires the original callback in refresh requests, so the grant records
|
|
116
|
+
it. Token responses must state granted scopes; a reduced grant stays reduced.
|
|
117
|
+
OAuth PKCE parameters are sent, but provider enforcement is not proven by local
|
|
118
|
+
fixtures. GraphQL errors, including partial-data responses, are rejected;
|
|
119
|
+
`UNAUTHENTICATED` requires reconnecting and `NOT_FOUND` returns a resource error.
|
|
120
|
+
Provider messages are not exposed. See Wave's [error examples](https://developer.waveapps.com/hc/en-us/articles/360018571372-Errors).
|
|
121
|
+
|
|
122
|
+
`cancelAuthorization` abandons one pending attempt. Failed replacement consent
|
|
123
|
+
preserves the previous connection. `disconnect` deletes local access and
|
|
124
|
+
attempts; provider token revocation is not implemented. Provider-side access
|
|
125
|
+
must be removed separately when needed.
|
|
126
|
+
|
|
127
|
+
## Create a customer
|
|
128
|
+
|
|
129
|
+
`customers.create` requires `customer:write` or `customer:*`. Supply an explicit
|
|
130
|
+
business ID chosen and authorized by your backend, plus the customer's name:
|
|
131
|
+
|
|
132
|
+
```js
|
|
133
|
+
const result = await connections.invoke({ context, integrationId: "wave",
|
|
134
|
+
operation: "customers.create", input: { input: {
|
|
135
|
+
businessId: selectedBusinessId, name: "Customer name",
|
|
136
|
+
email: "customer@example.com"
|
|
137
|
+
} } });
|
|
138
|
+
const customer = result.data.customerCreate.customer;
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Optional contact fields are `firstName`, `lastName`, `email`, `phone`, `mobile`,
|
|
142
|
+
`displayId` and `internalNotes`. Address/shipping/currency fields are not yet
|
|
143
|
+
exposed. Input limits are library bounds; Wave still validates business rules.
|
|
144
|
+
The fixed `CustomerCreateInput` mutation returns the customer and owning business.
|
|
145
|
+
A business mismatch is rejected. `didSucceed: false` becomes a 422 error with a
|
|
146
|
+
safe message; provider error text is not exposed. On timeout, network failure or
|
|
147
|
+
an invalid success response, inspect Wave before retrying: the write may already
|
|
148
|
+
have happened. The runtime does not automatically replay it.
|
|
149
|
+
|
|
150
|
+
Another framework sends the same named mutation and variables to Wave using its
|
|
151
|
+
native HTTP client and the project-owned token. There is no editor dependency.
|
|
152
|
+
See the [official schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
|
|
153
|
+
`customers.update` takes `{ businessId, input: { id, name, ... } }` and the same
|
|
154
|
+
optional contact fields. At least one field must change. Before the mutation,
|
|
155
|
+
the adapter reads that customer under the selected business and checks both IDs;
|
|
156
|
+
an absent or mismatched customer prevents the write. This requires both customer
|
|
157
|
+
read and write permissions (or `customer:*`). The application still authorizes
|
|
158
|
+
the selected business in its connection-service policy. These checks do not
|
|
159
|
+
substitute for workspace membership checks.
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
await connections.invoke({ context, integrationId: "wave",
|
|
163
|
+
operation: "customers.update", input: {
|
|
164
|
+
businessId: selectedBusinessId,
|
|
165
|
+
input: { id: customerId, name: "Updated customer name" }
|
|
166
|
+
} });
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The native equivalent is the business/customer lookup followed by the fixed
|
|
170
|
+
`CustomerPatchInput` mutation; `businessId` is not a field of that patch input.
|
|
171
|
+
The returned customer ID/business are checked too. There is no automatic retry.
|
|
172
|
+
The accounting operations below use the same project-owned connection.
|
|
173
|
+
|
|
174
|
+
## Invoice workflow
|
|
175
|
+
|
|
176
|
+
The app chooses a business, customer and products from authorized records. Use
|
|
177
|
+
`invoice:write` plus the relevant read permissions, and add `invoice:send` only
|
|
178
|
+
for sending. Wildcard `invoice:*` covers invoice reads/writes/sends. Creation
|
|
179
|
+
checks the customer under the business; update, approve and send first check the
|
|
180
|
+
existing invoice under that business. Customer changes also check the new customer.
|
|
181
|
+
The app's authorization policy must approve the business and requested operation.
|
|
182
|
+
|
|
183
|
+
```js
|
|
184
|
+
const draft = await connections.invoke({ context, integrationId: "wave",
|
|
185
|
+
operation: "invoices.create", input: { businessId: selectedBusinessId, input: {
|
|
186
|
+
customerId,
|
|
187
|
+
items: [{ productId, quantity: "1.5", unitPrice: "75.00" }],
|
|
188
|
+
invoiceDate: "2026-09-13"
|
|
189
|
+
} } });
|
|
190
|
+
const invoiceId = draft.data.invoiceCreate.invoice.id;
|
|
191
|
+
await connections.invoke({ context, integrationId: "wave",
|
|
192
|
+
operation: "invoices.update", input: { businessId: selectedBusinessId,
|
|
193
|
+
input: { id: invoiceId, memo: "Appointment completed" } } });
|
|
194
|
+
await connections.invoke({ context, integrationId: "wave",
|
|
195
|
+
operation: "invoices.approve", input: { businessId: selectedBusinessId,
|
|
196
|
+
input: { invoiceId } } });
|
|
197
|
+
// Run only after the app user deliberately chooses to send this invoice.
|
|
198
|
+
await connections.invoke({ context, integrationId: "wave",
|
|
199
|
+
operation: "invoices.send", input: { businessId: selectedBusinessId,
|
|
200
|
+
input: { invoiceId, to: ["customer@example.com"], attachPDF: true } } });
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Creation defaults to `DRAFT`; an explicit `SAVED` status is also supported.
|
|
204
|
+
Create accepts `customerId`, `items` (1–100), status, currency, title, invoice/PO
|
|
205
|
+
number, invoice/due date, exchange rate, memo and footer. Patch accepts the same
|
|
206
|
+
fields but requires `id`; omitted fields stay unchanged and supplied items replace
|
|
207
|
+
all existing items. At least one patch field is required. Dates must be real
|
|
208
|
+
YYYY-MM-DD dates. Monetary values and quantities must be decimal **strings**, up
|
|
209
|
+
to eight fractional places, never JavaScript numbers. Wave performs calculations.
|
|
210
|
+
Each item requires `productId`; description, quantity, unit price and taxes are
|
|
211
|
+
optional. Omit taxes to use product defaults; `taxes: []` explicitly removes them,
|
|
212
|
+
or pass `[{ salesTaxId }]`. Deprecated manual tax amounts are not sent.
|
|
213
|
+
|
|
214
|
+
Send requires a nonempty explicit recipient list and `attachPDF`; subject,
|
|
215
|
+
message and `ccMyself` are optional. The operation checks that the invoice is
|
|
216
|
+
approved and `business.emailSendEnabled` is true. A successful result means Wave
|
|
217
|
+
queued the email, not that the recipient received it. Never retry an uncertain
|
|
218
|
+
send automatically. `invoices.get` takes `{ businessId, invoiceId }` and returns
|
|
219
|
+
status, customer, currency, exact total/amount due and provider PDF/view links.
|
|
220
|
+
The adapter never downloads those private links.
|
|
221
|
+
|
|
222
|
+
Other frameworks use the same configuration/Env and native GraphQL operations:
|
|
223
|
+
`InvoiceCreateInput`, `InvoicePatchInput`, `InvoiceApproveInput`, `InvoiceSendInput`.
|
|
224
|
+
Business selection is passed into create input; for the other mutations it is
|
|
225
|
+
used for the preceding ownership lookup, not as an unsupported input field.
|
|
226
|
+
See the [invoice creation example](https://developer.waveapps.com/hc/en-us/articles/360038817812-Mutation-Create-invoice),
|
|
227
|
+
[sending example](https://developer.waveapps.com/hc/en-us/articles/360041888312-Mutation-Send-invoice)
|
|
228
|
+
and [schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
|
|
229
|
+
Discounts, payment recording, cloning/deletion and advanced document formatting
|
|
230
|
+
are not covered by these invoice operations. The full Wave acceptance packet,
|
|
231
|
+
including final setup/lifecycle and distribution evidence, is still open.
|
|
232
|
+
|
|
233
|
+
## Application registration and hosting
|
|
234
|
+
|
|
235
|
+
Each application owns its provider registration, callback route, credentials
|
|
236
|
+
and grants. Hosted and installed editors configure the same app-owned setup;
|
|
237
|
+
neither supplies a shared Vibe64 registration or token gateway. Use the app's
|
|
238
|
+
assigned public URL as the initial callback origin, append the route the backend
|
|
239
|
+
actually implements, and register the exact URL with the provider. Keep the
|
|
240
|
+
client secret and callback binding in the application's Env.
|
|
241
|
+
|
|
242
|
+
A custom-domain or hosting move that changes the callback requires updating both
|
|
243
|
+
the provider registration and the app's Env. Preserve the application's identity
|
|
244
|
+
and private connection store, validate callback state and initiator, and allow
|
|
245
|
+
only application-approved return destinations. The editor's address is not the
|
|
246
|
+
provider callback. See the [callback contract](../../connectors-core/docs/oauth-callbacks.md)
|
|
247
|
+
and [setup command](../../connectors-core/docs/setup-command.md).
|
|
248
|
+
|
|
249
|
+
Wave approval requirements still apply to the developer's actual integration;
|
|
250
|
+
customer integrations use OAuth. Follow
|
|
251
|
+
[Developers and Integrators](https://developer.waveapps.com/hc/en-us/articles/360020596771-Permitted-Use-Developers-and-Integrators).
|
|
252
|
+
Distinct registrations alone do not establish independent API quotas. The
|
|
253
|
+
application must follow its approved usage and account limits.
|
|
254
|
+
|
|
255
|
+
## Automation feasibility
|
|
256
|
+
|
|
257
|
+
- **AI can prepare:** JSON, environment variable names, callback handler wiring,
|
|
258
|
+
explicit business selection/policy, named read/write invocations and local fixtures.
|
|
259
|
+
The protocol and storage implementation remain JSKIT library code.
|
|
260
|
+
- **Human/provider step:** account ownership, subscription choice, consent and
|
|
261
|
+
provider review. Portal actions can be assisted after authentication, but
|
|
262
|
+
issued secrets must enter protected fields directly.
|
|
263
|
+
- **Registration automation:** the reviewed public guides describe portal
|
|
264
|
+
creation; no supported public registration-creation API was established.
|
|
265
|
+
Do not invent a GraphQL mutation to create provider applications.
|
|
266
|
+
Read APIs and token refresh do not establish provisioning API availability.
|
|
267
|
+
- **Rotation:** create/update credentials in the portal and protected bindings.
|
|
268
|
+
Changed client IDs or callbacks require reconnecting; changing the secret
|
|
269
|
+
binding can support ordinary provider-side secret rotation.
|
|
270
|
+
|
|
271
|
+
## Verification and remaining scope
|
|
272
|
+
|
|
273
|
+
`test/wave.test.js` exercises the real shared service with temporary encrypted
|
|
274
|
+
files and controlled HTTP responses. It covers code consent, restart, named
|
|
275
|
+
queries, input boundaries, scopes, owner policy, callback changes, serialized
|
|
276
|
+
refresh, permission/subscription failures, partial GraphQL errors, cancellation
|
|
277
|
+
and malformed success responses. The guide's JSON is parsed by the same schema.
|
|
278
|
+
The public editor cases passed at desktop and phone widths, checking all ten
|
|
279
|
+
setup steps, configuration/Env references and file persistence, owner-mode
|
|
280
|
+
changes, consent cancellation, reconnect and local disconnect.
|
|
281
|
+
|
|
282
|
+
These tests use no live Wave account, consent, invoices or registration. They do
|
|
283
|
+
not generate a sample application. Live success, provider PKCE enforcement,
|
|
284
|
+
partner approval and actual quota allocation remain unproven. Full-access
|
|
285
|
+
tokens, webhooks and provider-side revocation are not implemented. The implemented mutations are described below.
|
|
286
|
+
|
|
287
|
+
## Estimates in the application
|
|
288
|
+
|
|
289
|
+
Use `estimates.list` with `{ businessId, page, pageSize }` and `estimates.get`
|
|
290
|
+
with `{ businessId, estimateId }` to populate the app's estimate screens. List
|
|
291
|
+
ordering is newest-created first. The app owns those screens and the business
|
|
292
|
+
access policy; Vibe64 does not approve or send estimates.
|
|
293
|
+
|
|
294
|
+
```js
|
|
295
|
+
const draft = await connections.invoke({ context, integrationId: "wave",
|
|
296
|
+
operation: "estimates.create", input: { businessId, input: {
|
|
297
|
+
customerId, estimateDate: "2026-09-13", dueDate: "2026-10-13",
|
|
298
|
+
items: [{ productId, quantity: "1", unitPrice: "125.00", taxes: [] }]
|
|
299
|
+
} }
|
|
300
|
+
});
|
|
301
|
+
const estimateId = draft.data.estimateCreate.estimate.id;
|
|
302
|
+
// Each write follows a separate deliberate action authorized by your application.
|
|
303
|
+
await connections.invoke({ context, integrationId: "wave", operation: "estimates.approve",
|
|
304
|
+
input: { businessId, input: { estimateId } } });
|
|
305
|
+
await connections.invoke({ context, integrationId: "wave", operation: "estimates.send",
|
|
306
|
+
input: { businessId, input: { estimateId, to: [customerEmail], attachPDF: true } } });
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Create defaults to DRAFT. Every estimate item requires an explicit decimal-string
|
|
310
|
+
`unitPrice`; numeric JavaScript prices are rejected. To update, pass
|
|
311
|
+
`estimates.update` with `{ businessId, input: { id, customerId, status, title,
|
|
312
|
+
estimateDate, dueDate, currency, exchangeRate, ...changes } }`. These fields are
|
|
313
|
+
required by Wave's patch input; read the current estimate before constructing
|
|
314
|
+
an edit. Optional `items` replaces the list. Creation and edits support memo,
|
|
315
|
+
footer, purchase-order number, estimate number and subheading.
|
|
316
|
+
|
|
317
|
+
Enable `estimate:read`, `estimate:write` and, only for sending, `estimate:send`
|
|
318
|
+
(or the explicit wildcard), plus customer read access for ownership checks.
|
|
319
|
+
The runtime verifies the estimate/customer business before mutation and validates
|
|
320
|
+
returned ownership. Sending a draft or deleted/converted estimate is rejected.
|
|
321
|
+
Sending success acknowledges the provider request, not recipient delivery.
|
|
322
|
+
Returned PDF/view URLs are private application data; the runtime does not fetch them.
|
|
323
|
+
|
|
324
|
+
Other frameworks use the same project configuration, Env credentials and native
|
|
325
|
+
Wave GraphQL operations: `estimateCreate`, `estimatePatch`, `estimateApprove` and
|
|
326
|
+
`estimateSend`. Preserve their differing input requirements and the same business
|
|
327
|
+
checks. See the [Wave schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
|
|
328
|
+
Estimate conversion, deposits, attachments, discounts and advanced formatting are
|
|
329
|
+
not yet exposed by these operations; this estimate workflow alone does not close
|
|
330
|
+
the provider's full acceptance checklist.
|
|
331
|
+
|
|
332
|
+
## Maintain products and services
|
|
333
|
+
|
|
334
|
+
`products.create` takes `{ businessId, input: { name, unitPrice, description?,
|
|
335
|
+
incomeAccountId?, expenseAccountId?, defaultSalesTaxIds? } }`.
|
|
336
|
+
`products.update` takes `{ businessId, input: { id, ...changes } }`.
|
|
337
|
+
Supply prices as strings with at most five decimal places. Empty
|
|
338
|
+
`defaultSalesTaxIds: []` clears defaults; omit it to leave them unchanged.
|
|
339
|
+
The generated app owns the product editor and the decision to save.
|
|
340
|
+
|
|
341
|
+
Grant product write access (and product read for updates). When selecting
|
|
342
|
+
account/tax references, also grant the corresponding account/sales-tax read
|
|
343
|
+
permissions. Before writing, the runtime verifies each referenced record belongs
|
|
344
|
+
to the selected business. Choose permitted income/expense account subtypes from
|
|
345
|
+
`accounts.list`; Wave enforces which account types can be associated. There is
|
|
346
|
+
no automatic retry after a mutation failure or uncertain result.
|
|
347
|
+
|
|
348
|
+
```js
|
|
349
|
+
await connections.invoke({ context, integrationId: "wave", operation: "products.create",
|
|
350
|
+
input: { businessId, input: {
|
|
351
|
+
name: "Dog grooming", unitPrice: "125.00", incomeAccountId,
|
|
352
|
+
defaultSalesTaxIds: selectedTaxIds
|
|
353
|
+
} } });
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
Native framework implementations use `ProductCreateInput` / `ProductPatchInput`
|
|
357
|
+
and the matching `productCreate` / `productPatch` mutations at the same Wave
|
|
358
|
+
GraphQL endpoint. Preserve the business authorization checks before writes.
|
|
359
|
+
Creating products does not create accounting accounts or tax definitions.
|
|
360
|
+
|
|
361
|
+
## Accounting accounts and tax definitions
|
|
362
|
+
|
|
363
|
+
`accounts.create` accepts `{ businessId, input: { name, subtype, currency?,
|
|
364
|
+
description?, displayId? } }`. The app chooses a supported Wave account subtype;
|
|
365
|
+
JSKIT does not infer accounting treatment. `accounts.get` accepts
|
|
366
|
+
`{ businessId, accountId }` and returns `sequence`. Pass that revision to
|
|
367
|
+
`accounts.update` as `{ businessId, input: { id, sequence, ...changes } }`.
|
|
368
|
+
Edits support name, description and display ID. A changed revision produces
|
|
369
|
+
`connector_conflict`; reload and let the user review their edit. Wave still
|
|
370
|
+
performs its own revision check if the account changes after the preflight.
|
|
371
|
+
|
|
372
|
+
`salesTaxes.create` accepts `{ businessId, input: { name, abbreviation, rate,
|
|
373
|
+
description?, taxNumber?, showTaxNumberOnInvoices?, isCompound?, isRecoverable? } }`.
|
|
374
|
+
Use decimal strings for rates: `"0.15"` means 15%, with up to six decimal places.
|
|
375
|
+
`salesTaxes.get` accepts `{ businessId, salesTaxId }` and includes dated rates.
|
|
376
|
+
`salesTaxes.update` accepts `{ businessId, input: { id, ...changes } }` with name,
|
|
377
|
+
abbreviation, description, tax number, invoice display choice and optional
|
|
378
|
+
`rates: [{ effective: "2026-10-01", rate: "0.15" }]`. Review the full intended
|
|
379
|
+
rate history before submitting it; no automatic rate merging occurs.
|
|
380
|
+
|
|
381
|
+
Both update operations verify the record's business before writing. Read and
|
|
382
|
+
write scopes must be granted separately (or explicitly grant the corresponding
|
|
383
|
+
wildcard). Native frameworks use `accountCreate`, `accountPatch`, `salesTaxCreate`
|
|
384
|
+
and `salesTaxPatch`, preserving revision checks and explicit decimal/date inputs.
|
|
385
|
+
The app owns authorization, edit screens and accounting choices. These operations
|
|
386
|
+
do not yet expose tax archiving, account restrictions or null-to-clear account fields.
|
|
387
|
+
|
|
388
|
+
## Record a money transaction
|
|
389
|
+
|
|
390
|
+
`transactions.create` takes `{ businessId, input: { externalId, date, description,
|
|
391
|
+
notes?, anchor, lineItems } }`. An anchor is `{ accountId, amount, direction }`,
|
|
392
|
+
where direction is `DEPOSIT` or `WITHDRAWAL`. Each line has `{ accountId, amount,
|
|
393
|
+
balance, customerId?, description?, taxes? }`; balance is `INCREASE`, `DECREASE`,
|
|
394
|
+
`DEBIT` or `CREDIT`. Taxes are `{ salesTaxId, amount }`. All amounts are positive
|
|
395
|
+
strings with at most two decimal places. There are at most 100 lines, 20 taxes
|
|
396
|
+
per line and 100 distinct referenced records per request.
|
|
397
|
+
|
|
398
|
+
The application must deliberately choose valid accounting categories and balance
|
|
399
|
+
the lines against the anchor. Wave validates the accounting result; the adapter
|
|
400
|
+
does not guess debit/credit treatment. It verifies that the referenced accounts,
|
|
401
|
+
customers and taxes belong to the selected business before submitting once.
|
|
402
|
+
Grant transaction write and the relevant record-read permissions.
|
|
403
|
+
|
|
404
|
+
Save `externalId` with the application's source event and submission outcome.
|
|
405
|
+
It is not a claimed provider idempotency guarantee: after a timeout, reconcile
|
|
406
|
+
in Wave before resubmitting. There is no automatic retry or background import.
|
|
407
|
+
Successful output contains `data.moneyTransactionCreate.transaction.id`.
|
|
408
|
+
Native frameworks use the same `MoneyTransactionCreateInput` and
|
|
409
|
+
`moneyTransactionCreate` operation. See [Wave's transaction example](https://developer.waveapps.com/hc/en-us/articles/360057230751-Mutation-Create-Money-Transaction).
|
|
410
|
+
This records accounting data; it does not move money or initiate bank transfers.
|
|
411
|
+
|
|
412
|
+
## Captured scope reconciliation
|
|
413
|
+
|
|
414
|
+
The captured vendor permission advertises creation and updates. The reviewed
|
|
415
|
+
[public schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference)
|
|
416
|
+
has vendor queries but no vendor create/patch mutation. This adapter supplies
|
|
417
|
+
`vendors.list`; it does not invent undocumented vendor endpoints. Business-write
|
|
418
|
+
and checkout scope choices likewise do not imply corresponding operations here.
|
|
419
|
+
The transaction implementation creates records; it does not claim transaction
|
|
420
|
+
search/edit/delete capabilities absent from the reviewed public API. These
|
|
421
|
+
provider limits must remain visible in the final acceptance record.
|
|
422
|
+
|
|
423
|
+
The inline setup screen keeps credential values in project Env bindings, gives
|
|
424
|
+
the callback origin/route rule, separates read/write/send permissions and explains
|
|
425
|
+
related-record read permissions. Registration creation remains a portal action;
|
|
426
|
+
no supported API for provisioning developer applications was established.
|
|
427
|
+
|
|
428
|
+
## Archive an accounting account
|
|
429
|
+
|
|
430
|
+
Call `accounts.archive` with `{ businessId, input: { id } }` after the application
|
|
431
|
+
user deliberately chooses to archive that account. The backend verifies the
|
|
432
|
+
account belongs to the selected business before submitting `accountArchive`.
|
|
433
|
+
Grant account read and write access (or `account:*`). The mutation carries only
|
|
434
|
+
the account ID; the business ID remains an application authorization input.
|
|
435
|
+
Wave decides whether this account can be archived. A rejected mutation produces
|
|
436
|
+
a safe input error; no automatic retry occurs. On success refresh the account
|
|
437
|
+
view. This hides an account from the default view, rather than deleting it.
|
|
438
|
+
Native frameworks use the same ownership lookup and `AccountArchiveInput`, whose
|
|
439
|
+
output provides `didSucceed` and `inputErrors`, without an account object. See
|
|
440
|
+
[Wave API reference](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
|