# Zendesk AI Billing & Outcome Auditor - Reconcile (`factrelay/reconcile`) Actor

Audit Zendesk AI billing and Resolution Allowance outcomes against sanitized evidence and buyer rules. Reconcile separates supported charges, potential disputes, business-value variance, and unverifiable items for finance, CX, automation, and AI-agent workflows.

- **URL**: https://apify.com/factrelay/reconcile.md
- **Developed by:** [Liou](https://apify.com/factrelay) (community)
- **Categories:** AI, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.49 / completed reconcile audit

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zendesk AI Billing Audit & Resolution Allowance Reconciliation

Reconcile is an independent **Zendesk AI billing audit** for buyers. It checks sanitized Zendesk AI outcome evidence against billed Resolution Allowance rows and your own acceptance rules, then separates supported charges, potential billing disputes, business-value variance, and items that cannot be verified.

**No Zendesk password required. No transcripts required.** The Store edition is designed for sanitized, structured facts only.

Want to see it work first? Open the Actor input and run the prefilled synthetic example. It produces a real structured audit result without using customer data.

### Use this Actor when

Use Reconcile for **Resolution Allowance reconciliation** when you need to:

- audit Zendesk AI billing against outcome evidence,
- identify charges that deserve a billing or contract review,
- separate vendor-valid charges from outcomes that failed your own business-value policy,
- quantify billed, disputed, business-variance, and unverifiable units and amounts,
- feed a deterministic audit result into finance, CX, procurement, automation, or AI-agent workflows.

A business-value variance does **not** automatically mean vendor overbilling. Reconcile keeps vendor billing validity and buyer business acceptance separate.

### What you get

Each successful run writes one privacy-safe dataset item containing:

- vendor billed units and amount,
- potential contract-dispute units and amount,
- business-value variance units and amount,
- unverifiable units,
- pseudonymous finding IDs,
- evidence-backed reason codes and deterministic classifications.

The Dataset Overview puts financial totals first. Detailed findings stay in the same item for API, workflow, and AI-agent use.

### For AI agents and automation

AI agents should call Reconcile when the task is to **audit, reconcile, verify, or review Zendesk AI Resolution Allowance billing** from already-sanitized structured facts.

Good tool-selection intents include:

- "audit this Zendesk AI bill",
- "check Resolution Allowance charges",
- "reconcile Zendesk AI outcomes with billing",
- "find potential AI billing disputes",
- "separate AI billing validity from business-value failures".

The input and output contracts are structured and deterministic, so an agent does not need to interpret free-form transcripts. Missing or ambiguous evidence fails closed to `UNVERIFIABLE` instead of being guessed.

### Privacy boundary

**Do not upload transcripts, customer names, email addresses, phone numbers, addresses, credentials, or raw resolution reasoning.** This Actor intentionally accepts only sanitized facts needed for reconciliation.

Instead of raw `automated_resolution_reasoning`, provide `automated_resolution_reasoning_present: true` or `false`. Use opaque Zendesk conversation IDs or your own consistent pseudonymous IDs for `conversation_id`, `platform_conversation_id`, and `case_ref`.

Buyer event evidence IDs are generated inside the Actor and do not need to be supplied.

### Input

The Actor accepts four top-level fields:

- `conversations`: sanitized Zendesk outcome evidence,
- `billing`: billed outcome rows; money is supplied as decimal strings,
- `events`: optional buyer-side facts such as reopen, human rework, negative feedback, duplicate link, or explicit unresolved status,
- `policy`: deterministic buyer acceptance settings such as the reopen window.

The pricing/rule model is fixed to `zendesk-resolution-allowance-2026`. Reconcile does not assume a universal Zendesk dollar price; supplied billing amounts and rates remain authoritative for money math.

Example buyer policy:

```json
{
  "reopen_window_days": 7,
  "human_rework_invalidates": true,
  "duplicate_invalidates": true,
  "negative_feedback_invalidates": true,
  "explicit_unresolved_invalidates": true
}
```

### Global and multilingual use

The Store page is English-first so people and AI agents can discover it globally. The audit contract itself is language-neutral: classifications, reason codes, timestamps, currencies, and money values are structured data.

Reconcile performs no transcript-language interpretation or translation. That is deliberate: translation or free-form language analysis could change audit meaning and is not required for this deterministic rule pack.

### Current scope

This release supports the 2026 Zendesk Resolution Allowance rule pack. It does not log in to Zendesk, use OAuth, fetch customer data, submit disputes, or perform realtime synchronization.

For sensitive audits where raw exports must remain inside the customer's environment, use the local/private Reconcile workflow instead of uploading raw data to Apify. The Apify Actor is intended for sanitized audits, developer integrations, AI-agent discovery, automation workflows, and one-off checks.

Synthetic examples demonstrate functionality only and do not establish a real-world billing error or savings rate.

# Actor input Schema

## `conversations` (type: `array`):

JSON array of only the audit facts Reconcile needs. Use opaque Zendesk IDs; replace raw reasoning text with automated\_resolution\_reasoning\_present true/false.

## `billing` (type: `array`):

JSON array of billed outcome rows. Money must be decimal strings or null. Pricing model is fixed to the supported Zendesk 2026 resolution-allowance rule pack.

## `events` (type: `array`):

Optional deterministic buyer events. Event evidence IDs are generated inside the Actor; do not include free-text evidence.

## `policy` (type: `object`):

Deterministic business acceptance rules. The policy version is generated by the Actor; no customer label is stored in output.

## Actor input object example

```json
{
  "conversations": [
    {
      "conversation_id": "sample-accepted",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:00:00+00:00"
    },
    {
      "conversation_id": "sample-dispute",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": true,
      "conversation_end_time": "2026-08-01T10:05:00+00:00"
    },
    {
      "conversation_id": "sample-rework",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:10:00+00:00"
    },
    {
      "conversation_id": "sample-unverifiable",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": false,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:15:00+00:00"
    }
  ],
  "billing": [
    {
      "case_ref": "sample-accepted",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-dispute",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-rework",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-unverifiable",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    }
  ],
  "events": [
    {
      "case_ref": "sample-rework",
      "event_type": "HUMAN_REWORK",
      "event_at": "2026-08-01T11:00:00+00:00",
      "same_issue": true
    }
  ],
  "policy": {
    "reopen_window_days": 7,
    "human_rework_invalidates": true,
    "duplicate_invalidates": true,
    "negative_feedback_invalidates": true,
    "explicit_unresolved_invalidates": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One privacy-safe audit item with financial summary and findings.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "conversations": [
        {
            "conversation_id": "sample-accepted",
            "automated_resolution": true,
            "automated_resolution_reasoning_present": true,
            "last_resolution": "VERIFIED",
            "test_mode": false,
            "conversation_end_time": "2026-08-01T10:00:00+00:00"
        },
        {
            "conversation_id": "sample-dispute",
            "automated_resolution": true,
            "automated_resolution_reasoning_present": true,
            "last_resolution": "VERIFIED",
            "test_mode": true,
            "conversation_end_time": "2026-08-01T10:05:00+00:00"
        },
        {
            "conversation_id": "sample-rework",
            "automated_resolution": true,
            "automated_resolution_reasoning_present": true,
            "last_resolution": "VERIFIED",
            "test_mode": false,
            "conversation_end_time": "2026-08-01T10:10:00+00:00"
        },
        {
            "conversation_id": "sample-unverifiable",
            "automated_resolution": true,
            "automated_resolution_reasoning_present": false,
            "last_resolution": "VERIFIED",
            "test_mode": false,
            "conversation_end_time": "2026-08-01T10:15:00+00:00"
        }
    ],
    "billing": [
        {
            "case_ref": "sample-accepted",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD"
        },
        {
            "case_ref": "sample-dispute",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD"
        },
        {
            "case_ref": "sample-rework",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD"
        },
        {
            "case_ref": "sample-unverifiable",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD"
        }
    ],
    "events": [
        {
            "case_ref": "sample-rework",
            "event_type": "HUMAN_REWORK",
            "event_at": "2026-08-01T11:00:00+00:00",
            "same_issue": true
        }
    ],
    "policy": {
        "reopen_window_days": 7,
        "human_rework_invalidates": true,
        "duplicate_invalidates": true,
        "negative_feedback_invalidates": true,
        "explicit_unresolved_invalidates": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("factrelay/reconcile").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "conversations": [
        {
            "conversation_id": "sample-accepted",
            "automated_resolution": True,
            "automated_resolution_reasoning_present": True,
            "last_resolution": "VERIFIED",
            "test_mode": False,
            "conversation_end_time": "2026-08-01T10:00:00+00:00",
        },
        {
            "conversation_id": "sample-dispute",
            "automated_resolution": True,
            "automated_resolution_reasoning_present": True,
            "last_resolution": "VERIFIED",
            "test_mode": True,
            "conversation_end_time": "2026-08-01T10:05:00+00:00",
        },
        {
            "conversation_id": "sample-rework",
            "automated_resolution": True,
            "automated_resolution_reasoning_present": True,
            "last_resolution": "VERIFIED",
            "test_mode": False,
            "conversation_end_time": "2026-08-01T10:10:00+00:00",
        },
        {
            "conversation_id": "sample-unverifiable",
            "automated_resolution": True,
            "automated_resolution_reasoning_present": False,
            "last_resolution": "VERIFIED",
            "test_mode": False,
            "conversation_end_time": "2026-08-01T10:15:00+00:00",
        },
    ],
    "billing": [
        {
            "case_ref": "sample-accepted",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD",
        },
        {
            "case_ref": "sample-dispute",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD",
        },
        {
            "case_ref": "sample-rework",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD",
        },
        {
            "case_ref": "sample-unverifiable",
            "billing_period": "2026-08",
            "resolution_tier": "VERIFIED",
            "billed_units": 1,
            "unit_rate": "1.00",
            "billed_amount": "1.00",
            "currency": "USD",
        },
    ],
    "events": [{
            "case_ref": "sample-rework",
            "event_type": "HUMAN_REWORK",
            "event_at": "2026-08-01T11:00:00+00:00",
            "same_issue": True,
        }],
    "policy": {
        "reopen_window_days": 7,
        "human_rework_invalidates": True,
        "duplicate_invalidates": True,
        "negative_feedback_invalidates": True,
        "explicit_unresolved_invalidates": True,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("factrelay/reconcile").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "conversations": [
    {
      "conversation_id": "sample-accepted",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:00:00+00:00"
    },
    {
      "conversation_id": "sample-dispute",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": true,
      "conversation_end_time": "2026-08-01T10:05:00+00:00"
    },
    {
      "conversation_id": "sample-rework",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": true,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:10:00+00:00"
    },
    {
      "conversation_id": "sample-unverifiable",
      "automated_resolution": true,
      "automated_resolution_reasoning_present": false,
      "last_resolution": "VERIFIED",
      "test_mode": false,
      "conversation_end_time": "2026-08-01T10:15:00+00:00"
    }
  ],
  "billing": [
    {
      "case_ref": "sample-accepted",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-dispute",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-rework",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    },
    {
      "case_ref": "sample-unverifiable",
      "billing_period": "2026-08",
      "resolution_tier": "VERIFIED",
      "billed_units": 1,
      "unit_rate": "1.00",
      "billed_amount": "1.00",
      "currency": "USD"
    }
  ],
  "events": [
    {
      "case_ref": "sample-rework",
      "event_type": "HUMAN_REWORK",
      "event_at": "2026-08-01T11:00:00+00:00",
      "same_issue": true
    }
  ],
  "policy": {
    "reopen_window_days": 7,
    "human_rework_invalidates": true,
    "duplicate_invalidates": true,
    "negative_feedback_invalidates": true,
    "explicit_unresolved_invalidates": true
  }
}' |
apify call factrelay/reconcile --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,factrelay/reconcile"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VMbgcdqFWo1tQBphU/builds/IUXi4ryeddhdBqT3b/openapi.json
