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

# describeProgram

> List a program's decoded instruction names, events, and account roles so you can build Parsed Streams filters that actually match.

The most common failure with a filter-based API is a filter that is valid but matches nothing, usually a guessed instruction or role name. `describeProgram` prevents that by returning the exact names the matcher compares against — the decoded instruction names, event names, and account roles for any of the 3,600+ programs in the catalog.

`describeProgram` is a JSON-RPC method sent over a WebSocket connection. It is currently only available on `wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>`, not on the Gatekeeper endpoint (`wss://beta.helius-rpc.com`) you subscribe on. Open a separate connection to `fs-beta` for discovery, then subscribe on Gatekeeper.

Recommended flow: `describeProgram` to get the exact instruction and role names, build the filter with those names, then [subscribe](https://www.helius.dev/docs/api-reference/parsed-streams/parsedtransactionsubscribe.md). The [Track Jupiter Swaps](https://www.helius.dev/docs/parsed-streams/guides/track-jupiter-swaps.md) guide walks through this end to end.

## Body

**params** `array` *required*

**Query**

**program** `string` *required*

A program address (base58) or a catalog name. **Prefer the address**: names can be ambiguous across program versions (more than one catalog entry is named `jupiter`, and a name lookup can resolve to the older one). If you do look up by name, check that `result.id` is the program you intend to subscribe to.

## Response

**id** `string`

The program's address (base58).

**name** `string`

The program's catalog name.

**instructions** `string[]`

Decoded instruction names, exactly as the matcher compares them. Use these in the `instructionNames` filter field.

**events** `string[]`

Event names the parser recognizes for this program.

**roles** `string[]`

Decoded account role names. Use these as keys in the `accounts.roles` filter field — they match exactly, with no case folding.

```json Request theme={"system"}
{ "jsonrpc": "2.0", "id": 1, "method": "describeProgram", "params": [{ "program": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" }] }
```

```json Response theme={"system"}
{
  "jsonrpc": "2.0", "id": 1,
  "result": {
    "id": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
    "name": "jupiter",
    "instructions": ["route", "shared_accounts_route", "exact_out_route"],
    "events": ["SwapEvent"],
    "roles": ["user_transfer_authority", "destination_token_account"]
  }
}
```


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