# When your Ownbox says no

Part of the [Ownbox SDK reference](https://www.ownbox.io/sdk/reference.md).

Your Ownbox refuses a call with `sdk.BoxRefused`: `.code` is the reason, which a rewording never changes, and the message is a sentence saying what to change. The codes: `not_permitted` (add the permission it names), `host_not_allowed`, `key_not_allowed`, `key_wrong_host`, `key_missing`, `no_cap` and `over_cap` (the owner's monthly limit for a key), `over_budget` (the AI's allowance for the month), `rate_limited`, `too_large`, `bad_*` (an argument), `never_readable` (a key read), `too_many_screens` and `too_many_panels`. The people, conversation and send calls never raise: their answer carries a `status` and a `code` instead.

## sdk.BoxRefused

```python
sdk.BoxRefused
```

**Exception.** Your Ownbox answered a call with a refusal.

`.code` is the reason, which a rewording never changes; the message is a sentence saying what to change. Decide in code on `.code`.

Example (inside a job):

```python
try:
    m.think("check", "Say yes.")
except sdk.BoxRefused as e:
    m.save_setting("refused", e.code)
```

## sdk.NotYet

```python
sdk.NotYet
```

**Exception.** A call a custom machine cannot make yet.

Raised by the calls under Not yet, with a sentence.

## sdk.Reserved

```python
sdk.Reserved
```

**Exception.** A name kept for a later release.

Raised by the reserved calls, with a sentence saying what to use until then.

