projectadg last reviewed 2026-05-21

Xero API Gateway โ€” unified accounting access for 5 orgs

Context

Aspire runs 5 separate Xero organizations (one per entity: ADG, AHG, Six Degrees, Chanya Thai, Venice). Agents + apps need programmatic access to accounting data across all of them, but Xero's OAuth + per-org token management is painful. The Xero API Gateway wraps all 5 orgs behind a single authenticated HTTP surface.

Architecture

graph LR TANDA["Tanda payroll"] --> XG APP["apps + agents"] --> XG XG["Xero API Gateway<br/>X-API-Key"] --> ADG[("adg")] XG --> AHG[("ahg")] XG --> SIX[("sixdegree")] XG --> CHA[("chanyathai")] XG --> VEN[("venice")] classDef gw fill:#715EE3,color:#fff,stroke:#291F50; class XG gw;

Detail

The gateway (LIVE)

Known issue: MCP wrappers broken

Per MEMORY.md reference_xero_gateway:

The 5 Xero orgs

Org slugEntityUsed for
adgAspire Digital GroupHolding/parent accounting
ahgAspire Hospitality GroupHospitality holdco
sixdegreeSix Degrees venuePer-venue P&L
chanyathaiChanya Thai venuePer-venue P&L
veniceVenice Albany venuePer-venue P&L

Note: org names like chanyathai and sixdegree are Aspire AU entities (not Thai), per aspire-venue-geography.

What it exposes

Relationship to payroll flow

The Xero gateway is the "money movement" half of the payroll pipeline described in payroll-via-tanda:

Tanda (rosters/timesheets) โ†’ Xero (per-venue org) โ†’ bank file + STP to ATO

Relationship to other tools

Open questions

  1. When to fix the broken MCP wrappers vs just standardizing on curl + X-API-Key?
  2. When does Zinga Ledgr replace one org's Xero?
  3. Should the gateway cache aggressively (Xero rate limits) or stay real-time?

Related

๐Ÿ”— Relationships

graph LR xero_api_gateway["xero-api-gateway"]:::self xero_api_gateway --> aspire_venue_geography["aspire-venue-geography"] xero_api_gateway --> payroll_via_tanda["payroll-via-tanda"] xero_api_gateway --> zinga_suite["zinga-suite"] xero_api_gateway --> smart_dashboard["smart-dashboard"] classDef self fill:#715EE3,color:#fff,stroke:#291F50;