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

# Pushbullet

The io.b3os/pushbullet pack: 2 actions with call snippets, fixture outputs, connection setup and error codes, generated from version 1.0.0.

`io.b3os/pushbullet` 1.0.0 · `notifications`, `messaging`, `mobile` · MIT

Push notifications to your own phones and browsers through Pushbullet with your Pushbullet access token: send a note or a link to all devices or one device, and list devices to find their identifiers.

Every call's result carries `upstream_status` and `timing`: `validate_ms`, `inject_ms`, `render_ms`, `upstream_ms`, `map_ms` and `total_ms`. `upstream` is the service's time; the others are B3OS's own ([call actions](/actions/call)). The snippets below show no timing values, because a fixture records none.

## Connection

`pushbullet`, type `api_key`: Pushbullet access token.

An access token from pushbullet.com/#settings/account, sent as the Access-Token header to api.pushbullet.com only.

How to get one: [docs.pushbullet.com](https://docs.pushbullet.com/#http).

The credential is sent only to `api.pushbullet.com`.

Store the credential once as a [vault connection](/vault) for this pack and key, then name its id in a call's `connections`. Leave the key out and B3OS uses the project's newest connection for the pack and key without a `subject` ([connections](/actions/call#connections)).

Hosts it reaches: `api.pushbullet.com`.

## Actions

| Action | Effect | MCP tool | Title |
|---|---|---|---|
| [`send-push`](/actions/catalog/pushbullet#pushbullet-send-push) | irreversible | `pushbullet__send-push` | Send push |
| [`list-devices`](/actions/catalog/pushbullet#pushbullet-list-devices) | read | `pushbullet__list-devices` | List devices |

send-push

**Send push.** Send a note, or a link with a URL, to every device on the account or to one device (deviceIden from list-devices). Returns the push identifier.

Ref `io.b3os/pushbullet/send-push@1.0.0` · effect `irreversible` · connection `pushbullet` · MCP tool `pushbullet__send-push`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Idempotency-Key: 7c1e2f6a-1d43-4a8e-b2a5-3f0c9d5e8b11" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/pushbullet/send-push@1",
          "input": {
            "type": "link",
            "title": "Deploy finished",
            "body": "v2.4.1 is live",
            "url": "https://status.acme.example/deploys/241"
          },
          "connections": {"pushbullet": "conn_01m5t6cbgdjs1ketgcqwa2sne8"}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/pushbullet/send-push@1",
      input: {
        type: "link",
        title: "Deploy finished",
        body: "v2.4.1 is live",
        url: "https://status.acme.example/deploys/241",
      },
      connections: { pushbullet: "conn_01m5t6cbgdjs1ketgcqwa2sne8" },
    }, { idempotencyKey: crypto.randomUUID() });
    console.log(result.output);
    ```
  **Python**

```python
    import uuid
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/pushbullet/send-push@1",
        "input": {
            "type": "link",
            "title": "Deploy finished",
            "body": "v2.4.1 is live",
            "url": "https://status.acme.example/deploys/241",
        },
        "connections": {"pushbullet": "conn_01m5t6cbgdjs1ketgcqwa2sne8"},
    }, idempotency_key=str(uuid.uuid4()))
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "pushbullet__send-push",
        "arguments": {
          "type": "link",
          "title": "Deploy finished",
          "body": "v2.4.1 is live",
          "url": "https://status.acme.example/deploys/241"
        }
      }
    }
    ```

    Expose the pack as tools with `--packs pushbullet` on the local server or `?packs=pushbullet` on the remote URL, and the agent calls `pushbullet__send-push` with the action's input. The tool uses your newest connection for each key without a `subject`. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Send push (documented response shape, example values). From the bundle's `fixtures/send-push.json`, not a live call.

```json
{"iden": "ujpah72o0sjAoRtnM0jc", "active": true}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `not_found` | 404 | no | No such Pushbullet device. |
| `connection_unauthorized` | 401 | no | Pushbullet rejected the access token; check the connection. |
| `forbidden` | 403 | no | Pushbullet refused the request for this account. |
| `rate_limited` | 429 | yes | Pushbullet rate limit reached for this account; retry later. |

list-devices

**List devices.** Active devices on the Pushbullet account with identifier, nickname, type (android, ios, chrome, firefox, ...) and whether they can receive pushes.

Ref `io.b3os/pushbullet/list-devices@1.0.0` · effect `read` · connection `pushbullet` · MCP tool `pushbullet__list-devices`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/pushbullet/list-devices@1",
          "input": {},
          "connections": {"pushbullet": "conn_01m5t6cbgdjs1ketgcqwa2sne8"}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/pushbullet/list-devices@1",
      input: {},
      connections: { pushbullet: "conn_01m5t6cbgdjs1ketgcqwa2sne8" },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/pushbullet/list-devices@1",
        "input": {},
        "connections": {"pushbullet": "conn_01m5t6cbgdjs1ketgcqwa2sne8"},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {"name": "pushbullet__list-devices", "arguments": {}}
    }
    ```

    Expose the pack as tools with `--packs pushbullet` on the local server or `?packs=pushbullet` on the remote URL, and the agent calls `pushbullet__list-devices` with the action's input. The tool uses your newest connection for each key without a `subject`. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: List devices (documented response shape, example values). From the bundle's `fixtures/list-devices.json`, not a live call.

```json
{
  "devices": [
    {
      "iden": "ujpah72o0sjAoRtnM0jc",
      "nickname": "Pixel 9",
      "type": "android",
      "manufacturer": "Google",
      "model": "Pixel 9",
      "pushable": true
    },
    {
      "iden": "ujpah72o0sjAsoeMFETtJs",
      "nickname": "Chrome",
      "type": "chrome",
      "manufacturer": null,
      "model": null,
      "pushable": true
    }
  ]
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `not_found` | 404 | no | No such Pushbullet device. |
| `connection_unauthorized` | 401 | no | Pushbullet rejected the access token; check the connection. |
| `forbidden` | 403 | no | Pushbullet refused the request for this account. |
| `rate_limited` | 429 | yes | Pushbullet rate limit reached for this account; retry later. |