Developer Guide


Prerequisites

Before data that is sent to the API can be routed to field responders, IamResponding will need several pieces of information:

  • A unique criteria for triggering an incident.alert to be delivered to a field agency (i.e. a new incident.details.id field value has been received).
  • If the x-recipient-id header is not being used in the API call, it will be necessary to identify a data field that specifies which field agencies the data should be delivered to (i.e. "Station_ID", "agency", etc.). See the Routing Incident Data section for more information.
  • A field that specifies a unique identifier for the incident that is common to all agencies assigned to the incident.(i.e. "incident_ID", "EID", etc.)
  • If the IaR CAD Incident Schema is not being used to send data, it will be necessary to provide IamResponding with guidance for how to map fields from the incoming data to the IaR schema fields so that the information can be correctly presented in the IamResponding mobile application. See the section on Data Format and some examples.

This information should be provided to [email protected].

If data is sent in a format other than the IaR Incident Schema, API calls may fail until IamResponding has implemented a receiver for the nonstandard data.

Authentication

An API key is required to send data to the IaR CAD Incident API. This API key must be included in the x-api-key header field in the HTTP POST request. To obtain an API key, please contact [email protected].

API Endpoints

CAD incident data can be sent to the API via a HTTP POST endpoint.

Routing Incident Data

There are two methods than can be used to route CAD Incidentdata to specific IamResponding subscriber agencies:

Method 1 - X-Recipient-Id Header in the HTTP POST request

When this method is used, the CAD system making the API calls is responsible for specifying which IamResponding subscriber agencies should receive the data that is being sent. Each IamResponding subscriber is assigned a unique Recipient Id. Populating the HTTP POST request with one or more X-Recipient-Id headers.containing the agency Recipient Id(s) will route the data to the specified agencies. To obtain a list of IamResponding Recipient Id values for your jurisdiction, please contact [email protected].

Sample Recipient Id Table

IaR Recipient IdAgency Name
54321abcSunnydale Fire Department
12345defCripple Creek Rescue Squad
56789ghiMetro Fire Station 1
56789ghjMetro Fire Station 2
68534abcKing's Point VFD Fire Calls
68534abdKing's Point VFD EMS Calls

Method 2 - Routing via CAD data field

When this method is used, a field in the received CAD data is used to route the data to the appropriate IamResponding subscriber agencies. For example, if the CAD data contains an agency field, the value(s) in that field can be mapped to specific IamResponding subscriber agencies. This mapping is performed by the IamResponding CAD Incident routing system. API users wishing to use this routing method must provide IamResponding with the name of the data field to be used for routing along with a table that specifies which values in the field map to the IamResponding subscriber agencies. Please contact [email protected] to set up CAD field incident routing.

Sample Field Mapping Table

CAD "agency" Field ValueAgency Name
SFDSunnydale Fire Department
CCRCripple Creek Rescue Squad
MF1Metro Fire Station 1
MF2Metro Fire Station 2
KPFKing's Point VFD Fire Calls
KPEKing's Point VFD EMS Calls

Data Format

Regardless of which endpoint is used, the preferred data format is JSON using the IaR CAD Incident Schema. However, other data formats can be ingested and utilized.

If the data will be sent in a format other than the IaR schema, please provide data samples to [email protected] along with how fields in the data that is provided should be mapped to the fields in the IaR CAD Incident Schema. Examples can be found here.

Data Display in the IamResponding mobile app

This section shows how the data fields in the IaR CAD Incident Schema are presented to field responders in the IamResponding mobile app.

Incident Header Data

Certain data from the incident.Header data object will be presented in the IamResponding mobile app as shown:

Incident Details Data

All data from the incident.details object will be presented in Key: Value format in the Incident Details portion of the Incident Card in the order shown below. Data sent to the API may include additional fields in the incident.details object that are not described in the IaR CAD Incident Schema and they will still be displayed in this area underneath the standard schema fields.

911 Caller Data

All data from the incident.details.callers array will be presented in Key: Value format in the 911 Caller portion of the Incident Card in the order shown below. Data sent to the API may include additional fields in the caller objects that are not described in the IaR CAD Incident Schema and they will still be displayed in this area.

Incident Units Data

All units from the incident.units array with status field values of "Dispatched", "Enroute", and "On Scene" will be grouped in the top three areas of the Units portion of the Incident Card as shown below. Units with other values in the Status field will be displayed lower in the card.

Incident Comments

All Comments in the incident.comments array will be displayed in the Comments portion of the Incident Card as shown below. The newest comments will be at the top of the display with a red dot indicating that the comment is new since the last time the data was viewed.

Data Field Mapping Examples

Data formats other than the IaR CAD Incident JSON schema can be consumed if documentation is provided that describes how to map the incoming data into the IaR CAD IncidentJSON schema fields. Some examples of this type of documentation are provided below.

Mapping to Spillman CAD fields

Sample output from Spillman CAD:

Sample Field Mapping Table for Spillman CAD

Spillman CAD Field NameIamResponding CAD Incident Field Name
LongTermCallIdincident.details.commonId
CallTypeLawFireEMSincident.headers.type
incident.Natureincident.headers.subType
RespondToAddressincident.headers.address
CityCodeincident.headers.municipality
CallPriorityincident.headers.priority
RelatedRecordNumberincident.details.id
AgencyCodeincident.details.agency
CallZoneCodeincident.details.zone
StatusCodeOfCallincident.details.status
Responsibleunit.umberincident.units.unit.id
TimeDateReportedincident.details.createdAt
WhenStatusDeclaredincident.details.updatedAt
WhenStatusDeclared changes to "DISPincident.details.dispatchedAt
YCoordinateGeobaseincident.headers.latitude (add decimal six digits from right)
XCoordinateGeobaseincident.headers.longitude (add decimal six digits from right)
CADMasterCallCommentsTable.CallTakerCommentsincident.comments (new entry in array for each new line/entry)

Note Even though zone is not a standard field in the incident.details object, additional fields can be added to this object that may be of local interest. These fields will be shown in the Incident Details view in the IamResponding mobile app.

Mapping to IMC CAD Exchange fields

Sample output from IMC CAD Exchange:

Sample Field Mapping for IMC CAD Exchange

IMC Field NameIamResponding CAD Incident Field Name
IncidentIDincident.details.commondId
CaseNumbersincident.details.caseNumbers
Problemincident.headers.type
AgencyIdincident.details.agency
InitialProblemNatureincident.headers.subType
ProblemCodeincident.header.typeCode
Priorityincident.headers.priority
Addressincident.headers.address
LocationNameincident.headers.locationName
Cityincident.headers.municipality
PostalCodeincident.headers.zipCode
Latitudeincident.headers.latitude
Longitudeincident.headers.longitude
CrossStreetincident.headers.crossStreets
Districtincident.details.district
Zoneincident.details.zone
ResponseDateincident.details.createdAt
TimeCallClosedincident.details.status = Closed
CallBackPhoneincident.callers.caller.phoneNumber
CallerNameincident.callers.caller.name
CallerAddressincident.callers.caller.address
CallerCityincident.callers.caller.city
VehicleData.RadioNameincident.units.unit.name
VehicleData.TimeAssignedincident.units.unit.status = Dispatched
VehicleData.TimeEnrouteincident.units.unit.status = Enroute
VehicleData.TimeArrivedAtDestinationincident.units.unit.status = On Scene
VehicleData.TimeClearedDestinationincident.units.unit.status = Cleared
Commentsincident.comments.message

Note Even though zone and district are not standard fields in the incident.details object, additional fields can be added to this object that may be of local interest. These fields will be shown in the Incident Details view in the IamResponding mobile app.

Mapping to Intergraph fields

Sample output from Intergraph CADlink:

Sample Field Mapping Table for Intergraph CADlink

CADlink Field NameIamResponding CAD Incident Field Name
AEVEN.NUM_1incident.headers.id
AEVEN.TYCODincident.headers.typeCode
AEVEN.SUB_TYCODincident.headers.subTypeCode
AEVEN.TYP_ENGincident.headers.type
AEVEN.SUB_ENGincident.headers.subType
EVENT.[EDIRPRE + ESTNUM + EFEANME + EFEATYP + EDIRSUF]incident.headers.address
EVENT.EMUNincident.headers.city
EVENT.ECOMPLincident.headers.locationName
AEVEN.AG_IDincident.details.agency
EVENT.LATITUDEindident.headers.latitude
EVENT.LONGITUDEindident.headers.longitude
EVENT.XSTREET1 + EVENT.XSTREET1incident.headers.crossStreets
AEVEN.DS_TS_TIMESTAMP.DS_TS_DATETIMEincident.details.dispatchedAt
AEVEN.DGROUPincident.details.dispatchGroup
EVENT.CLRNUMincident.callers.caller.phoneNumber
EVENT.CLNAMEincident.callers.caller.name
EVCOM.UN_HI_LIST.UNIDincident.units.unit.id
EVCOM.UN_HI_LIST.AG_IDincident.units.unit.agency
EVCOM.UN_HI_LIST.UNIT_STATUSincident.units.unit.status
EVCOM.UN_HI_LIST.CDTS_TIMESTAMP.CDTS_DATETIMEincident.units.unit.createdAt
EVCOM.UN_HI_LIST.CPERS_EMPLOYEEREF.CPERS_USR_IDincident.units.unit.createdBy
EVCOM_LIST.EVCOM.COMMincident.comments.comment.message
EVCOM_LIST.EVCOM.CDTS_TIMESTAMP.CDTS_DATETIMEincident.comments.comment.createdAt
EVCOM_LIST.EVCOM.CPERS_EMPLOYEEREF.CPERS_USR_IDincident.comments.comment.createdBy

Mapping to GenConex CAD fields

Sample output from GenConex CAD:

Sample Field Mapping Table for GenConex CAD

GeoConex Field NameIamResponding CAD Incident Field Name
PriorityLevelPriorityincident.headers.priority
PrimaryEventTypeDescriptionincident.headers.type
PrimaryEventTypeAbbreviationincident.headers.typeCode
FullAddressincident.headers.address
BusinessNameincident.headers.locationName
Latitudeincident.headers.latitude
Longitudeincident.headers.longitude
Communityincident.headers.municipality
IncidentNumberincident.details.commonId
RespondingAgencies.RespondingAgency.AgencyRunNumbers.AgencyRunNumber.RunNumberincident.details.id when RespondingAgency.AgencyName = "MY FIRE DEPARTMENT"
DispatchedAtincident.details.dispatchedAt
Createdincident.details.CreatedAt
IncidentStateincident.details.status
Changedincident.details.updatedAt
CallerNameincident.callers.caller.name
CallbackNumberincident.callers.caller.phoneNumber
CallerLocationincident.callers.caller.address and .city and .latitude and .longitude (all must be parsed from string)
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.ResourceNameunits.unit.id
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.AgencyNameunits.unit.agency
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.DispatchStateunits.unit.status
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.DispatchStateAtunits.unit.createdAt
IncidentNarratives.IncidentNarrative.NarrativeTextcomments.comment.message
IncidentNarratives.IncidentNarrative.Createdcomments.comment.createdAt
IncidentNarratives.IncidentNarrative.UserNamecomments.comment.createdBy

Mapping to SouthernSoftware CAD fields

Sample output from SouthernSoftware CAD:

Sample Field Mapping Table for SouthernSoftware CAD

SouthernSoftware Field NameIamResponding CAD Incident Field Name
CFSRecord.CFS.IncStreetNum + CFSRecord.CFS.IncStreetName + CFSRecord.CFS.IncLocAptheaders.address
CFSRecord.CFS.IncCommunityheaders.municipality
CFSRecord.CFS.ZipCodeheaders.zipCode
CFSRecord.CFS.Priorityheaders.priority
CFSRecord.CFS.CrossLow + " / " + CFSRecord.CFS.CrossHighheaders.crossStreets
CFSRecord.CFS.CallTypeheaders.type
CFSRecord.CFS.CallTypeIDheaders.typeCode
CFSRecord.CFS.YCoorheaders.latitude
CFSRecord.CFS.XCoorheaders.longitude
CFSRecord.CFS.YCoor + "," + CFSRecord.CFS.XCoorheaders.coordinates
CFSRecord.CFS.IncLandNameheaders.locationName
CFSRecord.CFS.CreateWhendetails.createdAt
CFSRecord.CFS.LastUpdateWhendetails.updatedAt
CFSRecord.CFS.FirstUnitDispatchWhendetails.dispatchedAt
CFSRecord.CFS.FirstUnitArriveWhendetails.arrivedAt
CFSRecord.CFS.ControlWhendetails.controlledAt
CFSRecord.CFS.ClosedWhendetails.closedAt
CFSRecord.CFS.CFSNumberdetails.commonId
CFSRecord.UnitCFSEvents.Unit.StationName units.unit.agencydetails.agency (for agency "placeholder" units)
CFSRecord.CFS.OCANumberdetails.id
Open until CFSRecord.CFS.ClosedWhen has data, then Closeddetails.status
CFSRecord.CFS.EMSTractdetails.EmsZone
CFSRecord.CFS.FireTractdetails.FireZone
CFSRecord.CFS.LawTractdetails.LawZone
CFSRecord.CFS.CallerNamecallers.caller.name
CFSRecord.CFS.CallerPhonecallers.caller.phoneNumber
CFSRecord.CFS.CallerStreetNum + CFSRecord.CFS.CallerStreetName + CFSRecord.CFS.CallerAptLoccallers.caller.address
CFSRecord.CFS.CallerCommunitycallers.caller.city
CFSRecord.UnitCFSEvents.Unit.StationNameunits.unit.agency
CFSRecord.UnitCFSEvents.Unit.UnitIDunits.unit.id
""Dispatched"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Dispatch.When is not emptyunits.unit.status
""Enroute"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Enroute.When is not emptyunits.unit.status
""Inarea"" if CFSRecord.UnitCFSEvents.Unit.UnitID.InArea.When is not emptyunits.unit.status
""Onscene"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Arrive.When is not emptyunits.unit.status
""Onscene"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Arrive2.When is not emptyunits.unit.status
""WithPatient"" if CFSRecord.UnitCFSEvents.Unit.UnitID.WithCallerPatient.When is not emptyunits.unit.status
""Cancelled"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Cancel.When is not emptyunits.unit.status
""Cleared"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Clear.When is not emptyunits.unit.status
""Cleared"" if CFSRecord.UnitCFSEvents.Unit.UnitID.BackToStation.When is not emptyunits.unit.status
""Cancelled"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Cancel.When is not emptyunits.unit.status
CFSRecord.UnitCFSEvents.Unit.XXXX.When per aboveunits.unit.createdAt
CFSRecord.CFS.Commentcomments.comment.message
CFSRecord.CFS.CFSNotes.CFSNote.NoteTextcomments.comment.message
Person: CFSRecord.CFS.CFSPeople.CFSPerson.InvolvementType + CFSRecord.CFS.CFSPeople.CFSPerson.FirstName + CFSRecord.CFS.CFSPeople.CFSPerson.LastNamecomments.comment.message
Vehicle: CFSRecord.CFS.CFSVehicles.CFSVehicle.InvolvementType + CFSRecord.CFS.CFSVehicles.CFSVehicle.VehicleYear + CFSRecord.CFS.CFSVehicles.CFSVehicle.Make + CFSRecord.CFS.CFSVehicles.CFSVehicle.Model + CFSRecord.CFS.CFSVehicles.CFSVehicle.TagState + CFSRecord.CFS.CFSVehicles.CFSVehicle.TagType + CFSRecord.CFS.CFSVehicles.CFSVehicle.Tag + CFSRecord.CFS.CFSVehicles.CFSVehicle.VINcomments.comment.message
CFSRecord.CFS.CFSNotes.CFSNote.CreateBycomments.comment.createdBy
CFSRecord.CFS.CFSPeople.CFSPerson.CreateBycomments.comment.createdBy
CFSRecord.CFS.CFSVehicles.CFSVehicle.CreateBycomments.comment.createdBy
CFSRecord.CFS.CFSNotes.CFSNote.CreateWhencomments.comment.createdAt
CFSRecord.CFS.CFSPeople.CFSPerson.CreateWhencomments.comment.createdAt
CFSRecord.CFS.CFSVehicles.CFSVehicle.CreateWhencomments.comment.createdAt

String Replacement in Data Fields

In many cases, CAD systems transmit data for some fields using abbreviations or codes that may be difficult to interpret. Defining string replacement criteria allows the IamResponding incident. API to present that information to the user in a more human-readable form for easier viewing. An example of the type of data that can be provided to IamResponding to configure field string replacement is shown below.

Example unit.id String Replacement

Value to ReplaceReplacement Value
LCE4Lincoln City Engine 4
CAR4Brookfield Battalion 4

Example unit.status String Replacement

Value to ReplaceReplacement Value
DISPDispatched
ENREnroute
AQAvailable in Quarters
AMAvailable Mobile