When a Granite circuit goes down, SmartTile opens the Granite repair ticket over the customer's own Granite API, then pulls Granite's status and notes into the Rev.io ticket every 30 minutes. Joey only phones Granite if the API cannot do it.
/customer/tickets, /customer/services) secured by Okta OAuth2 client credentials — the customer's own Granite credentials, held on their own SmartTile instance.POST /customer/tickets, journals the Granite ticket number into Rev.io, and a 30-minute poller posts Granite's status and notes to Rev.io until it closes.Granite issues API credentials to the end customer, not to SmartChoice. So SmartTile never copies them: the customer's Granite client ID and secret stay on the customer's own SmartTile instance, and CarrierAutomate asks that instance to open or read the ticket over an SSH bridge, getting back a one-line answer. The result is a Granite repair ticket opened in seconds, with no call placed. Joey Circuits, our voice agent, is the fallback when the API genuinely fails.
| The moment | Today | With SmartTile |
|---|---|---|
| A Granite circuit goes down | Someone calls Granite, finds the child account, reads out the circuit and the site contact. | The gate opens the ticket through the owning SmartTile: summary, circuit, site address, outage time, SmartChoice reference and the on-site contact. |
| The ticket number | Copied by hand into the internal ticket. | Written to the SmartTile carrier ticket and posted as an internal Rev.io journal: "trouble ticket … opened directly with Granite … No carrier call was placed." |
| Keeping up with Granite | Call back, or log in to the Granite portal. | Every 30 minutes SmartTile reads Granite's status and notes and posts them to Rev.io only when something changed. |
| The API has a bad day | — | The failure is journalled and Joey calls Granite instead (fallback on by default). Each failed attempt is a strike; 10 strikes hands the ticket to a live engineer. |
The customer's Granite account team issues an Okta OAuth2 client ID and secret, the Okta token URL and the scope.
On the customer's own SmartTile: CarrierAutomate → Granite. Every field has an ⓘ that says what it is and where to get it.
The Data Sync Test checks which SmartTile owns the circuits, that it gets a Granite token, and reads a Granite ticket back.
API-first is on by default. SuperAdmin → Granite API shows the switches, the poller and every ticket it opened.
<okta token URL>grant_type=client_credentials with the Basic-auth client ID/secret/customer/ticketsOpen the repair ticket (summary ≤ 100 chars + rich description)/customer/tickets?status=&page[number]=Read tickets, paginated — status and notes for the poller/customer/servicesGranite service inventory, for matching circuits and import/customer/tickets/{id}/notesAdd a comment to a Granite ticket/customer/tickets/{id}Update a ticket/customer/tickets/{id}/escalateEscalate a ticket/customer/tickets/{id}/cancelCancel a ticketGranite API — trouble ticket 7012345 opened directly with Granite in 3,120 ms.
Circuit: 01234567 — Head Office, 123 Example St
No carrier call was placed. Status updates will be pulled from the Granite API and posted here automatically.
The client ID and secret stay on the customer's SmartTile, encrypted at rest; the access token is cached encrypted too. The platform only receives the bridge's answer.
Granite API first (on), Fall back to Joey (on), Kill switch (off) — plus the 30-minute poller switch, all on SuperAdmin → Granite API.
Every journal post is audited; a note is posted only when Granite's status or notes changed; each failed API attempt counts toward the 10-strike hand-off.
| Question | Answer |
|---|---|
| Does SmartTile close the Granite ticket? | No — closing is not part of this integration. SmartTile records when Granite reports the ticket closed. |
| Does Granite push updates to us? | A Granite webhook is registered but has not delivered events; the 30-minute poller is the path that works, and any stored webhook delivery triggers an immediate sync. |
| What if the API is down? | Joey phones Granite with the same data package, and the journal says why the API was not used. |