Job Models

Job models for ACPortal and ABC APIs.

class ab.api.models.jobs.JobContactEmail(*, id=None, email=None, invalid=None, dontSpam=None, **extra_data)[source]

Bases: ResponseModel

Email entry nested in JobContactDetails.

Parameters:
  • id (int | None)

  • email (str | None)

  • invalid (bool | None)

  • dontSpam (bool | None)

  • extra_data (Any)

id: int | None
email: str | None
invalid: bool | None
dont_spam: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobContactPhone(*, id=None, phone=None, **extra_data)[source]

Bases: ResponseModel

Phone entry nested in JobContactDetails.

Parameters:
  • id (int | None)

  • phone (str | None)

  • extra_data (Any)

id: int | None
phone: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ContactDetails(*, id=None, contactDisplayId=None, fullName=None, contactTypeId=None, editable=None, isEmpty=None, fullNameUpdateRequired=None, emailsList=None, phonesList=None, addressesList=None, fax=None, primaryPhone=None, primaryEmail=None, careOf=None, bolNotes=None, taxId=None, isBusiness=None, isPayer=None, isPrefered=None, isPrivate=None, isActive=None, companyId=None, rootContactId=None, ownerFranchiseeId=None, company=None, legacyGuid=None, isPrimary=None, assistant=None, department=None, webSite=None, birthDate=None, jobTitleId=None, jobTitle=None, **extra_data)[source]

Bases: ResponseModel

Full contact person — nested in JobContactDetails.contact.

Maps to C# ContactDetails entity.

Parameters:
  • id (int | None)

  • contactDisplayId (str | None)

  • fullName (str | None)

  • contactTypeId (int | None)

  • editable (bool | None)

  • isEmpty (bool | None)

  • fullNameUpdateRequired (bool | None)

  • emailsList (List[dict] | None)

  • phonesList (List[dict] | None)

  • addressesList (List[dict] | None)

  • fax (str | None)

  • primaryPhone (str | None)

  • primaryEmail (str | None)

  • careOf (str | None)

  • bolNotes (str | None)

  • taxId (str | None)

  • isBusiness (bool | None)

  • isPayer (bool | None)

  • isPrefered (bool | None)

  • isPrivate (bool | None)

  • isActive (bool | None)

  • companyId (str | None)

  • rootContactId (str | None)

  • ownerFranchiseeId (str | None)

  • company (dict | None)

  • legacyGuid (str | None)

  • isPrimary (bool | None)

  • assistant (str | None)

  • department (str | None)

  • webSite (str | None)

  • birthDate (str | None)

  • jobTitleId (str | None)

  • jobTitle (str | None)

  • extra_data (Any)

id: int | None
contact_display_id: str | None
full_name: str | None
contact_type_id: int | None
editable: bool | None
is_empty: bool | None
full_name_update_required: bool | None
emails_list: List[dict] | None
phones_list: List[dict] | None
addresses_list: List[dict] | None
fax: str | None
primary_phone: str | None
primary_email: str | None
care_of: str | None
bol_notes: str | None
tax_id: str | None
is_business: bool | None
is_payer: bool | None
is_prefered: bool | None
is_private: bool | None
is_active: bool | None
company_id: str | None
root_contact_id: str | None
owner_franchisee_id: str | None
company: dict | None
legacy_guid: str | None
is_primary: bool | None
assistant: str | None
department: str | None
web_site: str | None
birth_date: str | None
job_title_id: str | None
job_title: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobContactDetails(*, id=None, contact=None, email=None, phone=None, address=None, careOf=None, legacyGuid=None, contactEmailMappingId=None, contactPhoneMappingId=None, contactAddressMappingId=None, draggedFrom=None, jobContactType=None, propertyType=None, **extra_data)[source]

Bases: ResponseModel

Contact wrapper — nested in Job as customerContact, pickupContact, deliveryContact.

Maps to C# JobContactDetails entity. Reuses CompanyAddress from common.py.

Parameters:
id: int | None
contact: ContactDetails | None
email: JobContactEmail | None
phone: JobContactPhone | None
address: CompanyAddress | None
care_of: str | None
legacy_guid: str | None
contact_email_mapping_id: int | None
contact_phone_mapping_id: int | None
contact_address_mapping_id: int | None
dragged_from: str | None
job_contact_type: str | None
property_type: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobItemMaterial(*, jobID=None, jobPackMaterialID=None, materialID=None, mateialMasterID=None, materialQuantity=None, materialName=None, materialDescription=None, materialCode=None, materialType=None, materialUnit=None, materialWeight=None, materialLength=None, materialWidth=None, materialHeight=None, materialCost=None, materialPrice=None, materialWasteFactor=None, materialTotalCost=None, materialTotalWeight=None, createdBy=None, modifiedBy=None, createdDate=None, modifiedDate=None, itemID=None, quantityActual=None, isAutomatic=None, waste=None, price=None, isEdited=None, itemName=None, itemDescription=None, itemNotes=None, jobItemId=None, companyId=None, isActive=None, **extra_data)[source]

Bases: ResponseModel

Material used in a job item — nested in JobItem.materials.

Maps to C# MasterMaterials entity.

Parameters:
  • jobID (str | None)

  • jobPackMaterialID (str | None)

  • materialID (int | None)

  • mateialMasterID (str | None)

  • materialQuantity (float | None)

  • materialName (str | None)

  • materialDescription (str | None)

  • materialCode (str | None)

  • materialType (str | None)

  • materialUnit (str | None)

  • materialWeight (float | None)

  • materialLength (float | None)

  • materialWidth (float | None)

  • materialHeight (float | None)

  • materialCost (float | None)

  • materialPrice (float | None)

  • materialWasteFactor (float | None)

  • materialTotalCost (float | None)

  • materialTotalWeight (float | None)

  • createdBy (str | None)

  • modifiedBy (str | None)

  • createdDate (str | None)

  • modifiedDate (str | None)

  • itemID (str | None)

  • quantityActual (float | None)

  • isAutomatic (bool | None)

  • waste (float | None)

  • price (float | None)

  • isEdited (bool | None)

  • itemName (str | None)

  • itemDescription (str | None)

  • itemNotes (str | None)

  • jobItemId (str | None)

  • companyId (str | None)

  • isActive (bool | None)

  • extra_data (Any)

job_id: str | None
job_pack_material_id: str | None
material_id: int | None
mateial_master_id: str | None
material_quantity: float | None
material_name: str | None
material_description: str | None
material_code: str | None
material_type: str | None
material_unit: str | None
material_weight: float | None
material_length: float | None
material_width: float | None
material_height: float | None
material_cost: float | None
material_price: float | None
material_waste_factor: float | None
material_total_cost: float | None
material_total_weight: float | None
created_by: str | None
modified_by: str | None
created_date: str | None
modified_date: str | None
item_id: str | None
quantity_actual: float | None
is_automatic: bool | None
waste: float | None
price: float | None
is_edited: bool | None
item_name: str | None
item_description: str | None
item_notes: str | None
job_item_id: str | None
company_id: str | None
is_active: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobItem(*, jobDisplayId=None, jobItemID=None, originalJobItemId=None, jobID=None, quantity=None, originalQty=None, jobFreightID=None, nmfcItem=None, nmfcSub=None, nmfcSubClass=None, jobItemPkdLength=None, jobItemPkdWidth=None, jobItemPkdHeight=None, jobItemPkdWeight=None, isFillPercentChanged=None, cFillId=None, containerId=None, laborHrs=None, laborCharge=None, userId=None, isFillChanged=None, isContainerChanged=None, isValidContainer=None, isValidFill=None, inchesToAdd=None, containerThickness=None, isInchToAddChanged=None, totalPcs=None, descriptionOfProducts=None, totalItems=None, autoPackOff=None, cPackValue=None, cFillValue=None, containerType=None, jobItemFillPercent=None, containerWeight=None, fillWeight=None, materialWeight=None, jobItemPkdValue=None, totalPackedValue=None, totalWeight=None, stc=None, materials=None, materialTotalCost=None, isAccess=None, jobItemParcelValue=None, totalLaborCharge=None, grossCubicFeet=None, rowNumber=None, notedConditions=None, jobItemNotes=None, customerItemId=None, documentExists=None, forceCrate=None, autoPackFailed=None, doNotTip=None, commodityId=None, longestDimension=None, secondDimension=None, pkdLengthPlusGirth=None, requestedParcelPackagings=None, parcelPackageTypeId=None, transportationLength=None, transportationWidth=None, transportationHeight=None, transportationWeight=None, ceilingTransportationWeight=None, companyID=None, companyName=None, itemSequenceNo=None, itemName=None, itemDescription=None, scheduleB=None, eccn=None, itemNotes=None, isPrepacked=None, itemActive=None, itemPublic=None, cPackId=None, itemID=None, itemValue=None, modifiedBy=None, createdBy=None, createdDate=None, modifiedDate=None, itemLength=None, itemWidth=None, itemHeight=None, itemWeight=None, netCubicFeet=None, **extra_data)[source]

Bases: ResponseModel

Job line item — nested in Job.items.

Maps to C# Items entity (inherits MasterItems, ItemFeature).

Parameters:
  • jobDisplayId (int | None)

  • jobItemID (str | None)

  • originalJobItemId (str | None)

  • jobID (str | None)

  • quantity (int | None)

  • originalQty (int | None)

  • jobFreightID (str | None)

  • nmfcItem (str | None)

  • nmfcSub (str | None)

  • nmfcSubClass (str | None)

  • jobItemPkdLength (float | None)

  • jobItemPkdWidth (float | None)

  • jobItemPkdHeight (float | None)

  • jobItemPkdWeight (float | None)

  • isFillPercentChanged (bool | None)

  • cFillId (int | None)

  • containerId (int | None)

  • laborHrs (float | None)

  • laborCharge (float | None)

  • userId (str | None)

  • isFillChanged (bool | None)

  • isContainerChanged (bool | None)

  • isValidContainer (bool | None)

  • isValidFill (bool | None)

  • inchesToAdd (float | None)

  • containerThickness (float | None)

  • isInchToAddChanged (bool | None)

  • totalPcs (int | None)

  • descriptionOfProducts (str | None)

  • totalItems (int | None)

  • autoPackOff (bool | None)

  • cPackValue (str | None)

  • cFillValue (str | None)

  • containerType (str | None)

  • jobItemFillPercent (float | None)

  • containerWeight (float | None)

  • fillWeight (float | None)

  • materialWeight (float | None)

  • jobItemPkdValue (float | None)

  • totalPackedValue (float | None)

  • totalWeight (float | None)

  • stc (str | None)

  • materials (List[JobItemMaterial] | None)

  • materialTotalCost (float | None)

  • isAccess (bool | None)

  • jobItemParcelValue (float | None)

  • totalLaborCharge (float | None)

  • grossCubicFeet (float | None)

  • rowNumber (int | None)

  • notedConditions (str | None)

  • jobItemNotes (str | None)

  • customerItemId (str | None)

  • documentExists (bool | None)

  • forceCrate (bool | None)

  • autoPackFailed (bool | None)

  • doNotTip (bool | None)

  • commodityId (int | None)

  • longestDimension (float | None)

  • secondDimension (float | None)

  • pkdLengthPlusGirth (float | None)

  • requestedParcelPackagings (str | None)

  • parcelPackageTypeId (int | None)

  • transportationLength (int | None)

  • transportationWidth (int | None)

  • transportationHeight (int | None)

  • transportationWeight (float | None)

  • ceilingTransportationWeight (int | None)

  • companyID (str | None)

  • companyName (str | None)

  • itemSequenceNo (int | None)

  • itemName (str | None)

  • itemDescription (str | None)

  • scheduleB (str | None)

  • eccn (str | None)

  • itemNotes (str | None)

  • isPrepacked (bool | None)

  • itemActive (bool | None)

  • itemPublic (bool | None)

  • cPackId (str | None)

  • itemID (str | None)

  • itemValue (float | None)

  • modifiedBy (str | None)

  • createdBy (str | None)

  • createdDate (str | None)

  • modifiedDate (str | None)

  • itemLength (float | None)

  • itemWidth (float | None)

  • itemHeight (float | None)

  • itemWeight (float | None)

  • netCubicFeet (float | None)

  • extra_data (Any)

job_display_id: int | None
job_item_id: str | None
original_job_item_id: str | None
job_id: str | None
quantity: int | None
original_qty: int | None
job_freight_id: str | None
nmfc_item: str | None
nmfc_sub: str | None
nmfc_sub_class: str | None
job_item_pkd_length: float | None
job_item_pkd_width: float | None
job_item_pkd_height: float | None
job_item_pkd_weight: float | None
is_fill_percent_changed: bool | None
c_fill_id: int | None
container_id: int | None
labor_hrs: float | None
labor_charge: float | None
user_id: str | None
is_fill_changed: bool | None
is_container_changed: bool | None
is_valid_container: bool | None
is_valid_fill: bool | None
inches_to_add: float | None
container_thickness: float | None
is_inch_to_add_changed: bool | None
total_pcs: int | None
description_of_products: str | None
total_items: int | None
auto_pack_off: bool | None
c_pack_value: str | None
c_fill_value: str | None
container_type: str | None
job_item_fill_percent: float | None
container_weight: float | None
fill_weight: float | None
material_weight: float | None
job_item_pkd_value: float | None
total_packed_value: float | None
total_weight: float | None
stc: str | None
materials: List[JobItemMaterial] | None
material_total_cost: float | None
is_access: bool | None
job_item_parcel_value: float | None
total_labor_charge: float | None
gross_cubic_feet: float | None
row_number: int | None
noted_conditions: str | None
job_item_notes: str | None
customer_item_id: str | None
document_exists: bool | None
force_crate: bool | None
auto_pack_failed: bool | None
do_not_tip: bool | None
commodity_id: int | None
longest_dimension: float | None
second_dimension: float | None
pkd_length_plus_girth: float | None
requested_parcel_packagings: str | None
parcel_package_type_id: int | None
transportation_length: int | None
transportation_width: int | None
transportation_height: int | None
transportation_weight: float | None
ceiling_transportation_weight: int | None
company_id: str | None
company_name: str | None
item_sequence_no: int | None
item_name: str | None
item_description: str | None
schedule_b: str | None
eccn: str | None
item_notes: str | None
is_prepacked: bool | None
item_active: bool | None
item_public: bool | None
c_pack_id: str | None
item_id: str | None
item_value: float | None
modified_by: str | None
created_by: str | None
created_date: str | None
modified_date: str | None
item_length: float | None
item_width: float | None
item_height: float | None
item_weight: float | None
net_cubic_feet: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSummarySnapshot(*, jobSnapshotID=None, jobID=None, jobStatusID=None, jobTotalAmount=None, jobTotalWeight=None, jobTotalQty=None, jobTotalValue=None, isCurrent=None, totalUnpackedWeight=None, jobItemsTotalContainerLbs=None, jobItemsTotalFillLbs=None, jobItemsTotalMaterials=None, jobItemsTotalLaborHrs=None, jobItemsTotalGrossCubes=None, jobItemsTotalNetCubes=None, jobItemsTotalMaterialsLbs=None, jobItemsTotalLaborCost=None, jobTaxTotalAmount=None, jobTotalCost=None, jobNetProfit=None, createdDate=None, createdBy=None, subTotal=None, sumTotal=None, **extra_data)[source]

Bases: ResponseModel

Financial/weight rollup — nested in Job.job_summary_snapshot.

Maps to C# JobSummary entity.

Parameters:
  • jobSnapshotID (int | None)

  • jobID (str | None)

  • jobStatusID (str | None)

  • jobTotalAmount (float | None)

  • jobTotalWeight (float | None)

  • jobTotalQty (int | None)

  • jobTotalValue (float | None)

  • isCurrent (bool | None)

  • totalUnpackedWeight (float | None)

  • jobItemsTotalContainerLbs (float | None)

  • jobItemsTotalFillLbs (float | None)

  • jobItemsTotalMaterials (float | None)

  • jobItemsTotalLaborHrs (float | None)

  • jobItemsTotalGrossCubes (float | None)

  • jobItemsTotalNetCubes (float | None)

  • jobItemsTotalMaterialsLbs (float | None)

  • jobItemsTotalLaborCost (float | None)

  • jobTaxTotalAmount (float | None)

  • jobTotalCost (float | None)

  • jobNetProfit (float | None)

  • createdDate (str | None)

  • createdBy (str | None)

  • subTotal (float | None)

  • sumTotal (float | None)

  • extra_data (Any)

job_snapshot_id: int | None
job_id: str | None
job_status_id: str | None
job_total_amount: float | None
job_total_weight: float | None
job_total_qty: int | None
job_total_value: float | None
is_current: bool | None
total_unpacked_weight: float | None
job_items_total_container_lbs: float | None
job_items_total_fill_lbs: float | None
job_items_total_materials: float | None
job_items_total_labor_hrs: float | None
job_items_total_gross_cubes: float | None
job_items_total_net_cubes: float | None
job_items_total_materials_lbs: float | None
job_items_total_labor_cost: float | None
job_tax_total_amount: float | None
job_total_cost: float | None
job_net_profit: float | None
created_date: str | None
created_by: str | None
sub_total: float | None
sum_total: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ActiveOnHoldInfo(*, id=None, responsiblePartyTypeId=None, reasonId=None, responsibleParty=None, reason=None, comment=None, startDate=None, createdBy=None, **extra_data)[source]

Bases: ResponseModel

Active on-hold info — nested in Job.active_on_hold_info.

Maps to C# OnHoldInfo entity.

Parameters:
  • id (int | None)

  • responsiblePartyTypeId (str | None)

  • reasonId (str | None)

  • responsibleParty (str | None)

  • reason (str | None)

  • comment (str | None)

  • startDate (str | None)

  • createdBy (str | None)

  • extra_data (Any)

id: int | None
responsible_party_type_id: str | None
reason_id: str | None
responsible_party: str | None
reason: str | None
comment: str | None
start_date: str | None
created_by: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobDocument(*, id=None, path=None, thumbnailPath=None, description=None, typeName=None, typeId=None, fileName=None, shared=None, tags=None, jobItems=None, **extra_data)[source]

Bases: ResponseModel

Document attachment — nested in Job.documents.

Maps to C# DocumentDetails entity.

Parameters:
  • id (int | None)

  • path (str | None)

  • thumbnailPath (str | None)

  • description (str | None)

  • typeName (str | None)

  • typeId (int | None)

  • fileName (str | None)

  • shared (int | None)

  • tags (List[dict] | None)

  • jobItems (List[str] | None)

  • extra_data (Any)

id: int | None
path: str | None
thumbnail_path: str | None
description: str | None
type_name: str | None
type_id: int | None
file_name: str | None
shared: int | None
tags: List[dict] | None
job_items: List[str] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSlaInfo(*, days=None, expedited=None, startDate=None, finishDate=None, totalOnHoldDays=None, **extra_data)[source]

Bases: ResponseModel

SLA tracking — nested in Job.sla_info.

Maps to C# SlaInfo entity.

Parameters:
  • days (int | None)

  • expedited (bool | None)

  • startDate (str | None)

  • finishDate (str | None)

  • totalOnHoldDays (int | None)

  • extra_data (Any)

days: int | None
expedited: bool | None
start_date: str | None
finish_date: str | None
total_on_hold_days: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobFreightInfo(*, providerCompanyCode=None, providerCompanyName=None, proNum=None, transportationState=None, transportationStateDescription=None, **extra_data)[source]

Bases: ResponseModel

Freight tracking summary — nested in Job.freight_info.

Maps to C# FreightTrackingLastDetails entity.

Parameters:
  • providerCompanyCode (str | None)

  • providerCompanyName (str | None)

  • proNum (str | None)

  • transportationState (int | None)

  • transportationStateDescription (str | None)

  • extra_data (Any)

provider_company_code: str | None
provider_company_name: str | None
pro_num: str | None
transportation_state: int | None
transportation_state_description: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobPaymentInfo(*, statusId=None, status=None, readyToInvoiceDate=None, invoiceDate=None, paidDate=None, **extra_data)[source]

Bases: ResponseModel

Payment status — nested in Job.payment_info.

Maps to C# PaymentInfo entity.

Parameters:
  • statusId (str | None)

  • status (str | None)

  • readyToInvoiceDate (str | None)

  • invoiceDate (str | None)

  • paidDate (str | None)

  • extra_data (Any)

status_id: str | None
status: str | None
ready_to_invoice_date: str | None
invoice_date: str | None
paid_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobAgentPaymentInfo(*, amount=None, paidDate=None, **extra_data)[source]

Bases: ResponseModel

Agent payment info — nested in Job.agent_payment_info.

Maps to C# AgentPaymentInfo entity.

Parameters:
  • amount (float | None)

  • paidDate (str | None)

  • extra_data (Any)

amount: float | None
paid_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobFreightItem(*, jobID=None, quantity=None, freightItemId=None, freightItemClassId=None, jobFreightID=None, freightDescription=None, freightItemValue=None, freightItemClass=None, jobDisplayId=None, nmfcItem=None, totalWeight=None, **extra_data)[source]

Bases: ResponseModel

Freight shipment item — nested in Job.freight_items.

Maps to C# FreightShimpment entity (inherits ItemFeature).

Parameters:
  • jobID (str | None)

  • quantity (int | None)

  • freightItemId (str | None)

  • freightItemClassId (str | None)

  • jobFreightID (str | None)

  • freightDescription (str | None)

  • freightItemValue (str | None)

  • freightItemClass (str | None)

  • jobDisplayId (str | None)

  • nmfcItem (str | None)

  • totalWeight (float | None)

  • extra_data (Any)

job_id: str | None
quantity: int | None
freight_item_id: str | None
freight_item_class_id: str | None
job_freight_id: str | None
freight_description: str | None
freight_item_value: str | None
freight_item_class: str | None
job_display_id: str | None
nmfc_item: str | None
total_weight: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TransferModel(*, franchiseeId)[source]

Bases: RequestModel

Body for POST /job/transfer/{jobDisplayId}.

Parameters:

franchiseeId (str)

franchisee_id: str
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchParams(*, jobDisplayId=None)[source]

Bases: RequestModel

Query parameters for GET /job/search.

Parameters:

jobDisplayId (int | None)

job_display_id: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.FreightProvidersParams(*, ProviderIndexes=None, ShipmentTypes=None, OnlyActive=None)[source]

Bases: RequestModel

Query parameters for GET /job/{jobDisplayId}/freightproviders.

Parameters:
  • ProviderIndexes (List[int] | None)

  • ShipmentTypes (List[str] | None)

  • OnlyActive (bool | None)

provider_indexes: List[int] | None
shipment_types: List[str] | None
only_active: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineCreateParams(*, createEmail=None)[source]

Bases: RequestModel

Query parameters for POST /job/{jobDisplayId}/timeline.

Parameters:

createEmail (bool | None)

create_email: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TrackingV3Params(*, historyAmount=None)[source]

Bases: RequestModel

Query parameters for GET /v3/job/{jobDisplayId}/tracking.

Parameters:

historyAmount (int | None)

history_amount: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobNoteListParams(*, category=None, taskCode=None)[source]

Bases: RequestModel

Query parameters for GET /job/{jobDisplayId}/note.

Parameters:
  • category (str | None)

  • taskCode (str | None)

category: str | None
task_code: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobRfqListParams(*, rfqServiceType=None)[source]

Bases: RequestModel

Query parameters for GET /job/{jobDisplayId}/rfq.

Parameters:

rfqServiceType (str | None)

rfq_service_type: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.Job(*, isActive=None, createdDate=None, modifiedDate=None, createdBy=None, modifiedBy=None, id=None, jobDisplayId=None, status=None, customer=None, pickup=None, delivery=None, items=None, bookedDate=None, ownerCompanyId=None, customerContact=None, pickupContact=None, deliveryContact=None, totalSellPrice=None, freightItems=None, jobSummarySnapshot=None, notes=None, activeOnHoldInfo=None, writeAccess=None, accessLevel=None, statusId=None, jobMgmtSubId=None, isCancelled=None, freightInfo=None, freightProviders=None, expectedPickupDate=None, expectedDeliveryDate=None, timelineTasks=None, documents=None, labelRequestSentDate=None, paymentInfo=None, agentPaymentInfo=None, slaInfo=None, jobType=None, prices=None, **extra_data)[source]

Bases: ResponseModel, FullAuditModel

Full job record — GET /job/{jobDisplayId}.

Maps to C# JobPortalInfo entity. Response shape varies by JobAccessLevel (Owner/Customer gets full data, Agent gets filtered).

Parameters:
job_display_id: int | None
status: str | None
customer: dict | None
pickup: dict | None
delivery: dict | None
items: List[JobItem] | None
booked_date: str | None
owner_company_id: str | None
customer_contact: JobContactDetails | None
pickup_contact: JobContactDetails | None
delivery_contact: JobContactDetails | None
total_sell_price: float | None
freight_items: List[JobFreightItem] | None
job_summary_snapshot: JobSummarySnapshot | None
notes: List[dict] | None
active_on_hold_info: ActiveOnHoldInfo | None
write_access: bool | None
access_level: int | None
status_id: str | None
job_mgmt_sub_id: str | None
is_cancelled: bool | None
freight_info: JobFreightInfo | None
freight_providers: List[dict] | None
expected_pickup_date: str | None
expected_delivery_date: str | None
timeline_tasks: List[dict] | None
documents: List[JobDocument] | None
label_request_sent_date: str | None
payment_info: JobPaymentInfo | None
agent_payment_info: JobAgentPaymentInfo | None
sla_info: JobSlaInfo | None
job_type: str | None
prices: List[dict] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchAddress(*, id=None, masterAddressId=None, propertyType=None, address1=None, address2=None, city=None, state=None, countryName=None, countryCode=None, zipCode=None, **extra_data)[source]

Bases: ResponseModel

Address nested in job search pickup/delivery details.

Parameters:
  • id (int | None)

  • masterAddressId (int | None)

  • propertyType (int | None)

  • address1 (str | None)

  • address2 (str | None)

  • city (str | None)

  • state (str | None)

  • countryName (str | None)

  • countryCode (str | None)

  • zipCode (str | None)

  • extra_data (Any)

id: int | None
master_address_id: int | None
property_type: int | None
address1: str | None
address2: str | None
city: str | None
state: str | None
country_name: str | None
country_code: str | None
zip_code: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchContact(*, id=None, contactDisplayId=None, companyId=None, companyName=None, bolNotes=None, fullName=None, **extra_data)[source]

Bases: ResponseModel

Contact nested in job search pickup/delivery details.

Parameters:
  • id (int | None)

  • contactDisplayId (str | None)

  • companyId (str | None)

  • companyName (str | None)

  • bolNotes (str | None)

  • fullName (str | None)

  • extra_data (Any)

id: int | None
contact_display_id: str | None
company_id: str | None
company_name: str | None
bol_notes: str | None
full_name: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchTask(*, id=None, jobId=None, truckId=None, taskCode=None, plannedStartDate=None, plannedEndDate=None, modifiedDate=None, onSiteTimeLog=None, tripTimeLog=None, completedDate=None, **extra_data)[source]

Bases: ResponseModel

Timeline task nested in job search pickup/delivery details.

Parameters:
  • id (int | None)

  • jobId (str | None)

  • truckId (str | None)

  • taskCode (str | None)

  • plannedStartDate (str | None)

  • plannedEndDate (str | None)

  • modifiedDate (str | None)

  • onSiteTimeLog (dict | None)

  • tripTimeLog (dict | None)

  • completedDate (str | None)

  • extra_data (Any)

id: int | None
job_id: str | None
truck_id: str | None
task_code: str | None
planned_start_date: str | None
planned_end_date: str | None
modified_date: str | None
on_site_time_log: dict | None
trip_time_log: dict | None
completed_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchTransportDetails(*, importantNotesCount=None, contact=None, address=None, contactEmail=None, contactPhone=None, companyId=None, task=None, **extra_data)[source]

Bases: ResponseModel

Pickup or delivery details in job search result.

Parameters:
important_notes_count: int | None
contact: JobSearchContact | None
address: JobSearchAddress | None
contact_email: str | None
contact_phone: str | None
company_id: str | None
task: JobSearchTask | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchResult(*, jobId=None, jobDisplayId=None, itemsCount=None, pickupDetails=None, deliveryDetails=None, accessLevel=None, **extra_data)[source]

Bases: ResponseModel

Single search hit — GET /job/search.

The live API returns a structured object with nested pickup/delivery details rather than the flat fields shown in older documentation.

Parameters:
job_id: str | None
job_display_id: int | None
items_count: int | None
pickup_details: JobSearchTransportDetails | None
delivery_details: JobSearchTransportDetails | None
access_level: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobPrice(*, jobDisplayId=None, prices=None, total=None, totalSellPrice=None, **extra_data)[source]

Bases: ResponseModel

Price info — GET /job/{jobDisplayId}/price.

Parameters:
  • jobDisplayId (int | None)

  • prices (List[dict] | None)

  • total (float | None)

  • totalSellPrice (float | None)

  • extra_data (Any)

job_display_id: int | None
prices: List[dict] | None
total: float | None
total_sell_price: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.CalendarItem(*, id=None, title=None, start=None, end=None, name=None, quantity=None, length=None, width=None, height=None, weight=None, value=None, notes=None, customerItemId=None, notedConditions=None, **extra_data)[source]

Bases: ResponseModel

Calendar/line item — GET /job/{jobDisplayId}/calendaritems.

Despite the name, the live API returns job line-item details (name, quantity, dimensions, value) rather than calendar events.

Parameters:
  • id (str | None)

  • title (str | None)

  • start (str | None)

  • end (str | None)

  • name (str | None)

  • quantity (int | None)

  • length (float | None)

  • width (float | None)

  • height (float | None)

  • weight (float | None)

  • value (float | None)

  • notes (str | None)

  • customerItemId (str | None)

  • notedConditions (str | None)

  • extra_data (Any)

id: str | None
title: str | None
start: str | None
end: str | None
name: str | None
quantity: int | None
length: float | None
width: float | None
height: float | None
weight: float | None
value: float | None
notes: str | None
customer_item_id: str | None
noted_conditions: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobUpdatePageConfig(*, config=None, pageControls=None, workflowControls=None, **extra_data)[source]

Bases: ResponseModel

Update page config — GET /job/{id}/updatePageConfig.

Parameters:
  • config (dict | None)

  • pageControls (int | None)

  • workflowControls (int | None)

  • extra_data (Any)

config: dict | None
page_controls: int | None
workflow_controls: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobCreateRequest(*, customer=None, pickup=None, delivery=None, items=None, services=None)[source]

Bases: RequestModel

Body for POST /job.

Parameters:
customer: dict | None
pickup: dict | None
delivery: dict | None
items: List[dict] | None
services: List[dict] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSaveRequest(*, jobDisplayId=None, customer=None, pickup=None, delivery=None, items=None)[source]

Bases: RequestModel

Body for PUT /job/save.

Parameters:
  • jobDisplayId (int | None)

  • customer (dict | None)

  • pickup (dict | None)

  • delivery (dict | None)

  • items (List[dict] | None)

job_display_id: int | None
customer: dict | None
pickup: dict | None
delivery: dict | None
items: List[dict] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SortByModel(*, sortByField=1, sortDir=True)[source]

Bases: RequestModel

Sort configuration for POST /job/searchByDetails.

Parameters:
sort_by_field: int
sort_dir: bool
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobSearchRequest(*, searchText=None, pageNo=None, pageSize=None, sortBy=None)[source]

Bases: PaginatedRequestMixin, SearchableRequestMixin

Body for POST /job/searchByDetails.

Parameters:
page: int | None
sort_by: SortByModel | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobUpdateRequest(*, jobId=None, updates=None)[source]

Bases: RequestModel

Body for POST /job/update (ABC API surface).

Parameters:
  • jobId (str | None)

  • updates (dict | None)

job_id: str | None
updates: dict | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineTask(*, createdDate=None, modifiedDate=None, createdBy=None, modifiedBy=None, id=None, jobId=None, taskCode=None, plannedStartDate=None, targetStartDate=None, actualEndDate=None, notes=None, workTimeLogs=None, initialNote=None, timeLog=None, plannedEndDate=None, preferredStartDate=None, preferredEndDate=None, truck=None, onSiteTimeLog=None, tripTimeLog=None, completedDate=None, scheduledDate=None, pickupCompletedDate=None, deliveryCompletedDate=None, expectedDeliveryDate=None, **extra_data)[source]

Bases: ResponseModel, TimestampedModel

Timeline task — unified model for all task codes (PU, PK, ST, CP).

Common fields from C# BaseTask + TimestampedModel, plus task-code-specific fields that are null when not applicable to the task’s code.

Parameters:
  • createdDate (datetime | None)

  • modifiedDate (datetime | None)

  • createdBy (str | None)

  • modifiedBy (str | None)

  • id (int | None)

  • jobId (str | None)

  • taskCode (str | None)

  • plannedStartDate (str | None)

  • targetStartDate (str | None)

  • actualEndDate (str | None)

  • notes (List[dict] | None)

  • workTimeLogs (List[dict] | None)

  • initialNote (dict | None)

  • timeLog (dict | None)

  • plannedEndDate (str | None)

  • preferredStartDate (str | None)

  • preferredEndDate (str | None)

  • truck (dict | None)

  • onSiteTimeLog (dict | None)

  • tripTimeLog (dict | str | None)

  • completedDate (str | None)

  • scheduledDate (str | None)

  • pickupCompletedDate (str | None)

  • deliveryCompletedDate (str | None)

  • expectedDeliveryDate (str | None)

  • extra_data (Any)

id: int | None
job_id: str | None
task_code: str | None
planned_start_date: str | None
target_start_date: str | None
actual_end_date: str | None
notes: List[dict] | None
work_time_logs: List[dict] | None
initial_note: dict | None
time_log: dict | None
planned_end_date: str | None
preferred_start_date: str | None
preferred_end_date: str | None
truck: dict | None
on_site_time_log: dict | None
trip_time_log: dict | str | None
completed_date: str | None
scheduled_date: str | None
pickup_completed_date: str | None
delivery_completed_date: str | None
expected_delivery_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineAgent(*, id=None, code=None, name=None, typeId=None, **extra_data)[source]

Bases: ResponseModel

Timeline agent — GET /job/{jobDisplayId}/timeline/{taskCode}/agent.

Maps to C# CompanyListItem entity.

Parameters:
  • id (int | str | None)

  • code (str | None)

  • name (str | None)

  • typeId (str | None)

  • extra_data (Any)

id: int | str | None
code: str | None
name: str | None
type_id: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineResponse(*, success=None, errorMessage=None, tasks=None, onHolds=None, daysPerSla=None, deliveryServiceDoneBy=None, jobSubManagementStatus=None, jobBookedDate=None, **extra_data)[source]

Bases: ResponseModel

GET /job/{jobDisplayId}/timeline wrapper response.

The API returns this wrapper object (not a bare list of tasks).

Parameters:
  • success (bool | None)

  • errorMessage (str | None)

  • tasks (List[TimelineTask] | None)

  • onHolds (List[dict] | None)

  • daysPerSla (int | None)

  • deliveryServiceDoneBy (str | None)

  • jobSubManagementStatus (dict | None)

  • jobBookedDate (str | None)

  • extra_data (Any)

success: bool | None
error_message: str | None
tasks: List[TimelineTask] | None
on_holds: List[dict] | None
days_per_sla: int | None
delivery_service_done_by: str | None
job_sub_management_status: dict | None
job_booked_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineSaveResponse(*, success=None, errorMessage=None, taskExists=None, task=None, emailLogId=None, jobSubManagementStatus=None, **extra_data)[source]

Bases: ResponseModel

POST /job/{jobDisplayId}/timeline wrapper response.

The API returns this wrapper (not a bare TimelineTask).

Parameters:
  • success (bool | None)

  • errorMessage (str | None)

  • taskExists (bool | None)

  • task (TimelineTask | None)

  • emailLogId (int | None)

  • jobSubManagementStatus (dict | None)

  • extra_data (Any)

success: bool | None
error_message: str | None
task_exists: bool | None
task: TimelineTask | None
email_log_id: int | None
job_sub_management_status: dict | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimeLogPauseRequest(*, start=None, end=None)[source]

Bases: RequestModel

Pause period within a time log. Maps to C# TimeLogPauseModel.

Parameters:
  • start (str | None)

  • end (str | None)

start: str | None
end: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimeLogRequest(*, start=None, end=None, pauses=None)[source]

Bases: RequestModel

Time log with start/end and optional pauses. Maps to C# TimeLogModel.

Parameters:
start: str | None
end: str | None
pauses: List[TimeLogPauseRequest] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.WorkTimeLogRequest(*, date=None, startTime=None, endTime=None)[source]

Bases: RequestModel

Work time entry. Maps to C# WorkTimeLogModel.

Parameters:
  • date (str | None)

  • startTime (str | None)

  • endTime (str | None)

date: str | None
start_time: str | None
end_time: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.InitialNoteRequest(*, comments, dueDate=None, isImportant=None, isCompleted=None, sendNotification=None)[source]

Bases: RequestModel

Task note on creation. Maps to C# InitialNoteModel.

Parameters:
  • comments (str)

  • dueDate (str | None)

  • isImportant (bool | None)

  • isCompleted (bool | None)

  • sendNotification (bool | None)

comments: str
due_date: str | None
is_important: bool | None
is_completed: bool | None
send_notification: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TaskTruckInfoRequest(*, id, name=None, isActive=None)[source]

Bases: RequestModel

Truck assignment info. Maps to C# TaskTruckInfo.

Parameters:
  • id (int)

  • name (str | None)

  • isActive (bool | None)

id: int
name: str | None
is_active: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.BaseTimelineTaskRequest(*, id=None, modifiedDate=None, taskCode, plannedStartDate=None, workTimeLogs=None, initialNote=None)[source]

Bases: RequestModel

Shared base for all timeline task creation requests.

Maps to C# BaseTaskModel. Three concrete subclasses correspond to the server’s TaskModelDataBinder polymorphic deserialization.

Parameters:
id: int | None
modified_date: str | None
task_code: str
planned_start_date: str | None
work_time_logs: List[WorkTimeLogRequest] | None
initial_note: InitialNoteRequest | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.InTheFieldTaskRequest(*, id=None, modifiedDate=None, taskCode, plannedStartDate=None, workTimeLogs=None, initialNote=None, plannedEndDate=None, preferredStartDate=None, preferredEndDate=None, truck=None, onSiteTimeLog=None, tripTimeLog=None, completedDate=None)[source]

Bases: BaseTimelineTaskRequest

Request model for PU/DE (pickup/delivery) tasks.

Maps to C# InTheFieldTaskModel. Used by helpers: schedule(), received().

Parameters:
planned_end_date: str | None
preferred_start_date: str | None
preferred_end_date: str | None
truck: TaskTruckInfoRequest | None
on_site_time_log: TimeLogRequest | None
trip_time_log: TimeLogRequest | None
completed_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SimpleTaskRequest(*, id=None, modifiedDate=None, taskCode, plannedStartDate=None, workTimeLogs=None, initialNote=None, timeLog=None)[source]

Bases: BaseTimelineTaskRequest

Request model for PK/ST (packing/storage) tasks.

Maps to C# SimpleTaskModel. Used by helpers: pack_start(), pack_finish(), storage_begin(), storage_end().

Parameters:
time_log: TimeLogRequest | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.CarrierTaskRequest(*, id=None, modifiedDate=None, taskCode, plannedStartDate=None, workTimeLogs=None, initialNote=None, scheduledDate=None, pickupCompletedDate=None, deliveryCompletedDate=None, expectedDeliveryDate=None)[source]

Bases: BaseTimelineTaskRequest

Request model for CP (carrier) tasks.

Maps to C# CarrierTaskModel. Used by helpers: carrier_schedule(), carrier_pickup(), carrier_delivery().

Parameters:
scheduled_date: str | None
pickup_completed_date: str | None
delivery_completed_date: str | None
expected_delivery_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TimelineTaskUpdateRequest(*, status=None, scheduledDate=None, completedDate=None, comments=None)[source]

Bases: RequestModel

Body for PATCH /job/{jobDisplayId}/timeline/{timelineTaskId}.

Parameters:
  • status (int | None)

  • scheduledDate (str | None)

  • completedDate (str | None)

  • comments (str | None)

status: int | None
scheduled_date: str | None
completed_date: str | None
comments: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.IncrementStatusRequest(*, createEmail=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/timeline/incrementjobstatus.

Parameters:

createEmail (bool | None)

create_email: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TrackingInfo(*, status=None, location=None, estimatedDelivery=None, events=None, carrierName=None, proNumber=None, statuses=None, success=None, errorMessage=None, **extra_data)[source]

Bases: ResponseModel

Tracking info — GET /job/{jobDisplayId}/tracking.

Parameters:
  • status (str | None)

  • location (str | None)

  • estimatedDelivery (str | None)

  • events (List[dict] | None)

  • carrierName (str | None)

  • proNumber (str | None)

  • statuses (List[dict] | None)

  • success (bool | None)

  • errorMessage (str | None)

  • extra_data (Any)

status: str | None
location: str | None
estimated_delivery: str | None
events: List[dict] | None
carrier_name: str | None
pro_number: str | None
statuses: List[dict] | None
success: bool | None
error_message: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.TrackingInfoV3(*, trackingDetails=None, carrierInfo=None, shipmentStatus=None, statuses=None, carriers=None, **extra_data)[source]

Bases: ResponseModel

Tracking info v3 — GET /v3/job/{jobDisplayId}/tracking/{historyAmount}.

Parameters:
tracking_details: List[dict] | None
carrier_info: List[dict] | None
shipment_status: str | None
statuses: List[dict] | None
carriers: List[dict] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobNote(*, createdDate=None, modifiedDate=None, createdBy=None, modifiedBy=None, id=None, comment=None, isImportant=None, isCompleted=None, author=None, modifiyDate=None, taskCode=None, **extra_data)[source]

Bases: ResponseModel, IdentifiedModel, TimestampedModel

Job note — GET /job/{jobDisplayId}/note.

Parameters:
  • createdDate (datetime | None)

  • modifiedDate (datetime | None)

  • createdBy (str | None)

  • modifiedBy (str | None)

  • id (int | None)

  • comment (str | None)

  • isImportant (bool | None)

  • isCompleted (bool | None)

  • author (str | None)

  • modifiyDate (str | None)

  • taskCode (str | None)

  • extra_data (Any)

id: int | None
comment: str | None
is_important: bool | None
is_completed: bool | None
author: str | None
modify_date: str | None
task_code: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobNoteCreateRequest(*, comments, taskCode, isImportant=None, sendNotification=None, dueDate=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/note.

Parameters:
  • comments (str)

  • taskCode (str)

  • isImportant (bool | None)

  • sendNotification (bool | None)

  • dueDate (str | None)

comments: str
task_code: str
is_important: bool | None
send_notification: bool | None
due_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobNoteUpdateRequest(*, comments=None, isImportant=None, isCompleted=None)[source]

Bases: RequestModel

Body for PUT /job/{jobDisplayId}/note/{id}.

Parameters:
  • comments (str | None)

  • isImportant (bool | None)

  • isCompleted (bool | None)

comments: str | None
is_important: bool | None
is_completed: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ParcelItem(*, id=None, jobItemId=None, description=None, quantity=None, jobItemPkdLength=None, jobItemPkdWidth=None, jobItemPkdHeight=None, jobItemPkdWeight=None, jobItemParcelValue=None, parcelPackageTypeId=None, insureKey=None, packageTypeCode=None, jobModifiedDate=None, parcelItems=None, **extra_data)[source]

Bases: ResponseModel

Parcel item — GET /job/{jobDisplayId}/parcelitems.

Maps to C# ParcelItemWithPackage entity.

Parameters:
  • id (int | None)

  • jobItemId (str | None)

  • description (str | None)

  • quantity (int | None)

  • jobItemPkdLength (float | None)

  • jobItemPkdWidth (float | None)

  • jobItemPkdHeight (float | None)

  • jobItemPkdWeight (float | None)

  • jobItemParcelValue (float | None)

  • parcelPackageTypeId (int | None)

  • insureKey (str | None)

  • packageTypeCode (str | None)

  • jobModifiedDate (str | None)

  • parcelItems (List[dict] | None)

  • extra_data (Any)

id: int | None
job_item_id: str | None
description: str | None
quantity: int | None
job_item_pkd_length: float | None
job_item_pkd_width: float | None
job_item_pkd_height: float | None
job_item_pkd_weight: float | None
job_item_parcel_value: float | None
parcel_package_type_id: int | None
insure_key: str | None
package_type_code: str | None
job_modified_date: str | None
parcel_items: List[dict] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.JobParcelItemMaterial(*, name=None, description=None, code=None, type=None, weight=None, length=None, width=None, height=None, cost=None, price=None, quantity=None, **extra_data)[source]

Bases: ResponseModel

Material used in a parcel item — nested in ParcelItemWithMaterials.

Parameters:
name: str | None
description: str | None
code: str | None
type: str | None
weight: float | None
length: float | None
width: float | None
height: float | None
cost: float | None
price: float | None
quantity: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ParcelItemWithMaterials(*, id=None, jobItemId=None, description=None, quantity=None, jobItemPkdLength=None, jobItemPkdWidth=None, jobItemPkdHeight=None, jobItemPkdWeight=None, jobItemParcelValue=None, parcelPackageTypeId=None, insureKey=None, packageTypeCode=None, jobModifiedDate=None, parcelItems=None, materials=None, **extra_data)[source]

Bases: ParcelItem

Parcel item with materials — GET /job/{jobDisplayId}/parcel-items-with-materials.

Parameters:
  • id (int | None)

  • jobItemId (str | None)

  • description (str | None)

  • quantity (int | None)

  • jobItemPkdLength (float | None)

  • jobItemPkdWidth (float | None)

  • jobItemPkdHeight (float | None)

  • jobItemPkdWeight (float | None)

  • jobItemParcelValue (float | None)

  • parcelPackageTypeId (int | None)

  • insureKey (str | None)

  • packageTypeCode (str | None)

  • jobModifiedDate (str | None)

  • parcelItems (List[dict] | None)

  • materials (List[JobParcelItemMaterial] | None)

  • extra_data (Any)

materials: List[JobParcelItemMaterial] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.PackagingContainer(*, name=None, description=None, length=None, width=None, height=None, weight=None, totalCost=None, **extra_data)[source]

Bases: ResponseModel

Packaging container — GET /job/{jobDisplayId}/packagingcontainers.

Maps to C# Packaging entity.

Parameters:
  • name (str | None)

  • description (str | None)

  • length (float | None)

  • width (float | None)

  • height (float | None)

  • weight (float | None)

  • totalCost (float | None)

  • extra_data (Any)

name: str | None
description: str | None
length: float | None
width: float | None
height: float | None
weight: float | None
total_cost: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ParcelItemCreateRequest(*, description, length=None, width=None, height=None, weight=None, quantity=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/parcelitems.

Parameters:
description: str
length: float | None
width: float | None
height: float | None
weight: float | None
quantity: int | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ItemNotesRequest(*, notes)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/item/notes.

Parameters:

notes (str)

notes: str
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ItemUpdateRequest(*, description=None, quantity=None, weight=None)[source]

Bases: RequestModel

Body for PUT /job/{jobDisplayId}/item/{itemId}.

Parameters:
  • description (str | None)

  • quantity (int | None)

  • weight (float | None)

description: str | None
quantity: int | None
weight: float | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ExtendedOnHoldInfo(*, id=None, reason=None, description=None, followUpUser=None, followUpDate=None, status=None, createdDate=None, createdByContactId=None, createdByJobRelation=None, resolvedDate=None, responsiblePartyTypeId=None, reasonId=None, responsibleParty=None, comment=None, startDate=None, createdBy=None, **extra_data)[source]

Bases: ResponseModel

On-hold listing entry — GET /job/{jobDisplayId}/onhold.

Parameters:
  • id (int | None)

  • reason (str | None)

  • description (str | None)

  • followUpUser (str | None)

  • followUpDate (str | None)

  • status (str | None)

  • createdDate (str | None)

  • createdByContactId (int | None)

  • createdByJobRelation (str | None)

  • resolvedDate (str | None)

  • responsiblePartyTypeId (str | None)

  • reasonId (str | None)

  • responsibleParty (str | None)

  • comment (str | None)

  • startDate (str | None)

  • createdBy (str | None)

  • extra_data (Any)

id: int | None
reason: str | None
description: str | None
follow_up_user: str | None
follow_up_date: str | None
status: str | None
created_date: str | None
created_by_contact_id: int | None
created_by_job_relation: str | None
resolved_date: str | None
responsible_party_type_id: str | None
reason_id: str | None
responsible_party: str | None
comment: str | None
start_date: str | None
created_by: str | None
cli_format()[source]

One-line pretty row used by the CLI and examples (vs. JSON).

Return type:

str

model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.OnHoldDetails(*, id=None, responsiblePartyTypeId=None, reasonId=None, startDate=None, nextStepId=None, dueDate=None, assignedToId=None, resolvedDate=None, resolvedCodeId=None, isActive=None, createdByContactId=None, createdByContactName=None, notes=None, responsibleParty=None, reason=None, comment=None, description=None, comments=None, dates=None, followUpUser=None, status=None, **extra_data)[source]

Bases: ResponseModel

Full on-hold detail — GET /job/{jobDisplayId}/onhold/{id}.

Parameters:
  • id (int | None)

  • responsiblePartyTypeId (str | None)

  • reasonId (str | None)

  • startDate (str | None)

  • nextStepId (str | None)

  • dueDate (str | None)

  • assignedToId (int | None)

  • resolvedDate (str | None)

  • resolvedCodeId (str | None)

  • isActive (bool | None)

  • createdByContactId (int | None)

  • createdByContactName (str | None)

  • notes (List[dict] | None)

  • responsibleParty (str | None)

  • reason (str | None)

  • comment (str | None)

  • description (str | None)

  • comments (List[dict] | None)

  • dates (dict | None)

  • followUpUser (dict | None)

  • status (str | None)

  • extra_data (Any)

id: int | None
responsible_party_type_id: str | None
reason_id: str | None
start_date: str | None
next_step_id: str | None
due_date: str | None
assigned_to_id: int | None
resolved_date: str | None
resolved_code_id: str | None
is_active: bool | None
created_by_contact_id: int | None
created_by_contact_name: str | None
notes: List[dict] | None
responsible_party: str | None
reason: str | None
comment: str | None
description: str | None
comments: List[dict] | None
dates: dict | None
follow_up_user: dict | None
status: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SaveOnHoldRequest(*, reasonId, responsiblePartyTypeId, comment=None, nextStepId=None, dueDate=None, assignedToId=None, resolvedDate=None, resolvedCodeId=None, startDate=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/onhold and PUT /job/{jobDisplayId}/onhold/{onHoldId} and PUT /job/{jobDisplayId}/onhold/{onHoldId}/resolve.

Matches swagger SaveOnHoldRequest – a single schema covers create / update / resolve. The legacy ResolveOnHoldRequest is an alias of this class.

Required: reason_id (UUID) + responsible_party_type_id (UUID).

Sourcing UUIDs:

  • reason_id -> api.lookup.get_by_key("OnHoldReason")

  • responsible_party_type_id -> api.lookup.get_by_key("ResponsibleParty")

  • next_step_id (optional) -> api.lookup.get_by_key("OnHoldNextStep")

  • resolved_code_id (optional) -> api.lookup.get_by_key("OnHoldResolvedCode")

  • assigned_to_id -> a contactId from list_followup_users().

Parameters:
  • reasonId (str)

  • responsiblePartyTypeId (str)

  • comment (Annotated[str | None, MaxLen(max_length=1024)])

  • nextStepId (str | None)

  • dueDate (datetime | None)

  • assignedToId (int | None)

  • resolvedDate (datetime | None)

  • resolvedCodeId (str | None)

  • startDate (datetime | None)

reason_id: str
responsible_party_type_id: str
comment: str | None
next_step_id: str | None
due_date: datetime | None
assigned_to_id: int | None
resolved_date: datetime | None
resolved_code_id: str | None
start_date: datetime | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SaveOnHoldResponse(*, onHoldId=None, status=None, **extra_data)[source]

Bases: ResponseModel

On-hold create/update response.

Parameters:
  • onHoldId (str | None)

  • status (str | None)

  • extra_data (Any)

on_hold_id: str | None
status: str | None
cli_format()[source]
Return type:

str

model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ResolveJobOnHoldResponse(*, resolved=None, status=None, **extra_data)[source]

Bases: ResponseModel

On-hold resolution response.

Parameters:
  • resolved (bool | None)

  • status (str | None)

  • extra_data (Any)

resolved: bool | None
status: str | None
cli_format()[source]
Return type:

str

model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SaveOnHoldDatesModel(*, followUpDate=None, dueDate=None)[source]

Bases: RequestModel

Body for PUT /job/{jobDisplayId}/onhold/{onHoldId}/dates.

Parameters:
  • followUpDate (str | None)

  • dueDate (str | None)

follow_up_date: str | None
due_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.OnHoldUser(*, contactId=None, name=None, email=None, fullName=None, jobRelation=None, **extra_data)[source]

Bases: ResponseModel

Follow-up user info — GET /job/{jobDisplayId}/onhold/followupuser/{contactId}.

Parameters:
  • contactId (int | None)

  • name (str | None)

  • email (str | None)

  • fullName (str | None)

  • jobRelation (str | None)

  • extra_data (Any)

contact_id: int | None
name: str | None
email: str | None
full_name: str | None
job_relation: str | None
cli_format()[source]

One-line pretty row used by the CLI and examples (vs. JSON).

Return type:

str

model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.OnHoldNoteDetails(*, id=None, comment=None, author=None, date=None, **extra_data)[source]

Bases: ResponseModel

On-hold comment — POST /job/{jobDisplayId}/onhold/{onHoldId}/comment.

Parameters:
  • id (str | None)

  • comment (str | None)

  • author (str | None)

  • date (str | None)

  • extra_data (Any)

id: str | None
comment: str | None
author: str | None
date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SendDocumentEmailModel(*, to=None, cc=None, bcc=None, subject=None, body=None, documentType=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/email/senddocument.

Parameters:
to: List[str] | None
cc: List[str] | None
bcc: List[str] | None
subject: str | None
body: str | None
document_type: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.SendSMSModel(*, phoneNumber=None, message=None, templateId=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/sms.

Parameters:
  • phoneNumber (str | None)

  • message (str | None)

  • templateId (str | None)

phone_number: str | None
message: str | None
template_id: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.MarkSmsAsReadModel(*, smsIds=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/sms/read.

Parameters:

smsIds (List[str] | None)

sms_ids: List[str] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.CarrierAccountInfo(*, id=None, key=None, friendlyName=None, **extra_data)[source]

Bases: ResponseModel

Carrier account details — nested in PricedFreightProvider and ShipmentPlanProvider.

Maps to C# CarrierAccountInfo DTO.

Parameters:
  • id (int | None)

  • key (str | None)

  • friendlyName (str | None)

  • extra_data (Any)

id: int | None
key: str | None
friendly_name: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.PricedFreightProvider(*, optionIndex=None, shipmentType=None, providerAPI=None, providerId=None, providerCode=None, providerCompanyName=None, totalSell=None, transit=None, quoteNo=None, proNum=None, optionActive=None, shipmentAccepted=None, shipmentAcceptedDate=None, obtainNFMJobState=None, usedCarrierAccountInfo=None, **extra_data)[source]

Bases: ResponseModel

Freight provider with pricing — GET /job/{jobDisplayId}/freightproviders.

Expanded in feature 033 to match full swagger PricedFreightProvider schema (15 fields + nested CarrierAccountInfo).

Parameters:
  • optionIndex (int | None)

  • shipmentType (str | None)

  • providerAPI (int | None)

  • providerId (str | None)

  • providerCode (str | None)

  • providerCompanyName (str | None)

  • totalSell (float | None)

  • transit (int | None)

  • quoteNo (str | None)

  • proNum (str | None)

  • optionActive (bool | None)

  • shipmentAccepted (bool | None)

  • shipmentAcceptedDate (str | None)

  • obtainNFMJobState (str | None)

  • usedCarrierAccountInfo (CarrierAccountInfo | None)

  • extra_data (Any)

option_index: int | None
shipment_type: str | None
provider_api: int | None
provider_id: str | None
provider_code: str | None
provider_company_name: str | None
total_sell: float | None
transit: int | None
quote_no: str | None
pro_num: str | None
option_active: bool | None
shipment_accepted: bool | None
shipment_accepted_date: str | None
obtain_nfm_job_state: str | None
used_carrier_account_info: CarrierAccountInfo | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'allow', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ShipmentPlanProvider(*, jobID=None, freightQuoteOptionsId=None, providerID=None, isPrimary=None, providerCompanyCode=None, providerCompanyName=None, originalCompanyName=None, freightAmount=None, accessorialAmount=None, cafNote=None, quoteNo=None, proNum=None, transit=None, shipmentType=None, miles=None, logo=None, optionIndex=None, optionActive=None, shipmentAccepted=None, shipmentAcceptedDate=None, usedAPI=None, billToFranchiseeId=None, billToCompanyCode=None, obtainNFMJobState=None, usedCarrierAccountInfo=None)[source]

Bases: RequestModel

Save freight provider selection — POST /job/{jobDisplayId}/freightproviders.

Expanded in feature 033 to match full swagger ShipmentPlanProvider schema (22+ fields).

Parameters:
  • jobID (str | None)

  • freightQuoteOptionsId (str | None)

  • providerID (str | None)

  • isPrimary (bool | None)

  • providerCompanyCode (str | None)

  • providerCompanyName (str | None)

  • originalCompanyName (str | None)

  • freightAmount (float | None)

  • accessorialAmount (float | None)

  • cafNote (str | None)

  • quoteNo (str | None)

  • proNum (str | None)

  • transit (int | None)

  • shipmentType (str | None)

  • miles (float | None)

  • logo (str | None)

  • optionIndex (int | None)

  • optionActive (bool | None)

  • shipmentAccepted (bool | None)

  • shipmentAcceptedDate (str | None)

  • usedAPI (int | None)

  • billToFranchiseeId (str | None)

  • billToCompanyCode (str | None)

  • obtainNFMJobState (str | None)

  • usedCarrierAccountInfo (CarrierAccountInfo | None)

job_id: str | None
freight_quote_options_id: str | None
provider_id: str | None
is_primary: bool | None
provider_company_code: str | None
provider_company_name: str | None
original_company_name: str | None
freight_amount: float | None
accessorial_amount: float | None
caf_note: str | None
quote_no: str | None
pro_num: str | None
transit: int | None
shipment_type: str | None
miles: float | None
option_index: int | None
option_active: bool | None
shipment_accepted: bool | None
shipment_accepted_date: str | None
used_api: int | None
bill_to_franchisee_id: str | None
bill_to_company_code: str | None
obtain_nfm_job_state: str | None
used_carrier_account_info: CarrierAccountInfo | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.OnHoldCommentRequest(*, comment=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/onhold/{onHoldId}/comment.

Parameters:

comment (str | None)

comment: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

ab.api.models.jobs.ResolveOnHoldRequest

alias of SaveOnHoldRequest

class ab.api.models.jobs.SendEmailRequest(*, to=None, cc=None, bcc=None, subject=None, body=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/email.

Parameters:
to: List[str] | None
cc: List[str] | None
bcc: List[str] | None
subject: str | None
body: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.RateQuoteRequest(*, ratesKey=None, carrierCode=None, carrierAccountId=None, active=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/freightproviders/{optionIndex}/ratequote.

Maps to C# SetRateModel DTO per swagger. Expanded in feature 033.

Parameters:
  • ratesKey (str | None)

  • carrierCode (str | None)

  • carrierAccountId (int | None)

  • active (bool | None)

rates_key: str | None
carrier_code: str | None
carrier_account_id: int | None
active: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.FreightShipment(*, itemID=None, freightItemId=None, freightItemClassId=None, jobID=None, jobDisplayId=None, jobFreightID=None, quantity=None, itemLength=None, itemWidth=None, itemHeight=None, itemWeight=None, itemValue=None, cube=None, totalWeight=None, freightDescription=None, freightItemValue=None, freightItemClass=None, nmfcItem=None, bolDescription=None, jobFreightReport=None, modifiedBy=None, createdBy=None, createdDate=None, modifiedDate=None)[source]

Bases: RequestModel

Individual freight item — nested in FreightItemsRequest.freightItems.

Maps to C# FreightShimpment DTO per swagger (note: swagger has typo ‘Shimpment’; our model uses corrected spelling). Expanded in feature 033.

Parameters:
  • itemID (str | None)

  • freightItemId (str | None)

  • freightItemClassId (str | None)

  • jobID (str | None)

  • jobDisplayId (str | None)

  • jobFreightID (str | None)

  • quantity (int | None)

  • itemLength (float | None)

  • itemWidth (float | None)

  • itemHeight (float | None)

  • itemWeight (float | None)

  • itemValue (float | None)

  • cube (float | None)

  • totalWeight (float | None)

  • freightDescription (str | None)

  • freightItemValue (str | None)

  • freightItemClass (str | None)

  • nmfcItem (str | None)

  • bolDescription (str | None)

  • jobFreightReport (str | None)

  • modifiedBy (str | None)

  • createdBy (str | None)

  • createdDate (str | None)

  • modifiedDate (str | None)

item_id: str | None
freight_item_id: str | None
freight_item_class_id: str | None
job_id: str | None
job_display_id: str | None
job_freight_id: str | None
quantity: int | None
item_length: float | None
item_width: float | None
item_height: float | None
item_weight: float | None
item_value: float | None
cube: float | None
total_weight: float | None
freight_description: str | None
freight_item_value: str | None
freight_item_class: str | None
nmfc_item: str | None
bol_description: str | None
job_freight_report: str | None
modified_by: str | None
created_by: str | None
created_date: str | None
modified_date: str | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.FreightItemsRequest(*, jobModifiedDate=None, forceUpdate=None, freightItems=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/freightitems.

Maps to C# SaveAllFreightItemsRequest DTO per swagger. Expanded in feature 033.

Parameters:
job_modified_date: str | None
force_update: bool | None
freight_items: List[FreightShipment] | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class ab.api.models.jobs.ChangeJobAgentRequest(*, serviceType=None, agentId=None, recalculatePrice=None, applyRebate=None)[source]

Bases: RequestModel

Body for POST /job/{jobDisplayId}/changeAgent.

Maps to C# ChangeJobAgentRequest DTO (ABConnectTools).

Parameters:
  • serviceType (int | None)

  • agentId (str | None)

  • recalculatePrice (bool | None)

  • applyRebate (bool | None)

service_type: int | None
agent_id: str | None
recalculate_price: bool | None
apply_rebate: bool | None
model_config = {'alias_generator': <function _to_camel>, 'extra': 'forbid', 'populate_by_name': True, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].