SDK Method Names

Use x-fern-sdk-method-name to customize SDK method names for gRPC methods

By default, Fern generates SDK method names based on your gRPC service and method names. You can override this behavior using the x-fern-sdk-method-name extension.

Customize method names

Use x-fern-sdk-method-name to specify custom method names for your gRPC methods:

user_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 // Customize the SDK method name
7 rpc GetUserById(GetUserByIdRequest) returns (User) {
8 option (x_fern_sdk_method_name) = "getUser";
9 }
10
11 // Another customized method name
12 rpc CreateNewUser(CreateNewUserRequest) returns (User) {
13 option (x_fern_sdk_method_name) = "create";
14 }
15
16 // Remove redundant service name from method
17 rpc UpdateUserProfile(UpdateUserProfileRequest) returns (User) {
18 option (x_fern_sdk_method_name) = "updateProfile";
19 }
20}

This will generate SDK methods like:

1// Instead of client.userService.getUserById()
2const user = await client.userService.getUser({ id: "user_123" });
3
4// Instead of client.userService.createNewUser()
5const newUser = await client.userService.create({ userData: {...} });
6
7// Instead of client.userService.updateUserProfile()
8const updatedUser = await client.userService.updateProfile({ profileData: {...} });

Method naming conventions

Follow these conventions when naming SDK methods:

CRUD operations

Use standard CRUD naming for common operations:

crud_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 rpc CreateUser(CreateUserRequest) returns (User) {
7 option (x_fern_sdk_method_name) = "create";
8 }
9
10 rpc GetUser(GetUserRequest) returns (User) {
11 option (x_fern_sdk_method_name) = "get";
12 }
13
14 rpc UpdateUser(UpdateUserRequest) returns (User) {
15 option (x_fern_sdk_method_name) = "update";
16 }
17
18 rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty) {
19 option (x_fern_sdk_method_name) = "delete";
20 }
21
22 rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) {
23 option (x_fern_sdk_method_name) = "list";
24 }
25}

Search and query operations

Use descriptive names for search operations:

search_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 rpc SearchUsers(SearchUsersRequest) returns (SearchUsersResponse) {
7 option (x_fern_sdk_method_name) = "search";
8 }
9
10 rpc FindUserByEmail(FindUserByEmailRequest) returns (User) {
11 option (x_fern_sdk_method_name) = "findByEmail";
12 }
13
14 rpc QueryUsersByRole(QueryUsersByRoleRequest) returns (QueryUsersResponse) {
15 option (x_fern_sdk_method_name) = "queryByRole";
16 }
17}

Action operations

Use action-oriented names for business operations:

action_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 rpc ActivateUserAccount(ActivateUserAccountRequest) returns (User) {
7 option (x_fern_sdk_method_name) = "activate";
8 }
9
10 rpc DeactivateUserAccount(DeactivateUserAccountRequest) returns (User) {
11 option (x_fern_sdk_method_name) = "deactivate";
12 }
13
14 rpc ResetUserPassword(ResetUserPasswordRequest) returns (ResetPasswordResponse) {
15 option (x_fern_sdk_method_name) = "resetPassword";
16 }
17
18 rpc SendVerificationEmail(SendVerificationEmailRequest) returns (google.protobuf.Empty) {
19 option (x_fern_sdk_method_name) = "sendVerification";
20 }
21}

Language-specific method names

You can specify different method names for different programming languages:

language_specific.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 rpc GetUserPreferences(GetUserPreferencesRequest) returns (UserPreferences) {
7 option (x_fern_sdk_method_name_python) = "get_preferences";
8 option (x_fern_sdk_method_name_typescript) = "getPreferences";
9 option (x_fern_sdk_method_name_go) = "GetPreferences";
10 option (x_fern_sdk_method_name_java) = "getPreferences";
11 option (x_fern_sdk_method_name_csharp) = "GetPreferences";
12 }
13
14 rpc UpdateUserPreferences(UpdateUserPreferencesRequest) returns (UserPreferences) {
15 option (x_fern_sdk_method_name_python) = "update_preferences";
16 option (x_fern_sdk_method_name_typescript) = "updatePreferences";
17 option (x_fern_sdk_method_name_go) = "UpdatePreferences";
18 option (x_fern_sdk_method_name_java) = "updatePreferences";
19 option (x_fern_sdk_method_name_csharp) = "UpdatePreferences";
20 }
21}

Streaming method names

For streaming methods, use appropriate naming:

streaming_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserStreamingService {
6 // Server streaming
7 rpc StreamUserEvents(StreamUserEventsRequest) returns (stream UserEvent) {
8 option (x_fern_sdk_method_name) = "streamEvents";
9 }
10
11 // Client streaming
12 rpc UploadUserData(stream UploadUserDataRequest) returns (UploadUserDataResponse) {
13 option (x_fern_sdk_method_name) = "upload";
14 }
15
16 // Bidirectional streaming
17 rpc ChatWithUser(stream ChatMessage) returns (stream ChatMessage) {
18 option (x_fern_sdk_method_name) = "chat";
19 }
20
21 // Real-time notifications
22 rpc SubscribeToNotifications(SubscribeRequest) returns (stream Notification) {
23 option (x_fern_sdk_method_name) = "subscribe";
24 }
25}

Service-level naming

Customize the service name for better SDK organization:

service_naming.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserManagementService {
6 option (x_fern_sdk_service_name) = "users";
7
8 rpc CreateUser(CreateUserRequest) returns (User) {
9 option (x_fern_sdk_method_name) = "create";
10 }
11
12 rpc GetUser(GetUserRequest) returns (User) {
13 option (x_fern_sdk_method_name) = "get";
14 }
15}
16
17service AuthenticationService {
18 option (x_fern_sdk_service_name) = "auth";
19
20 rpc LoginUser(LoginUserRequest) returns (LoginResponse) {
21 option (x_fern_sdk_method_name) = "login";
22 }
23
24 rpc LogoutUser(LogoutUserRequest) returns (google.protobuf.Empty) {
25 option (x_fern_sdk_method_name) = "logout";
26 }
27}

This generates cleaner SDK interfaces:

1// Instead of client.userManagementService.createUser()
2await client.users.create({ userData: {...} });
3
4// Instead of client.authenticationService.loginUser()
5await client.auth.login({ credentials: {...} });

Handling method overloading

For services with similar methods, use descriptive names to avoid conflicts:

overloaded_methods.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 // Get user by ID
7 rpc GetUser(GetUserRequest) returns (User) {
8 option (x_fern_sdk_method_name) = "get";
9 }
10
11 // Get user by email
12 rpc GetUserByEmail(GetUserByEmailRequest) returns (User) {
13 option (x_fern_sdk_method_name) = "getByEmail";
14 }
15
16 // Get user by username
17 rpc GetUserByUsername(GetUserByUsernameRequest) returns (User) {
18 option (x_fern_sdk_method_name) = "getByUsername";
19 }
20
21 // Get multiple users
22 rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {
23 option (x_fern_sdk_method_name) = "getMany";
24 }
25}

Async method naming

For long-running operations, consider async naming:

async_methods.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 // Quick operation
7 rpc GetUser(GetUserRequest) returns (User) {
8 option (x_fern_sdk_method_name) = "get";
9 }
10
11 // Long-running operation
12 rpc GenerateUserReport(GenerateUserReportRequest) returns (Operation) {
13 option (x_fern_sdk_method_name) = "generateReportAsync";
14 }
15
16 // Batch operation
17 rpc BatchUpdateUsers(BatchUpdateUsersRequest) returns (Operation) {
18 option (x_fern_sdk_method_name) = "batchUpdateAsync";
19 }
20}

Use consistent naming for related operations:

grouped_methods.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5service UserService {
6 // Profile operations
7 rpc GetUserProfile(GetUserProfileRequest) returns (UserProfile) {
8 option (x_fern_sdk_method_name) = "getProfile";
9 }
10
11 rpc UpdateUserProfile(UpdateUserProfileRequest) returns (UserProfile) {
12 option (x_fern_sdk_method_name) = "updateProfile";
13 }
14
15 rpc DeleteUserProfile(DeleteUserProfileRequest) returns (google.protobuf.Empty) {
16 option (x_fern_sdk_method_name) = "deleteProfile";
17 }
18
19 // Settings operations
20 rpc GetUserSettings(GetUserSettingsRequest) returns (UserSettings) {
21 option (x_fern_sdk_method_name) = "getSettings";
22 }
23
24 rpc UpdateUserSettings(UpdateUserSettingsRequest) returns (UserSettings) {
25 option (x_fern_sdk_method_name) = "updateSettings";
26 }
27}

This ensures method names follow the conventions of each target language while maintaining clear and intuitive APIs for developers.