Custom Feed Integration Guide
The Proprietary Fusion Gateway (pipeline/src/ingest/custom_feeds.py) ingests any
CSV dropped into _inputs/custom_feeds/ — no code changes required. This page
shows ready-to-use templates for the three recommended commercial data providers.
How it works
- Drop a CSV into
_inputs/custom_feeds/. - Optionally place a
<stem>.columnmap.jsonsidecar alongside it to map provider-specific column names to the Arktrace schema. - Run the pipeline (or
uv run python pipeline/src/ingest/custom_feeds.py).
The feed type is detected automatically from column signatures and filename prefix.
Files ending with _sample are always skipped (smoke-test fixtures only).
Spire Maritime — satellite AIS feed
Target table: ais_positions
Detection: filename starts with ais_; columns mmsi, latitude, longitude auto-detected.
Spire exports use latitude/longitude instead of lat/lon. A columnmap
sidecar handles the rename transparently.
Sample file: ais_spire_sample.csv
mmsi,timestamp,latitude,longitude,speed_over_ground,course_over_ground,heading,navigational_status,imo,vessel_name,call_sign,ship_type,length,width,draught
123456789,2026-04-01T00:00:00Z,1.2847,103.8610,5.2,127.3,125,0,9876543,GOLDEN STAR,9HSK4,70,185,28,8.2
567891234,2026-04-01T01:30:00Z,1.4201,103.6823,0.1,0.0,511,1,7654321,SEA WOLF,A8KL2,80,220,32,12.5
Sidecar: ais_spire_sample.columnmap.json
{
"lat": "latitude",
"lon": "longitude",
"timestamp": "timestamp",
"mmsi": "mmsi",
"sog": "speed_over_ground",
"cog": "course_over_ground",
"heading": "heading",
"nav_status": "navigational_status",
"vessel_name": "vessel_name",
"imo": "imo",
"call_sign": "call_sign",
"vessel_type": "ship_type",
"length": "length",
"width": "width",
"draft": "draught"
}
Live integration steps
- Configure Spire to deliver files to
_inputs/custom_feeds/(SFTP push or S3 sync). - Name files
ais_spire_YYYYMMDD.csv(prefixais_ensures detection). - Copy
docs/examples/ais_spire_sample.columnmap.json→_inputs/custom_feeds/ais_spire_YYYYMMDD.columnmap.json(or use a single shared sidecar with a stable filename and symlink it). - Run the pipeline — rows are inserted with
INSERT OR IGNOREso re-delivery is safe.
ICEYE — persistent SAR detection feed
Target table: sar_detections
Detection: filename starts with sar_.
ICEYE exports use object_id, acquisition_datetime, latitude_dd/longitude_dd,
vessel_length_m, and detection_confidence. A columnmap sidecar maps these to the
Arktrace SAR schema.
Sample file: sar_iceye_sample.csv
object_id,acquisition_datetime,latitude_dd,longitude_dd,vessel_length_m,scene_id,detection_confidence
ICEYE-20260401-0001,2026-04-01T02:14:33Z,1.2847,103.8610,87.3,ICEYE-X14_SLC_20260401T021433,0.92
ICEYE-20260401-0002,2026-04-01T02:14:33Z,1.3105,103.7892,112.0,ICEYE-X14_SLC_20260401T021433,0.85
Sidecar: sar_iceye_sample.columnmap.json
{
"detection_id": "object_id",
"detected_at": "acquisition_datetime",
"lat": "latitude_dd",
"lon": "longitude_dd",
"length_m": "vessel_length_m",
"source_scene": "scene_id",
"confidence": "detection_confidence"
}
Live integration steps
- Configure ICEYE Tasking API webhook or S3 delivery to
_inputs/custom_feeds/. - Name files
sar_iceye_YYYYMMDD.csv. - Copy
docs/examples/sar_iceye_sample.columnmap.json→_inputs/custom_feeds/sar_iceye.columnmap.json(a single shared sidecar applies to all date-suffixed ICEYE files). - Dark vessels (those without an AIS match) are automatically cross-referenced
by the
compute_eo_featurespipeline step.
Lloyd's List Intelligence — vessel watchlist feed
Target table: sanctions_entities
Detection: filename starts with sanctions_; columns name, list_source required.
Lloyd's List Intelligence provides flagged vessel and entity records. Export the
watchlist as a CSV with at minimum name and list_source columns. IMO and MMSI
enable automatic cross-referencing with AIS tracks.
Sample file: sanctions_lloyds_sample.csv
name,list_source,mmsi,imo,flag,type
GOLDEN STAR SHIPPING CO,lloyds-watchlist,123456789,9876543,KHM,vessel
PACIFIC BRIDGE TRADING LTD,lloyds-watchlist,,,PAN,entity
HORIZON MARITIME HOLDINGS,lloyds-watchlist,567891234,1234567,TZA,vessel
Column reference:
| Column | Required | Description |
|---|---|---|
name |
Yes | Vessel or entity name |
list_source |
Yes | Use lloyds-watchlist (appears in alert attribution) |
mmsi |
Recommended | 9-digit MMSI for AIS cross-reference |
imo |
Recommended | IMO number for ownership graph linkage |
flag |
Optional | ISO 3166-1 alpha-3 flag state |
type |
Optional | vessel or entity |
Live integration steps
- Export the Lloyd's List watchlist from the Intelligence Centre as CSV.
- Drop the file into
_inputs/custom_feeds/sanctions_lloyds_YYYYMMDD.csv. - No sidecar needed — column names match the schema directly.
- Run the pipeline; entities are inserted with
INSERT OR IGNORE(deduplication byentity_id; auto-generated from name+list_source on first insert).
Schema reference
| Feed type | Required columns | Optional columns | Target table |
|---|---|---|---|
| AIS | mmsi, lat/latitude, lon/longitude, timestamp |
sog, cog, heading, vessel_name, imo, vessel_type |
ais_positions |
| SAR | lat, lon, detected_at |
detection_id, length_m, source_scene, confidence |
sar_detections |
| Sanctions | name, list_source |
mmsi, imo, flag, type |
sanctions_entities |
| Cargo | reporter, partner, hs_code, period |
trade_value_usd, route_key |
trade_flow |
Dry-run verification
Prints detected feed type for every file without writing to the database. Use this to verify column detection before a live pipeline run.