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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 13 message 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 2 await 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 11 message 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 19 message 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 25 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 13 message 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 20 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 12 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 16 message UserIdSearch { 17 string user_id = 1 [(x_fern_parameter_name) = "id"]; 18 bool include_deleted = 2 [(x_fern_parameter_name) = "includeDeleted"]; 19 } 20 21 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 15 message 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:
1 syntax = "proto3"; 2 3 package userservice.v1; 4 5 message 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 11 message 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 17 message 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 24 message 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.