Skip to main content

Vessel Profile and Unified Data Model

The unified data model connects a vessel profile to trips, operational events, source reports, field-level extraction evidence, human review, and immutable audit history.

This guide defines the domain model. The generated API Reference remains authoritative for endpoint request and response schemas.

Entity relationships​

Vessel
└── Trip
└── HaulEvent
└── SourceReport
└── ExtractedField
├── Confidence
├── ReviewStatus
└── AuditLog

One vessel can have many trips. A trip contains time-ordered haul or operational events. A source report records where imported or generated information came from. Each extracted field keeps its source location, normalized value, confidence, review status, and audit history.

Entity definitions​

Vessel​

The stable profile for one fishing vessel. It owns identifiers and descriptive attributes that remain valid across trips and reports.

Trip​

A bounded voyage for one vessel. A trip links departure and return information to the events and reports produced during that voyage.

HaulEvent​

A time-bounded operational event within a trip. eventType distinguishes haul, set, catch, transit, or another controlled event type without changing the common provenance model.

SourceReport​

One source document, electronic form, recording group, or machine-generated report used to produce normalized data. It records source type, ownership, time range, version, and processing status.

ExtractedField​

One field value extracted or projected from a SourceReport. It retains the original representation, normalized value, source reference, extraction method, confidence, and review decision.

Confidence​

The machine or rule-based assessment attached to an extracted value. score is between 0 and 1; level provides the controlled low, medium, or high interpretation used by review workflows.

ReviewStatus​

The current human-review state of an extracted value: pending, in_review, accepted, corrected, or rejected. A correction keeps both the extracted and reviewed values.

AuditLog​

An append-only record of a material change or review decision. It records what changed, why, when, and which authorized actor or service performed the action without storing credentials.

Field dictionary​

Vessel​

FieldTypeRequiredDescription
vesselIdstringYesStable Fishtube vessel identifier.
namestringYesVessel display name, unique within an organization.
registrationNumberstring or nullNoOfficial registration when available.
flagStatestring or nullNoControlled flag-state code.
organizationIdstringYesTenant that owns the vessel profile.
createdAt, updatedAtISO-8601 datetimeYesProfile lifecycle timestamps.

Trip​

FieldTypeRequiredDescription
tripIdstringYesStable trip identifier.
vesselIdstringYesParent vessel.
tripNumberstring or nullNoOperator or authority trip reference.
departedAt, returnedAtISO-8601 datetime or nullNoVoyage time boundary.
departurePort, returnPortstring or nullNoControlled port references.
statusenumYesplanned, active, completed, or cancelled.

HaulEvent​

FieldTypeRequiredDescription
eventIdstringYesStable operational-event identifier.
tripIdstringYesParent trip.
eventTypeenumYesset, haul, catch, transit, or another controlled type.
startedAt, endedAtISO-8601 datetimeYesEvent time boundary.
locationobject or nullNoLatitude and longitude when available.
sourceReportIdsstring arrayYesReports supporting the event.

SourceReport​

FieldTypeRequiredDescription
sourceReportIdstringYesStable source-report identifier.
tripId, eventIdstring or nullNoRelated trip and event.
sourceTypeenumYesobserver_form, edge_recording, ai_analysis, or import.
sourceReferencestringYesNon-secret document, segment, or recording-group reference.
capturedAtISO-8601 datetimeYesTime represented by the source.
versionstringYesSource schema or document version.
processingStatusenumYesreceived, processing, ready, or failed.

ExtractedField​

FieldTypeRequiredDescription
extractedFieldIdstringYesStable extracted-value identifier.
sourceReportIdstringYesSource report that produced the value.
fieldKeystringYesStable field-dictionary key.
rawValueany or nullNoValue as represented by the source.
normalizedValueany or nullNoValue normalized to the field dictionary.
sourcePointerobjectYesPage, segment, camera, timestamp, or JSON path provenance.
extractionMethodenumYesmanual, rule, ocr, or model.
confidenceConfidenceYesConfidence assessment.
reviewStatusReviewStatusYesCurrent review state.

Confidence​

FieldTypeRequiredDescription
scorenumberYesInclusive value from 0 to 1.
levelenumYeslow, medium, or high.
methodstringYesRule, model, or manual assertion method.
modelVersionstring or nullNoProducing model version when applicable.

ReviewStatus​

FieldTypeRequiredDescription
statusenumYespending, in_review, accepted, corrected, or rejected.
reviewedValueany or nullNoAccepted correction without replacing extracted provenance.
reasonCodestring or nullNoControlled reason for correction or rejection.
reviewedBy, reviewedAtstring/datetime or nullNoAuthorized reviewer and decision time.

AuditLog​

FieldTypeRequiredDescription
auditLogIdstringYesStable audit-event identifier.
entityType, entityIdstringYesChanged entity reference.
actionstringYesMaterial action such as field.corrected.
actorType, actorIdstringYesAuthorized user or service reference.
occurredAtISO-8601 datetimeYesImmutable event time.
reasonCodestring or nullNoControlled business reason.
changesobjectYesRedacted before/after values or changed field names.
correlationIdstringYesRequest or workflow correlation reference.

Sample JSON​

{
"vessel": {
"vesselId": "vessel_demo_001",
"name": "Example Vessel 01",
"registrationNumber": null,
"flagState": "TW",
"organizationId": "organization_demo_001",
"createdAt": "2026-07-01T08:00:00Z",
"updatedAt": "2026-07-28T04:00:00Z"
},
"trip": {
"tripId": "trip_demo_001",
"vesselId": "vessel_demo_001",
"tripNumber": "DEMO-2026-001",
"departedAt": "2026-07-20T00:00:00Z",
"returnedAt": null,
"departurePort": "PORT_DEMO_A",
"returnPort": null,
"status": "active"
},
"haulEvent": {
"eventId": "event_demo_001",
"tripId": "trip_demo_001",
"eventType": "haul",
"startedAt": "2026-07-27T02:10:00Z",
"endedAt": "2026-07-27T02:42:00Z",
"location": {
"latitude": 23.5,
"longitude": 121.0
},
"sourceReportIds": ["source_report_demo_001"]
},
"sourceReport": {
"sourceReportId": "source_report_demo_001",
"tripId": "trip_demo_001",
"eventId": "event_demo_001",
"sourceType": "ai_analysis",
"sourceReference": "recording_group_demo_001",
"capturedAt": "2026-07-27T02:20:14Z",
"version": "1.0",
"processingStatus": "ready"
},
"extractedFields": [
{
"extractedFieldId": "field_demo_001",
"sourceReportId": "source_report_demo_001",
"fieldKey": "catch.species_code",
"rawValue": "YFT",
"normalizedValue": "YFT",
"sourcePointer": {
"segmentId": "segment_demo_001",
"cameraId": "camera_demo_01",
"timestampSeconds": 614
},
"extractionMethod": "model",
"confidence": {
"score": 0.94,
"level": "high",
"method": "object_detection",
"modelVersion": "demo-model-1.0"
},
"reviewStatus": {
"status": "accepted",
"reviewedValue": "YFT",
"reasonCode": null,
"reviewedBy": "reviewer_demo_001",
"reviewedAt": "2026-07-28T03:45:00Z"
}
}
],
"auditLogs": [
{
"auditLogId": "audit_demo_001",
"entityType": "ExtractedField",
"entityId": "field_demo_001",
"action": "field.accepted",
"actorType": "user",
"actorId": "reviewer_demo_001",
"occurredAt": "2026-07-28T03:45:00Z",
"reasonCode": null,
"changes": {
"reviewStatus": {
"before": "pending",
"after": "accepted"
}
},
"correlationId": "request_demo_001"
}
]
}