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

# Cloud assist

> An optional step for what a device cannot do alone: naming things without Apple's on-device language model, writing answers, and filling profiles. It sends text Pool already read, never an image.

## When it runs

Cloud assist is off by default. It has four uses: naming the things in a capture while indexing, writing an answer for `ask` on devices without Apple's on-device model, filling a `profile`, and confirming the captures a rule is unsure about. See [Answers and profiles](https://docs.pool.day/answers.md) for the second and third, and [Classify by a rule](https://docs.pool.day/classify.md) for the fourth. Reading a single image with `pool.reader` can use it too, when that call opts in: see [Read one capture](https://docs.pool.day/reader.md). While indexing, a capture's text is sent only when all of these are true:

* Your configuration sets `allowsCloudAssist = true`, and your index options set `namesWithCloudAssist = true`. Both are off by default.
* An active grant was requested with `allowsCloudAssist: true`. Tell the person in your own consent screen that text from their photos is sent to Pool.
* Apple's on-device language model cannot run on the device at all, for example without Apple Intelligence. Devices that have it never use cloud assist for indexing: when the model is busy for a moment, naming waits for the next pass instead.
* The capture passed the privacy gate and has enough text to name something.
* Your app has allowance left this month.

```swift theme={null}
var configuration = PoolConfiguration(appKey: "pk_live_…")
configuration.allowsCloudAssist = true

let grant = try await pool.authorization.requestAccess(
    AccessRequest(data: [.products], purpose: "Name the products you saved", allowsCloudAssist: true)
)
```

## What is sent

* For naming: up to 1,500 characters of recognized text and up to eight labels per capture, in batches of up to eight captures.
* For an answer: the question and up to 40 things and excerpts PoolKit found on the device. For a profile: your schema and up to 80 recurring things. Excerpts of recognized text are included only when the grant has `.recognizedText`.
* For a rule: the rule, and for each capture PoolKit is unsure about, the same text and labels plus the names of things it found, in batches of up to 24 captures. Captures the device already decided are not sent.
* A random reference per capture that means nothing outside that request.
* A random install identifier and your bundle ID. No account, no advertising identifier, no location, no file name, no image.

## What Pool does with it

* A language model names the things in the text and the answer goes back to the device.
* For a rule, a judge model rates each capture against it and the ratings go back to the device.
* Pool stores a count of cloud assist units, for billing. It does not store or log the text, the rule or the answer.
* The text is not used to train models.
* Names that share no word with the capture's own text come back as low-confidence leads, so a model cannot invent a product into someone's library.

## When allowance runs out

The service answers 429 and the SDK stops asking until the time it was given. Nothing breaks: indexing, search, links and objects keep working on the device, and captures are named later.


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