One REST call per flight segment. Works with SAP Concur, Amadeus cytric, TravelPerk, or any system that stores IATA airport codes. Returns CO₂ per the ICAO CEC v13.1 methodology — what GHG Protocol recommends for Scope 3 Category 6 business travel reporting.
No native integration required. If your TMS knows origin, destination, and cabin class — you can calculate Scope 3 emissions today.
IATA codes
Only input needed
<100 ms
Per segment
GHG Protocol
Scope 3 Cat. 6
No vendor lock
Any TMS
Integration pattern
Pull trip segments from your TMS via webhook, API, or CSV export. You need: origin IATA, destination IATA, cabin class. Aircraft type is optional but improves accuracy.
POST one request per segment. The API returns co2_kg, co2_with_rfi_kg, confidence_score, and full methodology reference. Under 100 ms. Process 1,000 trips in seconds.
Store co2_kg linked to your employee, cost center, and trip IDs. Sum at year-close: divide by 1,000 to get tCO₂e. Paste into your ESRS E1-6 or CDP C6.5 template.
TMS compatibility
No partnership or native connector needed — just IATA codes.
SAP Concur
CompatibleTrips v2 API / webhook
Fields: OriginLocation, DestinationLocation, ClassOfService, Equipment
Webhook fires on TripApproved — calculate CO₂ before travel happens for pre-trip approval workflows.
Amadeus cytric
CompatiblePNR export / cytric API
Fields: Origin, Destination, CabinClass, EquipmentCode from PNR segments
GDS-sourced bookings include equipment code (e.g. 359, 77W) — enables exact aircraft matching.
TravelPerk
CompatibleTrips webhook / Trips API
Fields: origin, destination, cabin_class in segment objects
TravelPerk's Trips API returns segments with cabin class directly — straightforward field mapping.
Custom / in-house booking
CompatibleCSV export or internal API
Fields: Any store of IATA codes + cabin class
Batch via CSV: export trips, enrich with co2_kg, import back. See Python example below.
Integration code
// SAP Concur → Carbon API integration
// Triggered via Concur Trips v2 webhook on TripApproved event
async function onConcurTripApproved(event) {
const { segments } = event.trip.itinerary;
const results = await Promise.all(
segments.map(seg =>
fetch("https://aviation-api.logostream.dev/v1/carbon", {
method: "POST",
headers: {
"x-api-key": process.env.AVIATION_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: seg.OriginLocation, // IATA code from Concur
to: seg.DestinationLocation, // IATA code from Concur
cabin_class: mapConcurCabin(seg.ClassOfService),
passengers: 1,
aircraft: seg.Equipment ?? undefined, // e.g. "359", "77W"
}),
}).then(r => r.json())
)
);
// Store per-segment CO₂ linked to your booking ID
await db.tripEmissions.insertMany(
results.map((r, i) => ({
booking_id: event.trip.id,
employee_id: event.trip.userId,
segment_index: i,
co2_kg: r.sustainability_metrics.passenger_footprint.co2_kg,
co2_rfi_kg: r.sustainability_metrics.passenger_footprint.co2_with_rfi_kg,
confidence: r.confidence_score,
methodology: r.sustainability_metrics.methodology,
}))
);
}
function mapConcurCabin(classOfService) {
if (["F", "A", "P"].includes(classOfService)) return "first";
if (["C", "J", "D", "I"].includes(classOfService)) return "business";
if (["W", "S"].includes(classOfService)) return "premium_economy";
return "economy";
}FAQ
Free tier: 1,000 calculations/month. No credit card. Enterprise plans for high-volume annual report batch runs available on request.