Parameter Names

Use x-fern-parameter-name to customize SDK parameter names for gRPC message fields

By default, Fern uses the field names from your Protocol Buffer message definitions as SDK parameter names. You can customize these using the x-fern-parameter-name extension.

Customize field names

Use x-fern-parameter-name to specify custom parameter names for message fields:

user_service.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message CreateUserRequest {
6 string email_address = 1 [(x_fern_parameter_name) = "email"];
7 string full_name = 2 [(x_fern_parameter_name) = "name"];
8 int32 age_in_years = 3 [(x_fern_parameter_name) = "age"];
9 string phone_number = 4 [(x_fern_parameter_name) = "phone"];
10 UserPreferences user_preferences = 5 [(x_fern_parameter_name) = "preferences"];
11}
12
13message User {
14 string user_id = 1 [(x_fern_parameter_name) = "id"];
15 string email_address = 2 [(x_fern_parameter_name) = "email"];
16 string full_name = 3 [(x_fern_parameter_name) = "name"];
17 google.protobuf.Timestamp created_timestamp = 4 [(x_fern_parameter_name) = "createdAt"];
18 google.protobuf.Timestamp updated_timestamp = 5 [(x_fern_parameter_name) = "updatedAt"];
19}

This generates SDK methods with cleaner parameter names:

1// Instead of email_address, full_name, age_in_years, phone_number, user_preferences
2await client.users.create({
3 email: "john@example.com",
4 name: "John Doe",
5 age: 30,
6 phone: "+1-555-0123",
7 preferences: { theme: "dark" }
8});

Language-specific parameter names

You can specify different parameter names for different programming languages:

language_specific.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message SearchUsersRequest {
6 string search_query = 1 [
7 (x_fern_parameter_name_python) = "search_query",
8 (x_fern_parameter_name_typescript) = "searchQuery",
9 (x_fern_parameter_name_go) = "SearchQuery",
10 (x_fern_parameter_name_java) = "searchQuery",
11 (x_fern_parameter_name_csharp) = "SearchQuery"
12 ];
13
14 int32 page_size = 2 [
15 (x_fern_parameter_name_python) = "page_size",
16 (x_fern_parameter_name_typescript) = "pageSize",
17 (x_fern_parameter_name_go) = "PageSize",
18 (x_fern_parameter_name_java) = "pageSize",
19 (x_fern_parameter_name_csharp) = "PageSize"
20 ];
21
22 string page_token = 3 [
23 (x_fern_parameter_name_python) = "page_token",
24 (x_fern_parameter_name_typescript) = "pageToken",
25 (x_fern_parameter_name_go) = "PageToken",
26 (x_fern_parameter_name_java) = "pageToken",
27 (x_fern_parameter_name_csharp) = "PageToken"
28 ];
29}

Nested message naming

Customize parameter names for nested message fields:

nested_messages.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message CreateUserRequest {
6 UserProfile user_profile = 1 [(x_fern_parameter_name) = "profile"];
7 ContactInfo contact_info = 2 [(x_fern_parameter_name) = "contact"];
8 AccountSettings account_settings = 3 [(x_fern_parameter_name) = "settings"];
9}
10
11message UserProfile {
12 string first_name = 1 [(x_fern_parameter_name) = "firstName"];
13 string last_name = 2 [(x_fern_parameter_name) = "lastName"];
14 string display_name = 3 [(x_fern_parameter_name) = "displayName"];
15 string bio_text = 4 [(x_fern_parameter_name) = "bio"];
16 string avatar_url = 5 [(x_fern_parameter_name) = "avatarUrl"];
17}
18
19message ContactInfo {
20 string email_address = 1 [(x_fern_parameter_name) = "email"];
21 string phone_number = 2 [(x_fern_parameter_name) = "phone"];
22 Address mailing_address = 3 [(x_fern_parameter_name) = "address"];
23}
24
25message Address {
26 string street_address = 1 [(x_fern_parameter_name) = "street"];
27 string city_name = 2 [(x_fern_parameter_name) = "city"];
28 string state_province = 3 [(x_fern_parameter_name) = "state"];
29 string postal_code = 4 [(x_fern_parameter_name) = "zipCode"];
30 string country_code = 5 [(x_fern_parameter_name) = "country"];
31}

Repeated field naming

Handle repeated fields with custom naming:

repeated_fields.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message User {
6 string user_id = 1 [(x_fern_parameter_name) = "id"];
7 repeated string role_names = 2 [(x_fern_parameter_name) = "roles"];
8 repeated string permission_codes = 3 [(x_fern_parameter_name) = "permissions"];
9 repeated SocialAccount social_accounts = 4 [(x_fern_parameter_name) = "socialAccounts"];
10 repeated string tag_list = 5 [(x_fern_parameter_name) = "tags"];
11}
12
13message SocialAccount {
14 string platform_name = 1 [(x_fern_parameter_name) = "platform"];
15 string account_handle = 2 [(x_fern_parameter_name) = "handle"];
16 string profile_url = 3 [(x_fern_parameter_name) = "url"];
17 bool is_verified = 4 [(x_fern_parameter_name) = "verified"];
18}
19
20message BatchCreateUsersRequest {
21 repeated CreateUserRequest user_requests = 1 [(x_fern_parameter_name) = "users"];
22 bool send_welcome_email = 2 [(x_fern_parameter_name) = "sendWelcomeEmail"];
23 bool skip_validation = 3 [(x_fern_parameter_name) = "skipValidation"];
24}

Map field naming

Customize names for map fields:

map_fields.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message UserPreferences {
6 map<string, string> notification_settings = 1 [(x_fern_parameter_name) = "notifications"];
7 map<string, bool> feature_flags = 2 [(x_fern_parameter_name) = "features"];
8 map<string, int32> display_settings = 3 [(x_fern_parameter_name) = "display"];
9 map<string, UserTheme> theme_overrides = 4 [(x_fern_parameter_name) = "themes"];
10}
11
12message MetricsData {
13 map<string, double> performance_metrics = 1 [(x_fern_parameter_name) = "performance"];
14 map<string, int64> usage_counters = 2 [(x_fern_parameter_name) = "usage"];
15 map<string, google.protobuf.Timestamp> event_timestamps = 3 [(x_fern_parameter_name) = "events"];
16}

Optional and required field naming

Customize names for optional and required fields:

optional_fields.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message UpdateUserRequest {
6 // Required fields
7 string user_id = 1 [(x_fern_parameter_name) = "id"];
8
9 // Optional fields with custom names
10 optional string email_address = 2 [(x_fern_parameter_name) = "email"];
11 optional string full_name = 3 [(x_fern_parameter_name) = "name"];
12 optional int32 age_in_years = 4 [(x_fern_parameter_name) = "age"];
13 optional string profile_picture_url = 5 [(x_fern_parameter_name) = "avatarUrl"];
14
15 // Field mask for partial updates
16 google.protobuf.FieldMask update_mask = 6 [(x_fern_parameter_name) = "updateMask"];
17}

Oneof field naming

Handle oneof fields with meaningful names:

oneof_fields.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message SearchRequest {
6 oneof search_criteria {
7 string search_by_email = 1 [(x_fern_parameter_name) = "email"];
8 string search_by_username = 2 [(x_fern_parameter_name) = "username"];
9 string search_by_phone = 3 [(x_fern_parameter_name) = "phone"];
10 UserIdSearch search_by_id = 4 [(x_fern_parameter_name) = "id"];
11 }
12
13 SearchOptions search_options = 5 [(x_fern_parameter_name) = "options"];
14}
15
16message UserIdSearch {
17 string user_id = 1 [(x_fern_parameter_name) = "id"];
18 bool include_deleted = 2 [(x_fern_parameter_name) = "includeDeleted"];
19}
20
21message NotificationRequest {
22 oneof notification_target {
23 string target_user_id = 1 [(x_fern_parameter_name) = "userId"];
24 string target_group_id = 2 [(x_fern_parameter_name) = "groupId"];
25 BroadcastTarget target_broadcast = 3 [(x_fern_parameter_name) = "broadcast"];
26 }
27
28 string message_content = 4 [(x_fern_parameter_name) = "message"];
29 NotificationPriority priority_level = 5 [(x_fern_parameter_name) = "priority"];
30}

Timestamp and duration naming

Customize names for time-related fields:

time_fields.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message UserSession {
6 string session_id = 1 [(x_fern_parameter_name) = "id"];
7 string user_id = 2 [(x_fern_parameter_name) = "userId"];
8 google.protobuf.Timestamp created_timestamp = 3 [(x_fern_parameter_name) = "createdAt"];
9 google.protobuf.Timestamp last_accessed_timestamp = 4 [(x_fern_parameter_name) = "lastAccessedAt"];
10 google.protobuf.Timestamp expires_timestamp = 5 [(x_fern_parameter_name) = "expiresAt"];
11 google.protobuf.Duration session_duration = 6 [(x_fern_parameter_name) = "duration"];
12 google.protobuf.Duration idle_timeout = 7 [(x_fern_parameter_name) = "idleTimeout"];
13}
14
15message ScheduledTask {
16 string task_id = 1 [(x_fern_parameter_name) = "id"];
17 google.protobuf.Timestamp scheduled_time = 2 [(x_fern_parameter_name) = "scheduledAt"];
18 google.protobuf.Duration execution_timeout = 3 [(x_fern_parameter_name) = "timeout"];
19 google.protobuf.Duration retry_delay = 4 [(x_fern_parameter_name) = "retryDelay"];
20}

Complex nested naming

Handle complex nested structures:

complex_nested.proto
1syntax = "proto3";
2
3package userservice.v1;
4
5message CreateOrderRequest {
6 OrderDetails order_details = 1 [(x_fern_parameter_name) = "order"];
7 PaymentInfo payment_info = 2 [(x_fern_parameter_name) = "payment"];
8 ShippingInfo shipping_info = 3 [(x_fern_parameter_name) = "shipping"];
9}
10
11message OrderDetails {
12 repeated OrderItem order_items = 1 [(x_fern_parameter_name) = "items"];
13 string promo_code = 2 [(x_fern_parameter_name) = "promoCode"];
14 string special_instructions = 3 [(x_fern_parameter_name) = "instructions"];
15}
16
17message OrderItem {
18 string product_id = 1 [(x_fern_parameter_name) = "productId"];
19 int32 quantity_ordered = 2 [(x_fern_parameter_name) = "quantity"];
20 double unit_price = 3 [(x_fern_parameter_name) = "price"];
21 repeated string product_options = 4 [(x_fern_parameter_name) = "options"];
22}
23
24message PaymentInfo {
25 oneof payment_method {
26 CreditCardInfo credit_card_info = 1 [(x_fern_parameter_name) = "creditCard"];
27 PayPalInfo paypal_info = 2 [(x_fern_parameter_name) = "paypal"];
28 BankTransferInfo bank_transfer_info = 3 [(x_fern_parameter_name) = "bankTransfer"];
29 }
30
31 BillingAddress billing_address = 4 [(x_fern_parameter_name) = "billingAddress"];
32}

Using custom parameter names ensures consistent naming conventions across your SDK while maintaining compatibility with your existing Protocol Buffer schemas.