> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bijection.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Wave

> Resources, examples, configuration and evidence for Wave.

Use the `@bijection/connectors/wave` entrypoint to declare Wave resources.

## Availability

This page describes the pinned source package. Published availability is unestablished for this artifact. [Source build and package availability](https://docs.bijection.com/client/sdk-distribution.md).

## Resources and modes

| Resource | Mode | Description |
| - | - | - |
| Invoices | `pull` | Captured GraphQL pages by modifiedAtAfter, Money text, signed webhook hints, read-only |
| Customers | `pull` | Captured GraphQL pages by modifiedAtAfter, archived as state, read-only |

Declare a resource in application code, then bind deployment-specific settings and credentials. See [typed resources](https://docs.bijection.com/integrations/resources.md), [connections](https://docs.bijection.com/integrations/connections.md) and [source inspection](https://docs.bijection.com/integrations/cli.md).

## Invoices

### pull: Captured GraphQL pages by modifiedAtAfter, Money text, signed webhook hints, read-only

The following example matches configuration `standard`.

```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
import { wave } from "@bijection/connectors/wave";
export const invoices = wave.invoices.pull({ updates: "webhooks" });
```

> **Inferred record types**
>
> ```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> Resource without an operational record table
> ```

#### Configuration: standard

Case: `wave/invoices/pull/standard`.

Connection and resource configuration are declared by this exact case.

Credential kind: `wave`. Keep credential material in the private credential inventory.

| Setting | Type | Required | Owner |
| - | - | - | - |
| `businessId` | string | Yes | Resource binding |

> **Complete configuration contract**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "setup": [],
>   "resource": {
>     "access": {},
>     "defaults": {},
>     "connector": "wave",
>     "output": {
>       "kind": "single",
>       "collection": "invoices"
>     },
>     "credential_kind": "wave",
>     "connection_fields": [],
>     "address": {
>       "kind": "fixed",
>       "url": "https://gql.waveapps.com"
>     }
>   },
>   "connection_setup": {
>     "type": "object",
>     "value": {
>       "businessId": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       }
>     }
>   },
>   "execution": null
> }
> ```

Native admission analysis is available for this exact declaration.

**Collection: invoices**

| Contract | Meaning |
| - | - |
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |

> **Complete native profile**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "movement": {
>     "exchanges": {
>       "invoicesChanged": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       },
>       "invoicesWalk": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       }
>     },
>     "nativeInputLimitBytes": null,
>     "steps": [
>       {
>         "id": "acquire.1",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange invoicesChanged",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "acquire.2",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange invoicesWalk",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "acquire.3",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "listener changes",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "retain.1",
>         "inputs": [
>           "acquire.1",
>           "acquire.2",
>           "acquire.3"
>         ],
>         "action": {
>           "operation": "retain",
>           "subject": "acquisition evidence",
>           "reason": "recovery",
>           "release": "acquisition_custody"
>         }
>       },
>       {
>         "id": "interpret.1",
>         "inputs": [
>           "retain.1"
>         ],
>         "action": {
>           "operation": "interpret",
>           "subject": "acquired input",
>           "produces": "records"
>         }
>       },
>       {
>         "id": "materialize.1",
>         "inputs": [
>           "interpret.1"
>         ],
>         "action": {
>           "operation": "materialize",
>           "subject": "source rows",
>           "reason": "serving",
>           "release": "replacement"
>         }
>       },
>       {
>         "id": "publish.1",
>         "inputs": [
>           "materialize.1"
>         ],
>         "action": {
>           "operation": "publish",
>           "subject": "source rows",
>           "visibility": "with_acquisition"
>         }
>       }
>     ]
>   },
>   "initial": "enumeration",
>   "changes": "observations",
>   "deletions": "unsupported",
>   "resume": "none",
>   "retentionMs": null,
>   "gap": "not_applicable",
>   "limits": {
>     "http_response_bytes": "524288"
>   },
>   "restrictions": [],
>   "commands": {}
> }
> ```

> **Commands, occurrences and artifacts**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "records": {
>     "invoices": {
>       "protocol": "record_observation",
>       "coverage": "records",
>       "consistency": "observations",
>       "atomicity": "record",
>       "history": "observations",
>       "recordRefresh": false,
>       "reconciliation": false,
>       "notifications": true,
>       "snapshotMaxRows": null,
>       "profile": {
>         "movement": {
>           "exchanges": {
>             "invoicesChanged": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             },
>             "invoicesWalk": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             }
>           },
>           "nativeInputLimitBytes": null,
>           "steps": [
>             {
>               "id": "acquire.1",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange invoicesChanged",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "acquire.2",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange invoicesWalk",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "acquire.3",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "listener changes",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "retain.1",
>               "inputs": [
>                 "acquire.1",
>                 "acquire.2",
>                 "acquire.3"
>               ],
>               "action": {
>                 "operation": "retain",
>                 "subject": "acquisition evidence",
>                 "reason": "recovery",
>                 "release": "acquisition_custody"
>               }
>             },
>             {
>               "id": "interpret.1",
>               "inputs": [
>                 "retain.1"
>               ],
>               "action": {
>                 "operation": "interpret",
>                 "subject": "acquired input",
>                 "produces": "records"
>               }
>             },
>             {
>               "id": "materialize.1",
>               "inputs": [
>                 "interpret.1"
>               ],
>               "action": {
>                 "operation": "materialize",
>                 "subject": "source rows",
>                 "reason": "serving",
>                 "release": "replacement"
>               }
>             },
>             {
>               "id": "publish.1",
>               "inputs": [
>                 "materialize.1"
>               ],
>               "action": {
>                 "operation": "publish",
>                 "subject": "source rows",
>                 "visibility": "with_acquisition"
>               }
>             }
>           ]
>         },
>         "initial": "enumeration",
>         "changes": "observations",
>         "deletions": "unsupported",
>         "resume": "none",
>         "retentionMs": null,
>         "gap": "not_applicable",
>         "limits": {
>           "http_response_bytes": "524288"
>         },
>         "restrictions": [],
>         "commands": {}
>       }
>     }
>   },
>   "occurrences": null,
>   "artifacts": {
>     "raw_archive": false,
>     "native_file_transfer_limit_bytes": null,
>     "external_versions": false,
>     "files": {}
>   },
>   "commands": {}
> }
> ```

**Recorded checks**

| Requirement | Scope | Evidence | Result |
| - | - | - | - |
| listener-custody-before-ack | \{"kind":"listener","collection":"invoices"} | Native test: integrations/listeners/webhook\_delivery\_commits\_responsibility\_before\_acknowledging (shared\_engine) | Execution result unavailable |
| listener-duplicate-delivery | \{"kind":"listener","collection":"invoices"} | Native test: integrations/providers/shopify\_product\_hint\_is\_deduplicated\_and\_refused\_when\_unsigned (shared\_engine) | Execution result unavailable |
| page-publication-recovery | \{"kind":"collection","name":"invoices"} | Native test: integrations/acquisition/acquisition\_windows\_preserve\_sequences\_and\_restart\_fences\_old\_work (shared\_engine) | Execution result unavailable |
| budget-shared | \{"kind":"connection"} | Native test: integrations/acquisition/budget\_one\_bucket\_is\_spent\_by\_a\_collection\_and\_by\_a\_command (shared\_engine) | Execution result unavailable |
| identity-account | \{"kind":"connection"} | Fixture: ./src/connectors/wave/fixtures/identity.json | passed (2026-10-24T21:36:12.451Z) |

Hosted qualification: **unestablished for this catalog configuration**. Installed connections report their own identity, authority and current status.

#### Configuration: polled

Case: `wave/invoices/pull/polled`.

Connection and resource configuration are declared by this exact case.

Credential kind: `wave`. Keep credential material in the private credential inventory.

| Setting | Type | Required | Owner |
| - | - | - | - |
| `businessId` | string | Yes | Resource binding |

> **Complete configuration contract**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "setup": [],
>   "resource": {
>     "access": {},
>     "defaults": {},
>     "connector": "wave",
>     "output": {
>       "kind": "single",
>       "collection": "invoices"
>     },
>     "credential_kind": "wave",
>     "connection_fields": [],
>     "address": {
>       "kind": "fixed",
>       "url": "https://gql.waveapps.com"
>     }
>   },
>   "connection_setup": {
>     "type": "object",
>     "value": {
>       "businessId": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       }
>     }
>   },
>   "execution": null
> }
> ```

Native admission analysis is available for this exact declaration.

**Collection: invoices**

| Contract | Meaning |
| - | - |
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |

> **Complete native profile**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "movement": {
>     "exchanges": {
>       "invoicesChanged": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       },
>       "invoicesWalk": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       }
>     },
>     "nativeInputLimitBytes": null,
>     "steps": [
>       {
>         "id": "acquire.1",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange invoicesChanged",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "acquire.2",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange invoicesWalk",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "retain.1",
>         "inputs": [
>           "acquire.1",
>           "acquire.2"
>         ],
>         "action": {
>           "operation": "retain",
>           "subject": "acquisition evidence",
>           "reason": "recovery",
>           "release": "acquisition_custody"
>         }
>       },
>       {
>         "id": "interpret.1",
>         "inputs": [
>           "retain.1"
>         ],
>         "action": {
>           "operation": "interpret",
>           "subject": "acquired input",
>           "produces": "records"
>         }
>       },
>       {
>         "id": "materialize.1",
>         "inputs": [
>           "interpret.1"
>         ],
>         "action": {
>           "operation": "materialize",
>           "subject": "source rows",
>           "reason": "serving",
>           "release": "replacement"
>         }
>       },
>       {
>         "id": "publish.1",
>         "inputs": [
>           "materialize.1"
>         ],
>         "action": {
>           "operation": "publish",
>           "subject": "source rows",
>           "visibility": "with_acquisition"
>         }
>       }
>     ]
>   },
>   "initial": "enumeration",
>   "changes": "observations",
>   "deletions": "unsupported",
>   "resume": "none",
>   "retentionMs": null,
>   "gap": "not_applicable",
>   "limits": {
>     "http_response_bytes": "524288"
>   },
>   "restrictions": [],
>   "commands": {}
> }
> ```

> **Commands, occurrences and artifacts**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "records": {
>     "invoices": {
>       "protocol": "record_observation",
>       "coverage": "records",
>       "consistency": "observations",
>       "atomicity": "record",
>       "history": "observations",
>       "recordRefresh": false,
>       "reconciliation": false,
>       "notifications": false,
>       "snapshotMaxRows": null,
>       "profile": {
>         "movement": {
>           "exchanges": {
>             "invoicesChanged": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             },
>             "invoicesWalk": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             }
>           },
>           "nativeInputLimitBytes": null,
>           "steps": [
>             {
>               "id": "acquire.1",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange invoicesChanged",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "acquire.2",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange invoicesWalk",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "retain.1",
>               "inputs": [
>                 "acquire.1",
>                 "acquire.2"
>               ],
>               "action": {
>                 "operation": "retain",
>                 "subject": "acquisition evidence",
>                 "reason": "recovery",
>                 "release": "acquisition_custody"
>               }
>             },
>             {
>               "id": "interpret.1",
>               "inputs": [
>                 "retain.1"
>               ],
>               "action": {
>                 "operation": "interpret",
>                 "subject": "acquired input",
>                 "produces": "records"
>               }
>             },
>             {
>               "id": "materialize.1",
>               "inputs": [
>                 "interpret.1"
>               ],
>               "action": {
>                 "operation": "materialize",
>                 "subject": "source rows",
>                 "reason": "serving",
>                 "release": "replacement"
>               }
>             },
>             {
>               "id": "publish.1",
>               "inputs": [
>                 "materialize.1"
>               ],
>               "action": {
>                 "operation": "publish",
>                 "subject": "source rows",
>                 "visibility": "with_acquisition"
>               }
>             }
>           ]
>         },
>         "initial": "enumeration",
>         "changes": "observations",
>         "deletions": "unsupported",
>         "resume": "none",
>         "retentionMs": null,
>         "gap": "not_applicable",
>         "limits": {
>           "http_response_bytes": "524288"
>         },
>         "restrictions": [],
>         "commands": {}
>       }
>     }
>   },
>   "occurrences": null,
>   "artifacts": {
>     "raw_archive": false,
>     "native_file_transfer_limit_bytes": null,
>     "external_versions": false,
>     "files": {}
>   },
>   "commands": {}
> }
> ```

**Recorded checks**

| Requirement | Scope | Evidence | Result |
| - | - | - | - |
| page-publication-recovery | \{"kind":"collection","name":"invoices"} | Native test: integrations/acquisition/acquisition\_windows\_preserve\_sequences\_and\_restart\_fences\_old\_work (shared\_engine) | Execution result unavailable |
| budget-shared | \{"kind":"connection"} | Native test: integrations/acquisition/budget\_one\_bucket\_is\_spent\_by\_a\_collection\_and\_by\_a\_command (shared\_engine) | Execution result unavailable |
| identity-account | \{"kind":"connection"} | Fixture: ./src/connectors/wave/fixtures/identity.json | passed (2026-10-24T21:36:12.451Z) |

Hosted qualification: **unestablished for this catalog configuration**. Installed connections report their own identity, authority and current status.

## Customers

### pull: Captured GraphQL pages by modifiedAtAfter, archived as state, read-only

The following example matches configuration `standard`.

```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
import { wave } from "@bijection/connectors/wave";
export const customers = wave.customers.pull({});
```

> **Inferred record types**
>
> ```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> Resource without an operational record table
> ```

#### Configuration: standard

Case: `wave/customers/pull/standard`.

Connection and resource configuration are declared by this exact case.

Credential kind: `wave`. Keep credential material in the private credential inventory.

| Setting | Type | Required | Owner |
| - | - | - | - |
| `businessId` | string | Yes | Resource binding |

> **Complete configuration contract**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "setup": [],
>   "resource": {
>     "access": {},
>     "defaults": {},
>     "connector": "wave",
>     "output": {
>       "kind": "single",
>       "collection": "customers"
>     },
>     "credential_kind": "wave",
>     "connection_fields": [],
>     "address": {
>       "kind": "fixed",
>       "url": "https://gql.waveapps.com"
>     }
>   },
>   "connection_setup": {
>     "type": "object",
>     "value": {
>       "businessId": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       }
>     }
>   },
>   "execution": null
> }
> ```

Native admission analysis is available for this exact declaration.

**Collection: customers**

| Contract | Meaning |
| - | - |
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |

> **Complete native profile**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "movement": {
>     "exchanges": {
>       "customersChanged": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       },
>       "customersWalk": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       }
>     },
>     "nativeInputLimitBytes": null,
>     "steps": [
>       {
>         "id": "acquire.1",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange customersChanged",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "acquire.2",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange customersWalk",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "retain.1",
>         "inputs": [
>           "acquire.1",
>           "acquire.2"
>         ],
>         "action": {
>           "operation": "retain",
>           "subject": "acquisition evidence",
>           "reason": "recovery",
>           "release": "acquisition_custody"
>         }
>       },
>       {
>         "id": "interpret.1",
>         "inputs": [
>           "retain.1"
>         ],
>         "action": {
>           "operation": "interpret",
>           "subject": "acquired input",
>           "produces": "records"
>         }
>       },
>       {
>         "id": "materialize.1",
>         "inputs": [
>           "interpret.1"
>         ],
>         "action": {
>           "operation": "materialize",
>           "subject": "source rows",
>           "reason": "serving",
>           "release": "replacement"
>         }
>       },
>       {
>         "id": "publish.1",
>         "inputs": [
>           "materialize.1"
>         ],
>         "action": {
>           "operation": "publish",
>           "subject": "source rows",
>           "visibility": "with_acquisition"
>         }
>       }
>     ]
>   },
>   "initial": "enumeration",
>   "changes": "observations",
>   "deletions": "unsupported",
>   "resume": "none",
>   "retentionMs": null,
>   "gap": "not_applicable",
>   "limits": {
>     "http_response_bytes": "524288"
>   },
>   "restrictions": [],
>   "commands": {}
> }
> ```

> **Commands, occurrences and artifacts**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "records": {
>     "customers": {
>       "protocol": "record_observation",
>       "coverage": "records",
>       "consistency": "observations",
>       "atomicity": "record",
>       "history": "observations",
>       "recordRefresh": false,
>       "reconciliation": false,
>       "notifications": false,
>       "snapshotMaxRows": null,
>       "profile": {
>         "movement": {
>           "exchanges": {
>             "customersChanged": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             },
>             "customersWalk": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             }
>           },
>           "nativeInputLimitBytes": null,
>           "steps": [
>             {
>               "id": "acquire.1",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange customersChanged",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "acquire.2",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange customersWalk",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "retain.1",
>               "inputs": [
>                 "acquire.1",
>                 "acquire.2"
>               ],
>               "action": {
>                 "operation": "retain",
>                 "subject": "acquisition evidence",
>                 "reason": "recovery",
>                 "release": "acquisition_custody"
>               }
>             },
>             {
>               "id": "interpret.1",
>               "inputs": [
>                 "retain.1"
>               ],
>               "action": {
>                 "operation": "interpret",
>                 "subject": "acquired input",
>                 "produces": "records"
>               }
>             },
>             {
>               "id": "materialize.1",
>               "inputs": [
>                 "interpret.1"
>               ],
>               "action": {
>                 "operation": "materialize",
>                 "subject": "source rows",
>                 "reason": "serving",
>                 "release": "replacement"
>               }
>             },
>             {
>               "id": "publish.1",
>               "inputs": [
>                 "materialize.1"
>               ],
>               "action": {
>                 "operation": "publish",
>                 "subject": "source rows",
>                 "visibility": "with_acquisition"
>               }
>             }
>           ]
>         },
>         "initial": "enumeration",
>         "changes": "observations",
>         "deletions": "unsupported",
>         "resume": "none",
>         "retentionMs": null,
>         "gap": "not_applicable",
>         "limits": {
>           "http_response_bytes": "524288"
>         },
>         "restrictions": [],
>         "commands": {}
>       }
>     }
>   },
>   "occurrences": null,
>   "artifacts": {
>     "raw_archive": false,
>     "native_file_transfer_limit_bytes": null,
>     "external_versions": false,
>     "files": {}
>   },
>   "commands": {}
> }
> ```

**Recorded checks**

| Requirement | Scope | Evidence | Result |
| - | - | - | - |
| page-publication-recovery | \{"kind":"collection","name":"customers"} | Native test: integrations/acquisition/acquisition\_windows\_preserve\_sequences\_and\_restart\_fences\_old\_work (shared\_engine) | Execution result unavailable |
| budget-shared | \{"kind":"connection"} | Native test: integrations/acquisition/budget\_one\_bucket\_is\_spent\_by\_a\_collection\_and\_by\_a\_command (shared\_engine) | Execution result unavailable |
| identity-account | \{"kind":"connection"} | Fixture: ./src/connectors/wave/fixtures/identity.json | passed (2026-10-24T21:36:12.452Z) |

Hosted qualification: **unestablished for this catalog configuration**. Installed connections report their own identity, authority and current status.

## Provider guidance

Compiled declaration examples and configuration details are published in the [connector reference](https://docs.bijection.com/integrations/connectors/index).

Bind setup `{ businessId }` (Wave's base64 global business id, as `businesses`
answers it) and a `wave` credential (`wave.credential("WAVE")`): an OAuth
access token or a Full Access token for `https://gql.waveapps.com`. OAuth
reaches only businesses with an active Pro or Wave Advisor subscription, and a
third-party integration needs Wave's approval. Identity is the id
`business(id:)` answers with.

## What is read

Every request is a captured GraphQL query against
`POST /graphql/public`; see [Captured contract](#captured-contract).

* `invoices`: header fields and totals (`subtotal`, `discountTotal`,
  `taxTotal`, `total`, `amountPaid`, `amountDue`), no line items. Amounts are
  Wave's own `Money.value` text, refused unless it is plain decimal text, and
  every amount must name the invoice's currency. `exchangeRate` is Wave's
  `Decimal` text.
* `customers`: names, email, `displayId`, `isArchived` (a state) and currency.
  Outstanding and overdue balances are not read: nothing says they move
  `modifiedAt`.

A pass pages by 1-based `page` number (`pageSize` 1..100, default 45, Wave's own
default; its maximum is undocumented), sorted `MODIFIED_AT_ASC`. The first pass
walks everything; each finished pass carries the latest `modifiedAt`, and the
next asks `modifiedAtAfter` five minutes (`overlapSeconds`) before it. The last
page is the one `pageInfo.totalPages` names, or a short page where Wave states
no count. Offset pages over a live ordering can pass over a record that moves
during the pass, so every 96th pass (`fullEvery`) walks everything again.

Versions are `modifiedAt`. Nothing is ever deleted: Wave's invoice statuses
name no void or deleted state, and a deleted invoice or customer disappears
with no tombstone. A record deleted in Wave stays published.

## Webhooks

`updates: "webhooks"` admits Wave's invoice webhooks as refresh hints:
`x-wave-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">`,
five-minute tolerance, deduplicated by `event_id`. An event names the invoice
by Wave's raw UUID rather than the API's base64 global id and carries only
that event's fields, so it asks for a pass and names no record. Wave sends no
customer events.

## Limits and writes

Wave documents no request rate; the schema's own `@rateLimit` directive
defaults to 60 per minute, held as a client-side budget. Partial GraphQL
answers (`errors` beside `data`) are refused before this code sees them.
Wave's mutations carry no idempotency key and no precondition, so nothing is
written.

## Captured contract

`schema.graphql` is a reviewed field projection of a third-party introspection
dump of Wave's public schema (its header keeps the dump's SHA-256 and retrieval
date). Selected output fields keep every argument and input type, with one
declared deviation: `CurrencyCode` (more ISO 4217 values than the
`bijection-graphql-v1` profile's 32 enum alternatives) is captured as a scalar
whose wire mapping is three upper-case letters. `operations.graphql` holds the
three queries; `operations.generated.ts` and `contract.generated.json` are
compiler output.

### Regenerating

Feed this JSON on stdin to the `bijection-graphql` compiler
(`tools/codegen/http/src/graphql/bin.mjs`, Node 24.13.0), with `files`
holding the contents of `schema.graphql` and `operations.graphql`:

```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
{
  "alias": "waveAccounting",
  "root": "src/connectors/wave",
  "files": { "schema.graphql": "…", "operations.graphql": "…" },
  "schema": ["schema.graphql"],
  "documents": ["operations.graphql"],
  "operations": ["IdentifyWaveBusiness", "ListWaveInvoices", "ListWaveCustomers"],
  "path": ["graphql", "public"],
  "scalars": {
    "Date": { "input": { "kind": "string" }, "output": { "kind": "string" } },
    "DateTime": { "input": { "kind": "string" }, "output": { "kind": "string" } },
    "Decimal": { "input": { "kind": "string" }, "output": { "kind": "string" } },
    "CurrencyCode": {
      "input": { "kind": "string", "pattern": "^[A-Z]{3}$" },
      "output": { "kind": "string", "pattern": "^[A-Z]{3}$" }
    }
  }
}
```

Write `artifact` plus a newline to `contract.generated.json`, and to
`operations.generated.ts` the first line of the current file, the two imports
(`createGraphQLOperation` from `../../graphql.js`, `v` from `bijection/values`)
and `source`, exactly as `dev/graphql-codegen.mjs` does for GitHub.

Nothing here has run against Wave. Package fixtures establish declaration
behavior only; the Money spelling, page-size bound, `modifiedAtAfter`
inclusivity and webhook bodies are taken from Wave's documentation and schema.

## Provider references

Provider references and prerequisites are maintained in the connector guidance above. No separate provider-documentation review date is recorded.

## Source and evidence

[Canonical connector source](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/src/connectors/wave/README.md), [native analysis](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/contract-analysis.json) and [check receipts](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/evidence.json).

Connector artifact: `905888ea276a2a28e36981a79e8142b2547ea451c3e63162cb6915ad4a7d1305`.

The resource declaration examples above are compiled and compared with exact catalog declarations. Recorded checks apply only to their source, declaration and runtime identities. Configure a connection and inspect its status to establish deployment-specific readiness.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.