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

# Endstate SDKs

> Official libraries for building on Endstate - the Core SDK for the API in TypeScript, and the Reader SDK for turning physical taps into verified API calls.

Two packages, covering the two halves of an Endstate integration: talking to
the API, and reading a physical tap.

Everything they produce speaks the same vocabulary as the
[REST API](/api-reference/introduction) - `chip_id`, `external_id`,
`session_token` - so nothing is renamed and you can mix SDK and direct API
calls freely.

<CardGroup cols={2}>
  <Card title="Core SDK" icon="package" href="/sdks/core/quickstart">
    The Endstate API in TypeScript - typed operations, typed errors, retries
    derived from the spec, and tap sessions. Runs in Node, edge, and the
    browser. `@endstate-sdk/core`
  </Card>

  <Card title="Reader SDK" icon="scan-line" href="/sdks/reader/quickstart">
    Read Endstate chips from your own application - desktop USB readers and
    Android phone NFC behind one interface. `@endstate-sdk/reader`
  </Card>
</CardGroup>

Both are TypeScript-first, ship **zero runtime dependencies**, and are licensed
Apache-2.0. Each is versioned on its own - upgrading one never forces you to
upgrade the other - and follows [semantic versioning](https://semver.org), so a
patch or minor release will not break your build.

## Which do I need?

* **Calling the API from TypeScript**, on a server or in a browser? Start with
  the [Core SDK quickstart](/sdks/core/quickstart). It covers every operation
  in the spec, so you rarely need anything else.
* **Pairing or verifying physical chips from a browser app an operator uses?**
  Add the [Reader SDK](/sdks/reader/quickstart) for the tap itself, then follow
  [Pair chips from your own application](/guides/pair-chips-from-your-app) for
  the full operator flow. The two compose: the reader produces `chip_id` and
  `e`, and Core's [`verify()`](/sdks/core/tap-sessions) turns them into a
  session.
* **Not using TypeScript?** Call the
  [API](/api-reference/introduction) directly; see the
  [guides](/guides/set-up-catalog) for end-to-end flows.

## How they fit together

Core is the foundation and has no dependency on the reader. The reader is
standalone too, so an operator tool that only encodes chips does not pull in an
API client. Used together, the reader captures the tap and Core exchanges it
for a session:

```ts theme={null}
import { pickReader } from "@endstate-sdk/reader";
import { EndstatePublicClient } from "@endstate-sdk/core";

reader.start({
  onTap: async ({ chipId, e, c }) => {
    const session = await endstate.verify({ chip_id: chipId, e, c });
    // session.item is the verified unit
  },
});
```

## Working with AI tools

Every SDK package ships an `AGENTS.md` for AI coding agents, and these docs
are agent-readable - see [Use Endstate with AI tools](/ai-tools).
