feat: add dashboard analytics to sdk and public api (#353)

This commit is contained in:
Dave Stockley
2026-03-04 11:06:21 +00:00
committed by GitHub
parent 991fcab764
commit ce8b780155
12 changed files with 555 additions and 112 deletions
+56
View File
@@ -0,0 +1,56 @@
import { paths } from "../types/schema";
import { ErrorResponse } from "../types";
import { UseSend } from "./usesend";
type EmailTimeSeriesQuery =
paths["/v1/analytics/email-time-series"]["get"]["parameters"]["query"];
type EmailTimeSeriesResponseSuccess =
paths["/v1/analytics/email-time-series"]["get"]["responses"]["200"]["content"]["application/json"];
type EmailTimeSeriesResponse = {
data: EmailTimeSeriesResponseSuccess | null;
error: ErrorResponse | null;
};
type ReputationMetricsQuery =
paths["/v1/analytics/reputation-metrics"]["get"]["parameters"]["query"];
type ReputationMetricsResponseSuccess =
paths["/v1/analytics/reputation-metrics"]["get"]["responses"]["200"]["content"]["application/json"];
type ReputationMetricsResponse = {
data: ReputationMetricsResponseSuccess | null;
error: ErrorResponse | null;
};
export class Analytics {
constructor(private readonly usesend: UseSend) {
this.usesend = usesend;
}
async emailTimeSeries(
query?: EmailTimeSeriesQuery,
): Promise<EmailTimeSeriesResponse> {
const params = new URLSearchParams();
if (query?.days) params.set("days", query.days);
if (query?.domainId) params.set("domainId", query.domainId);
const qs = params.toString();
const path = `/analytics/email-time-series${qs ? `?${qs}` : ""}`;
return this.usesend.get<EmailTimeSeriesResponseSuccess>(path);
}
async reputationMetrics(
query?: ReputationMetricsQuery,
): Promise<ReputationMetricsResponse> {
const params = new URLSearchParams();
if (query?.domainId) params.set("domainId", query.domainId);
const qs = params.toString();
const path = `/analytics/reputation-metrics${qs ? `?${qs}` : ""}`;
return this.usesend.get<ReputationMetricsResponseSuccess>(path);
}
}
+2
View File
@@ -4,6 +4,7 @@ import { ContactBooks } from "./contactBook";
import { Emails } from "./email";
import { Domains } from "./domain";
import { Campaigns } from "./campaign";
import { Analytics } from "./analytics";
import { Webhooks } from "./webhooks";
const defaultBaseUrl = "https://app.usesend.com";
@@ -26,6 +27,7 @@ export class UseSend {
readonly contacts = new Contacts(this);
readonly contactBooks = new ContactBooks(this);
readonly campaigns = new Campaigns(this);
readonly analytics = new Analytics(this);
url = baseUrl;
constructor(
+102
View File
@@ -1715,6 +1715,108 @@ export interface paths {
patch?: never;
trace?: never;
};
"/v1/analytics/email-time-series": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: {
parameters: {
query?: {
/** @description Number of days to retrieve data for (default: 30) */
days?: "7" | "30";
/** @description Filter by domain ID */
domainId?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Retrieve email time series data */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
result: {
date: string;
sent: number;
delivered: number;
opened: number;
clicked: number;
bounced: number;
complained: number;
}[];
totalCounts: {
sent: number;
delivered: number;
opened: number;
clicked: number;
bounced: number;
complained: number;
};
};
};
};
};
};
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/v1/analytics/reputation-metrics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: {
parameters: {
query?: {
/** @description Filter by domain ID */
domainId?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Retrieve reputation metrics data */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
delivered: number;
hardBounced: number;
complained: number;
bounceRate: number;
complaintRate: number;
};
};
};
};
};
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
}
export type webhooks = Record<string, never>;
export interface components {