home / skills / near / agent-skills / near-api-js

near-api-js skill

/skills/near-api-js

This skill helps you develop NEAR apps with near-api-js v7 by guiding account management, transactions, and token interactions.

npx playbooks add skill near/agent-skills --skill near-api-js

Review the files below or copy the command above to add this skill to your agents.

Files (6)
SKILL.md
7.3 KB
---
name: near-api-js
description: >-
  Guide for developing with near-api-js v7 - the JavaScript/TypeScript library for NEAR blockchain interaction. 
  Use when: (1) building apps that interact with NEAR blockchain, (2) creating/signing transactions, 
  (3) calling smart contracts, (4) managing accounts and keys, (5) working with NEAR RPC API, 
  (6) handling FT/NFT tokens on NEAR, (7) using NEAR cryptographic operations (KeyPair, signing), 
  (8) converting between NEAR units (yocto, gas), (9) gasless/meta transactions with relayers,
  (10) wallet integration and session management, (11) NEP-413 message signing for authentication,
  (12) storage deposit management for FT contracts. Triggers on any NEAR blockchain development tasks.
---

# near-api-js Skill

JavaScript/TypeScript library for NEAR blockchain interaction. Works in browser and Node.js.

## Quick Start

```typescript
import { Account, JsonRpcProvider, KeyPair } from "near-api-js"
import { NEAR } from "near-api-js/tokens"

// Connect to testnet
const provider = new JsonRpcProvider({ url: "https://test.rpc.fastnear.com" })

// Create account with signer
const account = new Account("my-account.testnet", provider, "ed25519:...")
```

## Import Cheatsheet

```typescript
// Core
import { Account, actions, JsonRpcProvider, FailoverRpcProvider } from "near-api-js"
import { KeyPair, PublicKey, KeyType } from "near-api-js"

// Tokens
import { NEAR, FungibleToken, NFTContract } from "near-api-js/tokens"
import { USDC, wNEAR } from "near-api-js/tokens/mainnet"

// Seed phrases
import { generateSeedPhrase, parseSeedPhrase } from "near-api-js/seed-phrase"

// Signers
import { KeyPairSigner, MultiKeySigner, Signer } from "near-api-js"

// Units
import { nearToYocto, yoctoToNear, teraToGas, gigaToGas } from "near-api-js"

// Transactions
import { createTransaction, signTransaction } from "near-api-js"

// Error handling
import { TypedError, parseTransactionExecutionError } from "near-api-js"
```

## Core Modules

### Account

Main class for account operations.

```typescript
const account = new Account(accountId, provider, privateKey)

// Get state
const state = await account.getState()  // { balance: { total, available, locked }, storageUsage }

// Transfer NEAR
await account.transfer({ receiverId: "bob.testnet", amount: NEAR.toUnits("1"), token: NEAR })

// Call contract
await account.callFunction({
  contractId: "contract.testnet",
  methodName: "set_greeting",
  args: { message: "Hello" },
  deposit: 0n,
  gas: 30_000_000_000_000n
})

// Sign and send transaction
await account.signAndSendTransaction({
  receiverId: "contract.testnet",
  actions: [
    actions.functionCall("method", { arg: "value" }, 30_000_000_000_000n, 0n),
    actions.transfer(1_000_000_000_000_000_000_000_000n)
  ]
})
```

### Provider

RPC client for querying blockchain.

```typescript
const provider = new JsonRpcProvider({ url: "https://rpc.mainnet.near.org" })

// Failover provider
const failover = new FailoverRpcProvider([
  new JsonRpcProvider({ url: "https://rpc.mainnet.near.org" }),
  new JsonRpcProvider({ url: "https://rpc.mainnet.pagoda.co" })
])

// Query methods
await provider.viewAccount({ accountId: "alice.near" })
await provider.viewAccessKey({ accountId, publicKey })
await provider.callFunction({ contractId, method: "get_greeting", args: {} })
await provider.viewBlock({ finality: "final" })
await provider.sendTransaction(signedTx)
```

### Crypto

Key management and cryptographic operations.

```typescript
import { KeyPair, PublicKey } from "near-api-js"

// Generate random keypair
const keyPair = KeyPair.fromRandom("ed25519")

// From string
const keyPair = KeyPair.fromString("ed25519:5Fg2...")

// Sign and verify
const { signature, publicKey } = keyPair.sign(data)
const verified = keyPair.verify(message, signature)
```

### Tokens

FT and NFT support.

```typescript
import { NEAR, FungibleToken } from "near-api-js/tokens"
import { USDC } from "near-api-js/tokens/mainnet"

// Unit conversion
NEAR.toUnits("1.5")  // 1500000000000000000000000n
NEAR.toDecimal(amount)  // "1.5"

// Transfer FT
await account.transfer({ receiverId: "bob.near", amount: USDC.toUnits("50"), token: USDC })

// Custom FT
const token = new FungibleToken("usdt.tether-token.near", { decimals: 6, name: "USDT", symbol: "USDT" })
```

### Actions

All transaction actions.

```typescript
import { actions } from "near-api-js"

actions.transfer(amount)
actions.functionCall(methodName, args, gas, deposit)
actions.createAccount()
actions.deployContract(wasmBytes)
actions.addFullAccessKey(publicKey)
actions.addFunctionAccessKey(publicKey, contractId, methodNames, allowance)
actions.deleteKey(publicKey)
actions.deleteAccount(beneficiaryId)
actions.stake(amount, publicKey)
actions.signedDelegate(signedDelegateAction)  // Meta transactions
```

## RPC Endpoints

| Network | URL |
|---------|-----|
| Mainnet | `https://rpc.mainnet.near.org` |
| Mainnet (Pagoda) | `https://rpc.mainnet.pagoda.co` |
| Mainnet (FastNEAR) | `https://free.rpc.fastnear.com` |
| Testnet | `https://rpc.testnet.near.org` |
| Testnet (FastNEAR) | `https://test.rpc.fastnear.com` |

## Common Patterns

### View Contract State

```typescript
const result = await provider.callFunction({
  contractId: "contract.near",
  method: "get_data",
  args: { key: "value" }
})
```

### Change Contract State

```typescript
await account.callFunction({
  contractId: "contract.near",
  methodName: "set_data",
  args: { key: "new_value" },
  gas: 30_000_000_000_000n,
  deposit: 0n
})
```

### Batch Transactions

```typescript
await account.signAndSendTransactions({
  transactions: [
    { receiverId: "bob.near", actions: [actions.transfer(NEAR.toUnits("1"))] },
    { receiverId: "alice.near", actions: [actions.transfer(NEAR.toUnits("2"))] }
  ]
})
```

### Meta Transactions (Gasless)

```typescript
// Create signed meta tx (user side)
const signedDelegate = await account.createSignedMetaTransaction({
  receiverId: "contract.near",
  actions: [actions.functionCall("method", {}, 30_000_000_000_000n, 0n)]
})

// Submit via relayer
await relayerAccount.signAndSendTransaction({
  receiverId: signedDelegate.delegateAction.senderId,
  actions: [actions.signedDelegate(signedDelegate)]
})
```

### Contract Interface

```typescript
import { Contract } from "near-api-js"

const contract = new Contract(account, "contract.near", {
  viewMethods: ["get_status"],
  changeMethods: ["set_status"]
})

const status = await contract.get_status()
await contract.set_status({ message: "Hello" })
```

## Error Handling

```typescript
import { parseTransactionExecutionError, TypedError, InvalidNonceError } from "near-api-js"

try {
  await account.signAndSendTransaction({ ... })
} catch (error) {
  if (error instanceof TypedError) {
    console.log(error.type, error.message)
  }
  if (error instanceof InvalidNonceError) {
    // Retry with fresh nonce
  }
}
```

## Reference Documentation

For detailed patterns and advanced usage, see:

- [API Patterns Reference](references/api_patterns.md) - Complete Account/Provider method reference, type definitions
- [Tokens Guide](references/tokens_guide.md) - FT/NFT operations, storage deposits, pre-defined tokens
- [Key Management](references/key_management.md) - KeyPair types, seed phrases, signers, access keys
- [Meta Transactions](references/meta_transactions.md) - Gasless transactions, relayer integration
- [Wallet Integration](references/wallet_integration.md) - Browser patterns, NEP-413 signing, sessions

Overview

This skill is a practical guide for developing with near-api-js v7, the JavaScript/TypeScript library for interacting with the NEAR blockchain. It focuses on common developer tasks: account management, signing transactions, calling smart contracts, token operations (FT/NFT), and provider/RPC usage. The content is geared for both browser and Node.js environments and includes patterns for gasless/meta transactions and wallet integration.

How this skill works

The skill explains core modules (Account, Provider, Crypto, Tokens, Actions) and provides code patterns for creating accounts, querying state, signing and sending transactions, and handling unit conversions. It covers RPC client setup (JsonRpcProvider, FailoverRpcProvider), key management (KeyPair, seed phrases, signers), and utilities for NEAR units and gas. It also demonstrates meta transactions, batch transactions, and error handling utilities for robust apps.

When to use it

  • Building dApps that interact with the NEAR blockchain from browser or Node.js
  • Creating, signing, and sending transactions or batching multiple transactions
  • Calling or deploying smart contract methods (view and change calls)
  • Managing accounts, keys, seed phrases, and access keys programmatically
  • Handling FT/NFT transfers, storage deposits, and token unit conversions

Best practices

  • Use JsonRpcProvider or FailoverRpcProvider with multiple endpoints for reliability
  • Keep private keys out of client bundles; use signers or wallet flows for browser apps
  • Convert between human NEAR amounts and yoctoNEAR using provided utilities to avoid precision bugs
  • Use typed error handling (TypedError, InvalidNonceError) and retry strategies for nonce issues
  • Batch related actions in a single transaction when atomicity is required
  • For gasless flows, generate signed meta transactions client-side and submit via trusted relayers

Example use cases

  • Transfer native NEAR or FT tokens with precise unit conversion and storage deposit handling
  • Call change-methods on a smart contract to update state and attach deposit/gas
  • Implement wallet integration and NEP-413 message signing for user authentication
  • Create meta-transaction flow: user signs delegate, relayer submits signedDelegate action
  • Build a backend service that queries account state, views contract data, and sends signed transactions

FAQ

Can I use near-api-js in both browser and Node.js?

Yes. near-api-js v7 supports both environments; keep secrets out of browser code and rely on wallet signers or secure backends.

How do I avoid precision errors when sending amounts?

Use the provided unit utilities (nearToYocto, yoctoToNear) or token helpers (NEAR.toUnits, token.toDecimal) to convert between human-readable amounts and yocto units.