Skip to main content
source identifies the connected data source, for example icloud_notes. scopes identify approved data sets, for example ["icloud_notes.notes"]. Start with a source listed in the Vana app at app.vana.org/sources. For the current supported source and scope list, see the data-connectors scope registry: PDP-Connect/data-connectors/SCOPES.md.
Need a source that isn’t available yet? See Add a connector.
Request every scope in one approval. A grant is keyed by the (user, app) pair, and re-approving replaces the grant’s scopes rather than adding to them. Put every scope your app needs in the scopes array of a single request so one approval covers them all. If you request scopes across separate approvals, the grant ends up holding only the most recently approved set, and reads for the dropped scopes start failing the scope check.One source per request. A request targets one source. Scopes from another source in the same request (for example an icloud_notes.* scope with a spotify.* scope) read empty, because the approval connects only one source. If your app needs several sources, run one approval per source.

Reading more than one scope

Approving several scopes and reading several scopes are separate steps. getAccessRequestStatus returns the full approved set as scopes, and scope as the first of them:
readApprovedData reads one scope — the first approved scope unless you name another. To read everything the user approved, use readAllApprovedData:
Each scope is a separate paid read. Requesting five scopes costs the same as requesting one — a grant is registered once. But reading five scopes settles five data_access fees, so read only what your app uses.Acknowledgement is terminal. A successful readApprovedData acknowledges the request and moves it to completed, which is no longer readable. If you loop over scopes yourself, pass acknowledge: false on every call but the last. readAllApprovedData handles this for you — it acknowledges once, after the final scope, and only if every scope read. A scope that fails lands in errors and leaves the request unacknowledged so you can retry it.