# `AccessGrid.AccessPasses`
[🔗](https://github.com/Access-Grid/accessgrid-ex/blob/main/lib/access_grid/access_passes.ex#L1)

Manages access-pass lifecycle operations against `/v1/key-cards`.

All functions accept an optional `:client` in opts. If not provided,
credentials are loaded from application config via Gestalt.

## Examples

    # Using explicit client
    client = AccessGrid.Client.new(account_id: "...", api_secret: "...")
    AccessGrid.AccessPasses.issue(%{card_template_id: "tmpl_123"}, client: client)

    # Using config (client resolved automatically)
    AccessGrid.AccessPasses.get("card_abc123")

# `list_result`

```elixir
@type list_result() ::
  {:ok, [AccessGrid.AccessPass.t()]}
  | {:error, AccessGrid.Types.api_error_reason(),
     AccessGrid.HttpFailure.t() | [atom(), ...]}
```

# `result`

```elixir
@type result() ::
  {:ok, AccessGrid.AccessPass.t()}
  | {:error, AccessGrid.Types.api_error_reason(),
     AccessGrid.HttpFailure.t() | [atom(), ...]}
```

# `delete`

```elixir
@spec delete(
  String.t(),
  keyword()
) :: result()
```

Deletes a key card.

## Examples

    AccessGrid.AccessPasses.delete("card_abc123")

# `get`

```elixir
@spec get(
  String.t(),
  keyword()
) :: result()
```

Retrieves a key card by ID.

## Examples

    AccessGrid.AccessPasses.get("card_abc123")

# `issue`

```elixir
@spec issue(
  map(),
  keyword()
) :: result()
```

Issues a new key card.

## Parameters

  * `params` - Map with card parameters (card_template_id, full_name, etc.)
  * `opts` - Options including `:client`

## Examples

    AccessGrid.AccessPasses.issue(%{
      card_template_id: "tmpl_123",
      full_name: "John Doe"
    })

# `list`

```elixir
@spec list(
  String.t(),
  keyword()
) :: list_result()
```

Lists key cards for a template.

## Options

  * `:state` - Filter by card state (e.g., "active", "suspended")
  * `:client` - Client for authentication

## Examples

    AccessGrid.AccessPasses.list("tmpl_123")
    AccessGrid.AccessPasses.list("tmpl_123", state: "active")

# `resume`

```elixir
@spec resume(
  String.t(),
  keyword()
) :: result()
```

Resumes a suspended key card.

## Examples

    AccessGrid.AccessPasses.resume("card_abc123")

# `suspend`

```elixir
@spec suspend(
  String.t(),
  keyword()
) :: result()
```

Suspends a key card.

## Examples

    AccessGrid.AccessPasses.suspend("card_abc123")

# `unlink`

```elixir
@spec unlink(
  String.t(),
  keyword()
) :: result()
```

Unlinks a key card from its device.

## Examples

    AccessGrid.AccessPasses.unlink("card_abc123")

# `update`

```elixir
@spec update(String.t(), map(), keyword()) :: result()
```

Updates a key card.

## Examples

    AccessGrid.AccessPasses.update("card_abc123", %{full_name: "New Name"})

---

*Consult [api-reference.md](api-reference.md) for complete listing*
