Dbrij Resolve Documentation

Everything you need to run customer support from inside your own product with Dbrij Resolve: desks, tickets, replies, confirmations, scopes, metering and webhook events.

Support API

Run customer support from inside your own product on Dbrij Resolve. Your app acts with its owner's standing: it sees the desks of the companies they belong to, opens tickets on a customer's behalf, reads the honest state (status, public timeline, the desk score) and relays replies and confirmations. Set the desk up in Resolve first; everything here rides on it.

Authenticate with an API key carrying the support:read / support:write scopes. Each ticket you open is metered per app per month as support_tickets against your plan: the free tier has a hard monthly allotment while paid plans bill overage instead, and every request counts toward your plan's per minute rate ceiling (429).

GET/support/deskssupport:read

List desks

Every Resolve desk your app can act on, across the companies its owner belongs to.

Request
curl -X GET https://api.dbrij.com/api/support/desks \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": [ { "id": "d4e5…", "name": "Acme Support", "code": "ACME", "organizationId": "o3b4…" } ]
}
GET/support/desks/:deskId/scoresupport:read

Desk score

The desk’s honest numbers, machine readable: promises kept, confirmed closes, first reply speed, reopens and CSAT.

PATH / BODY PARAMETERS

deskId*string (path)The desk id.
Request
curl -X GET https://api.dbrij.com/api/support/desks/:deskId/score \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
GET/support/desks/:deskId/ticketssupport:read

List tickets

Tickets on a desk, newest activity first (max 100). Filter to one customer with the email query.

PATH / BODY PARAMETERS

deskId*string (path)The desk id.

QUERY PARAMETERS

emailstringOnly tickets belonging to this customer email.
Request
curl -X GET https://api.dbrij.com/api/support/desks/:deskId/tickets \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": [ { "id": "t9d1…", "reference": "ACME-42", "subject": "Payment failed on checkout", "status": "open", "awaitingReply": true, … } ]
}
POST/support/desks/:deskId/ticketssupport:write

Open a ticket

Open a ticket on a customer’s behalf from inside your own product. The customer is upserted by email on the desk. Metered as support_tickets, one per ticket created.

PATH / BODY PARAMETERS

deskId*string (path)The desk id.
email*stringThe customer’s email.
namestringThe customer’s name.
externalIdstringYour own user id for the customer, for joining on your side.
subject*stringWhat the ticket is about.
body*stringThe customer’s first message.
Request
curl -X POST https://api.dbrij.com/api/support/desks/:deskId/tickets \
  -H "Authorization: Bearer $DBRIJ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "jane@example.com",
  "name": "Jane",
  "externalId": "user_42",
  "subject": "Payment failed on checkout",
  "body": "My card was charged but the order shows unpaid."
}'
Request body
{
  "email": "jane@example.com",
  "name": "Jane",
  "externalId": "user_42",
  "subject": "Payment failed on checkout",
  "body": "My card was charged but the order shows unpaid."
}
Response 200
{
  "success": true,
  "data": {
    "id": "t9d1…",
    "reference": "ACME-42",
    "subject": "Payment failed on checkout",
    "status": "open",
    "statusLabel": "Open",
    "awaitingReply": true,
    "firstReplyDueAt": "2026-07-01T10:00:00.000Z",
    "resolvedAt": null,
    "customerConfirmedAt": null,
    "createdAt": "2026-07-01T09:00:00.000Z",
    "lastMessageAt": "2026-07-01T09:00:00.000Z"
  }
}
GET/support/tickets/:ticketIdsupport:read

Get a ticket

One ticket with its public conversation and timeline. Internal team notes never appear here.

PATH / BODY PARAMETERS

ticketId*string (path)The ticket id.
Request
curl -X GET https://api.dbrij.com/api/support/tickets/:ticketId \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "id": "t9d1…",
    "reference": "ACME-42",
    "status": "resolved",
    "messages": [ { "id": "m1…", "from": "customer", "body": "…", "createdAt": "…" }, { "id": "m2…", "from": "team", "body": "…", "createdAt": "…" } ],
    "timeline": [ { "kind": "opened", "summary": "Ticket opened", "createdAt": "…" } ],
    …
  }
}
POST/support/tickets/:ticketId/messagessupport:write

Relay a customer reply

A reply the customer typed inside your product, landed on the ticket exactly like a portal reply.

PATH / BODY PARAMETERS

ticketId*string (path)The ticket id.
body*stringThe customer’s message.
Request
curl -X POST https://api.dbrij.com/api/support/tickets/:ticketId/messages \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": { "ok": true }
}
POST/support/tickets/:ticketId/filessupport:write

Send the customer’s files

Screenshots or documents from the customer, sent as multipart form data. Stored by Dbrij and posted as one message, with or without words. Up to 5 files of 25 MB each: images, PDFs, Office documents and text files.

PATH / BODY PARAMETERS

ticketId*string (path)The ticket id.
files*file (multipart)One to five files, each under the field name files.
bodystring (multipart)Words to go with them.
Request
curl -X POST https://api.dbrij.com/api/support/tickets/:ticketId/files \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": { "ok": true, "attachments": [ { "id": "…", "name": "screenshot.png", "url": "https://…", "mimeType": "image/png", "sizeBytes": 48211 } ] }
}
POST/support/tickets/:ticketId/confirmsupport:write

Confirm the fix

The customer confirmed the fix inside your product: the honest close. Only a ticket in status resolved can be confirmed; it moves to closed and any linked task closes with it.

PATH / BODY PARAMETERS

ticketId*string (path)The ticket id.
Request
curl -X POST https://api.dbrij.com/api/support/tickets/:ticketId/confirm \
  -H "Authorization: Bearer $DBRIJ_API_KEY"
Response 200
{
  "success": true,
  "data": { "id": "t9d1…", "status": "closed", "customerConfirmedAt": "2026-07-02T08:30:00.000Z", … }
}

Webhook events

Tickets opened through the API carry your app id, so support.ticket.created, support.ticket.replied, support.ticket.resolved, support.ticket.confirmed and support.ticket.closed fire to your webhook URL in the same signed envelope as every other event. Verify X-Dbrij-Signature exactly as described on the Webhooks tab.

The honest close

A ticket never closes because the team says so. The team marks it resolved; it only becomes closed when the customer confirms, either in the portal or through POST /support/tickets/:id/confirm from your product. Build your UI around that: show the fix, ask the customer, send the confirmation.

SDKs and packages

Every SDK and package for Resolve, with what it does, how to install it and the smallest working use. The whole catalogue, for every product, is on the apps page.

  • TypeScript 2 packages
  • JavaScript 1 package
  • Browsers 2 packages
  • React Native 1 package
  • Capacitor 1 package
  • Swift 1 package
  • iOS 2 packages
  • Kotlin 1 package
  • Android 2 packages
  • Dart 1 package
  • Flutter 1 package

resolve-widget.js

A support bubble for any website: one script tag opens your Resolve desk in a panel on the page.

Script for your site · JavaScript · Served by Dbrij · Runs on Browsers

  • A floating bubble opens the desk's portal; your page's styles are never touched
  • Signed users go straight in with a user hash made on your server
  • Tickets start prefilled with your signed in user
  • Matches your page's light or dark theme and the desk's brand colour
  • window.DbrijResolve.identify sets the user after your own sign in
Install
<script src="https://resolve.dbrij.com/resolve-widget.js" data-desk="rk_..." defer></script>
Quick start
<script src="https://resolve.dbrij.com/resolve-widget.js"  data-desk="rk_..."  data-email="ada@example.com"  data-user-hash="HMAC_FROM_YOUR_SERVER"  defer></script>

@dbrij/resolve

Resolve inside Capacitor, Ionic, Cordova and web apps: the support screen, signed sign in and the unread badge.

SDK · TypeScript · npm · Runs on Capacitor, Ionic, Cordova, Browsers, Any runtime with fetch

  • openResolve shows the desk's own support center: tickets, screenshots, replies and fixes to confirm
  • Signed sign in with a user hash from your server, or an emailed code once per device
  • unread gives the badge count and keeps the session in your storage
  • Brand, answers and hours come from the desk, with no app update
  • Zero dependencies
Install
npm install @dbrij/resolve
Quick start
import { openResolve } from '@dbrij/resolve';const screen = openResolve({  desk: 'rk_...',  identity: { email, name, externalId, userHash }, // userHash from your server  onClose: () => {},});// screen.close() from your own back button

@dbrij/resolve-react-native

Resolve for React Native and Expo: your support desk as a screen in your app, with signed sign in, screenshots on tickets and the unread badge.

SDK · TypeScript · npm · Runs on React Native 0.71+, Expo, React 18+

  • ResolveSupport is the desk as a screen in your app
  • useResolveUnread checks on mount, on return to the front and every minute while in front
  • Signed sign in with a user hash from your server
  • Customers attach screenshots to their tickets
  • resolveSignOut ends the session from your own sign out
Install
npm install @dbrij/resolve-react-native react-native-webview
Quick start
import AsyncStorage from '@react-native-async-storage/async-storage';import { ResolveSupport } from '@dbrij/resolve-react-native';export function HelpScreen({ navigation }) {  return (    <ResolveSupport      desk="rk_..."      identity={{ email: user.email, name: user.name, externalId: user.id, userHash: user.resolveHash }}      storage={AsyncStorage}      onClose={() => navigation.goBack()}    />  );}

DbrijResolve

Resolve for iOS in Swift: your support desk as a screen in SwiftUI or UIKit, with signed sign in, screenshots on tickets and the unread badge.

SDK · Swift · Swift Package Manager · Runs on iOS 15+, Swift 5.9+

  • ResolveSupportView for SwiftUI and ResolveSupportViewController for UIKit
  • ResolveClient.unread gives the badge count, with the session kept in the Keychain
  • Signed sign in with a user hash from your server
  • Screenshots on tickets from the photo library or the camera
  • No dependencies
Install
.package(url: "https://github.com/DbrijHQ/resolve-ios", from: "0.1.0")
Quick start
import DbrijResolvelet me = ResolveIdentity(email: user.email, externalId: user.id, userHash: user.resolveHash).sheet(isPresented: $showHelp) {    ResolveSupportView(desk: "rk_...", identity: me) { showHelp = false }}

com.github.DbrijHQ:resolve-android

Resolve for Android in Kotlin: your support desk as a screen in your app, with signed sign in, screenshots on tickets and the unread badge.

SDK · Kotlin · JitPack · Runs on Android 6+ (API 23)

  • ResolveSupport.open shows the desk as a screen that closes with its button or the back gesture
  • ResolveClient.unread gives the badge count from a coroutine
  • Signed sign in with a user hash from your server
  • Screenshots and documents attach through the system picker
Install
// settings.gradle.kts, under dependencyResolutionManagement.repositoriesmaven { url = uri("https://jitpack.io") }// app/build.gradle.ktsimplementation("com.github.DbrijHQ:resolve-android:0.1.0")
Quick start
import com.dbrij.resolve.ResolveIdentityimport com.dbrij.resolve.ResolveSupportResolveSupport.open(    context,    desk = "rk_...",    identity = ResolveIdentity(email = user.email, externalId = user.id, userHash = user.resolveHash),)

dbrij_resolve

Resolve for Flutter: your support desk as a screen in your app, with signed sign in, screenshots on tickets and the unread badge.

SDK · Dart · pub.dev · Runs on Flutter 3.16+, iOS, Android

  • ResolveSupport is the desk as a widget you push like any screen
  • ResolveClient.unread gives the badge count
  • Signed sign in with a user hash from your server
  • Screenshots through the system file picker on Android and the photo library on iOS
  • signOut ends the session from your own sign out
Install
flutter pub add dbrij_resolve
Quick start
final resolve = ResolveClient(desk: 'rk_...', storage: MyStorage());Navigator.of(context).push(MaterialPageRoute(  builder: (ctx) => Scaffold(    body: SafeArea(      child: ResolveSupport(        desk: 'rk_...',        client: resolve,        identity: ResolveIdentity(email: user.email, externalId: user.id, userHash: user.resolveHash),        onClose: () => Navigator.of(ctx).pop(),      ),    ),  ),));

Dbrij is Nigeria’s company operating system: the first Nigerian built platform to put team chat, video meetings, email, HR, tax compliant payroll, customer support, marketing, analytics and cloud hosting in one product on one subscription.

Everything on Dbrij

More from Dbrij