vessel-api-python 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,887 @@
1
+ """Pydantic v2 models for the Vessel Tracking API.
2
+
3
+ Models are generated from the OpenAPI spec and follow Python conventions.
4
+ All optional fields use ``type | None = None`` and JSON field mapping uses
5
+ ``Field(alias="camelCase")`` where the API returns camelCase keys.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field
11
+
12
+ # ---------------------------------------------------------------------------
13
+ # Base config shared by all models
14
+ # ---------------------------------------------------------------------------
15
+
16
+
17
+ class _Base(BaseModel):
18
+ model_config = ConfigDict(populate_by_name=True)
19
+
20
+
21
+ # ---------------------------------------------------------------------------
22
+ # Shared / helper sub-models
23
+ # ---------------------------------------------------------------------------
24
+
25
+
26
+ class GeoJSON(_Base):
27
+ """GeoJSON Point geometry for geospatial coordinates."""
28
+
29
+ coordinates: list[float] | None = None
30
+ type: str | None = None
31
+
32
+
33
+ class PortCountry(_Base):
34
+ """Country information for a port."""
35
+
36
+ code: str | None = None
37
+ name: str | None = None
38
+
39
+
40
+ class PortReference(_Base):
41
+ """Port identification details used in port event references."""
42
+
43
+ country: str | None = None
44
+ name: str | None = None
45
+ unlo_code: str | None = None
46
+
47
+
48
+ class VesselReference(_Base):
49
+ """Vessel identification details used in port event references."""
50
+
51
+ imo: int | None = None
52
+ mmsi: int | None = None
53
+ name: str | None = None
54
+
55
+
56
+ class VesselFormerName(_Base):
57
+ """Historical vessel name record."""
58
+
59
+ name: str | None = None
60
+ year_until: str | None = None
61
+
62
+
63
+ class BroadcastStation(_Base):
64
+ """NAVTEX radio broadcast station details."""
65
+
66
+ country: str | None = None
67
+ coverage: str | None = None
68
+ latitude: float | None = None
69
+ longitude: float | None = None
70
+ name: str | None = None
71
+ station_id: str | None = None
72
+
73
+
74
+ # ---------------------------------------------------------------------------
75
+ # Classification sub-models
76
+ # ---------------------------------------------------------------------------
77
+
78
+
79
+ class ClassificationPurpose(_Base):
80
+ """Purpose entry within classification identification."""
81
+
82
+ description: str | None = None
83
+ is_main_purpose: bool | None = Field(default=None, alias="isMainPurpose")
84
+ purpose: str | None = None
85
+
86
+
87
+ class ClassificationCertificate(_Base):
88
+ """Certificate entry within vessel classification."""
89
+
90
+ certificate: str | None = None
91
+ code: str | None = None
92
+ expires: str | None = None
93
+ ext_until: str | None = Field(default=None, alias="extUntil")
94
+ issued: str | None = None
95
+ term: str | None = None
96
+ type: str | None = None
97
+
98
+
99
+ class ClassificationCondition(_Base):
100
+ """Condition entry within vessel classification."""
101
+
102
+ condition: str | None = None
103
+ due_date: str | None = Field(default=None, alias="dueDate")
104
+ imposed_date: str | None = Field(default=None, alias="imposedDate")
105
+
106
+
107
+ class ClassificationDimensions(_Base):
108
+ """Vessel dimensions from classification data."""
109
+
110
+ bm: float | None = None
111
+ dm: float | None = None
112
+ draught: float | None = None
113
+ dwt: float | None = None
114
+ gross_ton_69: float | None = Field(default=None, alias="grossTon69")
115
+ lbp: float | None = None
116
+ length_overall: float | None = Field(default=None, alias="lengthOverall")
117
+ net_ton_69: float | None = Field(default=None, alias="netTon69")
118
+
119
+
120
+ class ClassificationHull(_Base):
121
+ """Hull details from classification data."""
122
+
123
+ decks_number: str | None = Field(default=None, alias="decksNumber")
124
+
125
+
126
+ class ClassificationIdentification(_Base):
127
+ """Identification details from classification data."""
128
+
129
+ class_status_string: str | None = Field(default=None, alias="classStatusString")
130
+ flag_code: str | None = Field(default=None, alias="flagCode")
131
+ flag_name: str | None = Field(default=None, alias="flagName")
132
+ home_port: str | None = Field(default=None, alias="homePort")
133
+ imo_number: str | None = Field(default=None, alias="imoNumber")
134
+ non_class_relation_string: str | None = Field(
135
+ default=None, alias="nonClassRelationString"
136
+ )
137
+ official_number: str | None = Field(default=None, alias="officialNumber")
138
+ operational_status_string: str | None = Field(
139
+ default=None, alias="operationalStatusString"
140
+ )
141
+ purposes: list[ClassificationPurpose] | None = None
142
+ register_: str | None = Field(default=None, alias="register")
143
+ signal_letters: str | None = Field(default=None, alias="signalLetters")
144
+ type_formatted: str | None = Field(default=None, alias="typeFormatted")
145
+ vessel_id: str | None = Field(default=None, alias="vesselId")
146
+ vessel_name: str | None = Field(default=None, alias="vesselName")
147
+
148
+
149
+ class ClassificationInfo(_Base):
150
+ """Classification notation and class status details."""
151
+
152
+ class_entry_date: str | None = Field(default=None, alias="classEntryDate")
153
+ class_notation_string: str | None = Field(
154
+ default=None, alias="classNotationString"
155
+ )
156
+ class_notation_string_design: str | None = Field(
157
+ default=None, alias="classNotationStringDesign"
158
+ )
159
+ class_notation_string_in_operation: str | None = Field(
160
+ default=None, alias="classNotationStringInOperation"
161
+ )
162
+ class_notation_string_main: str | None = Field(
163
+ default=None, alias="classNotationStringMain"
164
+ )
165
+ construction_symbol: str | None = Field(default=None, alias="constructionSymbol")
166
+ dual_class: str | None = Field(default=None, alias="dualClass")
167
+ equipment_number: str | None = Field(default=None, alias="equipmentNumber")
168
+ last_classification_society: str | None = Field(
169
+ default=None, alias="lastClassificationSociety"
170
+ )
171
+ main_class: str | None = Field(default=None, alias="mainClass")
172
+ main_class_machinery: str | None = Field(
173
+ default=None, alias="mainClassMachinery"
174
+ )
175
+ register_notation_string: str | None = Field(
176
+ default=None, alias="registerNotationString"
177
+ )
178
+
179
+
180
+ class ClassificationMachinery(_Base):
181
+ """Machinery details from classification data."""
182
+
183
+ main_propulsion: str | None = Field(default=None, alias="mainPropulsion")
184
+
185
+
186
+ class ClassificationOwner(_Base):
187
+ """Owner/manager details from classification data."""
188
+
189
+ doc_holder_dnv_id: str | None = Field(default=None, alias="docHolderDnvId")
190
+ doc_holder_imo_number: str | None = Field(
191
+ default=None, alias="docHolderImoNumber"
192
+ )
193
+ doc_holder_name: str | None = Field(default=None, alias="docHolderName")
194
+ manager_dnv_id: str | None = Field(default=None, alias="managerDnvId")
195
+ manager_imo_number: str | None = Field(default=None, alias="managerImoNumber")
196
+ manager_name: str | None = Field(default=None, alias="managerName")
197
+ owner_dnv_id: str | None = Field(default=None, alias="ownerDnvId")
198
+ owner_imo_number: str | None = Field(default=None, alias="ownerImoNumber")
199
+ owner_name: str | None = Field(default=None, alias="ownerName")
200
+
201
+
202
+ class ClassificationSurvey(_Base):
203
+ """Survey entry within vessel classification."""
204
+
205
+ category: str | None = None
206
+ due_from: str | None = Field(default=None, alias="dueFrom")
207
+ due_to: str | None = Field(default=None, alias="dueTo")
208
+ last_date: str | None = Field(default=None, alias="lastDate")
209
+ location: str | None = None
210
+ postponed: str | None = None
211
+ survey: str | None = None
212
+
213
+
214
+ class ClassificationYard(_Base):
215
+ """Shipyard/builder details from classification data."""
216
+
217
+ contracted_builder: str | None = Field(default=None, alias="contractedBuilder")
218
+ contracted_builder_build_no: str | None = Field(
219
+ default=None, alias="contractedBuilderBuildNo"
220
+ )
221
+ date_of_build: str | None = Field(default=None, alias="dateOfBuild")
222
+ hull_yard_build_no: str | None = Field(default=None, alias="hullYardBuildNo")
223
+ hull_yard_name: str | None = Field(default=None, alias="hullYardName")
224
+ keel_date: str | None = Field(default=None, alias="keelDate")
225
+
226
+
227
+ # ---------------------------------------------------------------------------
228
+ # Vessel models
229
+ # ---------------------------------------------------------------------------
230
+
231
+
232
+ class Vessel(_Base):
233
+ """A vessel record with complete static data."""
234
+
235
+ breadth: int | None = None
236
+ breadth_unit: str | None = None
237
+ builder: str | None = None
238
+ call_sign: str | None = None
239
+ class_society: str | None = None
240
+ country: str | None = None
241
+ country_code: str | None = None
242
+ deadweight_tonnage: int | None = None
243
+ draft: int | None = None
244
+ draft_unit: str | None = None
245
+ engine_model_name: str | None = None
246
+ engine_type: int | None = None
247
+ former_names: list[VesselFormerName] | None = None
248
+ gross_tonnage: int | None = None
249
+ home_port: str | None = None
250
+ imo: int | None = None
251
+ kilowatt_power: int | None = None
252
+ length: int | None = None
253
+ length_unit: str | None = None
254
+ manager_name: str | None = None
255
+ mmsi: int | None = None
256
+ name: str | None = None
257
+ operating_status: str | None = None
258
+ owner_name: str | None = None
259
+ vessel_type: str | None = None
260
+ year_built: int | None = None
261
+
262
+
263
+ class VesselResponse(_Base):
264
+ """Response for a single vessel lookup."""
265
+
266
+ vessel: Vessel | None = None
267
+
268
+
269
+ class VesselPosition(_Base):
270
+ """A real-time vessel position record from AIS data."""
271
+
272
+ cog: float | None = None
273
+ heading: int | None = None
274
+ imo: int | None = None
275
+ latitude: float | None = None
276
+ location: GeoJSON | None = None
277
+ longitude: float | None = None
278
+ mmsi: int | None = None
279
+ nav_status: int | None = None
280
+ processed_timestamp: str | None = None
281
+ sog: float | None = None
282
+ suspected_glitch: bool | None = None
283
+ timestamp: str | None = None
284
+ vessel_name: str | None = None
285
+
286
+
287
+ class VesselPositionResponse(_Base):
288
+ """Response for a single vessel position lookup."""
289
+
290
+ vessel_position: VesselPosition | None = Field(
291
+ default=None, alias="vesselPosition"
292
+ )
293
+
294
+
295
+ class VesselPositionsResponse(_Base):
296
+ """Response for multiple vessel positions."""
297
+
298
+ vessel_positions: list[VesselPosition] | None = Field(
299
+ default=None, alias="vesselPositions"
300
+ )
301
+ next_token: str | None = Field(default=None, alias="nextToken")
302
+
303
+
304
+ # ---------------------------------------------------------------------------
305
+ # Vessel sub-resource models
306
+ # ---------------------------------------------------------------------------
307
+
308
+
309
+ class MarineCasualty(_Base):
310
+ """A marine casualty record."""
311
+
312
+ at_coding: list[str] | None = Field(default=None, alias="atCoding")
313
+ casualty_report_nr: str | None = Field(default=None, alias="casualtyReportNr")
314
+ cf_coding: list[str] | None = Field(default=None, alias="cfCoding")
315
+ collected_at: str | None = Field(default=None, alias="collectedAt")
316
+ competent_authority: list[str] | None = Field(
317
+ default=None, alias="competentAuthority"
318
+ )
319
+ date_of_occurrence: str | None = Field(default=None, alias="dateOfOccurrence")
320
+ deviation: list[str] | None = None
321
+ event_type: list[str] | None = Field(default=None, alias="eventType")
322
+ finished_investigation: bool | None = Field(
323
+ default=None, alias="finishedInvestigation"
324
+ )
325
+ imo_nr: list[str] | None = Field(default=None, alias="imoNr")
326
+ interim_report: bool | None = Field(default=None, alias="interimReport")
327
+ investigating_state: str | None = Field(
328
+ default=None, alias="investigatingState"
329
+ )
330
+ lives_lost_total: str | None = Field(default=None, alias="livesLostTotal")
331
+ name_of_ship: list[str] | None = Field(default=None, alias="nameOfShip")
332
+ occurrence_severity: str | None = Field(
333
+ default=None, alias="occurrenceSeverity"
334
+ )
335
+ occurrence_uuid: str | None = Field(default=None, alias="occurrenceUuid")
336
+ occurrence_with_persons: list[str] | None = Field(
337
+ default=None, alias="occurrenceWithPersons"
338
+ )
339
+ occurrence_with_ships: list[str] | None = Field(
340
+ default=None, alias="occurrenceWithShips"
341
+ )
342
+ people_injured_total: str | None = Field(
343
+ default=None, alias="peopleInjuredTotal"
344
+ )
345
+ pollution: bool | None = None
346
+ ship_craft_type: list[str] | None = Field(default=None, alias="shipCraftType")
347
+ sr_coding: list[str] | None = Field(default=None, alias="srCoding")
348
+
349
+
350
+ class MarineCasualtiesResponse(_Base):
351
+ """Response for vessel casualties."""
352
+
353
+ casualties: list[MarineCasualty] | None = None
354
+ next_token: str | None = Field(default=None, alias="nextToken")
355
+
356
+
357
+ class ClassificationVessel(_Base):
358
+ """Full vessel classification data with nested sub-objects."""
359
+
360
+ certificates: list[ClassificationCertificate] | None = None
361
+ classification: ClassificationInfo | None = None
362
+ collected_at: str | None = Field(default=None, alias="collectedAt")
363
+ conditions: list[ClassificationCondition] | None = None
364
+ dimensions: ClassificationDimensions | None = None
365
+ hull: ClassificationHull | None = None
366
+ identification: ClassificationIdentification | None = None
367
+ imo: int | None = None
368
+ machinery: ClassificationMachinery | None = None
369
+ owner: ClassificationOwner | None = None
370
+ surveys: list[ClassificationSurvey] | None = None
371
+ yard: ClassificationYard | None = None
372
+
373
+
374
+ # Keep the ``Classification`` alias so existing code continues to work.
375
+ Classification = ClassificationVessel
376
+
377
+
378
+ class ClassificationResponse(_Base):
379
+ """Response for vessel classification."""
380
+
381
+ classification: ClassificationVessel | None = None
382
+
383
+
384
+ class VesselEmission(_Base):
385
+ """A vessel emission record (EU MRV data)."""
386
+
387
+ co2_emissions_at_berth: float | None = None
388
+ co2_emissions_on_laden_voyages: float | None = None
389
+ co2_emissions_total: float | None = None
390
+ co2_per_distance: float | None = None
391
+ co2_per_transport_work: float | None = None
392
+ collected_at: str | None = None
393
+ distance_through_ice: float | None = None
394
+ doc_expiry_date: str | None = None
395
+ doc_issue_date: str | None = None
396
+ flag_code: str | None = None
397
+ flag_name: str | None = None
398
+ fuel_consumption_hfo: float | None = None
399
+ fuel_consumption_lfo: float | None = None
400
+ fuel_consumption_lng: float | None = None
401
+ fuel_consumption_mdo: float | None = None
402
+ fuel_consumption_mgo: float | None = None
403
+ fuel_consumption_other: float | None = None
404
+ fuel_consumption_total: float | None = None
405
+ fuel_per_distance: float | None = None
406
+ fuel_per_transport_work: float | None = None
407
+ home_port: str | None = None
408
+ ice_class: str | None = None
409
+ imo: int | None = None
410
+ monitoring_method_a: str | None = None
411
+ monitoring_method_b: str | None = None
412
+ monitoring_method_c: str | None = None
413
+ monitoring_method_d: str | None = None
414
+ name: str | None = None
415
+ port_calls_outside_eu: int | None = None
416
+ port_calls_within_eu: int | None = None
417
+ reporting_period: str | None = None
418
+ source_url: str | None = None
419
+ technical_efficiency: str | None = None
420
+ technical_efficiency_value: float | None = None
421
+ time_at_sea_through_ice: float | None = None
422
+ total_time_at_sea: float | None = None
423
+ unique_key: str | None = None
424
+ verifier_accreditation: str | None = None
425
+ verifier_address: str | None = None
426
+ verifier_name: str | None = None
427
+ vessel_type: str | None = None
428
+
429
+
430
+ class VesselEmissionsResponse(_Base):
431
+ """Response for vessel emissions."""
432
+
433
+ emissions: list[VesselEmission] | None = None
434
+ next_token: str | None = Field(default=None, alias="nextToken")
435
+
436
+
437
+ class VesselETA(_Base):
438
+ """Vessel Estimated Time of Arrival information."""
439
+
440
+ destination: str | None = None
441
+ draught: float | None = None
442
+ eta: str | None = None
443
+ imo: int | None = None
444
+ mmsi: int | None = None
445
+ timestamp: str | None = None
446
+ vessel_name: str | None = None
447
+
448
+
449
+ class VesselETAResponse(_Base):
450
+ """Response for vessel ETA."""
451
+
452
+ vessel_eta: VesselETA | None = Field(default=None, alias="vesselEta")
453
+
454
+
455
+ # ---------------------------------------------------------------------------
456
+ # Inspection models
457
+ # ---------------------------------------------------------------------------
458
+
459
+
460
+ class InspectionRecord(_Base):
461
+ """A port-state control inspection record (from types.Inspection)."""
462
+
463
+ authority: str | None = None
464
+ deficiencies: int | None = None
465
+ detail_id: str | None = None
466
+ detained: bool | None = None
467
+ imo: int | None = None
468
+ inspection_date: str | None = None
469
+ inspection_type: str | None = None
470
+ mou_region: str | None = None
471
+ port: str | None = None
472
+
473
+
474
+ # Keep ``Inspection`` as an alias so existing imports keep working.
475
+ Inspection = InspectionRecord
476
+
477
+
478
+ class InspectionDeficiency(_Base):
479
+ """A deficiency entry from an inspection detail."""
480
+
481
+ category: str | None = None
482
+ count: int | None = None
483
+ deficiency: str | None = None
484
+
485
+
486
+ class InspectionDetailRecord(_Base):
487
+ """Detailed inspection record with deficiency breakdown."""
488
+
489
+ authority: str | None = None
490
+ deficiencies: list[InspectionDeficiency] | None = None
491
+ deficiency_count: int | None = None
492
+ detail_id: str | None = None
493
+ detained: bool | None = None
494
+ detention_grounds: list[InspectionDeficiency] | None = None
495
+ imo: int | None = None
496
+ inspection_date: str | None = None
497
+ inspection_type: str | None = None
498
+ mou_region: str | None = None
499
+ port: str | None = None
500
+
501
+
502
+ # Keep ``InspectionDetail`` as an alias so existing imports keep working.
503
+ InspectionDetail = InspectionDetailRecord
504
+
505
+
506
+ class InspectionsResponseData(_Base):
507
+ """Inner data of the inspections response (types.InspectionsResponse)."""
508
+
509
+ cached_at: str | None = None
510
+ imo: int | None = None
511
+ inspection_count: int | None = None
512
+ inspections: list[InspectionRecord] | None = None
513
+
514
+
515
+ class TypesInspectionsResponse(_Base):
516
+ """Response for vessel inspections (wraps InspectionsResponseData)."""
517
+
518
+ cached_at: str | None = None
519
+ imo: int | None = None
520
+ inspection_count: int | None = None
521
+ inspections: list[InspectionRecord] | None = None
522
+
523
+
524
+ class InspectionDetailResponseData(_Base):
525
+ """Inner data of the inspection detail response."""
526
+
527
+ cached_at: str | None = None
528
+ detail_id: str | None = None
529
+ imo: int | None = None
530
+ inspection_detail: InspectionDetailRecord | None = None
531
+
532
+
533
+ class TypesInspectionDetailResponse(_Base):
534
+ """Response for a detailed inspection."""
535
+
536
+ cached_at: str | None = None
537
+ detail_id: str | None = None
538
+ imo: int | None = None
539
+ inspection_detail: InspectionDetailRecord | None = None
540
+
541
+
542
+ # ---------------------------------------------------------------------------
543
+ # Ownership models
544
+ # ---------------------------------------------------------------------------
545
+
546
+
547
+ class VesselOwnership(_Base):
548
+ """Vessel ownership and management details."""
549
+
550
+ doc_company: str | None = None
551
+ doc_company_address: str | None = None
552
+ imo: int | None = None
553
+ registered_owner: str | None = None
554
+ registered_owner_address: str | None = None
555
+ ship_manager: str | None = None
556
+ ship_manager_address: str | None = None
557
+
558
+
559
+ # Keep ``Ownership`` as an alias so existing imports keep working.
560
+ Ownership = VesselOwnership
561
+
562
+
563
+ class OwnershipResponseData(_Base):
564
+ """Inner data of the ownership response (types.OwnershipResponse)."""
565
+
566
+ cached_at: str | None = None
567
+ imo: int | None = None
568
+ ownership: VesselOwnership | None = None
569
+
570
+
571
+ class TypesOwnershipResponse(_Base):
572
+ """Response for vessel ownership."""
573
+
574
+ cached_at: str | None = None
575
+ imo: int | None = None
576
+ ownership: VesselOwnership | None = None
577
+
578
+
579
+ # ---------------------------------------------------------------------------
580
+ # Port models
581
+ # ---------------------------------------------------------------------------
582
+
583
+
584
+ class Port(_Base):
585
+ """A port record with complete harbor details and facilities."""
586
+
587
+ anchorage_depth: float | None = None
588
+ anchorage_depth_unit: str | None = None
589
+ cargo_handling_depth: float | None = None
590
+ cargo_handling_depth_unit: str | None = None
591
+ channel_depth: float | None = None
592
+ channel_depth_unit: str | None = None
593
+ country: PortCountry | None = None
594
+ garbage_disposal: bool | None = None
595
+ harbor_size: str | None = None
596
+ harbor_type: str | None = None
597
+ harbor_use: str | None = None
598
+ has_drydock: bool | None = None
599
+ latitude: float | None = None
600
+ location: GeoJSON | None = None
601
+ longitude: float | None = None
602
+ max_vessel_beam: float | None = None
603
+ max_vessel_beam_unit: str | None = None
604
+ max_vessel_draft: float | None = None
605
+ max_vessel_draft_unit: str | None = None
606
+ max_vessel_length: float | None = None
607
+ max_vessel_length_unit: str | None = None
608
+ medical_facilities: bool | None = None
609
+ name: str | None = None
610
+ navigation_area: str | None = None
611
+ pilotage_available: bool | None = None
612
+ pilotage_compulsory: bool | None = None
613
+ port_security: bool | None = None
614
+ region_name: str | None = None
615
+ repair_capability: str | None = None
616
+ shelter: str | None = None
617
+ size: str | None = None
618
+ supply_diesel: bool | None = None
619
+ supply_fuel: bool | None = None
620
+ supply_water: bool | None = None
621
+ traffic_separation_scheme: bool | None = None
622
+ tugs_available: bool | None = None
623
+ type: str | None = None
624
+ unlo_code: str | None = None
625
+ vessel_traffic_service: bool | None = None
626
+
627
+
628
+ class PortResponse(_Base):
629
+ """Response for a single port lookup."""
630
+
631
+ port: Port | None = None
632
+
633
+
634
+ # ---------------------------------------------------------------------------
635
+ # Port event models
636
+ # ---------------------------------------------------------------------------
637
+
638
+
639
+ class PortEvent(_Base):
640
+ """A port event (arrival/departure) record."""
641
+
642
+ event: str | None = None
643
+ port: PortReference | None = None
644
+ timestamp: str | None = None
645
+ vessel: VesselReference | None = None
646
+
647
+
648
+ class PortEventsResponse(_Base):
649
+ """Response for port events list."""
650
+
651
+ port_events: list[PortEvent] | None = Field(
652
+ default=None, alias="portEvents"
653
+ )
654
+ next_token: str | None = Field(default=None, alias="nextToken")
655
+
656
+
657
+ class PortEventResponse(_Base):
658
+ """Response for a single port event (e.g. last by vessel)."""
659
+
660
+ port_event: PortEvent | None = Field(default=None, alias="portEvent")
661
+
662
+
663
+ # ---------------------------------------------------------------------------
664
+ # Search models
665
+ # ---------------------------------------------------------------------------
666
+
667
+
668
+ class FindVesselsResponse(_Base):
669
+ """Response for vessel search."""
670
+
671
+ vessels: list[Vessel] | None = None
672
+ next_token: str | None = Field(default=None, alias="nextToken")
673
+
674
+
675
+ class FindPortsResponse(_Base):
676
+ """Response for port search."""
677
+
678
+ ports: list[Port] | None = None
679
+ next_token: str | None = Field(default=None, alias="nextToken")
680
+
681
+
682
+ class DGPSStation(_Base):
683
+ """A DGPS station record."""
684
+
685
+ aid_type: str | None = None
686
+ delete_flag: str | None = None
687
+ feature_number: float | None = None
688
+ frequency: float | None = None
689
+ geopolitical_heading: str | None = None
690
+ location: GeoJSON | None = None
691
+ name: str | None = None
692
+ notice_number: int | None = None
693
+ notice_week: str | None = None
694
+ notice_year: str | None = None
695
+ position: str | None = None
696
+ post_note: str | None = None
697
+ preceding_note: str | None = None
698
+ range: int | None = None
699
+ region_heading: str | None = None
700
+ remarks: str | None = None
701
+ remove_from_list: str | None = None
702
+ station_id: str | None = None
703
+ transfer_rate: int | None = None
704
+ volume_number: str | None = None
705
+
706
+
707
+ class FindDGPSStationsResponse(_Base):
708
+ """Response for DGPS station search."""
709
+
710
+ dgps_stations: list[DGPSStation] | None = Field(
711
+ default=None, alias="dgpsStations"
712
+ )
713
+ next_token: str | None = Field(default=None, alias="nextToken")
714
+
715
+
716
+ class LightAid(_Base):
717
+ """A light aid to navigation record."""
718
+
719
+ aid_type: str | None = None
720
+ characteristic: str | None = None
721
+ characteristic_number: int | None = None
722
+ delete_flag: str | None = None
723
+ feature_number: str | None = None
724
+ geopolitical_heading: str | None = None
725
+ height_feet_meters: str | None = None
726
+ local_heading: str | None = None
727
+ location: GeoJSON | None = None
728
+ name: str | None = None
729
+ notice_number: int | None = None
730
+ notice_week: str | None = None
731
+ notice_year: str | None = None
732
+ position: str | None = None
733
+ post_note: str | None = None
734
+ preceding_note: str | None = None
735
+ range: str | None = None
736
+ region_heading: str | None = None
737
+ remarks: str | None = None
738
+ remove_from_list: str | None = None
739
+ structure: str | None = None
740
+ subregion_heading: str | None = None
741
+ volume_number: str | None = None
742
+
743
+
744
+ class FindLightAidsResponse(_Base):
745
+ """Response for light aids search."""
746
+
747
+ light_aids: list[LightAid] | None = Field(default=None, alias="lightAids")
748
+ next_token: str | None = Field(default=None, alias="nextToken")
749
+
750
+
751
+ class MODU(_Base):
752
+ """A Mobile Offshore Drilling Unit record."""
753
+
754
+ date: str | None = None
755
+ distance: float | None = None
756
+ latitude: float | None = None
757
+ location: GeoJSON | None = None
758
+ longitude: float | None = None
759
+ name: str | None = None
760
+ navigation_area: str | None = None
761
+ position: str | None = None
762
+ region: int | None = None
763
+ rig_status: str | None = None
764
+ special_status: str | None = None
765
+ sub_region: int | None = None
766
+
767
+
768
+ class FindMODUsResponse(_Base):
769
+ """Response for MODU search."""
770
+
771
+ modus: list[MODU] | None = None
772
+ next_token: str | None = Field(default=None, alias="nextToken")
773
+
774
+
775
+ class RadioBeacon(_Base):
776
+ """A radio beacon record."""
777
+
778
+ aid_type: str | None = None
779
+ characteristic: str | None = None
780
+ delete_flag: str | None = None
781
+ feature_number: float | None = None
782
+ frequency: str | None = None
783
+ geopolitical_heading: str | None = None
784
+ location: GeoJSON | None = None
785
+ name: str | None = None
786
+ notice_number: int | None = None
787
+ notice_week: str | None = None
788
+ notice_year: str | None = None
789
+ position: str | None = None
790
+ post_note: str | None = None
791
+ preceding_note: str | None = None
792
+ range: str | None = None
793
+ region_heading: str | None = None
794
+ remove_from_list: str | None = None
795
+ sequence_text: str | None = None
796
+ station_remark: str | None = None
797
+ volume_number: str | None = None
798
+
799
+
800
+ class FindRadioBeaconsResponse(_Base):
801
+ """Response for radio beacon search."""
802
+
803
+ radio_beacons: list[RadioBeacon] | None = Field(
804
+ default=None, alias="radioBeacons"
805
+ )
806
+ next_token: str | None = Field(default=None, alias="nextToken")
807
+
808
+
809
+ # ---------------------------------------------------------------------------
810
+ # Location query response models
811
+ # ---------------------------------------------------------------------------
812
+
813
+
814
+ class VesselsWithinLocationResponse(_Base):
815
+ """Response for vessel location queries (bounding box or radius)."""
816
+
817
+ vessels: list[VesselPosition] | None = None
818
+ next_token: str | None = Field(default=None, alias="nextToken")
819
+
820
+
821
+ class PortsWithinLocationResponse(_Base):
822
+ """Response for port location queries."""
823
+
824
+ ports: list[Port] | None = None
825
+ next_token: str | None = Field(default=None, alias="nextToken")
826
+
827
+
828
+ class DGPSStationsWithinLocationResponse(_Base):
829
+ """Response for DGPS station location queries."""
830
+
831
+ dgps_stations: list[DGPSStation] | None = Field(
832
+ default=None, alias="dgpsStations"
833
+ )
834
+ next_token: str | None = Field(default=None, alias="nextToken")
835
+
836
+
837
+ class LightAidsWithinLocationResponse(_Base):
838
+ """Response for light aids location queries."""
839
+
840
+ light_aids: list[LightAid] | None = Field(default=None, alias="lightAids")
841
+ next_token: str | None = Field(default=None, alias="nextToken")
842
+
843
+
844
+ class MODUsWithinLocationResponse(_Base):
845
+ """Response for MODU location queries."""
846
+
847
+ modus: list[MODU] | None = None
848
+ next_token: str | None = Field(default=None, alias="nextToken")
849
+
850
+
851
+ class RadioBeaconsWithinLocationResponse(_Base):
852
+ """Response for radio beacon location queries."""
853
+
854
+ radio_beacons: list[RadioBeacon] | None = Field(
855
+ default=None, alias="radioBeacons"
856
+ )
857
+ next_token: str | None = Field(default=None, alias="nextToken")
858
+
859
+
860
+ # ---------------------------------------------------------------------------
861
+ # Navtex models
862
+ # ---------------------------------------------------------------------------
863
+
864
+
865
+ class Navtex(_Base):
866
+ """A NAVTEX maritime safety message."""
867
+
868
+ issuing_office: str | None = None
869
+ label: str | None = None
870
+ lines: list[str] | None = None
871
+ metarea_coordinator: str | None = None
872
+ metarea_id: str | None = None
873
+ metarea_name: str | None = None
874
+ metarea_region: str | None = None
875
+ metarea_stations: list[BroadcastStation] | None = None
876
+ raw_content: str | None = None
877
+ timestamp: str | None = None
878
+ wmo_header: str | None = None
879
+
880
+
881
+ class NavtexMessagesResponse(_Base):
882
+ """Response for NAVTEX messages list."""
883
+
884
+ navtex_messages: list[Navtex] | None = Field(
885
+ default=None, alias="navtexMessages"
886
+ )
887
+ next_token: str | None = Field(default=None, alias="nextToken")