Loading...
Loading...
Manage call recordings, media storage, Dialogflow integration, and external connections for SIP trunking. This skill provides JavaScript SDK examples.
npx skill4agent add team-telnyx/skills telnyx-sip-integrations-javascriptnpm install telnyximport Telnyx from 'telnyx';
const client = new Telnyx({
apiKey: process.env['TELNYX_API_KEY'], // This is the default and can be omitted
});clienttry {
const result = await client.messages.send({ to: '+13125550001', from: '+13125550002', text: 'Hello' });
} catch (err) {
if (err instanceof Telnyx.APIConnectionError) {
console.error('Network error — check connectivity and retry');
} else if (err instanceof Telnyx.RateLimitError) {
// 429: rate limited — wait and retry with exponential backoff
const retryAfter = err.headers?.['retry-after'] || 1;
await new Promise(r => setTimeout(r, retryAfter * 1000));
} else if (err instanceof Telnyx.APIError) {
console.error(`API error ${err.status}: ${err.message}`);
if (err.status === 422) {
console.error('Validation error — check required fields and formats');
}
}
}401403404422429for await (const item of result) { ... }GET /custom_storage_credentials/{connection_id}const customStorageCredential = await client.customStorageCredentials.retrieve('connection_id');
console.log(customStorageCredential.connection_id);backendconfigurationPOST /custom_storage_credentials/{connection_id}const customStorageCredential = await client.customStorageCredentials.create('connection_id', {
backend: 'gcs',
configuration: { backend: 'gcs' },
});
console.log(customStorageCredential.connection_id);backendconfigurationPUT /custom_storage_credentials/{connection_id}const customStorageCredential = await client.customStorageCredentials.update('connection_id', {
backend: 'gcs',
configuration: { backend: 'gcs' },
});
console.log(customStorageCredential.connection_id);backendconfigurationDELETE /custom_storage_credentials/{connection_id}await client.customStorageCredentials.delete('connection_id');GET /dialogflow_connections/{connection_id}const dialogflowConnection = await client.dialogflowConnections.retrieve('connection_id');
console.log(dialogflowConnection.data);connection_idconversation_profile_idenvironmentrecord_typeservice_accountPOST /dialogflow_connections/{connection_id}const dialogflowConnection = await client.dialogflowConnections.create('connection_id', {
service_account: {
type: 'bar',
project_id: 'bar',
private_key_id: 'bar',
private_key: 'bar',
client_email: 'bar',
client_id: 'bar',
auth_uri: 'bar',
token_uri: 'bar',
auth_provider_x509_cert_url: 'bar',
client_x509_cert_url: 'bar',
},
});
console.log(dialogflowConnection.data);connection_idconversation_profile_idenvironmentrecord_typeservice_accountPUT /dialogflow_connections/{connection_id}const dialogflowConnection = await client.dialogflowConnections.update('connection_id', {
service_account: {
type: 'bar',
project_id: 'bar',
private_key_id: 'bar',
private_key: 'bar',
client_email: 'bar',
client_id: 'bar',
auth_uri: 'bar',
token_uri: 'bar',
auth_provider_x509_cert_url: 'bar',
client_x509_cert_url: 'bar',
},
});
console.log(dialogflowConnection.data);connection_idconversation_profile_idenvironmentrecord_typeservice_accountDELETE /dialogflow_connections/{connection_id}await client.dialogflowConnections.delete('connection_id');GET /external_connections// Automatically fetches more pages as needed.
for await (const externalConnection of client.externalConnections.list()) {
console.log(externalConnection.id);
}activecreated_atcredential_activeexternal_sip_connectionidinboundoutboundrecord_typetagsupdated_atwebhook_api_versionwebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secs/phone_numbersPOST /external_connectionsexternal_sip_connectionoutboundactiveinboundtagswebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsconst externalConnection = await client.externalConnections.create({
external_sip_connection: 'zoom',
outbound: {},
});
console.log(externalConnection.data);activecreated_atcredential_activeexternal_sip_connectionidinboundoutboundrecord_typetagsupdated_atwebhook_api_versionwebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsGET /external_connections/log_messages// Automatically fetches more pages as needed.
for await (const logMessageListResponse of client.externalConnections.logMessages.list()) {
console.log(logMessageListResponse.code);
}log_messagesmetaGET /external_connections/log_messages/{id}const logMessage = await client.externalConnections.logMessages.retrieve('1293384261075731499');
console.log(logMessage.log_messages);log_messagesDELETE /external_connections/log_messages/{id}const response = await client.externalConnections.logMessages.dismiss('1293384261075731499');
console.log(response.success);successGET /external_connections/{id}const externalConnection = await client.externalConnections.retrieve('1293384261075731499');
console.log(externalConnection.data);activecreated_atcredential_activeexternal_sip_connectionidinboundoutboundrecord_typetagsupdated_atwebhook_api_versionwebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsPATCH /external_connections/{id}outboundactiveinboundtagswebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsconst externalConnection = await client.externalConnections.update('1293384261075731499', {
outbound: { outbound_voice_profile_id: '1911630617284445511' },
});
console.log(externalConnection.data);activecreated_atcredential_activeexternal_sip_connectionidinboundoutboundrecord_typetagsupdated_atwebhook_api_versionwebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsDELETE /external_connections/{id}const externalConnection = await client.externalConnections.delete('1293384261075731499');
console.log(externalConnection.data);activecreated_atcredential_activeexternal_sip_connectionidinboundoutboundrecord_typetagsupdated_atwebhook_api_versionwebhook_event_failover_urlwebhook_event_urlwebhook_timeout_secsGET /external_connections/{id}/civic_addressesconst civicAddresses = await client.externalConnections.civicAddresses.list('1293384261075731499');
console.log(civicAddresses.data);city_or_towncity_or_town_aliascompany_namecountrycountry_or_districtdefault_location_iddescriptionhouse_numberhouse_number_suffixidlocationspostal_or_zip_coderecord_typestate_or_provincestreet_namestreet_suffixGET /external_connections/{id}/civic_addresses/{address_id}const civicAddress = await client.externalConnections.civicAddresses.retrieve(
'318fb664-d341-44d2-8405-e6bfb9ced6d9',
{ id: '1293384261075731499' },
);
console.log(civicAddress.data);city_or_towncity_or_town_aliascompany_namecountrycountry_or_districtdefault_location_iddescriptionhouse_numberhouse_number_suffixidlocationspostal_or_zip_coderecord_typestate_or_provincestreet_namestreet_suffixPATCH /external_connections/{id}/locations/{location_id}static_emergency_address_idconst response = await client.externalConnections.updateLocation(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
{
id: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
static_emergency_address_id: '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
},
);
console.log(response.data);accepted_address_suggestionslocation_idstatic_emergency_address_idGET /external_connections/{id}/phone_numbers// Automatically fetches more pages as needed.
for await (const externalConnectionPhoneNumber of client.externalConnections.phoneNumbers.list(
'1293384261075731499',
)) {
console.log(externalConnectionPhoneNumber.civic_address_id);
}acquired_capabilitiescivic_address_iddisplayed_country_codelocation_idnumber_idtelephone_numberticket_idGET /external_connections/{id}/phone_numbers/{phone_number_id}const phoneNumber = await client.externalConnections.phoneNumbers.retrieve('1234567889', {
id: '1293384261075731499',
});
console.log(phoneNumber.data);acquired_capabilitiescivic_address_iddisplayed_country_codelocation_idnumber_idtelephone_numberticket_idPATCH /external_connections/{id}/phone_numbers/{phone_number_id}location_idconst phoneNumber = await client.externalConnections.phoneNumbers.update('1234567889', {
id: '1293384261075731499',
});
console.log(phoneNumber.data);acquired_capabilitiescivic_address_iddisplayed_country_codelocation_idnumber_idtelephone_numberticket_idconnection_idGET /external_connections/{id}/releases// Automatically fetches more pages as needed.
for await (const releaseListResponse of client.externalConnections.releases.list(
'1293384261075731499',
)) {
console.log(releaseListResponse.tenant_id);
}created_aterror_messagestatustelephone_numberstenant_idticket_idGET /external_connections/{id}/releases/{release_id}const release = await client.externalConnections.releases.retrieve(
'7b6a6449-b055-45a6-81f6-f6f0dffa4cc6',
{ id: '1293384261075731499' },
);
console.log(release.data);created_aterror_messagestatustelephone_numberstenant_idticket_idGET /external_connections/{id}/uploads// Automatically fetches more pages as needed.
for await (const upload of client.externalConnections.uploads.list('1293384261075731499')) {
console.log(upload.location_id);
}available_usageserror_codeerror_messagelocation_idstatustenant_idticket_idtn_upload_entriesPOST /external_connections/{id}/uploadsnumber_idsadditional_usagescivic_address_idlocation_idusageconst upload = await client.externalConnections.uploads.create('1293384261075731499', {
number_ids: [
'3920457616934164700',
'3920457616934164701',
'3920457616934164702',
'3920457616934164703',
],
});
console.log(upload.ticket_id);successticket_idPOST /external_connections/{id}/uploads/refreshconst response = await client.externalConnections.uploads.refreshStatus('1293384261075731499');
console.log(response.success);successGET /external_connections/{id}/uploads/statusconst response = await client.externalConnections.uploads.pendingCount('1293384261075731499');
console.log(response.data);pending_numbers_countpending_orders_countGET /external_connections/{id}/uploads/{ticket_id}const upload = await client.externalConnections.uploads.retrieve(
'7b6a6449-b055-45a6-81f6-f6f0dffa4cc6',
{ id: '1293384261075731499' },
);
console.log(upload.data);available_usageserror_codeerror_messagelocation_idstatustenant_idticket_idtn_upload_entriesPOST /external_connections/{id}/uploads/{ticket_id}/retryconst response = await client.externalConnections.uploads.retry(
'7b6a6449-b055-45a6-81f6-f6f0dffa4cc6',
{ id: '1293384261075731499' },
);
console.log(response.data);available_usageserror_codeerror_messagelocation_idstatustenant_idticket_idtn_upload_entriesGET /mediaconst media = await client.media.list();
console.log(media.data);content_typecreated_atexpires_atmedia_nameupdated_atPOST /mediamedia_urlmedia_namettl_secsconst response = await client.media.upload({ media_url: 'http://www.example.com/audio.mp3' });
console.log(response.data);content_typecreated_atexpires_atmedia_nameupdated_atGET /media/{media_name}const media = await client.media.retrieve('media_name');
console.log(media.data);content_typecreated_atexpires_atmedia_nameupdated_atPUT /media/{media_name}media_urlttl_secsconst media = await client.media.update('media_name');
console.log(media.data);content_typecreated_atexpires_atmedia_nameupdated_atDELETE /media/{media_name}await client.media.delete('media_name');GET /media/{media_name}/downloadconst response = await client.media.download('media_name');
console.log(response);
const content = await response.blob();
console.log(content);POST /operator_connect/actions/refreshconst response = await client.operatorConnect.actions.refresh();
console.log(response.message);messagesuccessGET /recording_transcriptions// Automatically fetches more pages as needed.
for await (const recordingTranscription of client.recordingTranscriptions.list()) {
console.log(recordingTranscription.id);
}created_atduration_millisidrecord_typerecording_idstatustranscription_textupdated_atGET /recording_transcriptions/{recording_transcription_id}const recordingTranscription = await client.recordingTranscriptions.retrieve(
'6a09cdc3-8948-47f0-aa62-74ac943d6c58',
);
console.log(recordingTranscription.data);created_atduration_millisidrecord_typerecording_idstatustranscription_textupdated_atDELETE /recording_transcriptions/{recording_transcription_id}const recordingTranscription = await client.recordingTranscriptions.delete(
'6a09cdc3-8948-47f0-aa62-74ac943d6c58',
);
console.log(recordingTranscription.data);created_atduration_millisidrecord_typerecording_idstatustranscription_textupdated_atGET /recordings// Automatically fetches more pages as needed.
for await (const recordingResponseData of client.recordings.list()) {
console.log(recordingResponseData.id);
}call_control_idcall_leg_idcall_session_idchannelsconference_idconnection_idcreated_atdownload_urlsduration_millisfromidinitiated_byrecord_typerecording_ended_atrecording_started_atsourcestatustoupdated_atPOST /recordings/actions/deleteconst action = await client.recordings.actions.delete({
ids: ['428c31b6-7af4-4bcb-b7f5-5013ef9657c1', '428c31b6-7af4-4bcb-b7f5-5013ef9657c2'],
});
console.log(action.status);statusGET /recordings/{recording_id}const recording = await client.recordings.retrieve('recording_id');
console.log(recording.data);call_control_idcall_leg_idcall_session_idchannelsconference_idconnection_idcreated_atdownload_urlsduration_millisfromidinitiated_byrecord_typerecording_ended_atrecording_started_atsourcestatustoupdated_atDELETE /recordings/{recording_id}const recording = await client.recordings.delete('recording_id');
console.log(recording.data);call_control_idcall_leg_idcall_session_idchannelsconference_idconnection_idcreated_atdownload_urlsduration_millisfromidinitiated_byrecord_typerecording_ended_atrecording_started_atsourcestatustoupdated_atPOST /siprec_connectorsconst siprecConnector = await client.siprecConnectors.create({
host: 'siprec.telnyx.com',
name: 'my-siprec-connector',
port: 5060,
});
console.log(siprecConnector.data);app_subdomaincreated_athostnameportrecord_typeupdated_atGET /siprec_connectors/{connector_name}const siprecConnector = await client.siprecConnectors.retrieve('connector_name');
console.log(siprecConnector.data);app_subdomaincreated_athostnameportrecord_typeupdated_atPUT /siprec_connectors/{connector_name}const siprecConnector = await client.siprecConnectors.update('connector_name', {
host: 'siprec.telnyx.com',
name: 'my-siprec-connector',
port: 5060,
});
console.log(siprecConnector.data);app_subdomaincreated_athostnameportrecord_typeupdated_atDELETE /siprec_connectors/{connector_name}await client.siprecConnectors.delete('connector_name');