# describe_api
URL: https://lsd.tools/docs/api-describe-describe-api
Updated: 2026-07-18

## Example

```python
from lsdtools import describe_api

api = describe_api()
print(api["api_version"], len(api["steps"]))
# → "2.1" 12
```

Walk the registered steps and their parameters:

```python
for name, step in describe_api()["steps"].items():
    print(name, step["kind"], [p["name"] for p in step["params"]])
```

## Notes

The return value is a plain, JSON-ready `dict` with these top-level keys:

| key | type | what |
|---|---|---|
| `api_version` | `str` | the public [`API_VERSION`](/docs/api-runtime), e.g. `"2.1"` |
| `lsd_version` | `str` | the engine/product version |
| `public_api` | `list[str]` | the sorted public API names (all importable from `lsdtools`) |
| `steps` | `dict` | registered load/shape/deliver steps by name — each entry has `kind`, `params`, `input_ports`, `output_ports` |
| `entities` | `dict` | registered entity types by name — each entry has `creatable`, `create_label`, `params` |

It introspects the **currently registered** step/entity classes, so load your packages first (the
`lsd` CLI does this) or installed contributions won't appear. This is the same data behind
[`lsd api describe`](/docs/api-cli) and the AI authoring context.

## See also

**API:** [describe_text](/docs/api-describe-describe-text) · [describe_markdown](/docs/api-describe-describe-markdown) · [CLI commands](/docs/api-cli)

**Guides:** [lsdtools API reference](/docs/api-index)
