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
X-Recipient-Id
Header in the HTTP POST requestWhen 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 Id | Agency Name |
---|---|
54321abc | Sunnydale Fire Department |
12345def | Cripple Creek Rescue Squad |
56789ghi | Metro Fire Station 1 |
56789ghj | Metro Fire Station 2 |
68534abc | King's Point VFD Fire Calls |
68534abd | King'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 Value | Agency Name |
---|---|
SFD | Sunnydale Fire Department |
CCR | Cripple Creek Rescue Squad |
MF1 | Metro Fire Station 1 |
MF2 | Metro Fire Station 2 |
KPF | King's Point VFD Fire Calls |
KPE | King'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 Name | IamResponding CAD Incident Field Name |
---|---|
LongTermCallId | incident.details.commonId |
CallTypeLawFireEMS | incident.headers.type |
incident.Nature | incident.headers.subType |
RespondToAddress | incident.headers.address |
CityCode | incident.headers.municipality |
CallPriority | incident.headers.priority |
RelatedRecordNumber | incident.details.id |
AgencyCode | incident.details.agency |
CallZoneCode | incident.details.zone |
StatusCodeOfCall | incident.details.status |
Responsibleunit.umber | incident.units.unit.id |
TimeDateReported | incident.details.createdAt |
WhenStatusDeclared | incident.details.updatedAt |
WhenStatusDeclared changes to "DISP | incident.details.dispatchedAt |
YCoordinateGeobase | incident.headers.latitude (add decimal six digits from right) |
XCoordinateGeobase | incident.headers.longitude (add decimal six digits from right) |
CADMasterCallCommentsTable.CallTakerComments | incident.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 Name | IamResponding CAD Incident Field Name |
---|---|
IncidentID | incident.details.commondId |
CaseNumbers | incident.details.caseNumbers |
Problem | incident.headers.type |
AgencyId | incident.details.agency |
InitialProblemNature | incident.headers.subType |
ProblemCode | incident.header.typeCode |
Priority | incident.headers.priority |
Address | incident.headers.address |
LocationName | incident.headers.locationName |
City | incident.headers.municipality |
PostalCode | incident.headers.zipCode |
Latitude | incident.headers.latitude |
Longitude | incident.headers.longitude |
CrossStreet | incident.headers.crossStreets |
District | incident.details.district |
Zone | incident.details.zone |
ResponseDate | incident.details.createdAt |
TimeCallClosed | incident.details.status = Closed |
CallBackPhone | incident.callers.caller.phoneNumber |
CallerName | incident.callers.caller.name |
CallerAddress | incident.callers.caller.address |
CallerCity | incident.callers.caller.city |
VehicleData.RadioName | incident.units.unit.name |
VehicleData.TimeAssigned | incident.units.unit.status = Dispatched |
VehicleData.TimeEnroute | incident.units.unit.status = Enroute |
VehicleData.TimeArrivedAtDestination | incident.units.unit.status = On Scene |
VehicleData.TimeClearedDestination | incident.units.unit.status = Cleared |
Comments | incident.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 Name | IamResponding CAD Incident Field Name |
---|---|
AEVEN.NUM_1 | incident.headers.id |
AEVEN.TYCOD | incident.headers.typeCode |
AEVEN.SUB_TYCOD | incident.headers.subTypeCode |
AEVEN.TYP_ENG | incident.headers.type |
AEVEN.SUB_ENG | incident.headers.subType |
EVENT.[EDIRPRE + ESTNUM + EFEANME + EFEATYP + EDIRSUF] | incident.headers.address |
EVENT.EMUN | incident.headers.city |
EVENT.ECOMPL | incident.headers.locationName |
AEVEN.AG_ID | incident.details.agency |
EVENT.LATITUDE | indident.headers.latitude |
EVENT.LONGITUDE | indident.headers.longitude |
EVENT.XSTREET1 + EVENT.XSTREET1 | incident.headers.crossStreets |
AEVEN.DS_TS_TIMESTAMP.DS_TS_DATETIME | incident.details.dispatchedAt |
AEVEN.DGROUP | incident.details.dispatchGroup |
EVENT.CLRNUM | incident.callers.caller.phoneNumber |
EVENT.CLNAME | incident.callers.caller.name |
EVCOM.UN_HI_LIST.UNID | incident.units.unit.id |
EVCOM.UN_HI_LIST.AG_ID | incident.units.unit.agency |
EVCOM.UN_HI_LIST.UNIT_STATUS | incident.units.unit.status |
EVCOM.UN_HI_LIST.CDTS_TIMESTAMP.CDTS_DATETIME | incident.units.unit.createdAt |
EVCOM.UN_HI_LIST.CPERS_EMPLOYEEREF.CPERS_USR_ID | incident.units.unit.createdBy |
EVCOM_LIST.EVCOM.COMM | incident.comments.comment.message |
EVCOM_LIST.EVCOM.CDTS_TIMESTAMP.CDTS_DATETIME | incident.comments.comment.createdAt |
EVCOM_LIST.EVCOM.CPERS_EMPLOYEEREF.CPERS_USR_ID | incident.comments.comment.createdBy |
Mapping to GenConex CAD fields
Sample output from GenConex CAD:
Sample Field Mapping Table for GenConex CAD
GeoConex Field Name | IamResponding CAD Incident Field Name |
---|---|
PriorityLevelPriority | incident.headers.priority |
PrimaryEventTypeDescription | incident.headers.type |
PrimaryEventTypeAbbreviation | incident.headers.typeCode |
FullAddress | incident.headers.address |
BusinessName | incident.headers.locationName |
Latitude | incident.headers.latitude |
Longitude | incident.headers.longitude |
Community | incident.headers.municipality |
IncidentNumber | incident.details.commonId |
RespondingAgencies.RespondingAgency.AgencyRunNumbers.AgencyRunNumber.RunNumber | incident.details.id when RespondingAgency.AgencyName = "MY FIRE DEPARTMENT" |
DispatchedAt | incident.details.dispatchedAt |
Created | incident.details.CreatedAt |
IncidentState | incident.details.status |
Changed | incident.details.updatedAt |
CallerName | incident.callers.caller.name |
CallbackNumber | incident.callers.caller.phoneNumber |
CallerLocation | incident.callers.caller.address and .city and .latitude and .longitude (all must be parsed from string) |
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.ResourceName | units.unit.id |
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.AgencyName | units.unit.agency |
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.DispatchState | units.unit.status |
RespondingAgencies.RespondingAgency.Dispatches.Dispatch.DispatchStateAt | units.unit.createdAt |
IncidentNarratives.IncidentNarrative.NarrativeText | comments.comment.message |
IncidentNarratives.IncidentNarrative.Created | comments.comment.createdAt |
IncidentNarratives.IncidentNarrative.UserName | comments.comment.createdBy |
Mapping to SouthernSoftware CAD fields
Sample output from SouthernSoftware CAD:
Sample Field Mapping Table for SouthernSoftware CAD
SouthernSoftware Field Name | IamResponding CAD Incident Field Name |
---|---|
CFSRecord.CFS.IncStreetNum + CFSRecord.CFS.IncStreetName + CFSRecord.CFS.IncLocApt | headers.address |
CFSRecord.CFS.IncCommunity | headers.municipality |
CFSRecord.CFS.ZipCode | headers.zipCode |
CFSRecord.CFS.Priority | headers.priority |
CFSRecord.CFS.CrossLow + " / " + CFSRecord.CFS.CrossHigh | headers.crossStreets |
CFSRecord.CFS.CallType | headers.type |
CFSRecord.CFS.CallTypeID | headers.typeCode |
CFSRecord.CFS.YCoor | headers.latitude |
CFSRecord.CFS.XCoor | headers.longitude |
CFSRecord.CFS.YCoor + "," + CFSRecord.CFS.XCoor | headers.coordinates |
CFSRecord.CFS.IncLandName | headers.locationName |
CFSRecord.CFS.CreateWhen | details.createdAt |
CFSRecord.CFS.LastUpdateWhen | details.updatedAt |
CFSRecord.CFS.FirstUnitDispatchWhen | details.dispatchedAt |
CFSRecord.CFS.FirstUnitArriveWhen | details.arrivedAt |
CFSRecord.CFS.ControlWhen | details.controlledAt |
CFSRecord.CFS.ClosedWhen | details.closedAt |
CFSRecord.CFS.CFSNumber | details.commonId |
CFSRecord.UnitCFSEvents.Unit.StationName units.unit.agency | details.agency (for agency "placeholder" units) |
CFSRecord.CFS.OCANumber | details.id |
Open until CFSRecord.CFS.ClosedWhen has data, then Closed | details.status |
CFSRecord.CFS.EMSTract | details.EmsZone |
CFSRecord.CFS.FireTract | details.FireZone |
CFSRecord.CFS.LawTract | details.LawZone |
CFSRecord.CFS.CallerName | callers.caller.name |
CFSRecord.CFS.CallerPhone | callers.caller.phoneNumber |
CFSRecord.CFS.CallerStreetNum + CFSRecord.CFS.CallerStreetName + CFSRecord.CFS.CallerAptLoc | callers.caller.address |
CFSRecord.CFS.CallerCommunity | callers.caller.city |
CFSRecord.UnitCFSEvents.Unit.StationName | units.unit.agency |
CFSRecord.UnitCFSEvents.Unit.UnitID | units.unit.id |
""Dispatched"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Dispatch.When is not empty | units.unit.status |
""Enroute"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Enroute.When is not empty | units.unit.status |
""Inarea"" if CFSRecord.UnitCFSEvents.Unit.UnitID.InArea.When is not empty | units.unit.status |
""Onscene"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Arrive.When is not empty | units.unit.status |
""Onscene"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Arrive2.When is not empty | units.unit.status |
""WithPatient"" if CFSRecord.UnitCFSEvents.Unit.UnitID.WithCallerPatient.When is not empty | units.unit.status |
""Cancelled"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Cancel.When is not empty | units.unit.status |
""Cleared"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Clear.When is not empty | units.unit.status |
""Cleared"" if CFSRecord.UnitCFSEvents.Unit.UnitID.BackToStation.When is not empty | units.unit.status |
""Cancelled"" if CFSRecord.UnitCFSEvents.Unit.UnitID.Cancel.When is not empty | units.unit.status |
CFSRecord.UnitCFSEvents.Unit.XXXX.When per above | units.unit.createdAt |
CFSRecord.CFS.Comment | comments.comment.message |
CFSRecord.CFS.CFSNotes.CFSNote.NoteText | comments.comment.message |
Person: CFSRecord.CFS.CFSPeople.CFSPerson.InvolvementType + CFSRecord.CFS.CFSPeople.CFSPerson.FirstName + CFSRecord.CFS.CFSPeople.CFSPerson.LastName | comments.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.VIN | comments.comment.message |
CFSRecord.CFS.CFSNotes.CFSNote.CreateBy | comments.comment.createdBy |
CFSRecord.CFS.CFSPeople.CFSPerson.CreateBy | comments.comment.createdBy |
CFSRecord.CFS.CFSVehicles.CFSVehicle.CreateBy | comments.comment.createdBy |
CFSRecord.CFS.CFSNotes.CFSNote.CreateWhen | comments.comment.createdAt |
CFSRecord.CFS.CFSPeople.CFSPerson.CreateWhen | comments.comment.createdAt |
CFSRecord.CFS.CFSVehicles.CFSVehicle.CreateWhen | comments.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 Replace | Replacement Value |
---|---|
LCE4 | Lincoln City Engine 4 |
CAR4 | Brookfield Battalion 4 |
Example unit.status String Replacement
Value to Replace | Replacement Value |
---|---|
DISP | Dispatched |
ENR | Enroute |
AQ | Available in Quarters |
AM | Available Mobile |