- chore: remove explicit ContentType from internal POST request builders
- Remove the redundant
ContentType = "application/json"property from - internal request configuration objects across multiple clients. The HTTP
- client already sets this header by default when a body is present, so
- the explicit assignment was unnecessary.
- Key changes:
- Remove
ContentType = "application/json"fromAssistantsClientPOST request - Remove
ContentType = "application/json"fromEvalClientPOST request - Remove
ContentType = "application/json"fromInsightClientPOST requests (two endpoints) - Remove
ContentType = "application/json"fromObservabilityScorecardClientPOST request - Remove
ContentType = "application/json"fromPhoneNumbersClientPOST request - Remove
ContentType = "application/json"fromSquadsClient,StructuredOutputsClient, andToolsClientPOST requests - 🌿 Generated with Fern
Call.SubscriptionLimits— new optional property that exposes the org's subscription and concurrency limit information at the time of the call.
- fix: improve RFC 3986 compliant percent-encoding for query strings and path segments
- Update
QueryStringBuilderto properly distinguish between three encoding - contexts — query keys, query values, and path segments — per RFC 3986.
- Previously, only unreserved characters (A-Z, a-z, 0-9,
-,_,.,~) - were left unencoded, causing over-encoding of characters that are safe in
- query strings and path segments (e.g.,
@,:,?,=in values, etc.). - Path parameter strings in
ValueConvert.ToPathParameterStringnow use the - new
EncodePathSegmentmethod instead of plain string passthrough, ensuring - path segments are correctly encoded per RFC 3986 pchar rules.
- Key changes:
- Add
EncodePathSegment()public method onQueryStringBuilderfor RFC 3986 pchar-safe encoding - Introduce
EncodingContextenum (QueryKey,QueryValue,Path) to differentiate encoding rules - Query values now allow
=,:,@,/,?, and sub-delimiters (except&,+,#) unencoded - Query keys allow the same set minus
=; path segments allow unreserved + sub-delims +:+@ ValueConvert.ToPathParameterString(string)now encodes path segments viaEncodePathSegment- Expand test coverage with new cases for path segment encoding, OData-style keys, and
+/=handling - 🌿 Generated with Fern
- The
CallControllerFindAllPaginatedRequestrequest class and the associatedCallControllerFindAllPaginatedRequestSortOrderenum have been removed from the SDK. If your code references either of these types, you will need to update it accordingly. Please refer to the latest API documentation for the replacement request model. - The following public types have been removed:
GenerateStructuredOutputSuggestionsDto,UpdateSupabaseCredentialDto, and theCreateVoicemailToolDtoTypeenum. Additionally,AnalyticsClient.GetAsyncnow returnsWithRawResponseTask<IEnumerable<AnalyticsQueryResult>>instead ofTask<IEnumerable<AnalyticsQueryResult>>; callers must update to await.Dataor use the.WithRawResponse()accessor. TheAnalyticsClientnow implementsIAnalyticsClient. - The
AssistantsClientmethods (ListAsync,CreateAsync,GetAsync,DeleteAsync,UpdateAsync) now returnWithRawResponseTask<T>instead ofTask<T>. Callers must update their code to await the result and access the data via.Data, or use.RawResponseto inspect the underlying HTTP response metadata (status code, URL, headers). - A new
AssistantSpeechStartedvalue has been added to theUpdateAssistantDtoClientMessagesItemenum. - All
CallsClientmethods (ListAsync,CreateAsync,GetAsync,DeleteAsync,UpdateAsync) now returnWithRawResponseTask<T>instead ofTask<T>, providing access to raw HTTP response metadata (status code, headers, URL) alongside deserialized data. Migration: Await the returnedWithRawResponseTask<T>and access.Datafor the previously returned value, or use the implicit awaiter to getTdirectly. TheCallControllerFindAllPaginatedAsyncmethod has been removed fromCallsClient. A newAssistantSpeechStartedvalue is available on theUpdateAssistantDtoServerMessagesItemenum. - All
CampaignsClientmethods now returnWithRawResponseTask<T>instead ofTask<T>, giving consumers access to the raw HTTP response (status code, URL, and headers) in addition to the deserialized data. Callers that simplyawaitthese methods will continue to work, but any code that stores or passes theTask<T>return value directly will need to be updated to useWithRawResponseTask<T>. CreateCampaignDto.PhoneNumberIdis now nullable (string?, previouslyrequired string) andCustomersis nowIEnumerable<CreateCustomerDto>?(previously a non-nullable collection with a default value). New optionalSquadIdandDialPlanproperties are available on bothCreateCampaignDtoandUpdateCampaignDtoto support squad-based and multi-number dial-plan campaigns.- All
ChatsClientasync methods (ListAsync,CreateAsync,GetAsync,DeleteAsync,CreateResponseAsync) now returnWithRawResponseTask<T>instead ofTask<T>, providing access to raw HTTP response metadata (status code, URL, and headers) via the.RawResponseproperty alongside the deserialized.Data. Existing callers must be updated toawaitthe task and access.Datafor the result.ListChatsRequestalso gains two new optional filter properties:IdandAssistantIdAny. - The SDK now supports improved JSON serialization for
Optional<T>and nullable fields, and HTTP retries now respectRetry-AfterandX-RateLimit-Resetresponse headers with jitter-based backoff.VapiClientApiExceptionnow accepts an optionalinnerExceptionparameter for better error chaining. - All
EvalClientasync methods now returnWithRawResponseTask<T>instead ofTask<T>, giving consumers access to both the deserialized response (.Data) and the raw HTTP response (.RawResponse, including status code, URL, and headers). Existing code that directly awaits these methods asTask<T>must be updated to use.Result(orawaitvia theWithRawResponseTask<T>API) to retrieve the deserialized value. Additionally,EvalClientnow implements theIEvalClientinterface. - The
ListAsync,CreateAsync,GetAsync,DeleteAsync, andUpdateAsyncmethods onFilesClientnow returnWithRawResponseTask<T>instead ofTask<T>. Callers can stillawaitthe result directly to get the deserialized data, but any code that stores or passes the return value as aTask<T>must be updated to useWithRawResponseTask<T>(or call.AsTask()if available). These methods also now expose the raw HTTP response — status code, URL, and headers — via the.RawResponseproperty on the awaited result. - All
InsightClientmethods now returnWithRawResponseTask<T>instead ofTask<T>, allowing consumers to access the raw HTTP response (status code, headers, and request URL) via the.RawResponseproperty in addition to the deserialized data.InsightClientalso now implements theIInsightClientinterface. Callers that awaited results directly are unaffected; callers that stored results as explicitTask<T>variables will need to update their type declarations toWithRawResponseTask<T>. - All
ObservabilityScorecardClientasync methods (ScorecardControllerGetAsync,ScorecardControllerRemoveAsync,ScorecardControllerUpdateAsync,ScorecardControllerGetPaginatedAsync, andScorecardControllerCreateAsync) now returnWithRawResponseTask<T>instead ofTask<T>. Callers can await the result directly to get the deserialized data, or access.RawResponsefor HTTP status code, URL, and headers. Update any code that assigns or passes the return value as aTask<T>to useWithRawResponseTask<T>(or simplyawaitthe call). Additionally, deserialization failures now throwVapiClientApiExceptioninstead ofVapiClientException. - The
PhoneNumbersClientmethods (ListAsync,CreateAsync,GetAsync,DeleteAsync,UpdateAsync, andPhoneNumberControllerFindAllPaginatedAsync) now returnWithRawResponseTask<T>instead ofTask<T>, giving callers access to the raw HTTP response (status code, headers, and URL) alongside the deserialized result. Callers must update their code to await.Resultor use.Datato access the deserialized payload. Additionally, deserialization failures now throwVapiClientApiExceptioninstead ofVapiClientException. - All
ProviderResourcesClientmethods now returnWithRawResponseTask<T>instead ofTask<T>, providing access to the raw HTTP response (status code, headers, URL) alongside the deserialized result. Callers must update theirawaitusage — use.Resultorawaitthe inner task to retrieve the typed data (e.g.,var result = await client.ProviderResourceControllerGetProviderResourceAsync(...); var data = result.Data;). A newCartesiaprovider value has also been added to the relevant request enums. - The SDK now supports Cartesia as a provider option in all provider-resource request enums (
Get,GetPaginated, andUpdate).CreateSessionDtogains two new optional properties —AssistantOverridesandCustomerId— for richer session creation.ListSessionsRequestalso gains several new optional filter fields:Id,AssistantIdAny,CustomerNumberAny,PhoneNumberId, andPhoneNumberIdAny. - All
SessionsClientmethods (ListAsync,CreateAsync,GetAsync,DeleteAsync,UpdateAsync) now returnWithRawResponseTask<T>instead ofTask<T>. Callers can await the result directly as before, but must update any code that assigns the return value toTask<T>. The raw HTTP response (status code, URL, and headers) is now accessible via the.RawResponseproperty on the awaited result. Additionally,ListSessionsRequestgains new optional filter fields:Id,AssistantIdAny,CustomerNumberAny,PhoneNumberId, andPhoneNumberIdAny. - The
ListAsync,CreateAsync,GetAsync,DeleteAsync, andUpdateAsyncmethods onSquadsClientnow returnWithRawResponseTask<T>instead ofTask<T>. Callers must update theirawaitexpressions and can now access.RawResponsefor HTTP status codes, headers, and the request URL. Additionally,UpdateStructuredOutputDtogains two new optional properties —TypeandRegex— to support regex-based structured output extraction. - All methods on
StructuredOutputsClientnow returnWithRawResponseTask<T>instead ofTask<T>, giving callers access to HTTP status codes, response headers, and the raw request URL alongside deserialized response data. TheStructuredOutputControllerSuggestAsyncmethod has been removed. Callers of anyStructuredOutputsClientmethod must update their code to handle the new return type, and any calls toStructuredOutputControllerSuggestAsyncmust be removed. - The
AdditionalPropertiesproperty on all SDK model types has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that wrote to or castAdditionalPropertiesas a mutable dictionary must be updated to use the new read-only accessor. - All
ToolsClientmethods (ListAsync,CreateAsync,GetAsync,DeleteAsync,UpdateAsync) now returnWithRawResponseTask<T>instead ofTask<T>. Callers canawaitthe result directly to obtain the data as before, or access.WithRawResponseto inspect the raw HTTP status code, URL, and headers. - New optional fields
CachedPromptTokensand related cached-token breakdown fields have been added toAnalysisCostandAnalysisCostBreakdown. - The
AdditionalPropertiesproperty on all SDK record types (e.g.AnalyticsQuery,AnthropicCredential,AnthropicModel, etc.) has changed its type fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that previously assigned to or mutated this dictionary will no longer compile. If you only read fromAdditionalProperties, no changes are required. - Three new Anthropic Claude model enum values are now available on
AnthropicModelModel:ClaudeOpus4520251101,ClaudeOpus46, andClaudeSonnet46. A newAnalyticsOperationColumnvalueCostBreakdownLlmCachedPromptTokenshas also been added. - The
AdditionalPropertiesproperty on all SDK record types has changed fromIDictionary<string, JsonElement>(publicly writable) toReadOnlyAdditionalProperties(read-only wrapper populated after deserialization). Any code that directly assigned or mutatedAdditionalPropertieswill need to be updated — the property is now read-only and managed automatically by the deserializer. - Several new optional properties have also been added across types, including
ApiRequestTool.EncryptedPaths,ApiRequestTool.Parameters,Artifact.AssistantActivations,ArtifactPlan.StructuredOutputs, andAssemblyAiTranscriber.VadAssistedEndpointingEnabled/SpeechModel. A newMultilanguage option is available forAssemblyAiTranscriberLanguage, and a newSessionCreatedHookvariant is available in the assistant hooks union. - The
AdditionalPropertiesproperty on several record types (e.g.AssistantCustomEndpointingRule,AssistantMessage,AssistantOverrides, and others) has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that wrote to or castAdditionalPropertiesas a mutable dictionary will need to be updated to use the new read-only type. Additionally, a newAssistantSpeechStartedvalue has been added toAssistantClientMessagesItem, a new optionalAutoIncludeMessageHistoryproperty has been added toAssistantMessageJudgePlanAi, andSessionCreatedHookis now included in theAssistantOverrides.Hooksunion. - The
AdditionalPropertiesproperty on response record types (e.g.AssistantPaginatedResponse,AssistantUserEditable,AssistantVersionPaginatedResponse,AutoReloadPlan) has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Callers that previously wrote to or iterated overAdditionalPropertiesas a mutable dictionary must update their code to use the new read-only type. - Additionally, the
AssistantSpeechStarted(assistant.speechStarted) value has been added toAssistantClientMessagesItem,AssistantOverridesClientMessagesItem,AssistantServerMessagesItem, andAssistantOverridesServerMessagesItemenums. - The
AdditionalPropertiesproperty on Azure credential and transcriber types (AzureBlobStorageBucketPlan,AzureCredential,AzureOpenAiCredential,AzureSpeechTranscriber) has changed from a mutableIDictionary<string, JsonElement>to a read-onlyReadOnlyAdditionalPropertiestype. Code that writes to or assignsAdditionalPropertiesdirectly will no longer compile — update such code to read from the property only. - Additionally, the
Australiaenum value inAzureCredentialRegionandAzureOpenAiCredentialRegionhas been renamed toAustraliaeast. Update any references from.Australiato.Australiaeast. Several new region values (Centralus,Germanywestcentral,Polandcentral,Spaincentral,Westeurope) and new GPT-5.x model values have been added to the respective enums. - The
AdditionalPropertiesproperty on record types (e.g.AzureVoice,BackgroundSpeechDenoisingPlan,BackoffPlan,BarInsight,BarInsightFromCallTable, and others) has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that wrote to or relied on the mutable dictionary interface must be updated to use the new read-only type. Additionally, theQueriesproperty onBarInsightandBarInsightFromCallTablenow includesJsonQueryOnEventsTableas a new union variant — exhaustive pattern matches on thisOneOftype will require a new case. - The
AdditionalPropertiesproperty on all SDK record types has changed from a mutableIDictionary<string, JsonElement>to a new read-onlyReadOnlyAdditionalPropertiestype — any code that previously wrote to or cast this property will need to be updated. Additionally,BotMessage.SpeakerLabelhas been removed. NewCustomerNumberenum values have been added toBarInsightFromCallTableGroupByandBarInsightGroupBy. - The
AdditionalPropertiesproperty onCall,CallBatchError,CallBatchResponse, andByoSipTrunkCredentialhas changed from a mutableIDictionary<string, JsonElement>to a read-onlyReadOnlyAdditionalPropertiestype — any code that wrote to or cast this property as a mutable dictionary will need to be updated. A newEndedMessageproperty has been added to theCalltype to provide additional context when a call ends. - The
CallEndedReasonenum has been expanded with over 60 new values covering additional provider failures (Wellsaid voice, Baseten LLM, Minimax LLM, Soniox transcriber, ElevenLabs/Google/OpenAI transcribers), new SIP connection error states (CallInProgressErrorSipInboundCallFailedToConnect,CallRingingErrorSipInboundCallFailedToConnect,CallInProgressErrorProviderfaultOutboundSip408RequestTimeout), and a new customer hangup reason (CustomerEndedCallDuringTransfer). The enum serializer has been replaced with a dedicated implementation that ensures deterministic wire-value round-tripping for all members. - The
AdditionalPropertiesproperty onCallHookAssistantSpeechInterrupted,CallHookCallEnding,CallHookCustomerSpeechInterrupted,CallHookCustomerSpeechTimeout,CallHookFilter,CallHookModelResponseTimeout,CallPaginatedResponse, and other record types has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Callers that accessed this property via the dictionary interface must update their code to use the newReadOnlyAdditionalPropertiesAPI. Additionally,CallHookCallEnding.Dohas changed fromIEnumerable<ToolCallHookAction>toIEnumerable<object>. - The
AdditionalPropertiesproperty on several record types (Campaign,CampaignPaginatedResponse,CartesiaCredential,CartesiaExperimentalControls,CartesiaGenerationConfig,CartesiaGenerationConfigExperimental,CartesiaTranscriber) has changed from a mutableIDictionary<string, JsonElement>to a read-onlyReadOnlyAdditionalPropertiestype — code that writes to this dictionary must be updated. Additionally,Campaign.PhoneNumberIdis now nullable (string?instead ofrequired string) andCampaign.Customersis nowIEnumerable<CreateCustomerDto>?instead of a required non-nullable collection. New optional propertiesSquadIdandDialPlanhave been added toCampaignto support squad-based and multi-number dial-plan campaigns. - The
AdditionalPropertiesproperty onCartesiaVoiceandCerebrasCredential(and likely other record types) has changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that wrote to or castAdditionalPropertiesas a mutable dictionary will need to be updated to use the new read-only API. Additionally, three new versioned model values (Sonic320260112,Sonic320251027,Sonic220250611) have been added to theCartesiaVoiceModelenum. - The
AdditionalPropertiesproperty on response record types (e.g.CerebrasModel,Chat,ChatCost,ChatAssistantOverrides, and related types) has changed its type fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that assigned to or called mutating methods onAdditionalPropertiesmust be updated to use the new read-only API. - The
AdditionalPropertiesproperty on all SDK response record types has changed fromIDictionary<string, JsonElement>to the newReadOnlyAdditionalPropertiestype. Code that writes to or castsAdditionalPropertiesas a mutable dictionary will need to be updated to use the read-only API. A newClientMessageAssistantSpeechvariant has also been added to theClientMessage.Messageunion type. - The
AdditionalPropertiesproperty onClientMessageChatCreated,ClientMessageChatDeleted,ClientMessageConversationUpdate,ClientMessageHang,ClientMessageLanguageChangeDetected,ClientMessageMetadata,ClientMessageModelOutput, andClientMessageSessionCreatedhas changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that assigns to or mutatesAdditionalPropertiesdirectly will no longer compile. A new optionalTurnIdproperty has been added toClientMessageModelOutputto identify and group LLM response tokens by turn. - The
AdditionalPropertiesproperty onClientMessageSessionDeleted,ClientMessageSessionUpdated,ClientMessageSpeechUpdate,ClientMessageToolCalls,ClientMessageToolCallsResult, andClientMessageTranscripthas changed fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Callers that previously assigned to or mutated this property must remove those mutations — the property is now populated automatically after deserialization and exposes a read-only interface. Index-based read access (record.AdditionalProperties["key"]) continues to work. - The
AdditionalPropertiesproperty on response record types (e.g.ClientMessageTransferUpdate,ClientMessageUserInterrupted,CloneVoiceDto,CloudflareCredential, and others) has changed fromIDictionary<string, JsonElement>(with aninternal set) toReadOnlyAdditionalProperties(with aprivate set). Code that writes to or castsAdditionalPropertiesas a mutable dictionary must be updated to use the new read-only type. - A new optional
TurnIdproperty has been added toClientMessageUserInterrupted, allowing clients to identify and discard tokens from an interrupted LLM response turn. - The
AdditionalPropertiesproperty on all response model types (e.g.CostBreakdown,Condition,ConversationNode,CreateApiRequestToolDto, and many others) has changed fromIDictionary<string, JsonElement>with aninternal settoReadOnlyAdditionalPropertieswith aprivate set. Consumers who previously read, assigned, or mutatedAdditionalPropertiesdirectly must update their code to use the new read-only accessor. - Two new optional properties have also been added:
CostBreakdown.LlmCachedPromptTokensfor LLM cached prompt token tracking, andCreateApiRequestToolDto.EncryptedPaths/CreateApiRequestToolDto.Parametersfor encrypted path and static parameter support on API request tools. - The
AdditionalPropertiesproperty on DTO records such asCreateAssistantDtoandCreateAzureCredentialDtohas changed type fromIDictionary<string, JsonElement>(publicly settable) toReadOnlyAdditionalProperties(read-only). Consumers that read from or write toAdditionalPropertiesas a dictionary must update their code to use the newReadOnlyAdditionalPropertiesAPI. - Additionally, the
Australiaenum member inCreateAzureCredentialDtoRegionhas been renamed toAustraliaeast; any code referencingCreateAzureCredentialDtoRegion.Australiamust be updated toAustraliaeast. - New capabilities added include:
AssistantSpeechStartedinCreateAssistantDtoClientMessagesItemandCreateAssistantDtoServerMessagesItem,SessionCreatedHookin theCreateAssistantDto.Hooksunion, and several new Azure regions (Centralus,Germanywestcentral,Polandcentral,Spaincentral,Westeurope). - The
AdditionalPropertiesproperty on several DTO types (includingCreateAzureOpenAiCredentialDto,CreateBarInsightFromCallTableDto,CreateBashToolDto,CreateByoPhoneNumberDto,CreateByoSipTrunkCredentialDto, and others) has changed its type fromIDictionary<string, JsonElement>toReadOnlyAdditionalProperties. Code that writes to or castsAdditionalPropertiesas a mutable dictionary will need to be updated. - Additionally, the
Australiaenum value inCreateAzureOpenAiCredentialDtoRegionhas been renamed toAustraliaeast; any switch statements or direct references toCreateAzureOpenAiCredentialDtoRegion.Australiamust be updated toAustraliaeast. - The
AdditionalPropertiesproperty on DTO types has changed fromIDictionary<string, JsonElement>(with aninternalsetter) toReadOnlyAdditionalProperties(with aprivatesetter). Any code that assigned to, cast, or mutatedAdditionalPropertiesdirectly will need to be updated to use the new read-only API. - Two new optional properties have also been added:
CreateCustomCredentialDto.EncryptionPlanfor specifying an encryption plan, andCreateDtmfToolDto.SipInfoDtmfEnabledfor enabling DTMF tones via SIP INFO messages. - The
AdditionalPropertiesproperty on all DTO types (e.g.CreateFunctionToolDto,CreateGcpCredentialDto,CreateGhlToolDto, and many others) has changed from a mutableIDictionary<string, JsonElement>to a newReadOnlyAdditionalPropertiestype. Code that previously wrote to or mutatedAdditionalPropertieswill no longer compile. Read access is still available via theReadOnlyAdditionalPropertiesAPI. CreateFunctionToolDtoalso gains two new optional properties:VariableExtractionPlanandParameters.