Loading...
Loading...
Generate and retrieve usage reports for billing, analytics, and reconciliation. This skill provides JavaScript SDK examples.
npx skill4agent add team-telnyx/skills telnyx-account-reports-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) { ... }occurred_atleg_idapplication_session_idGET /call_events// Automatically fetches more pages as needed.
for await (const callEventListResponse of client.callEvents.list()) {
console.log(callEventListResponse.call_leg_id);
}call_leg_idcall_session_idevent_timestampmetadatanamerecord_typetypePOST /ledger_billing_group_reportsmonthyearconst ledgerBillingGroupReport = await client.ledgerBillingGroupReports.create({
month: 10,
year: 2019,
});
console.log(ledgerBillingGroupReport.data);created_atidorganization_idrecord_typereport_urlstatusupdated_atGET /ledger_billing_group_reports/{id}const ledgerBillingGroupReport = await client.ledgerBillingGroupReports.retrieve(
'f5586561-8ff0-4291-a0ac-84fe544797bd',
);
console.log(ledgerBillingGroupReport.data);created_atidorganization_idrecord_typereport_urlstatusupdated_atGET /legacy/reporting/batch_detail_records/messagingconst messagings = await client.legacy.reporting.batchDetailRecords.messaging.list();
console.log(messagings.data);connectionscreated_atdirectionsend_datefiltersidprofilesrecord_typerecord_typesreport_namereport_urlstart_datestatusupdated_atPOST /legacy/reporting/batch_detail_records/messagingstart_timeend_timeconnectionsdirectionsfiltersinclude_message_bodymanaged_accountsprofilesrecord_typesreport_nameselect_all_managed_accountstimezoneconst messaging = await client.legacy.reporting.batchDetailRecords.messaging.create({
end_time: '2024-02-12T23:59:59Z',
start_time: '2024-02-01T00:00:00Z',
});
console.log(messaging.data);connectionscreated_atdirectionsend_datefiltersidprofilesrecord_typerecord_typesreport_namereport_urlstart_datestatusupdated_atGET /legacy/reporting/batch_detail_records/messaging/{id}const messaging = await client.legacy.reporting.batchDetailRecords.messaging.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(messaging.data);connectionscreated_atdirectionsend_datefiltersidprofilesrecord_typerecord_typesreport_namereport_urlstart_datestatusupdated_atDELETE /legacy/reporting/batch_detail_records/messaging/{id}const messaging = await client.legacy.reporting.batchDetailRecords.messaging.delete(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(messaging.data);connectionscreated_atdirectionsend_datefiltersidprofilesrecord_typerecord_typesreport_namereport_urlstart_datestatusupdated_atGET /legacy/reporting/batch_detail_records/voiceconst voices = await client.legacy.reporting.batchDetailRecords.voice.list();
console.log(voices.data);call_typesconnectionscreated_atend_timefiltersidmanaged_accountsrecord_typerecord_typesreport_namereport_urlretrysourcestart_timestatustimezoneupdated_atPOST /legacy/reporting/batch_detail_records/voicestart_timeend_timecall_typesconnectionsfieldsfiltersinclude_all_metadatamanaged_accountsrecord_typesreport_nameselect_all_managed_accountssourcetimezoneconst voice = await client.legacy.reporting.batchDetailRecords.voice.create({
end_time: '2024-02-12T23:59:59Z',
start_time: '2024-02-01T00:00:00Z',
});
console.log(voice.data);call_typesconnectionscreated_atend_timefiltersidmanaged_accountsrecord_typerecord_typesreport_namereport_urlretrysourcestart_timestatustimezoneupdated_atGET /legacy/reporting/batch_detail_records/voice/fieldsconst response = await client.legacy.reporting.batchDetailRecords.voice.retrieveFields();
console.log(response.Billing);BillingInteraction DataNumber InformationTelephony DataGET /legacy/reporting/batch_detail_records/voice/{id}const voice = await client.legacy.reporting.batchDetailRecords.voice.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(voice.data);call_typesconnectionscreated_atend_timefiltersidmanaged_accountsrecord_typerecord_typesreport_namereport_urlretrysourcestart_timestatustimezoneupdated_atDELETE /legacy/reporting/batch_detail_records/voice/{id}const voice = await client.legacy.reporting.batchDetailRecords.voice.delete(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(voice.data);call_typesconnectionscreated_atend_timefiltersidmanaged_accountsrecord_typerecord_typesreport_namereport_urlretrysourcestart_timestatustimezoneupdated_atGET /legacy/reporting/usage_reports/messaging// Automatically fetches more pages as needed.
for await (const mdrUsageReportResponseLegacy of client.legacy.reporting.usageReports.messaging.list()) {
console.log(mdrUsageReportResponseLegacy.id);
}aggregation_typeconnectionscreated_atend_timeidprofilesrecord_typereport_urlresultstart_timestatusupdated_atPOST /legacy/reporting/usage_reports/messagingconst messaging = await client.legacy.reporting.usageReports.messaging.create({
aggregation_type: 0,
});
console.log(messaging.data);aggregation_typeconnectionscreated_atend_timeidprofilesrecord_typereport_urlresultstart_timestatusupdated_atGET /legacy/reporting/usage_reports/messaging/{id}const messaging = await client.legacy.reporting.usageReports.messaging.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(messaging.data);aggregation_typeconnectionscreated_atend_timeidprofilesrecord_typereport_urlresultstart_timestatusupdated_atDELETE /legacy/reporting/usage_reports/messaging/{id}const messaging = await client.legacy.reporting.usageReports.messaging.delete(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(messaging.data);aggregation_typeconnectionscreated_atend_timeidprofilesrecord_typereport_urlresultstart_timestatusupdated_atGET /legacy/reporting/usage_reports/number_lookupconst numberLookups = await client.legacy.reporting.usageReports.numberLookup.list();
console.log(numberLookups.data);aggregation_typecreated_atend_dateidmanaged_accountsrecord_typereport_urlresultstart_datestatusupdated_atPOST /legacy/reporting/usage_reports/number_lookupconst numberLookup = await client.legacy.reporting.usageReports.numberLookup.create();
console.log(numberLookup.data);aggregation_typecreated_atend_dateidmanaged_accountsrecord_typereport_urlresultstart_datestatusupdated_atGET /legacy/reporting/usage_reports/number_lookup/{id}const numberLookup = await client.legacy.reporting.usageReports.numberLookup.retrieve('550e8400-e29b-41d4-a716-446655440000');
console.log(numberLookup.data);aggregation_typecreated_atend_dateidmanaged_accountsrecord_typereport_urlresultstart_datestatusupdated_atDELETE /legacy/reporting/usage_reports/number_lookup/{id}await client.legacy.reporting.usageReports.numberLookup.delete('550e8400-e29b-41d4-a716-446655440000');GET /legacy/reporting/usage_reports/voice// Automatically fetches more pages as needed.
for await (const cdrUsageReportResponseLegacy of client.legacy.reporting.usageReports.voice.list()) {
console.log(cdrUsageReportResponseLegacy.id);
}aggregation_typeconnectionscreated_atend_timeidproduct_breakdownrecord_typereport_urlresultstart_timestatusupdated_atPOST /legacy/reporting/usage_reports/voiceconst voice = await client.legacy.reporting.usageReports.voice.create({
end_time: '2024-02-01T00:00:00Z',
start_time: '2024-02-01T00:00:00Z',
});
console.log(voice.data);aggregation_typeconnectionscreated_atend_timeidproduct_breakdownrecord_typereport_urlresultstart_timestatusupdated_atGET /legacy/reporting/usage_reports/voice/{id}const voice = await client.legacy.reporting.usageReports.voice.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(voice.data);aggregation_typeconnectionscreated_atend_timeidproduct_breakdownrecord_typereport_urlresultstart_timestatusupdated_atDELETE /legacy/reporting/usage_reports/voice/{id}const voice = await client.legacy.reporting.usageReports.voice.delete(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(voice.data);aggregation_typeconnectionscreated_atend_timeidproduct_breakdownrecord_typereport_urlresultstart_timestatusupdated_atGET /phone_numbers/csv_downloads// Automatically fetches more pages as needed.
for await (const csvDownload of client.phoneNumbers.csvDownloads.list()) {
console.log(csvDownload.id);
}idrecord_typestatusurlPOST /phone_numbers/csv_downloadsconst csvDownload = await client.phoneNumbers.csvDownloads.create();
console.log(csvDownload.data);idrecord_typestatusurlGET /phone_numbers/csv_downloads/{id}const csvDownload = await client.phoneNumbers.csvDownloads.retrieve('550e8400-e29b-41d4-a716-446655440000');
console.log(csvDownload.data);idrecord_typestatusurlGET /reports/cdr_usage_reports/syncconst response = await client.reports.cdrUsageReports.fetchSync({
aggregation_type: 'NO_AGGREGATION',
product_breakdown: 'NO_BREAKDOWN',
});
console.log(response.data);aggregation_typeconnectionscreated_atend_timeidproduct_breakdownrecord_typereport_urlresultstart_timestatusupdated_atGET /reports/mdr_usage_reports// Automatically fetches more pages as needed.
for await (const mdrUsageReport of client.reports.mdrUsageReports.list()) {
console.log(mdrUsageReport.id);
}aggregation_typeconnectionscreated_atend_dateidprofilesrecord_typereport_urlresultstart_datestatusupdated_atPOST /reports/mdr_usage_reportsconst mdrUsageReport = await client.reports.mdrUsageReports.create({
aggregation_type: 'NO_AGGREGATION',
end_date: '2020-07-01T00:00:00-06:00',
start_date: '2020-07-01T00:00:00-06:00',
});
console.log(mdrUsageReport.data);aggregation_typeconnectionscreated_atend_dateidprofilesrecord_typereport_urlresultstart_datestatusupdated_atGET /reports/mdr_usage_reports/syncconst response = await client.reports.mdrUsageReports.fetchSync({ aggregation_type: 'PROFILE' });
console.log(response.data);aggregation_typeconnectionscreated_atend_dateidprofilesrecord_typereport_urlresultstart_datestatusupdated_atGET /reports/mdr_usage_reports/{id}const mdrUsageReport = await client.reports.mdrUsageReports.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(mdrUsageReport.data);aggregation_typeconnectionscreated_atend_dateidprofilesrecord_typereport_urlresultstart_datestatusupdated_atDELETE /reports/mdr_usage_reports/{id}const mdrUsageReport = await client.reports.mdrUsageReports.delete(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
);
console.log(mdrUsageReport.data);aggregation_typeconnectionscreated_atend_dateidprofilesrecord_typereport_urlresultstart_datestatusupdated_atGET /reports/mdrsconst response = await client.reports.listMdrs();
console.log(response.data);cldclicostcreated_atcurrencydirectionidmessage_typepartsprofile_nameraterecord_typestatusGET /reports/wdrs// Automatically fetches more pages as needed.
for await (const reportListWdrsResponse of client.reports.listWdrs()) {
console.log(reportListWdrsResponse.id);
}costcreated_atdownlink_dataduration_secondsidimsimccmncphone_numberraterecord_typesim_card_idsim_group_idsim_group_nameuplink_dataGET /session_analysis/metadataconst metadata = await client.sessionAnalysis.metadata.retrieve();
console.log(metadata.meta);metaquery_parametersrecord_typesGET /session_analysis/metadata/{record_type}const response = await client.sessionAnalysis.metadata.retrieveRecordType('record_type');
console.log(response.aliases);aliaseschild_relationshipseventexamplesmetaparent_relationshipsproductrecord_typeGET /session_analysis/{record_type}/{event_id}const sessionAnalysis = await client.sessionAnalysis.retrieve(
'182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
{ record_type: 'record_type' },
);
console.log(sessionAnalysis.session_id);completed_atcostcreated_atmetarootsession_idstatusGET /usage_reports// Automatically fetches more pages as needed.
for await (const usageReportListResponse of client.usageReports.list({
dimensions: ['string'],
metrics: ['string'],
product: 'wireless',
})) {
console.log(usageReportListResponse);
}datametaGET /usage_reports/optionsconst response = await client.usageReports.getOptions();
console.log(response.data);productproduct_dimensionsproduct_metricsrecord_typesGET /wireless/detail_records_reportsconst detailRecordsReports = await client.wireless.detailRecordsReports.list();
console.log(detailRecordsReports.data);created_atend_timeidrecord_typereport_urlstart_timestatusupdated_atPOST /wireless/detail_records_reportsend_timestart_timeconst detailRecordsReport = await client.wireless.detailRecordsReports.create();
console.log(detailRecordsReport.data);created_atend_timeidrecord_typereport_urlstart_timestatusupdated_atGET /wireless/detail_records_reports/{id}const detailRecordsReport = await client.wireless.detailRecordsReports.retrieve(
'6a09cdc3-8948-47f0-aa62-74ac943d6c58',
);
console.log(detailRecordsReport.data);created_atend_timeidrecord_typereport_urlstart_timestatusupdated_atDELETE /wireless/detail_records_reports/{id}const detailRecordsReport = await client.wireless.detailRecordsReports.delete(
'6a09cdc3-8948-47f0-aa62-74ac943d6c58',
);
console.log(detailRecordsReport.data);created_atend_timeidrecord_typereport_urlstart_timestatusupdated_at