BizKitHub
DocsAPI ReferenceIssue/bff/issue/comments
getIssueAdmin BFF

/bff/issue/comments

Returns a paginated list of comments for a specific issue, ordered by creation date (oldest first).

IssuegetBffIssueComments

Parameters

3 query

Query parameters

· 3
issueKeystringRequired

Issue key.

ExamplePROJ-123
pagenumberOptional

Page number.

Default: 1
Example1
limitnumberOptional

Items per page.

Default: 100
Example100

Response schema

1 status code documented

200Success
itemsobject[]Required
Each array item:
idstringRequired

Comment ID (format: "PROJ-123_c456").

authorIdnumberRequired

Author contact ID (FK; not necessarily who the UI shows for ai/system).

authorKind"human" | "ai" | "system"Required

Who wrote the comment. human = staff / reporter, ai = AI Agent (authorName is rewritten server-side to "AI Agent" and authorEmail is empty), system = workflow / audit.

channel"internal" | "email_out" | "email_in"Required

Timeline channel: internal = staff-only note (no e-mail was sent), email_out = comment sent to the customer as an e-mail, email_in = inbound customer reply lifted from an e-mail or the public support portal.

authorNamestringRequired

Ready-to-render display name. For ai/system this is a synthetic label ("AI Agent" / "System"), NOT the FK contact's name.

authorEmailstringRequired

Author email — empty string for ai/system comments.

messagestringRequired

Comment text.

insertedDateDate | string | string | numberRequired

When the comment was created.

One of 4:
Variant 1
Date

When the comment was created.

Variant 2
stringdate-time
Variant 3
stringdate
Variant 4
number
updatedDateDate | string | string | numberRequired

Last update.

One of 4:
Variant 1
Date

Last update.

Variant 2
stringdate-time
Variant 3
stringdate
Variant 4
number
isSpambooleanRequired

True when the LLM classifier flagged this comment as spam at insert time. Populated on public-portal replies (channel = email_in) — inbound e-mails, staff notes, and AI/system entries always report false.

spamReasonstring | nullRequired

Short human-readable reason from the classifier (≤200 chars). Null for non-spam rows or when the classifier declined to explain. Render as the tooltip on the spam badge — never surface to the customer.

One of 2:
Variant 1
string
Variant 2
null
avatarUrlstringOptional

Uploaded avatar URL for human authors, resolved via the canonical contact-first / user-canonical fallback. Absent for ai/system rows (the admin renders their dedicated icon) and for human authors without an uploaded blob (the UI falls back to name initials).

geoIpnull | objectRequired

Geo snapshot of the caller that produced this comment. Populated for every writer that has request context: admin BFF (add-comment / add-email / promote-comment-to-email), public support portal (apiSupport /issue/:externalId/comment), and inbound mail with a parseable sender-IP header (X-Originating-IP / first Received: hop). Null for AI/system writers, historical rows written before the wiring, and loopback traffic. Rendered as a single-line strip in the admin timeline — never surfaced to the customer.

One of 2:
Variant 1
null
Variant 2
ipstringRequired

Accepted formats:

  • IPv4 dot-decimal, e.g. 1.1.1.1 (4 octets, 0–255, no leading zeros).
  • IPv6 as defined by RFC 4291 — full 2001:0db8:0000:0000:0000:0000:0000:0001, zero-compressed 2001:db8::1, IPv4-mapped ::ffff:1.2.3.4, or scoped literals. Both upper- and lower-case hex are accepted.

Server-side canonicalization (ipNormalize in core/src/lib/network/ipNormalize.ts):

  • Valid IPv4 is passed through verbatim.
  • Valid IPv6 is lowercased (RFC 5952 §4.3).
  • IPv4-mapped IPv6 ::ffff:X.X.X.X is unwrapped to plain IPv4 (RFC 4291 §2.5.5.2) so 1.2.3.4 and ::ffff:1.2.3.4 share one brj__geo_ip row.
  • Loopback aliases (::1, 0.0.0.0, localhost, empty string) collapse to 127.0.0.1.
  • Junk values that fail both IPv4 and IPv6 validation are silently rejected and replaced with 127.0.0.1 (loopback).

On the wire: every response returns the canonicalized form — clients can safely rely on lowercase IPv6 and the plain-IPv4 unwrap when de-duping or joining. Server-originated writers (activity log, session log, ban list) resolve the visitor IP via resolveClientIp / resolveClientIpOrNull — always native IPv6 on Vercel Edge (there is no auto-mapping to ::ffff:X.X.X.X).

Enrichment: the system resolves reverse DNS, geolocation, ASN, mobile/proxy/hosting/Tor flags via our VikiTron GEO/IP resolver for both address families. Learn more

Examples1.1.1.12001:4860:4860::8888
citystring | nullRequired
One of 2:
Variant 1
string
Variant 2
null
countrystring | nullRequired
One of 2:
Variant 1
string
Variant 2
null
countryRegionstring | nullRequired
One of 2:
Variant 1
string
Variant 2
null
hostnamestring | nullRequired
One of 2:
Variant 1
string
Variant 2
null
itemCountnumberRequired

Total comment count.

Response example

application/json
{
  "items": [
    {
      "id": "example_id",
      "authorId": 0,
      "authorName": "example_authorName",
      "authorEmail": "example_authorEmail",
      "message": "example_message",
      "isSpam": false,
      "avatarUrl": "example_avatarUrl"
    }
  ],
  "itemCount": 0
}

Request example

GET /bff/issue/comments

get
curl -X GET "https://api.bizkithub.com/bff/issue/comments?issueKey=PROJ-123&page=1&limit=100" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY"

Need an API key?

All BizKitHub public API endpoints require authentication via API key.

Get API Key