Skip to main content

Emissions & LDAR API Guide

The Emissions API provides comprehensive Leak Detection and Repair (LDAR) capabilities through three specialized subgraphs: su-methane-ldar-backend, su-methane-reconcile-backend, and su-detections-ingress.

Overview

The Emissions API enables you to:
  • Track and manage emission observations (detections)
  • Coordinate LDAR inspection workflows
  • Reconcile emissions for compliance reporting
  • Ingest detection data from various sources

Key Concepts

  • Emission Observation: A detected emission event requiring investigation
  • Detection: Raw detection data from sensors, flyovers, satellites, etc.
  • Inspection Request: Request for follow-up inspection (OGI, drone, visual)
  • Reconciliation: Process of matching emissions to compliance requirements
  • Clue: Additional context about a detection (equipment, location, etc.)

Emission Observations

Query Emission Observations

query GetEmissionObservations($first: Int!, $after: String) {
  emissionObservations {
    all(first: $first, after: $after) {
      edges {
        node {
          id
          displayName
          priority
          status
          detectionType
          phenomenonTime
          receivedAt
          geometry {
            type
            coordinates
          }
          audit {
            createdTime
            acknowledgedTime
            acknowledgedBy {
              userId
            }
          }
        }
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}

Get Specific Emission Observation

query GetEmissionObservation($id: ID!) {
  emissionObservations {
    byId(id: $id) {
      id
      displayName
      priority
      status
      detectionType
      phenomenonTime
      geometry {
        type
        coordinates
      }
      clues {
        clueId
        clue {
          displayName
          equipment {
            id
            name
          }
        }
      }
      inspectionRequests {
        inspectionRequestId
        inspectionRequest {
          id
          inspectionType
          status
          additionalComment
        }
      }
    }
  }
}

Detection Types

TypeDescriptionCommon Source
DETECTION_TYPE_SATELLITESatellite-based detectionRemote sensing
DETECTION_TYPE_FLYOVERAircraft-based detectionAerial surveys
DETECTION_TYPE_DRONEDrone-based detectionUAV inspection
DETECTION_TYPE_OGIOptical Gas ImagingGround inspection
DETECTION_TYPE_CMSContinuous Monitoring SystemFixed sensors
DETECTION_TYPE_OWDOn-site Walk DownManual inspection
DETECTION_TYPE_VENTING_FLARING_BLOWDOWNPlanned releasesOperations

Detection Status Workflow

Priority Levels

PriorityInteger ValueDescription
DETECTION_PRIORITY_HIGH100Requires immediate attention
DETECTION_PRIORITY_MEDIUM50Normal priority
DETECTION_PRIORITY_LOW1Low priority or informational

Inspection Requests

Inspection requests coordinate follow-up investigations of emission observations.

Create Inspection Request

mutation CreateInspectionRequest($input: CreateInspectionRequestInput!) {
  createInspectionRequest(input: $input) {
    inspectionRequest {
      id
      detectionReference {
        detectionId
      }
      inspectionType
      status
      additionalComment
      audit {
        createdTime
        createdBy {
          userId
        }
      }
    }
    correlationId
    errors {
      message
      type
    }
  }
}
Variables:
{
  "input": {
    "detectionReference": {
      "detectionId": "detection-123"
    },
    "inspectionType": "INSPECTION_OGI",
    "additionalComment": "High priority - investigate equipment leak",
    "clues": [
      {
        "clueId": "clue-456"
      }
    ],
    "requestedBy": {
      "givenName": "John",
      "familyName": "Doe",
      "email": "john.doe@example.com"
    }
  }
}

Update Inspection Request

mutation UpdateInspectionRequest($input: UpdateInspectionRequestInput!) {
  updateInspectionRequest(input: $input) {
    inspectionRequest {
      id
      status
      additionalComment
    }
    correlationId
    errors {
      message
      type
    }
  }
}

Query Inspection Requests

query GetInspectionRequests($detectionId: ID!) {
  emissionObservations {
    byId(id: $detectionId) {
      inspectionRequests {
        inspectionRequestId
        inspectionRequest {
          id
          inspectionType
          status
          additionalComment
          requestedBy {
            givenName
            familyName
            email
          }
          audit {
            createdTime
            updatedTime
          }
        }
      }
    }
  }
}

Inspection Types

TypeDescriptionTypical Use
INSPECTION_OGIOptical Gas ImagingConfirm and locate leaks
INSPECTION_DRONEDrone inspectionAerial investigation

Clues (Equipment Context)

Clues provide context about where an emission was detected.

Query Clues for Detection

query GetDetectionClues($detectionId: ID!) {
  emissionObservations {
    byId(id: $detectionId) {
      clues {
        clueId
        clue {
          displayName
          equipment {
            id
            name
            description
            siteReference {
              siteId
            }
            components {
              name
              componentType
            }
          }
        }
      }
    }
  }
}

Equipment Components

query GetEquipmentComponents($equipmentId: ID!) {
  equipment {
    byId(id: $equipmentId) {
      id
      name
      components {
        name
        componentType
        description
      }
    }
  }
}

Resolution Modes

When resolving emission observations:
ModeDescription
DETECTION_RESOLVED_CORRELATEDCorrelated with another detection
DETECTION_RESOLVED_FALSE_ALARMDetermined to be false positive
DETECTION_RESOLVED_READY_TO_RECONCILEReady for compliance reconciliation

Resolve Detection

mutation ResolveDetection($input: ResolveDetectionInput!) {
  resolveDetection(input: $input) {
    emissionObservation {
      id
      status
      resolutionMode
    }
    correlationId
    errors {
      message
      type
    }
  }
}
Variables:
{
  "input": {
    "detectionId": "detection-123",
    "resolutionMode": "DETECTION_RESOLVED_READY_TO_RECONCILE",
    "notes": "Verified and repaired, ready for compliance reporting"
  }
}

Emission Observation Reports

Query Reports by Site and Month

query GetEmissionReports($siteId: ID!, $month: String!) {
  sites {
    byId(id: $siteId) {
      emissionObservationReports(month: $month) {
        edges {
          node {
            month
            totalDetections
            resolvedDetections
            pendingDetections
            highPriorityCount
            complianceStatus
          }
        }
      }
    }
  }
}
Variables:
{
  "siteId": "site-123",
  "month": "2025-11"
}

Filter Reports

query FilteredReports($filter: InboxDetectionFilter!) {
  emissionObservations {
    reports(filter: $filter) {
      edges {
        node {
          id
          displayName
          priority
          status
        }
      }
    }
  }
}

Detection Ingress

The su-detections-ingress subgraph handles incoming detection data.

Query Available Datasets

query GetDetectionDatasets($group: ID) {
  detectionsIngressDatasets(group: $group) {
    datasetId
    metadataJson
  }
}

Reload Datasets

mutation ReloadDatasets($group: ID) {
  reloadDetectionsIngressDatasets(group: $group) {
    datasetId
    metadataJson
  }
}

Reconciliation Workflow

The su-methane-reconcile-backend handles compliance reconciliation.

Query Reconciliation Status

query GetReconciliationStatus($siteId: ID!, $month: String!) {
  reconciliation {
    bySiteAndMonth(siteId: $siteId, month: $month) {
      status
      totalEmissions
      reconciledEmissions
      pendingEmissions
      complianceSeverity
      lastUpdated
    }
  }
}

Submit for Reconciliation

mutation SubmitForReconciliation($input: SubmitReconciliationInput!) {
  submitForReconciliation(input: $input) {
    reconciliation {
      id
      status
      submittedAt
    }
    correlationId
    errors {
      message
      type
    }
  }
}

Compliance Severity

SeverityDescription
HIGHCritical compliance issue
MEDIUMModerate compliance concern
LOWMinor compliance matter

Geospatial Queries

Get Detections Near Location

query GetNearbyDetections($center: GeoJSONGeometryInput!, $radius: Float!) {
  emissionObservations {
    near(center: $center, radius: $radius) {
      edges {
        node {
          id
          displayName
          geometry {
            type
            coordinates
          }
          distance
        }
      }
    }
  }
}
Variables:
{
  "center": {
    "type": "Point",
    "coordinates": [-114.0719, 51.0447]
  },
  "radius": 1000
}

Audit & Acknowledgment

Acknowledge Detection

mutation AcknowledgeDetection($input: AcknowledgeDetectionInput!) {
  acknowledgeDetection(input: $input) {
    emissionObservation {
      id
      audit {
        acknowledgedTime
        acknowledgedBy {
          userId
        }
      }
    }
    correlationId
    errors {
      message
      type
    }
  }
}

Query Acknowledgment History

query GetAcknowledgmentHistory($detectionId: ID!) {
  emissionObservations {
    byId(id: $detectionId) {
      audit {
        createdTime
        createdBy {
          userId
        }
        updatedTime
        updatedBy {
          userId
        }
        acknowledgedTime
        acknowledgedBy {
          userId
        }
      }
    }
  }
}

Common Patterns

Processing New Detections

// Query new detections
const newDetections = await query(`
  query {
    emissionObservations {
      all(first: 100, filter: { status: DETECTION_STATUS_NEW }) {
        edges {
          node {
            id
            priority
            detectionType
            phenomenonTime
          }
        }
      }
    }
  }
`)

// Prioritize and create inspection requests
for (const detection of newDetections.filter(d => d.priority === 'HIGH')) {
  await createInspectionRequest({
    detectionId: detection.id,
    inspectionType: 'INSPECTION_OGI'
  })
}

Tracking Inspection Progress

const inspectionStatuses = [
  'INSPECTION_STATUS_REQUESTED',
  'INSPECTION_STATUS_SCHEDULED',
  'INSPECTION_STATUS_COMPLETED'
]

for (const status of inspectionStatuses) {
  const count = await countInspections({ status })
  console.log(`${status}: ${count} inspections`)
}

Best Practices

  1. Prioritize high-severity detections: Focus on DETECTION_PRIORITY_HIGH first
  2. Track acknowledgment: Always acknowledge when reviewing detections
  3. Use clues for context: Clues help identify specific equipment and components
  4. Monitor status transitions: Track detections through the complete workflow
  5. Coordinate inspections: Link inspection requests to specific detections
  6. Reconcile regularly: Don’t let pending emissions accumulate
  7. Use geospatial queries: Find nearby detections to optimize field work
  8. Archive resolved detections: Keep historical data for compliance

Schema Reference