---
# System prepended metadata

title: '`@web3-storage/access-api` data storage'

---

# `@web3-storage/access-api` data storage

## Purpose of this Document

* Explain how [`@web3-storage/access-api`](https://github.com/web3-storage/w3up/tree/main/packages/access-api) stores data today.
    * https://github.com/web3-storage/w3up/issues/684
* Enable planning of how to scale the service

## access-api invocation handlers

not exhaustive. these are the recent ones that interact with data stores.

* [`provider/add`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/provider-add.js#L26)
* [`access/delegate`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-delegate.js#L62)
    * asserts [`hasStorageProvider({ consumer: space })`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-delegate.js#L66) 
    * then [putMany](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-delegate.js#L75) delegations
* [`access/claim`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-claim.js#L35)
    * retrieves stored delegations
        * select by delegation `audience`
        * may need to sort/filter by expiry

## access-api operations that interact with data stores

* [`DelegationsStorage#find`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/types/delegations.ts#L35)
    * [`DbDelegationsStorageWithR2#find`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/delegations.js#L117)
* [`DelegationsStorage#putMany`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/types/delegations.ts#L16)
    * [`DbDelegationsStorageWithR2#putMany`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/delegations.js#L95)
* [`DelegationsStorage#count`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/types/delegations.ts#L23)
  * [`DbDelegationsStorageWithR2#count`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/delegations.js#L110)

* [`ProvisionsStorage#hasStorageProvider(consumer: DID<'key'>)`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/types/provisions.ts#L21)
  * [`DbProvisions#hasStorageProvider`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/provisions.js#L189)
* [`ProvisionsStorage#put({ invocation, space, account, provider })`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/types/provisions.ts#L27)
  * [`DbProvisions#put`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/provisions.js#L110)
      * there is currently not 

## access-api data stores

### Cloudflare D1 (sqlite-ish)

* [`delegations_v3`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/migrations/0007_add_delegations_v3.sql#L10)
* [`provisions`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/migrations/0006_add_storage_provider_consumer_schema.sql#L11) - result of `provider/add`

Other tables, not used by `access/*` or `provider/*`

* [`accounts`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/migrations/0004_add_accounts_table.sql#L3) - not needed (at all afaict)
* [`spaces`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/migrations/0003_space.metadata_can_be_null.sql#L6)
    * may not be needed - depends on `space/info` et al expectations
    * spaces registered by `provider/add` only return `space/info` `{ did }`
        * This doesn't require `spaces` table
    * spaces registered by `voucher/` would returns essentially this whole row.

### Cloudflare R2 (s3-ish)

* `DbDelegationsStorageWithR2` [stores the bytes of the delegations in r2](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/delegations.js#L153) and CIDs-only in d1
    * at key `/delegations/{ucan.cid.toString(base32)}.car`

## opportunities to use ucan-stream

* reduce `access/delegate` invocations into an index that can serve `access/claim`
    * alternative to `access/claim` [calling](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-claim.js#L40) [`DbDelegationsStorageWithR2#find`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/delegations.js#L117)
    * write to
        * if dynamodb, should probably account for expiry sort key at same time (via @mikeal)
        * May not need dynamodb. We could group by audience and write to s3

* reduce `provider/add` receipts into an index that can answer whether a given space has at least one storage provider of a certain provider did
    * alternative to `access/delegate` [calling](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/service/access-delegate.js#L66) [`DbProvisions#hasStorageProvider`](https://github.com/web3-storage/w3up/blob/main/packages/access-api/src/models/provisions.js#L189)
