API reference

Analytics

Messaging, template, broadcast, inbox, commerce, drip, AI agent and API usage reports.

Every request needs x-tenant-id and an API key or OAuth token. Channel IDs are copied from Settings → Developer in the app. See Authentication.

Messaging analytics

get/api/public/v1/analytics/messages

Inbound and outbound message volume with delivery, read and failure counts for the range, broken down by day (zero-filled), channel and message type.

Query parameters

  • fromstring

    Start of the range (ISO 8601 date or date-time, inclusive). Defaults to 30 days before `to`.

  • tostring

    End of the range (exclusive; a date-only value includes that whole UTC day). Defaults to now. Max range 92 days.

  • timezonestring

    IANA timezone used to label per-day buckets (default UTC).

  • channelIdstring

    Only include this channel (24-char id from GET /channels).

Response 200Messaging analytics
  • successboolean
  • dataobject
    5 child fields
    • rangeobject
      3 child fields
      • fromstring (date-time)
      • tostring (date-time)
      • timezonestring
    • totalsobject
      12 child fields
      • totalinteger
      • inboundinteger
      • outboundinteger
      • sentinteger

        Outbound messages that reached sent, delivered or read.

      • deliveredinteger

        Outbound messages that reached delivered or read.

      • readinteger
      • failedinteger
      • broadcastinteger

        Outbound messages sent by broadcasts.

      • sessioninteger

        Other outbound messages (agent, API, automation).

      • deliveryRatePercentnumber | null
      • readRatePercentnumber | null
      • failureRatePercentnumber | null
    • byDayobject[]
      13 child fields
      • datestring
      • totalinteger
      • inboundinteger
      • outboundinteger
      • sentinteger

        Outbound messages that reached sent, delivered or read.

      • deliveredinteger

        Outbound messages that reached delivered or read.

      • readinteger
      • failedinteger
      • broadcastinteger

        Outbound messages sent by broadcasts.

      • sessioninteger

        Other outbound messages (agent, API, automation).

      • deliveryRatePercentnumber | null
      • readRatePercentnumber | null
      • failureRatePercentnumber | null
    • byChannelobject[]
      15 child fields
      • channelIdstring
      • channelTypestring | null
      • channelNamestring | null
      • totalinteger
      • inboundinteger
      • outboundinteger
      • sentinteger

        Outbound messages that reached sent, delivered or read.

      • deliveredinteger

        Outbound messages that reached delivered or read.

      • readinteger
      • failedinteger
      • broadcastinteger

        Outbound messages sent by broadcasts.

      • sessioninteger

        Other outbound messages (agent, API, automation).

      • deliveryRatePercentnumber | null
      • readRatePercentnumber | null
      • failureRatePercentnumber | null
    • byTypeobject[]
      4 child fields
      • typestring
      • totalinteger
      • inboundinteger
      • outboundinteger
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/messages" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "range": {
      "from": "2026-07-12T09:30:00.000Z",
      "to": "2026-07-12T09:30:00.000Z",
      "timezone": "UTC"
    },
    "totals": {
      "total": 1240,
      "inbound": 410,
      "outbound": 830,
      "sent": 812,
      "delivered": 790,
      "read": 512,
      "failed": 18,
      "broadcast": 600,
      "session": 230,
      "deliveryRatePercent": 97.29,
      "readRatePercent": 63.05,
      "failureRatePercent": 2.17
    },
    "byDay": [
      {
        "date": "2026-10-28",
        "total": 1240,
        "inbound": 410,
        "outbound": 830,
        "sent": 812,
        "delivered": 790,
        "read": 512,
        "failed": 18,
        "broadcast": 600,
        "session": 230,
        "deliveryRatePercent": 97.29,
        "readRatePercent": 63.05,
        "failureRatePercent": 2.17
      }
    ],
    "byChannel": [
      {
        "channelId": "string",
        "channelType": "WHATSAPP",
        "channelName": "string",
        "total": 1240,
        "inbound": 410,
        "outbound": 830,
        "sent": 812,
        "delivered": 790,
        "read": 512,
        "failed": 18,
        "broadcast": 600,
        "session": 230,
        "deliveryRatePercent": 97.29,
        "readRatePercent": 63.05,
        "failureRatePercent": 2.17
      }
    ],
    "byType": [
      {
        "type": "template",
        "total": 0,
        "inbound": 0,
        "outbound": 0
      }
    ]
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Template analytics

get/api/public/v1/analytics/templates

Delivery, read, failure and quick-reply click counts per template (name + language) for template messages sent in the range, from broadcasts, the API and automations. Pass `name` to also get a per-day series. URL-button taps are not reported by WhatsApp, so they are not counted.

Query parameters

  • fromstring

    Start of the range (ISO 8601 date or date-time, inclusive). Defaults to 30 days before `to`.

  • tostring

    End of the range (exclusive; a date-only value includes that whole UTC day). Defaults to now. Max range 92 days.

  • timezonestring

    IANA timezone used to label per-day buckets (default UTC).

  • channelIdstring

    Only include this channel (24-char id from GET /channels).

  • namestring

    Only this template name (exact).

  • languagestring

    Only this template language.

Response 200Template analytics
  • successboolean
  • dataobject
    5 child fields
    • rangeobject
      3 child fields
      • fromstring (date-time)
      • tostring (date-time)
      • timezonestring
    • totalsobject
      10 child fields
      • sentinteger
      • deliveredinteger
      • readinteger
      • failedinteger
      • pendinginteger

        Accepted but not yet sent.

      • clicksinteger

        Quick-reply button taps on these messages.

      • deliveryRatePercentnumber | null
      • readRatePercentnumber | null

        Read / delivered.

      • failureRatePercentnumber | null
      • clickRatePercentnumber | null

        Clicks / delivered.

    • templatesobject[]
      16 child fields
      • namestring
      • languagestring | null
      • categorystring | null
      • templateIdstring | null
      • lastSentAtstring (date-time) | null
      • sentinteger
      • deliveredinteger
      • readinteger
      • failedinteger
      • pendinginteger

        Accepted but not yet sent.

      • clicksinteger

        Quick-reply button taps on these messages.

      • deliveryRatePercentnumber | null
      • readRatePercentnumber | null

        Read / delivered.

      • failureRatePercentnumber | null
      • clickRatePercentnumber | null

        Clicks / delivered.

      • buttonsobject[]
        2 child fields
        • textstring
        • clicksinteger
    • byDayobject[]

      Only when `name` is given.

    • truncatedboolean

      True when the result was capped (over 500 templates or 20,000 button taps).

  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/templates" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "range": {
      "from": "2026-07-12T09:30:00.000Z",
      "to": "2026-07-12T09:30:00.000Z",
      "timezone": "UTC"
    },
    "totals": {
      "sent": 500,
      "delivered": 480,
      "read": 300,
      "failed": 6,
      "pending": 0,
      "clicks": 42,
      "deliveryRatePercent": 0,
      "readRatePercent": 0,
      "failureRatePercent": 0,
      "clickRatePercent": 0
    },
    "templates": [
      {
        "name": "order_update",
        "language": "en_US",
        "category": "UTILITY",
        "templateId": "string",
        "lastSentAt": "2026-07-12T09:30:00.000Z",
        "sent": 500,
        "delivered": 480,
        "read": 300,
        "failed": 6,
        "pending": 0,
        "clicks": 42,
        "deliveryRatePercent": 0,
        "readRatePercent": 0,
        "failureRatePercent": 0,
        "clickRatePercent": 0,
        "buttons": [
          {
            "text": "Track order",
            "clicks": 30
          }
        ]
      }
    ],
    "byDay": [
      {}
    ],
    "truncated": true
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Broadcast analytics summary

get/api/public/v1/analytics/broadcasts

Aggregate delivery metrics across broadcasts (drafts excluded unless `status` is set), plus a paginated per-broadcast table and highlights. `from`/`to` filter on the broadcast start time. Use GET /broadcasts/{id}/recipients for per-recipient statuses.

Query parameters

  • fromstring

    Broadcasts started at or after (ISO 8601).

  • tostring

    Broadcasts started at or before (ISO 8601; a date-only value includes that whole UTC day).

  • statusstring

    DRAFTSCHEDULEDRUNNINGPAUSEDCOMPLETEDCANCELLEDFAILED

  • channelIdstring
  • templateIdstring
  • pageinteger

    Page number (default 1).

  • limitinteger

    Page size (default 25, max 100).

  • sortstring

    startedAtnamestatustotalRecipientssentdeliveredreadfaileddeliveryRatereadRatecompletion

  • orderstring

    ascdesc

Response 200Broadcast analytics summary
  • successboolean
  • dataobject
    5 child fields
    • summaryobject | null

      Totals and rates across all matching broadcasts.

    • highlightsobject | null
    • broadcastsobject[]
      15 child fields
      • idstring
      • namestring | null
      • statusstring | null
      • templateIdstring | null
      • templateNamestring | null
      • totalRecipientsinteger
      • sentinteger
      • deliveredinteger
      • readinteger
      • failedinteger
      • successRatenumber
      • failureRatenumber
      • deliveryRatenumber
      • readRatenumber
      • startedAtstring (date-time) | null
    • paginationobject
    • truncatedboolean
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/broadcasts" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "summary": {},
    "highlights": {},
    "broadcasts": [
      {
        "id": "string",
        "name": "string",
        "status": "COMPLETED",
        "templateId": "string",
        "templateName": "string",
        "totalRecipients": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0,
        "successRate": 0,
        "failureRate": 0,
        "deliveryRate": 0,
        "readRate": 0,
        "startedAt": "2026-07-12T09:30:00.000Z"
      }
    ],
    "pagination": {},
    "truncated": true
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Inbox analytics

get/api/public/v1/analytics/inbox

Conversation counts by status, priority, channel, team, label and source; first-response and resolution times; per-agent load; message volume; and SLA compliance for conversations created in the range. The range is day-granular: `to` covers through the end of its UTC day.

Query parameters

  • fromstring

    Start of the range (ISO 8601 date or date-time, inclusive). Defaults to 30 days before `to`.

  • tostring

    End of the range (exclusive; a date-only value includes that whole UTC day). Defaults to now. Max range 92 days.

  • channelIdstring

    Only include this channel (24-char id from GET /channels).

  • teamIdstring

    Only conversations of this team (id from GET /teams).

Response 200Inbox analytics
  • successboolean
  • dataobject
    6 child fields
    • rangeobject
      3 child fields
      • fromstring (date-time)
      • tostring (date-time)
      • timezonestring
    • overviewobject
      8 child fields
      • totalinteger
      • openinteger
      • pendinginteger
      • resolvedinteger
      • closedinteger
      • unassignedinteger
      • avgFirstResponseMsnumber | null
      • avgResolutionHoursnumber | null
    • breakdownsobject
    • agentsobject[]
      9 child fields
      • agentIdstring | null
      • namestring | null
      • emailstring | null
      • openinteger
      • pendinginteger
      • resolvedinteger
      • closedinteger
      • totalinteger
      • avgFirstResponseMsnumber | null
    • messagesobject
    • slaobject
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/inbox" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "range": {
      "from": "2026-07-12T09:30:00.000Z",
      "to": "2026-07-12T09:30:00.000Z",
      "timezone": "UTC"
    },
    "overview": {
      "total": 0,
      "open": 0,
      "pending": 0,
      "resolved": 0,
      "closed": 0,
      "unassigned": 0,
      "avgFirstResponseMs": 0,
      "avgResolutionHours": 0
    },
    "breakdowns": {},
    "agents": [
      {
        "agentId": "string",
        "name": "string",
        "email": "string",
        "open": 0,
        "pending": 0,
        "resolved": 0,
        "closed": 0,
        "total": 0,
        "avgFirstResponseMs": 0
      }
    ],
    "messages": {},
    "sla": {}
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Plan usage

get/api/public/v1/analytics/usage

Current plan and usage against each plan limit (contacts, messages this month, API calls, storage, and more).

Response 200Plan usage
  • successboolean
  • dataobject
    3 child fields
    • periodstring | null
    • planobject
      3 child fields
      • codestring | null
      • namestring | null
      • statusstring | null
    • metricsobject[]
      8 child fields
      • keystring
      • labelstring
      • usednumber
      • limitnumber | null

        Null when unlimited.

      • remainingnumber | null
      • percentUsednumber | null
      • unlimitedboolean
      • resetsMonthlyboolean
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/usage" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "period": "2026-10",
    "plan": {
      "code": "string",
      "name": "string",
      "status": "string"
    },
    "metrics": [
      {
        "key": "messages_per_month",
        "label": "Messages Per Month",
        "used": 1200,
        "limit": 10000,
        "remaining": 0,
        "percentUsed": 0,
        "unlimited": true,
        "resetsMonthly": true
      }
    ]
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Commerce analytics

get/api/public/v1/analytics/commerce/{report}

Commerce reports, the same as the in-app commerce dashboard. `overview`: net/gross sales, orders, AOV, customers and conversion with previous-period comparison. `revenue` and `orders`: totals plus a time series. `customers`: new/repeat and top customers. `products`: top/lowest products, variants and categories. `inventory`: stock summary and out-of-stock items with recent sales. `promotions`: promotion performance. `funnel`: cart-to-order funnel. Amounts are in the order currency; when several currencies exist, pass `currency`.

Path parameters

  • reportstringrequired

    overviewrevenueorderscustomersproductsinventorypromotionsfunnel

Query parameters

  • periodstring

    Preset range (default this_month). Ignored when from/to are given.

    todayyesterdaythis_weeklast_weekthis_monthlast_monththis_year

  • fromstring

    Custom range start, YYYY-MM-DD in `timezone` (requires `to`).

  • tostring

    Custom range end, YYYY-MM-DD inclusive (max 366 days).

  • timezonestring

    IANA timezone (default: the workspace timezone).

  • granularitystring

    Series bucket size for revenue/orders.

    dayweekmonth

  • currencystring
  • channelstring

    Order channel filter.

  • categoryIdstring
  • collectionIdstring
  • catalogProductIdstring

    Catalog product filter.

  • promotionIdstring
  • limitinteger

    Rows in top-N lists (default 10).

Response 200Commerce report
  • successboolean
  • dataobject
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/commerce/6650a1b2c3d4e5f6a7b8c9d0" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {},
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Drip campaign analytics

get/api/public/v1/analytics/drips

Drip campaigns with enrollment outcomes (enrolled, completed, stopped by reply or opt-out, failed, cancelled).

Query parameters

  • pageinteger

    Page number (default 1).

  • limitinteger

    Page size (default 25, max 100).

  • statusstring

    DRAFTSCHEDULEDRUNNINGPAUSEDCOMPLETEDCANCELLED

Response 200Drip campaigns
  • successboolean
  • dataobject[]
    8 child fields
    • idstring
    • namestring | null
    • statusstring | null
    • channelIdstring | null
    • stepCountinteger
    • countsobject
      6 child fields
      • enrolledinteger
      • completedinteger
      • stoppedReplyinteger
      • stoppedOptOutinteger
      • failedinteger
      • cancelledinteger
    • startedAtstring (date-time) | null
    • completedAtstring (date-time) | null
  • paginationobject
    8 child fields
    • pageinteger
    • limitinteger
    • totalinteger
    • totalPagesinteger
    • hasNextPageboolean
    • hasPrevPageboolean
    • nextCursorstring | null
    • prevCursorstring | null
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/drips" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "string",
      "name": "string",
      "status": "RUNNING",
      "channelId": "string",
      "stepCount": 0,
      "counts": {
        "enrolled": 0,
        "completed": 0,
        "stoppedReply": 0,
        "stoppedOptOut": 0,
        "failed": 0,
        "cancelled": 0
      },
      "startedAt": "2026-07-12T09:30:00.000Z",
      "completedAt": "2026-07-12T09:30:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 3,
    "totalPages": 1,
    "hasNextPage": false,
    "hasPrevPage": false,
    "nextCursor": null,
    "prevCursor": null
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Drip campaign step analytics

get/api/public/v1/analytics/drips/{id}

Enrollments by status and sent / failed / queued counts for each step of one drip campaign.

Path parameters

  • idstringrequired

    24-char drip id

Response 200Drip step analytics
  • successboolean
  • dataobject
    4 child fields
    • dripobject
      8 child fields
      • idstring
      • namestring | null
      • statusstring | null
      • channelIdstring | null
      • stepCountinteger
      • countsobject
        6 child fields
        • enrolledinteger
        • completedinteger
        • stoppedReplyinteger
        • stoppedOptOutinteger
        • failedinteger
        • cancelledinteger
      • startedAtstring (date-time) | null
      • completedAtstring (date-time) | null
    • totalEnrollmentsinteger
    • enrollmentsByStatusobject
    • stepsobject[]
      7 child fields
      • orderinteger
      • templateIdstring | null
      • templateNamestring | null
      • delayMsinteger
      • sentinteger
      • failedinteger
      • queuedinteger
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 404Resource not found
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/drips/6650a1b2c3d4e5f6a7b8c9d0" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "drip": {
      "id": "string",
      "name": "string",
      "status": "RUNNING",
      "channelId": "string",
      "stepCount": 0,
      "counts": {
        "enrolled": 0,
        "completed": 0,
        "stoppedReply": 0,
        "stoppedOptOut": 0,
        "failed": 0,
        "cancelled": 0
      },
      "startedAt": "2026-07-12T09:30:00.000Z",
      "completedAt": "2026-07-12T09:30:00.000Z"
    },
    "totalEnrollments": 0,
    "enrollmentsByStatus": {},
    "steps": [
      {
        "order": 0,
        "templateId": "string",
        "templateName": "string",
        "delayMs": 0,
        "sent": 0,
        "failed": 0,
        "queued": 0
      }
    ]
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

AI agent analytics

get/api/public/v1/analytics/ai-agents

Replies, handoffs, unanswered questions, containment rate and token usage for each AI agent (up to 50) over the look-back window.

Query parameters

  • sinceDaysinteger

    Look-back window in days (default 7).

Response 200AI agent analytics
  • successboolean
  • dataobject
    2 child fields
    • sinceDaysinteger
    • agentsobject[]
      13 child fields
      • idstring
      • namestring | null
      • statusstring | null
      • modestring | null
      • channelIdstring | null
      • conversationsTouchedinteger
      • repliesinteger

        Turns the AI answered.

      • handoffsinteger

        Turns escalated to a human.

      • unansweredinteger
      • skippedinteger
      • containmentRatenumber | null

        Replies / (replies + handoffs + no-answer), 0-1.

      • escalationTotalinteger
      • tokensobject
        3 child fields
        • promptinteger
        • completioninteger
        • totalinteger
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/ai-agents" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "sinceDays": 0,
    "agents": [
      {
        "id": "string",
        "name": "string",
        "status": "LIVE",
        "mode": "string",
        "channelId": "string",
        "conversationsTouched": 0,
        "replies": 0,
        "handoffs": 0,
        "unanswered": 0,
        "skipped": 0,
        "containmentRate": 0,
        "escalationTotal": 0,
        "tokens": {
          "prompt": 0,
          "completion": 0,
          "total": 0
        }
      }
    ]
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

AI agent analytics (single)

get/api/public/v1/analytics/ai-agents/{id}

One AI agent: metrics, escalation reasons, CSAT survey results and the most recent unanswered customer questions.

Path parameters

  • idstringrequired

    24-char AI agent id

Query parameters

  • sinceDaysinteger

    Look-back window in days (default 7).

Response 200AI agent analytics
  • successboolean
  • dataobject
    13 child fields
    • agentIdstring
    • sinceDaysinteger
    • conversationsTouchedinteger
    • repliesinteger

      Turns the AI answered.

    • handoffsinteger

      Turns escalated to a human.

    • unansweredinteger
    • skippedinteger
    • containmentRatenumber | null

      Replies / (replies + handoffs + no-answer), 0-1.

    • escalationTotalinteger
    • tokensobject
      3 child fields
      • promptinteger
      • completioninteger
      • totalinteger
    • escalationBreakdownobject[]
    • csatobject | null
    • topUnansweredobject[]
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 404Resource not found
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/ai-agents/6650a1b2c3d4e5f6a7b8c9d0" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "agentId": "string",
    "sinceDays": 0,
    "conversationsTouched": 0,
    "replies": 0,
    "handoffs": 0,
    "unanswered": 0,
    "skipped": 0,
    "containmentRate": 0,
    "escalationTotal": 0,
    "tokens": {
      "prompt": 0,
      "completion": 0,
      "total": 0
    },
    "escalationBreakdown": [
      {}
    ],
    "csat": {},
    "topUnanswered": [
      {}
    ]
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}

Public API usage

get/api/public/v1/analytics/api-usage

Your Public API traffic: calls, success and error counts, average and p95 latency, by day (zero-filled), endpoint, API key / OAuth app and status code, plus the monthly api_calls quota. Only authenticated requests are counted.

Query parameters

  • fromstring

    Start of the range (ISO 8601 date or date-time, inclusive). Defaults to 30 days before `to`.

  • tostring

    End of the range (exclusive; a date-only value includes that whole UTC day). Defaults to now. Max range 92 days.

  • timezonestring

    IANA timezone used to label per-day buckets (default UTC).

  • keyIdstring

    Only this API key id, or `oauth:<clientId>` for an OAuth app.

Response 200Public API usage
  • successboolean
  • dataobject
    7 child fields
    • rangeobject
      3 child fields
      • fromstring (date-time)
      • tostring (date-time)
      • timezonestring
    • totalsobject
      10 child fields
      • callsinteger
      • successinteger
      • errorsinteger
      • clientErrorsinteger
      • serverErrorsinteger
      • rateLimitedinteger
      • successRatePercentnumber | null
      • errorRatePercentnumber | null
      • avgLatencyMsinteger | null
      • p95LatencyMsinteger | null
    • byDayobject[]
    • byEndpointobject[]
    • byKeyobject[]
    • byStatusobject[]
    • quotaobject | null
  • metaobject
    1 child field
    • apiVersionstring
  • requestIdstring | null
  • timestampstring (date-time)

Errors

  • 400Malformed request or missing tenant context
  • 401Missing or invalid API key / access token
  • 403Forbidden — plan, scope, key status, or tenant mismatch
  • 422Validation failed
  • 429Too many requests — rate limit exceeded
  • 500Unexpected server error
Error envelope and fixes →
curl -X GET "https://api.inaiy.com/api/public/v1/analytics/api-usage" \
  -H "x-tenant-id: demo" \
  -H "x-api-key: wp_live_xxxxxxxxxxxxxxxxxxxx"
Response 200
{
  "success": true,
  "data": {
    "range": {
      "from": "2026-07-12T09:30:00.000Z",
      "to": "2026-07-12T09:30:00.000Z",
      "timezone": "UTC"
    },
    "totals": {
      "calls": 10520,
      "success": 10220,
      "errors": 300,
      "clientErrors": 297,
      "serverErrors": 3,
      "rateLimited": 0,
      "successRatePercent": 0,
      "errorRatePercent": 0,
      "avgLatencyMs": 84,
      "p95LatencyMs": 240
    },
    "byDay": [
      {}
    ],
    "byEndpoint": [
      {}
    ],
    "byKey": [
      {}
    ],
    "byStatus": [
      {}
    ],
    "quota": {}
  },
  "meta": {
    "apiVersion": "v1"
  },
  "requestId": "string",
  "timestamp": "2026-07-12T09:30:00.000Z"
}