Typed HTTP client for interacting with Turnkey API
npm install @turnkey/http
A lower-level, fully typed HTTP client for interacting with Turnkey API.
For signing transactions and messages, check out the higher-level @turnkey/ethers or @turnkey/viem signers.
Turnkey API documentation lives here: https://docs.turnkey.com.
``bash`
$ npm install @turnkey/http
`typescript
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
import { TurnkeyClient } from "@turnkey/http";
// This stamper produces signatures using the API key pair passed in.
const stamper = new ApiKeyStamper({
apiPublicKey: "...",
apiPrivateKey: "...",
});
// The Turnkey client uses the passed in stamper to produce signed requests
// and sends them to Turnkey
const client = new TurnkeyClient(
{
baseUrl: "https://api.turnkey.com",
},
stamper,
);
// Now you can make authenticated requests!
const data = await client.getWhoami({
organizationId: "
});
`
@turnkey/http provides fully typed http fetchers for interacting with the Turnkey API. You can find all available methods here. The types of input parameters and output responses are also exported for convenience.
The OpenAPI spec that generates all fetchers is also included in the package.
helperAll Turnkey mutation endpoints are asynchronous (with the exception of private key-related signing endpoints, e.g. /submit/sign_transaction, /submit/sign_raw_payload). To help you simplify async mutations, @turnkey/http provides a withAsyncPolling(...) wrapper. Here's a quick example:
`typescript
import { withAsyncPolling, TurnkeyActivityError } from "@turnkey/http";
// Use withAsyncPolling(...) to wrap & create a fetcher with built-in async polling support
const fetcher = withAsyncPolling({
request: client.createPrivateKeys,
});
// The fetcher remains fully typed. After submitting the request,
// it'll poll until the activity reaches a terminal state.
try {
const activity = await fetcher({
body: {
/ ... /
},
});
// Success!
console.log(
activity.result.createPrivateKeysResultV2?.privateKeys?.[0]?.privateKeyId,
);
} catch (error) {
if (error instanceof TurnkeyActivityError) {
// In case the activity is rejected, failed, or requires consensus,
// a rich TurnkeyActivityError will be thrown. You can read fromTurnkeyActivityError
// to find out why the activity didn't succeed.activityId
//
// For instance, if your activity requires consensus and doesn't have
// enough approvals, you can get the from TurnkeyActivityError,.postGetActivity(...)
// store it somewhere, then re-fetch the activity via `
// when the required approvals/rejections are in place.
}
}
See createNewEthereumPrivateKey.ts in the with-ethers example.
- @turnkey/ethers: Turnkey Signer for Ethers
- @turnkey/viem: Turnkey Custom Account for Viem`