Neynar Documentation
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
Most of the migration can be done quickly with AI: Using github copilot
Installation
Shell
yarn add @neynar/nodejs-sdk
OR
Shell
npm install @neynar/nodejs-sdk
Client Initialization
v1
Typescript
import { NeynarAPIClient } from "@neynar/nodejs-sdk";
const client = new NeynarAPIClient("API_KEY", {
baseOptions: {
headers: {
"x-neynar-experimental": true,
},
},
});
v2
Typescript
import { NeynarAPIClient, Configuration } from "@neynar/nodejs-sdk";
const config = new Configuration({
apiKey: "API_KEY",
baseOptions: {
headers: {
"x-neynar-experimental": true,
},
},
});
const client = new NeynarAPIClient(config);
Removed Methods and Changes in Method Names
All Neynar API v1-related methods have been removed from SDK v2. This version of the SDK will only support Neynar API v2.
Removed Methods
The following methods have been removed entirely from SDK v2:
| Removed Method | Replacement |
|---|---|
fetchRecentUsers |
Use webhook or kafka |
fetchAllCastsLikedByUser |
fetchUserReactions |
lookupUserByFid |
fetchBulkUsers |
lookupCustodyAddressForUser |
fetchBulkUsers |
lookUpCastByHash |
lookUpCastByHashOrWarpcastUrl |
fetchAllCastsInThread |
lookupCastConversation |
fetchAllCastsCreatedByUser |
fetchCastsForUser |
fetchRecentCasts |
Use webhook or kafka |
fetchUserVerifications |
fetchBulkUsers |
lookupUserByVerification |
fetchBulkUsersByEthOrSolAddress |
fetchMentionAndReplyNotifications |
fetchAllNotifications |
fetchUserLikesAndRecasts |
fetchUserReactions |
Checkout Affected v1 API Methods on how to replace it.
Renamed Methods
Several methods in SDK v2 have been renamed for consistency and clarity:
| v1 Method Name | v2 Method Name |
|---|---|
lookUpCastByHashOrWarpcastUrl |
lookupCastByHashOrWarpcastUrl |
publishReactionToCast |
publishReaction |
deleteReactionFromCast |
deleteReaction |
fetchReactionsForCast |
fetchCastReactions |
fetchBulkUsersByEthereumAddress |
fetchBulkUsersByEthOrSolAddress |
Methods Updated to v2 API
These methods retain the original method names but now use the v2 version of the neynar API:
| v1 Method Name | v2 Method Name |
|---|---|
fetchUserFollowersV2 |
fetchUserFollowers |
fetchUserFollowingV2 |
fetchUserFollowing |
lookupUserByUsernameV2 |
lookupUserByUsername |
Enum Changes
Renamed enums
The following enums have been renamed in SDK v2 to align with the updated naming conventions:
| v1 Enum Name | v2 Enum Name |
|---|---|
TimeWindow |
FetchTrendingChannelsTimeWindowEnum |
TrendingFeedTimeWindow |
FetchTrendingFeedTimeWindowEnum |
BulkCastsSortType |
FetchBulkCastsSortTypeEnum |
BulkUserAddressTypes |
BulkUserAddressType |
Enum Key Changes
Certain enum keys have been modified in SDK v2. If you were using the following enums, be aware that their key formats may have changed:
NotificationTypeValidateFrameAggregateWindowFetchTrendingChannelsTimeWindowEnum(formerlyTimeWindow)FetchTrendingFeedTimeWindowEnum(formerlyTrendingFeedTimeWindow)FetchBulkCastsSortTypeEnum(formerlyBulkCastsSortType)BulkUserAddressType(formerlyBulkUserAddressTypes)
Import Path Changes
All the api-related enums and schemas are now centralized and exported from /build/api directory instead of /build/neynar-api/v2/*
Typescript
import {CastParamType, NotificationTypeEnum, User, Cast, ...etc } from '@neynar/nodejs-sdk/build/api'
Imports for following isApiErrorResponse utility function and Webhook interfaces remains the same
Typescript
import { isApiErrorResponse, WebhookFollowCreated, WebhookFollowDeleted, WebhookReactionCreated, WebhookReactionDeleted, WebhookCastCreated, WebhookUserCreated, WebhookUserUpdated } form '@neynar/nodejs-sdk'
Affected v1 API Methods
The following methods have been completely removed in SDK v2 (Ref. Removed Methods). As a result, the response structure will be different in the new methods that replace the deprecated v1 methods.
fetchAllCastsLikedByUser (Use fetchUserReactions)
fetchAllCastsLikedByUser
Typescript
const fid = 3;
const viewerFid = 2;
const limit = 50;
client
.fetchAllCastsLikedByUser(fid, {
viewerFid,
limit,
})
.then((response) => {
const { likes, reactor, next } = response.result;
console.log("likes", likes); // likes.reaction, likes.cast, likes.cast_author
console.log("reactor", reactor);
console.log("nextCursor", next.cursor);
});
fetchUserReactions
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk/build/api";
const fid = 3;
const viewerFid = 2;
const limit = 50;
const type = ReactionsType.Likes;
client.fetchUserReactions({ fid, type, viewerFid, limit }).then((response) => {
const { reactions } = response; // This structure is changed
console.log("likes", reactions);
});
lookupUserByFid (Use fetchBulkUsers)
lookupUserByFid
Typescript
const fid = 19960;
const viewerFid = 194;
client.lookupUserByFid(fid, viewerFid).then((response) => {
const { user } = response.result;
console.log("user", user);
});
fetchBulkUsers
Typescript
const fid = 3;
const viewerFid = 2;
client.fetchBulkUsers({ fids: [fid], viewerFid }).then((res) => {
const { users } = res;
console.log("user", users[0]); // This structure is changed
});
lookupCustodyAddressForUser (Use fetchBulkUsers)
lookupCustodyAddressForUser
Typescript
const fid = 19960;
client.lookupCustodyAddressForUser(fid).then((response) => {
const { fid, custodyAddress } = response.result;
console.log("fid:", fid);
console.log("custodyAddress:", custodyAddress);
});
fetchBulkUsers
Typescript
const fid = 19960;
client.fetchBulkUsers({ fids: [fid] }).then((res) => {
const { users } = res;
console.log("fid:", users[0].fid);
console.log("custodyAddress", users[0].custody_address);
});
lookUpCastByHash (Use lookupCastByHashOrWarpcastUrl)
lookUpCastByHash
Typescript
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be";
const viewerFid = 3;
client
.lookUpCastByHash(hash, {
viewerFid,
})
.then((response) => {
const { cast } = response.result;
console.log(cast);
});
lookupCastByHashOrWarpcastUrl
Typescript
import { CastParamType } from "@neynar/nodejs-sdk/build/api";
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be";
const viewerFid = 3;
const type = CastParamType.Hash;
client
.lookupCastByHashOrWarpcastUrl({
identifier: hash,
type,
viewerFid,
})
.then((response) => {
const { cast } = response;
console.log("cast", cast); // This structure is changed
});
fetchAllCastsInThread (Use lookupCastConversation)
fetchAllCastsInThread
Typescript
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be";
const viewerFid = 3;
client.fetchAllCastsInThread(hash, viewerFid).then((response) => {
const { casts } = response.result;
console.log("conversation", casts);
});
lookupCastConversation
Typescript
import { CastParamType } from "@neynar/nodejs-sdk/build/api";
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be";
const viewerFid = 3;
const type = CastParamType.Hash;
client
.lookupCastConversation({
identifier: hash,
type,
viewerFid,
})
.then((response) => {
const { cast } = response.conversation;
console.log("conversation", cast); // This structure is changed
});
fetchAllCastsCreatedByUser (Use fetchCastsForUser)
fetchAllCastsCreatedByUser
Typescript
const fid = 3;
const parentUrl = "https://ethereum.org";
const viewerFid = 2;
const limit = 5;
client
.fetchAllCastsCreatedByUser(fid, {
parentUrl,
viewerFid,
limit,
})
.then((response) => {
const { casts } = response.result;
console.log("User Casts:", casts);
});
fetchCastsForUser
Typescript
const fid = 3;
const parentUrl = "https://ethereum.org";
const viewerFid = 2;
const limit = 5;
client
.fetchCastsForUser({ fid, parentUrl, viewerFid, limit })
.then((response) => {
const { casts } = response;
console.log("Users casts: ", casts); // This structure is changed
});
fetchUserVerifications (Use fetchBulkUsers)
fetchUserVerifications
Typescript
const fid = 3;
client.fetchUserVerifications(fid).then((response) => {
const { fid, username, display_name, verifications } = response.result;
console.log("fid ", fid);
console.log("username ", username);
console.log("display_name ", display_name);
console.log("verifications ", verifications);
});
fetchBulkUsers
Typescript
const fid = 3;
client.fetchBulkUsers({ fids: [fid] }).then((response) => {
const { fid, username, display_name, verified_addresses } = response.users[0];
console.log("fid ", fid);
console.log("username ", username);
console.log("display_name ", display_name);
console.log("verifications ", verified_addresses);
});
lookupUserByVerification (Use fetchBulkUsersByEthOrSolAddress)
lookupUserByVerification
Typescript
const address = "0x7ea5dada4021c2c625e73d2a78882e91b93c174c";
client.lookupUserByVerification(address).then((response) => {
const { user } = response.result;
console.log("User:", user);
});
fetchBulkUsersByEthOrSolAddress
Typescript
import { BulkUserAddressType } from "@neynar/nodejs-sdk/build/api";
const addresses = ["0x7ea5dada4021c2c625e73d2a78882e91b93c174c"];
const addressTypes = [BulkUserAddressType.VerifiedAddress];
client
.fetchBulkUsersByEthOrSolAddress({ addresses, addressTypes })
.then((response) => {
const user = response[addresses[0]];
console.log("User:", user[0]); // This structure is changed
});
fetchMentionAndReplyNotifications (Use fetchAllNotifications)
fetchMentionAndReplyNotifications
Typescript
const fid = 3;
const viewerFid = 2;
client
.fetchMentionAndReplyNotifications(fid, {
viewerFid,
})
.then((response) => {
console.log("Notifications:", response.result);
});
fetchAllNotifications
Typescript
const fid = 3;
client.fetchAllNotifications({ fid }).then((response) => {
console.log("response:", response); // Returns notifications including mentions, replies, likes, and quotes
});
fetchUserLikesAndRecasts (Use fetchUserReactions)
fetchUserLikesAndRecasts
Typescript
const fid = 12345;
const viewerFid = 67890;
const limit = 5;
client
.fetchUserLikesAndRecasts(fid, {
viewerFid,
limit,
})
.then((response) => {
const { notifications } = response.result;
console.log("User Reactions : ", notifications);
});
fetchUserReactions
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk/build/api";
const fid = 12345;
const viewerFid = 67890;
const limit = 5;
client
.fetchUserReactions({ fid, type: ReactionsType.All, viewerFid, limit })
.then((response) => {
const { reactions } = response;
console.log("User Reactions : ", reactions);
});
Affected v2 API Methods
- Arguments Format: In SDK v2, all methods now accept arguments as key-value pairs (kvargs). In SDK v1, only optional parameters were passed as key-value pairs, while required arguments were simple parameters.
Users
searchUser
v1
Typescript
const q = "ris";
const viewerFid = 19960;
const limit = 10;
client.searchUser(q, viewerFid, { limit }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const q = "ris";
const viewerFid = 19960;
const limit = 10;
client.searchUser({ q, viewerFid, limit }).then((response) => {
console.log("response:", response);
});
fetchBulkUsers
v1
Typescript
const fids = [2, 3];
const viewerFid = 19960;
client.fetchBulkUsers(fids, { viewerFid }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fids = [2, 3];
const viewerFid = 19960;
client.fetchBulkUsers({ fids, viewerFid }).then((response) => {
console.log("response:", response);
});
fetchBulkUsersByEthereumAddress
v1
Typescript
import { BulkUserAddressTypes } from "@neynar/nodejs-sdk";
const addresses = [\
"0xa6a8736f18f383f1cc2d938576933e5ea7df01a1",\
"0x7cac817861e5c3384753403fb6c0c556c204b1ce",\
];
const addressTypes = [BulkUserAddressTypes.CUSTODY_ADDRESS];
const viewerFid = 3;
client
.fetchBulkUsersByEthereumAddress(addresses, { addressTypes, viewerFid })
.then((response) => {
console.log("response:", response);
});
v2
fetchBulkUsersByEthereumAddressis renamed tofetchBulkUsersByEthOrSolAddress(Ref. Renamed Methods)BulkUserAddressTypesis renamed toBulkUserAddressType(Ref. Renamed enums)- Import path for
BulkUserAddressTypeis changed (Ref. Import path changes) - Enum key changed from
CUSTODY_ADDRESStoCustodyAddress(Ref. Enum Key Changes)
Typescript
import { BulkUserAddressType } from "@neynar/nodejs-sdk/build/api";
const addresses = [\
"0xa6a8736f18f383f1cc2d938576933e5ea7df01a1",\
"0x7cac817861e5c3384753403fb6c0c556c204b1ce",\
];
const addressTypes = [BulkUserAddressType.CustodyAddress];
const viewerFid = 3;
client
.fetchBulkUsersByEthOrSolAddress({ addresses, addressTypes, viewerFid })
.then((response) => {
console.log("response:", response);
});
lookupUserByCustodyAddress
v1
Typescript
const custodyAddress = "0xd1b702203b1b3b641a699997746bd4a12d157909";
client.lookupUserByCustodyAddress(custodyAddress).then((response) => {
console.log("response:", response);
});
v2
Typescript
const custodyAddress = "0xd1b702203b1b3b641a699997746bd4a12d157909";
client.lookupUserByCustodyAddress({ custodyAddress }).then((response) => {
console.log("response:", response);
});
lookupUserByUsernameV2
This method is renamed to lookupUserByUsername.v1
Typescript
const username = "manan";
const viewerFid = 3;
client.lookupUserByUsernameV2(username, { viewerFid }).then((response) => {
console.log("response:", response);
});
v2
lookupUserByUsernameV2 is now renamed to lookupUserByUsername (Ref. Methods Updated to v2 API)
Typescript
const username = "manan";
const viewerFid = 3;
client.lookupUserByUsername({ username, viewerFid }).then((response) => {
console.log("response:", response);
});
fetchUsersByLocation
v1
Typescript
const latitude = 37.7749;
const longitude = -122.4194;
const viewerFid = 3;
const limit = 5;
client
.fetchUsersByLocation(latitude, longitude, { viewerFid, limit })
.then((response) => {
console.log("response:", response);
});
v2
Typescript
const latitude = 37.7749;
const longitude = -122.4194;
const viewerFid = 3;
const limit = 5;
client
.fetchUsersByLocation({ latitude, longitude, viewerFid, limit })
.then((response) => {
console.log("response:", response);
});
fetchPopularCastsByUser
v1
Typescript
const fid = 3;
const viewerFid = 19960;
client.fetchPopularCastsByUser(fid, { viewerFid }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const viewerFid = 19960;
client.fetchPopularCastsByUser({ fid, viewerFid }).then((response) => {
console.log("response:", response);
});
fetchRepliesAndRecastsForUser
v1
Typescript
const fid = 3;
const limit = 25;
const viewerFid = 19960;
client
.fetchRepliesAndRecastsForUser(fid, { limit, viewerFid })
.then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const limit = 25;
const viewerFid = 3;
client
.fetchRepliesAndRecastsForUser({ fid, limit, viewerFid })
.then((response) => {
console.log("response:", response);
});
fetchCastsForUser
v1
Typescript
const fid = 3;
const viewerFid = 3;
const limit = 25;
const includeReplies = false;
client
.fetchCastsForUser(fid, {
limit,
viewerFid,
includeReplies,
})
.then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const viewerFid = 3;
const limit = 25;
const includeReplies = false;
client
.fetchCastsForUser({ fid, viewerFid, limit, includeReplies })
.then((response) => {
console.log("response:", response);
});
followUser
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const targetFids = [3, 2, 1];
client.followUser(signerUuid, targetFids).then((response) => {
console.log("response:", response);
});
v2
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const targetFids = [3, 2, 1];
client.followUser({ signerUuid, targetFids }).then((response) => {
console.log("response:", response);
});
unfollowUser
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const targetFids = [3, 2, 1];
client.unfollowUser(signerUuid, targetFids).then((response) => {
console.log("response:", response);
});
v2
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const targetFids = [3, 2, 1];
client.unfollowUser({ signerUuid, targetFids }).then((response) => {
console.log("response:", response);
});
registerAccount
v1
Typescript
const signature = "signatureString";
const fid = 12345;
const requestedUserCustodyAddress = "0x123...abc";
const deadline = 1672531200;
const fname = "newUsername";
client
.registerAccount(fid, signature, requestedUserCustodyAddress, deadline, {
fname,
})
.then((response) => {
console.log("response:", response);
});
v2
Typescript
client .registerAccount({ signature, fid, requestedUserCustodyAddress, deadline, fname, }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#updateuser) `updateUser`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const bio = "New bio here"; const pfpUrl = "https://example.com/pfp.jpg"; const username = "newUsername"; const displayName = "New Display Name";
client .updateUser(signerUuid, { bio, pfpUrl, username, displayName, }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.updateUser({ signerUuid, bio, pfpUrl, username, displayName })
.then((response) => {
console.log("response:", response);
});
publishVerification
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const address = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f";
const blockHash =
"0x191905a9201170abb55f4c90a4cc968b44c1b71cdf3db2764b775c93e7e22b29";
const ethSignature =
"0x2fc09da1f4dcb723fefb91f77932c249c418c0af00c66ed92ee1f35002c80d6a1145280c9f361d207d28447f8f7463366840d3a9309036cf6954afd1fd331beb1b";
client
.publishVerification(signerUuid, address, blockHash, ethSignature)
.then((response) => {
console.log("response:", response);
});
v2
Typescript
client .publishVerification({ signerUuid, address, blockHash, ethSignature }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deleteverification) `deleteVerification`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const address = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f";
client.deleteVerification(signerUuid, address).then((response) => { console.log("response:", response); });
**v2**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const address = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f";
client.deleteVerification({ signerUuid, address }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchauthorizationurl) `fetchAuthorizationUrl`
**v1**
Typescript
import { AuthorizationUrlResponseType } from "@neynar/nodejs-sdk";
const clientId = "your-client-id"; const responseType = AuthorizationUrlResponseType.Code;
client.fetchAuthorizationUrl(clientId, responseType).then((response) => { console.log("response:", response); });
**v2**
The import path for `AuthorizationUrlResponseType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { AuthorizationUrlResponseType } from "@neynar/nodejs-sdk/build/api";
const clientId = "your-client-id"; const responseType = AuthorizationUrlResponseType.Code;
client.fetchAuthorizationUrl({ clientId, responseType }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#signer) Signer
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#lookupsigner) `lookupSigner`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
client.lookupSigner(signerUuid).then((response) => { console.log("response:", response); });
**v2**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
client.lookupSigner({ signerUuid }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#registersignedkey) `registerSignedKey`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const signature = "0xsig_1";
const appFid = 18949;
const deadline = 1625097600;
const sponsor = {
fid: 0,
signature: 0xsig_2,
};
client .registerSignedKey(signerUuid, appFid, deadline, signature, { sponsor }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.registerSignedKey({ signerUuid, signature, appFid, deadline, sponsor })
.then((response) => {
console.log("response:", response);
});
lookupDeveloperManagedSigner
v1
Typescript
const publicKey =
"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
client.lookupDeveloperManagedSigner(publicKey).then((response) => {
console.log("response:", response);
});
v2
Typescript
const publicKey =
"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
client.lookupDeveloperManagedSigner({ publicKey }).then((response) => {
console.log("response:", response);
});
registerSignedKeyForDeveloperManagedSigner
v1
Typescript
const publicKey =
"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
const signature = "0xsig_1";
const appFid = 12345;
const deadline = 1625097600;
const sponsor = {
fid: 0,
signature: `0xsig_2`,
};
client
.registerSignedKeyForDeveloperManagedSigner(
publicKey,
signature,
appFid,
deadline,
{ sponsor }
)
.then((response) => {
console.log("response:", response);
});
v2
Typescript
client .registerSignedKeyForDeveloperManagedSigner({ publicKey, signature, appFid, deadline, sponsor, }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishmessagetofarcaster) `publishMessageToFarcaster`
**v1**
Typescript
const body = {};
client.publishMessageToFarcaster(body).then((response) => { console.log("response:", response); });
**v2**
Typescript
const body = {};
client.publishMessageToFarcaster({ body }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#cast) Cast
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#lookupcastbyhashorwarpcasturl) `lookUpCastByHashOrWarpcastUrl`
**v1**
Typescript
import { CastParamType } from "@neynar/nodejs-sdk";
const identifier = "https://warpcast.com/rish/0x9288c1"; const type = CastParamType.Url; const viewerFid = 3;
client .lookUpCastByHashOrWarpcastUrl(identifier, type, { viewerFid }) .then((response) => { console.log("response:", response); });
**v2**
1. `lookUpCastByHashOrWarpcastUrl` is renamed to `lookupCastByHashOrWarpcastUrl` (Ref. [Renamed Methods](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-methods))
2. The import path for `CastParamType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { CastParamType } from "@neynar/nodejs-sdk/build/api";
const identifier = "https://warpcast.com/rish/0x9288c1"; const type = CastParamType.Url; const viewerFid = 3;
client .lookupCastByHashOrWarpcastUrl({ identifier, type, viewerFid }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishcast) `publishCast`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const text = "Testing publishCast() method";
const embeds = [
{
url: "https://warpcast.com/harper.eth/0x3c974d78",\
},
];
const replyTo = "0x9e95c380791fce11ffbb14b2ea458b233161bafd";
const idem = "my-cast-idem";
const parent_author_fid = 6131;
client .publishCast(signerUuid, text, { replyTo, idem, embeds, parent_author_fid, }) .then((response) => { console.log("cast:", response); });
**v2**
1. `replyTo` param is now renamed to `parent`
2. `parent_author_fid` is now cam camelCase (`parentAuthorFid`)
3. sdk v1 `response` object is sdk v2 `response.cast` object
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const text = "Testing publishCast() method";
const embeds = [
{
url: "https://warpcast.com/harper.eth/0x3c974d78",\
},
];
const replyTo = "0x9e95c380791fce11ffbb14b2ea458b233161bafd";
const idem = "my-cast-idem";
const parentAuthorFid = 6131;
client .publishCast({ signerUuid, text, embeds, parent: replyTo, idem, parentAuthorFid, }) .then((response) => { console.log("cast:", response.cast); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deletecast) `deleteCast`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const targetHash = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f";
client.deleteCast(signerUuid, targetHash).then((response) => { console.log("response:", response); });
**v2**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const targetHash = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f";
client.deleteCast({ signerUuid, targetHash }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchbulkcasts) `fetchBulkCasts`
**v1**
Typescript
import { BulkCastsSortType } from "@neynar/nodejs-sdk";
const casts = [
"0xa896906a5e397b4fec247c3ee0e9e4d4990b8004",
"0x27ff810f7f718afd8c40be236411f017982e0994",
];
const viewerFid = 3;
const sortType = BulkCastsSortType.LIKES;
client .fetchBulkCasts(casts, { viewerFid, sortType, }) .then((response) => { console.log("response:", response); });
**v2**
1. `BulkCastsSortType` is renamed to `FetchBulkCastsSortTypeEnum` (Ref. [Renamed enums](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-enums))
2. Enum key is changed now `LIKES` is `Likes` (Ref. [Enum Key Changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#enum-key-changes))
Typescript
import { FetchBulkCastsSortTypeEnum } from "@neynar/nodejs-sdk";
const casts = [
"0xa896906a5e397b4fec247c3ee0e9e4d4990b8004",
"0x27ff810f7f718afd8c40be236411f017982e0994",
];
const viewerFid = 3;
const sortType = FetchBulkCastsSortTypeEnum.LIKES;
client.fetchBulkCasts({ casts, viewerFid, sortType }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#searchcasts) `searchCasts`
**v1**
Typescript
const q = "We are releasing a v2 of our nodejs sdk."; const authorFid = 19960; const viewerFid = 3; const limit = 3;
client.searchCasts(q, { authorFid, viewerFid, limit }).then((response) => { console.log("response:", response); });
**v2**
Typescript
const q = "We are releasing a v2 of our nodejs sdk."; const authorFid = 19960; const viewerFid = 3; const limit = 3;
client.searchCasts({ q, authorFid, viewerFid, limit }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#lookupcastconversation) `lookupCastConversation`
**v1**
Typescript
import { CastParamType } from "@neynar/nodejs-sdk";
const identifier = "https://warpcast.com/rish/0x9288c1"; const type = CastParamType.Url; const replyDepth = 2; const includeChronologicalParentCasts = true; const viewerFid = 3; const fold = "above"; const limit = 2;
client .lookupCastConversation( "https://warpcast.com/rish/0x9288c1", CastParamType.Url, { replyDepth, includeChronologicalParentCasts, fold, viewerFid, limit, } ) .then((response) => { console.log("response:", response); });
**v2**
The import path for `CastParamType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { CastParamType } from "@neynar/nodejs-sdk/build/api";
client .lookupCastConversation({ identifier, type, replyDepth, includeChronologicalParentCasts, viewerFid, fold, limit, }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchcomposeractions) `fetchComposerActions`
**v1**
Typescript
import { CastComposerType } from "@neynar/nodejs-sdk/neynar-api/v2";
const list = CastComposerType.Top; const limit = 25;
client.fetchComposerActions(list, { limit }).then((response) => { console.log("response:", response); });
**v2**
The import path for `CastComposerType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { CastComposerType } from "@neynar/nodejs-sdk/build/api";
const list = CastComposerType.Top; const limit = 25;
client.fetchComposerActions({ list, limit }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#feed) Feed
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchuserfollowingfeed) `fetchUserFollowingFeed`
**v1**
Typescript
const fid = 3; const viewerFid = 100; const withRecasts = true; const limit = 30;
client .fetchUserFollowingFeed(fid, { withRecasts, limit, viewerFid, }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
const fid = 3; const viewerFid = 100; const withRecasts = true; const limit = 30;
client .fetchUserFollowingFeed({ fid, viewerFid, withRecasts, limit }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchfeedforyou) `fetchFeedForYou`
**v1**
Typescript
import { ForYouProvider } from "@neynar/nodejs-sdk/neynar-api/v2";
const fid = 3; const viewerFid = 10; const provider = ForYouProvider.Mbd; const limit = 20; const providerMetadata = encodeURIComponent( JSON.stringify({ filters: { channels: ["https://farcaster.group/founders"], }, }) );
client .fetchFeedForYou(fid, { limit, viewerFid, provider, providerMetadata: providerMetadata, }) .then((response) => { console.log("response:", response); });
**v2**
The import path for `ForYouProvider` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { ForYouProvider } from "@neynar/nodejs-sdk/build/api";
client .fetchFeedForYou({ fid, viewerFid, provider, limit, providerMetadata }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchfeedbychannelids) `fetchFeedByChannelIds`
**v1**
Typescript
const channelIds = ["neynar", "farcaster"]; const withRecasts = true; const viewerFid = 100; const withReplies = true; const limit = 30; const shouldModerate = false;
client .fetchFeedByChannelIds(channelIds, { withRecasts, withReplies, limit, viewerFid, shouldModerate, }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.fetchFeedByChannelIds({
channelIds,
withRecasts,
viewerFid,
withReplies,
limit,
shouldModerate,
})
.then((response) => {
console.log("response:", response);
});
fetchFeedByParentUrls
v1
Typescript
const parentUrls = [\
"chain://eip155:1/erc721:0xd4498134211baad5846ce70ce04e7c4da78931cc",\
];
const withRecasts = true;
const viewerFid = 100;
const withReplies = true;
const limit = 30;
client
.fetchFeedByParentUrls(parentUrls, {
withRecasts,
withReplies,
limit,
viewerFid,
})
.then((response) => {
console.log("response:", response);
});
v2
Typescript
client .fetchFeedByParentUrls({ parentUrls, withRecasts, viewerFid, withReplies, limit, }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchfeed) `fetchFeed`
**v1**
Typescript
import { FeedType } from "@neynar/nodejs-sdk/neynar-api/v2";
const feedType = FeedType.Following; const fid = 3; const withRecasts = true; const limit = 50; const viewerFid = 100;
client .fetchFeed(feedType, { fid, limit, withRecasts, viewerFid }) .then((response) => { console.log("response:", response); });
**v2**
The import path for `FeedType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { FeedType } from "@neynar/nodejs-sdk/build/api";
const feedType = FeedType.Following; const fid = 3; const withRecasts = true; const limit = 50; const viewerFid = 100;
client .fetchFeed({ feedType, fid, withRecasts, limit, viewerFid }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchframesonlyfeed) `fetchFramesOnlyFeed`
**v1**
Typescript
const limit = 30; const viewerFid = 3;
client.fetchFramesOnlyFeed({ limit, viewerFid }).then((response) => { console.log("response:", response); });
**v2**
Typescript
const limit = 30; const viewerFid = 3;
client.fetchFramesOnlyFeed({ limit, viewerFid }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchtrendingfeed) `fetchTrendingFeed`
**v1**
Typescript
import { TrendingFeedTimeWindow } from "@neynar/nodejs-sdk";
const limit = 10; const viewerFid = 3; const timeWindow = TrendingFeedTimeWindow.SIX_HOUR; const channelId = "farcaster"; const provider = "mbd"; const providerMetadata = encodeURIComponent( JSON.stringify({ filters: { channels: ["https://farcaster.group/founders"], }, }) );
client .fetchTrendingFeed({ limit, timeWindow, channelId, viewerFid, provider, providerMetadata, }) .then((response) => { console.log("response:", response); });
**v2**
1. `TrendingFeedTimeWindow` is renamed to `FetchTrendingFeedTimeWindowEnum` (Ref. [Renamed enums](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-enums))
2. The import path is for `FetchTrendingFeedTimeWindowEnum` changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
3. Enum Keys have changed `SIX_HOUR` to `_6h` (Ref. [Enum Key Changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#enum-key-changes))
Typescript
import { FetchTrendingFeedTimeWindowEnum } from "@neynar/nodejs-sdk/build/api";
const limit = 10; const viewerFid = 3; const timeWindow = FetchTrendingFeedTimeWindowEnum._6h; const channelId = "farcaster"; const provider = "mbd"; const providerMetadata = encodeURIComponent( JSON.stringify({ filters: { channels: ["https://farcaster.group/founders"], }, }) );
client .fetchTrendingFeed({ limit, viewerFid, timeWindow, channelId, provider, providerMetadata, }) .then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#reaction) Reaction
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishreactiontocast) `publishReactionToCast`
**v1**
Typescript
import { ReactionType } from "@neynar/nodejs-sdk";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const reactionType = ReactionType.Like; const target = "0x1ea99cbed57e4020314ba3fadd7c692d2de34d5f"; const idem = "my-reaction-idem";
client .publishReactionToCast(signerUuid, reactionType, target, { idem }) .then((response) => { console.log("response:", response); });
**v2**
1. `publishReactionToCast` is renamed to `publishReaction` (Ref. [Renamed Methods](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-methods))
2. The import path for `ReactionType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { ReactionType } from "@neynar/nodejs-sdk/build/api";
client .publishReaction({ signerUuid, reactionType, target, idem }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deletereactionfromcast) `deleteReactionFromCast`
**v1**
Typescript
import { ReactionType } from "@neynar/nodejs-sdk";
client .deleteReactionFromCast(signerUuid, reactionType, target, { idem }) .then((response) => { console.log("response:", response); });
**v2**
1. `deleteReactionFromCast` is renamed to `deleteReaction` (Ref. [Renamed Methods](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-methods))
2. The import path for `ReactionType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { ReactionType } from "@neynar/nodejs-sdk/build/api";
client .deleteReaction({ signerUuid, reactionType, target, idem }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchuserreactions) `fetchUserReactions`
**v1**
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk";
const fid = 3; const type = ReactionsType.All; const viewerFid = 19960; const limit = 50;
client .fetchUserReactions(fid, type, { limit, viewerFid, }) .then((response) => { console.log("response:", response); });
**v2**
The import path for `ReactionsType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk/build/api";
const fid = 3; const type = ReactionsType.All; const viewerFid = 19960; const limit = 50;
client.fetchUserReactions({ fid, type, viewerFid, limit }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchreactionsforcast) `fetchReactionsForCast`
**v1**
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk";
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be"; const types = ReactionsType.All; const viewerFid = 3; const limit = 50;
client .fetchReactionsForCast(hash, types, { limit, viewerFid, }) .then((response) => { console.log("response:", response); });
**v2**
1. `fetchReactionsForCast` is now renamed to `fetchCastReactions` (Ref. [Renamed Methods](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#renamed-methods))
2. The import path for `ReactionsType` is changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { ReactionsType } from "@neynar/nodejs-sdk/build/api";
const hash = "0xfe90f9de682273e05b201629ad2338bdcd89b6be"; const types = ReactionsType.All; const viewerFid = 3; const limit = 50;
client .fetchCastReactions({ hash, types, viewerFid, limit }) .then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#notifications) Notifications
Notifications include likes, mentions, replies, and quotes of a user’s casts.
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchallnotifications) `fetchAllNotifications`
**v1**
Typescript
import { NotificationType } from "@neynar/nodejs-sdk";
const fid = 3; const type = NotificationType.LIKES; const priorityMode = false;
client .fetchAllNotifications(fid, { type, priorityMode, }) .then((response) => { console.log("response:", response); });
**v2**
1. `isPriority` is removed.
2. The import path is for `NotificationType` changed. (Ref. [Import path changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
3. Enum Keys have changed `LIKES` to `Likes` (Ref. [Enum Key Changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#enum-key-changes))
4. Supports notification types: Likes, Mentions, Replies, and Quotes
Typescript
import { NotificationType } from "@neynar/nodejs-sdk/build/api";
const fid = 3; const type = NotificationType.Likes; const priorityMode = false;
client.fetchAllNotifications({ fid, type, priorityMode }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchchannelnotificationsforuser) `fetchChannelNotificationsForUser`
**v1**
Typescript
const fid = 3; const channelIds = ["neynar", "farcaster"]; const priorityMode = false;
client .fetchChannelNotificationsForUser(fid, channelIds, { priorityMode, }) .then((response) => { console.log("response:", response); });
**v2**
`isPriority` is removed.
Typescript
const fid = 3; const channelIds = ["neynar", "farcaster"]; const priorityMode = false;
client .fetchChannelNotificationsForUser({ fid, channelIds, priorityMode }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchnotificationsbyparenturlforuser) `fetchNotificationsByParentUrlForUser`
**v1**
Typescript
const fid = 3;
const parentUrls = [
"chain://eip155:1/erc721:0xd4498134211baad5846ce70ce04e7c4da78931cc",
"chain://eip155:1/erc721:0xfd8427165df67df6d7fd689ae67c8ebf56d9ca61",
];
const priorityMode = false;
client .fetchNotificationsByParentUrlForUser(fid, parentUrls, { priorityMode }) .then((response) => { console.log("response:", response); });
**v2**
`isPriority` is removed.
Typescript
client
.fetchNotificationsByParentUrlForUser({ fid, parentUrls, priorityMode })
.then((response) => {
console.log("response:", response);
});
markNotificationsAsSeen
v1
Typescript
import { NotificationType } from "@neynar/nodejs-sdk";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const type = NotificationType.FOLLOWS;
client.markNotificationsAsSeen(signerUuid, { type }).then((response) => {
console.log("response:", response);
});
v2
- The import path for
NotificationTypeis changed. (Ref. Import path changes) - Enum Keys have changed
FOLLOWStoFollows(Ref. Enum Key changes) - Supported notification types include Follows, Likes, Mentions, Replies, and Quotes
Typescript
import { NotificationType } from "@neynar/nodejs-sdk/build/api";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const type = NotificationType.Follows;
client.markNotificationsAsSeen({ signerUuid, type }).then((response) => {
console.log("response:", response);
});
Channel
searchChannels
v1
Typescript
const q = ux;
const limit = 5;
client.searchChannels("ux", { limit }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const q = ux;
const limit = 5;
client.searchChannels({ q, limit }).then((response) => {
console.log("response:", response);
});
fetchBulkChannels
v1
Typescript
import { ChannelType } from "@neynar/nodejs-sdk";
const ids = ["neynar", "farcaster"];
const type = ChannelType.Id;
const viewerFid = 3;
client.fetchBulkChannels(ids, { viewerFid, type }).then((response) => {
console.log("response:", response);
});
v2
The import path for ChannelType is changed. (Ref. Import path changes)
Typescript
const ids = ["neynar", "farcaster"];
const type = ChannelType.Id;
const viewerFid = 3;
client.fetchBulkChannels({ ids, type, viewerFid }).then((response) => {
console.log("response:", response);
});
lookupChannel
v1
Typescript
import { ChannelType } from "@neynar/nodejs-sdk";
const id = "neynar";
const type = ChannelType.Id;
const viewerFid = 3;
client.lookupChannel("neynar", { viewerFid, type }).then((response) => {
console.log("response:", response);
});
v2
Typescript
import { ChannelType } from "@neynar/nodejs-sdk/build/api";
const id = "neynar";
const type = ChannelType.Id;
const viewerFid = 3;
client.lookupChannel({ id, type, viewerFid }).then((response) => {
console.log("response:", response);
});
removeChannelMember
v1
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/neynar-api/v2";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const fid = 3;
const role = ChannelMemberRole.Member;
client
.removeChannelMember(signerUuid, channelId, fid, role)
.then((response) => {
console.log("response:", response);
});
v2
The import path for ChannelMemberRole is changed. (Ref. Import path changes)
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/build/api";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const fid = 3;
const role = "member";
client
.removeChannelMember({ signerUuid, channelId, fid, role })
.then((response) => {
console.log("response:", response);
});
fetchChannelMembers
v1
Typescript
const channelId = "neynar";
const fid = 194;
const limit = 10;
client.fetchChannelMembers(channelId, { limit, fid }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const channelId = "neynar";
const fid = 194;
const limit = 10;
client.fetchChannelMembers({ channelId, fid, limit }).then((response) => {
console.log("response:", response);
});
inviteChannelMember
v1
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/neynar-api/v2";
const signnerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const fid = 3;
const role = ChannelMemberRole.Member;
client
.inviteChannelMember(signnerUuid, channelId, fid, role)
.then((response) => {
console.log("response:", response);
});
v2
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/build/api";
const signnerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const fid = 3;
const role = ChannelMemberRole.Member;
client
.inviteChannelMember({ signerUuid, channelId, fid, role })
.then((response) => {
console.log("response:", response);
});
respondChannelInvite
v1
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/neynar-api/v2";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const role = ChannelMemberRole.Member;
const accept = true;
client
.respondChannelInvite(signerUuid, channelId, role, accept)
.then((response) => {
console.log("response:", response);
});
v2
Typescript
import { ChannelMemberRole } from "@neynar/nodejs-sdk/build/api";
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
const role = ChannelMemberRole.Member;
const accept = true;
client
.respondChannelInvite({ signerUuid, channelId, role, accept })
.then((response) => {
console.log("response:", response);
});
fetchFollowersForAChannel
v1
Typescript
const id = "founders";
const viewerFid = 3;
const limit = 50;
client.fetchFollowersForAChannel(id, { limit, viewerFid }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const id = "founders";
const viewerFid = 3;
const limit = 50;
client.fetchFollowersForAChannel({ id, viewerFid, limit }).then((response) => {
console.log("response:", response);
});
fetchRelevantFollowersForAChannel
v1
Typescript
const id = "why";
const viewerFid = 3;
client.fetchRelevantFollowersForAChannel(id, viewerFid).then((response) => {
console.log("response:", response);
});
v2
Typescript
const id = "why";
const viewerFid = 3;
client.fetchRelevantFollowersForAChannel({ id, viewerFid }).then((response) => {
console.log("response:", response);
});
fetchUserChannels
v1
Typescript
const fid = 3;
const limit = 5;
client.fetchUserChannels(fid, { limit }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const limit = 5;
client.fetchUserChannels({ fid, limit }).then((response) => {
console.log("response:", response);
});
fetchUserChannelMemberships
v1
Typescript
const fid = 3;
const limit = 10;
client.fetchUserChannelMemberships(fid, { limit }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const limit = 10;
client.fetchUserChannelMemberships({ fid, limit }).then((response) => {
console.log("response:", response);
});
followChannel
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
client.followChannel(signerUuid, channelId).then((response) => {
console.log("response:", response);
});
v2
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
client.followChannel({ signerUuid, channelId }).then((response) => {
console.log("response:", response);
});
unfollowChannel
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
client.unfollowChannel(signerUuid, channelId).then((response) => {
console.log("response:", response);
});
v2
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const channelId = "neynar";
client.unfollowChannel({ signerUuid, channelId }).then((response) => {
console.log("response:", response);
});
fetchTrendingChannels
v1
Typescript
import { TimeWindow } from "@neynar/nodejs-sdk";
const timeWindow = TimeWindow.SEVEN_DAYS;
const limit = 20;
client.fetchTrendingChannels(timeWindow, { limit }).then((response) => {
console.log("response:", response);
});
v2
TimeWindowis renamed toFetchTrendingChannelsTimeWindowEnum(Ref. Renamed enums)FetchTrendingChannelsTimeWindowEnumimport is changed (Ref. Import Path Changes)- Enums key is changed from
SEVEN_DAYSto_7d(Ref. Enum Key Changes)
Typescript
import { FetchTrendingChannelsTimeWindowEnum } from "@neynar/nodejs-sdk/build/api";
const timeWindow = FetchTrendingChannelsTimeWindowEnum._7d;
const limit = 20;
client.fetchTrendingChannels({ timeWindow, limit }).then((response) => {
console.log("response:", response);
});
fetchUsersActiveChannels
v1
Typescript
const fid = 3;
const limit = 10;
client.fetchUsersActiveChannels(fid, { limit }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const limit = 10;
client.fetchUsersActiveChannels({ fid, limit }).then((response) => {
console.log("response:", response);
});
Follows
fetchUserFollowersV2
v1
Typescript
import { FollowSortType } from "@neynar/nodejs-sdk";
const fid = 3;
const viewerFid = 23;
const sortType = FollowSortType.DescChron;
const limit = 10;
client
.fetchUserFollowersV2(fid, { limit, viewerFid, sortType })
.then((response) => {
console.log("response:", response);
});
v2
fetchUserFollowersV2is now renamed tofetchUserFollowers(Ref. Methods Updated to v2 API)FollowSortTypeimport is changed (Ref. Import Path Changes)
Typescript
import { FollowSortType } from "@neynar/nodejs-sdk/build/api";
const fid = 3;
const viewerFid = 23;
const sortType = FollowSortType.DescChron;
const limit = 10;
client
.fetchUserFollowers({ fid, viewerFid, sortType, limit })
.then((response) => {
console.log("response:", response);
});
fetchRelevantFollowers
v1
Typescript
const targetFid = 3;
const viewerFid = 19960;
client.fetchRelevantFollowers(targetFid, viewerFid).then((response) => {
console.log("response:", response);
});
v2
Typescript
const targetFid = 3;
const viewerFid = 19960;
client.fetchRelevantFollowers({ targetFid, viewerFid }).then((response) => {
console.log("response:", response);
});
fetchUserFollowingV2
v1
Typescript
import { FollowSortType } from "@neynar/nodejs-sdk";
const fid = 3;
const viewerFid = 23;
const sortType = FollowSortType.DescChron;
const limit = 10;
client
.fetchUserFollowingV2(fid, { limit, viewerFid, sortType })
.then((response) => {
console.log("response:", response);
});
v2
fetchUserFollowingV2is now renamed tofetchUserFollowing(Ref. Methods Updated to v2 API)FollowSortTypeimport is changed (Ref. Import Path Changes)
Typescript
import { FollowSortType } from "@neynar/nodejs-sdk/build/api";
const fid = 3;
const viewerFid = 23;
const sortType = FollowSortType.DescChron;
const limit = 10;
client
.fetchUserFollowing({ fid, viewerFid, sortType, limit })
.then((response) => {
console.log("response:", response);
});
fetchFollowSuggestions
v1
Typescript
const fid = 3;
const viewerFid = 19950;
const limit = 5;
client.fetchFollowSuggestions(fid, { limit, viewerFid }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const viewerFid = 19950;
const limit = 5;
client.fetchFollowSuggestions({ fid, viewerFid, limit }).then((response) => {
console.log("response:", response);
});
Storage
lookupUserStorageAllocations
v1
Typescript
const fid = 3;
client.lookupUserStorageAllocations(fid).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
client.lookupUserStorageAllocations({ fid }).then((response) => {
console.log("response:", response);
});
lookupUserStorageUsage
v1
Typescript
const fid = 3;
client.lookupUserStorageUsage(3).then((response) => {
console.log("User Storage Usage:", response);
});
v2
Typescript
const fid = 3;
client.lookupUserStorageUsage({ fid }).then((response) => {
console.log("response:", response);
});
buyStorage
v1
Typescript
const fid = 3;
const units = 1;
const idem = "some_random_unique_key";
client.buyStorage(fid, { units, idem }).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fid = 3;
const units = 1;
const idem = "some_random_unique_key";
client.buyStorage({ fid, units, idem }).then((response) => {
console.log("response:", response);
});
Frame
postFrameAction
v1
Typescript
const signerUuid = "signerUuid";
const castHash = "castHash";
const action = {
button: {
title: "Button Title",
index: 1,
},
frames_url: "frames Url",
post_url: "Post Url",
};
client.postFrameAction(signerUuid, castHash, action).then((response) => {
console.log("response:", response);
});
v2
Typescript
client.postFrameAction({ signerUuid, castHash, action }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#validateframeaction) `validateFrameAction`
**v1**
Typescript
const messageBytesInHex = "messageBytesInHex"; const castReactionContext = false; const followContext = true; const signerContext = true; const channelFollowContext = true;
client .validateFrameAction(messageBytesInHex, { castReactionContext, followContext, signerContext, channelFollowContext, }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.validateFrameAction({
messageBytesInHex,
castReactionContext,
followContext,
signerContext,
channelFollowContext,
})
.then((response) => {
console.log("response:", response);
});
fetchValidateFrameAnalytics
v1
Typescript
import {
ValidateFrameAnalyticsType,
ValidateFrameAggregateWindow,
} from "@neynar/nodejs-sdk";
const frameUrl = "https://shorturl.at/bDRY9";
const analyticsType = ValidateFrameAnalyticsType.InteractionsPerCast;
const start = "2024-04-06T06:44:56.811Z";
const stop = "2024-04-08T06:44:56.811Z";
const aggregateWindow = ValidateFrameAggregateWindow.TWELVE_HOURS;
client
.fetchValidateFrameAnalytics(frameUrl, analyticsType, start, stop, {
aggregateWindow,
})
.then((response) => {
console.log("response:", response);
});
v2
- Import for
ValidateFrameAnalyticsTypeandValidateFrameAggregateWindowis changed (Ref. Import Path Changes) - Enums key is changed from
TWELVE_HOURSto_12h(Ref. Enum Key Changes)
Typescript
import {
ValidateFrameAnalyticsType,
ValidateFrameAggregateWindow,
} from "@neynar/nodejs-sdk/build/api";
const frameUrl = "https://shorturl.at/bDRY9";
const analyticsType = ValidateFrameAnalyticsType.InteractionsPerCast;
const start = "2024-04-06T06:44:56.811Z";
const stop = "2024-04-08T06:44:56.811Z";
const aggregateWindow = ValidateFrameAggregateWindow._12h;
client
.fetchValidateFrameAnalytics({
frameUrl,
analyticsType,
start,
stop,
aggregateWindow,
})
.then((response) => {
console.log("response:", response);
});
lookupNeynarFrame
v1
Typescript
import { FrameType } from "@neynar/nodejs-sdk";
const type = FrameType.Uuid;
const uuid = "your-frame-uuid";
client.lookupNeynarFrame(uuid, { type }).then((response) => {
console.log("response:", response);
});
v2
Import for FrameType is changed (Ref. Import Path Changes)
Typescript
import { FrameType } from "@neynar/nodejs-sdk/build/api";
const type = FrameType.Uuid;
const uuid = "your-frame-uuid";
client.lookupNeynarFrame({ type, uuid }).then((response) => {
console.log("response:", response);
});
deleteNeynarFrame
v1
Typescript
const uuid = "your-frame-uuid";
client.deleteNeynarFrame(uuid).then((response) => {
console.log("response:", response);
});
v2
Typescript
const uuid = "your-frame-uuid";
client.deleteNeynarFrame({ uuid }).then((response) => {
console.log("response:", response);
});
fetchFrameMetaTagsFromUrl
v1
Typescript
const url = "https://frames.neynar.com/f/862277df/ff7be6a4";
client.fetchFrameMetaTagsFromUrl(url).then((response) => {
console.log("response:", response);
});
v2
Typescript
const url = "https://frames.neynar.com/f/862277df/ff7be6a4";
client.fetchFrameMetaTagsFromUrl({ url }).then((response) => {
console.log("response:", response);
});
postFrameActionDeveloperManaged
v1
Typescript
const action = // Example action
const signature_packet = // Example signature packet
const castHash = "castHash";
client
.postFrameDeveloperManagedAction(action, signature_packet, {
castHash: castHash,
})
.then((response) => {
console.log("response:", response);
});
v2
Typescript
const action = // Example action
const signature_packet = // Example signature packet
const castHash = "castHash";
client.postFrameActionDeveloperManaged({castHash, action, signaturePacket}).then(response => {
console.log('response:', response);
});
fname
isFnameAvailable
v1
Typescript
const fname = "shreyas-chorge";
client.isFnameAvailable(fname).then((response) => {
console.log("response:", response);
});
v2
Typescript
const fname = "shreyas-chorge";
client.isFnameAvailable({ fname }).then((response) => {
console.log("response:", response);
});
Webhook
lookupWebhook
v1
Typescript
const webhookId = "yourWebhookId";
client.lookupWebhook(webhookId).then((response) => {
console.log("response:", response);
});
v2
Typescript
const webhookId = "yourWebhookId";
client.lookupWebhook({ webhookId }).then((response) => {
console.log("response:", response);
});
publishWebhook
v1
Typescript
const name = "Cast created Webhook";
const url = "https://example.com/webhook";
const subscription = {
"cast.created": {
author_fids: [3, 196, 194],
mentioned_fids: [196],
},
"user.created": {},
};
client.publishWebhook(name, url, { subscription }).then((response) => {
console.log("response:", response);
});
v2
Typescript
client.publishWebhook({ name, url, subscription }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#updatewebhookactivestatus) `updateWebhookActiveStatus`
**v1**
typescript
const webhookId = "yourWebhookId"; const active = false;
client.updateWebhookActiveStatus(webhookId, active).then((response) => { console.log("response:", response); });
**v2**
Typescript
const webhookId = "yourWebhookId"; const active = false;
client.updateWebhookActiveStatus({ webhookId, active }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#updatewebhook) `updateWebhook`
**v1**
Typescript
const webhookId = "existingWebhookId"; const name = "UpdatedWebhookName"; const url = "https://example.com/new-webhook-url"; const subscription = { "cast.created": { author_fids: [2, 4, 6], mentioned_fids: [194], }, "user.created": {}, };
client .updateWebhook(webhookId, name, url, { subscription }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.updateWebhook({ name, url, subscription, webhookId })
.then((response) => {
console.log("response:", response);
});
deleteWebhook
v1
Typescript
const webhookId = "yourWebhookId";
client.deleteWebhook(webhookId).then((response) => {
console.log("response:", response);
});
v2
Typescript
const webhookId = "yourWebhookId";
client.deleteWebhook({ webhookId }).then((response) => {
console.log("response:", response);
});
Action
publishFarcasterAction
v1
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec";
const baseUrl = "https://appb.example.com";
const action = {
type: "sendMessage",
payload: {
message: "Hello from App A!",
},
};
client.publishFarcasterAction(signerUuid, baseUrl, action).then((response) => {
console.log("response:", response);
});
v2
Typescript
client .publishFarcasterAction({ signerUuid, baseUrl, action }) .then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#mute) Mute
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchmutelist) `fetchMuteList`
**v1**
Typescript
const fid = 3; const limit = 10;
client.fetchMuteList(fid, { limit }).then((response) => { console.log("response:", response); });
**v2**
Typescript
const fid = 3; const limit = 10;
client.fetchMuteList({ fid, limit }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishmute) `publishMute`
**v1**
Typescript
const fid = 3; const mutedFid = 19960;
client.publishMute(fid, mutedFid).then((response) => { console.log("response:", response); });
**v2**
Typescript
const fid = 3; const mutedFid = 19960;
client.publishMute({ fid, mutedFid }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deletemute) `deleteMute`
**v1**
Typescript
const fid = 3; const mutedFid = 19960;
client.deleteMute(fid, mutedFid).then((response) => { console.log("Mute Response:", response); });
**v2**
Typescript
const fid = 3; const mutedFid = 19960;
client.deleteMute({ fid, mutedFid }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#block) Block
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishblock) `publishBlock`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const blockedFid = 19960;
client.publishBlock(signerUuid, blockedFid).then((response) => { console.log("response:", response); });
**v2**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const blockedFid = 19960;
client.publishBlock({ signerUuid, blockedFid }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deleteblock) `deleteBlock`
**v1**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const blockedFid = 19960;
client.deleteBlock(signerUuid, blockedFid).then((response) => { console.log("response:", response); });
**v2**
Typescript
const signerUuid = "19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"; const blockedFid = 19960;
client.deleteBlock({ signerUuid, blockedFid }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#ban) Ban
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#publishbans) `publishBans`
**v1**
Typescript
const fids = [3, 19960];
client.publishBan(fids).then((response) => { console.log("response:", response); });
**v2**
Typescript
const fids = [3, 19960];
client.publishBans({ fids }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#deletebans) `deleteBans`
**v1**
Typescript
const fids = [3, 19960];
client.deleteBans(fids).then((response) => { console.log("response:", response); });
**v2**
Typescript
const fids = [3, 19960];
client.deleteBans({ fids }).then((response) => { console.log("response:", response); });
### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#onchain) Onchain
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchuserbalance) `fetchUserBalance`
**v1**
Typescript
const fid = 3; const networks = Networks.Base;
client.fetchUserBalance(fid, networks).then((response) => { console.log("response:", response); });
**v2**
Typescript
const fid = 3; const networks = Networks.Base;
client.fetchUserBalance({ fid, networks }).then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchsubscriptionsforfid) `fetchSubscriptionsForFid`
**v1**
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp;
client.fetchSubscriptionsForFid(fid, subscriptionProvider).then((response) => { console.log("response:", response); });
**v2**
Import for `SubscriptionProvider` is changed (Ref. [Import Path Changes](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide#import-path-changes))
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk/build/api";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp;
client .fetchSubscriptionsForFid({ fid, subscriptionProvider }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchsubscribedtoforfid) `fetchSubscribedToForFid`
**v1**
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp; const viewerFid = 1231;
client .fetchSubscribedToForFid(fid, subscriptionProvider, { viewerFid }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk/build/api";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp; const viewerFid = 1231;
client .fetchSubscribedToForFid({ fid, subscriptionProvider, viewerFid }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchsubscribersforfid) `fetchSubscribersForFid`
**v1**
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp; const viewerFid = 1231;
client .fetchSubscribedToForFid(fid, subscriptionProvider, { viewerFid }) .then((response) => { console.log("response:", response); });
**v2**
Typescript
import { SubscriptionProvider } from "@neynar/nodejs-sdk/build/api";
const fid = 3; const subscriptionProvider = SubscriptionProvider.FabricStp; const viewerFid = 1231;
client .fetchSubscribersForFid({ fid, subscriptionProvider, viewerFid }) .then((response) => { console.log("response:", response); });
#### [](https://docs.neynar.com/reference/neynar-nodejs-sdk-v1-to-v2-migration-guide\#fetchsubscriptioncheck) `fetchSubscriptionCheck`
**v1**
Typescript
const addresses = [
"0xedd3783e8c7c52b80cfbd026a63c207edc9cbee7",
"0x5a927ac639636e534b678e81768ca19e2c6280b7",
];
const contractAddress = "0x76ad4cb9ac51c09f4d9c2cadcea75c9fa9074e5b";
const chainId = "8453";
client .fetchSubscriptionCheck(addresses, contractAddress, chainId) .then((response) => { console.log("response:", response); });
**v2**
Typescript
client
.fetchSubscriptionCheck({ addresses, contractAddress, chainId })
.then((response) => {
console.log("response:", response);
});
This guide should assist in updating your existing code to SDK v2. If you encounter any issues or have further questions, please reach out to us. Warpcast Slack
Related topics
Using Github Copilot Domain Migration
Was this page helpful?
YesNo
Ctrl+I