openapi: 3.0.3 info: title: MVMNT API version: 1.0.0 description: | The MVMNT API enables you to automate freight brokerage workflows by integrating directly with our Transportation Management System. Postman setup guide: [API Clients](/getting-started/api-clients). ## Authentication OAuth 2.0 client credentials flow. See [Authentication Guide](/getting-started/authentication) for details. ### Token Endpoint ``` POST https://api.mvmnt.io/oauth2/token ``` #### Request **Headers:** ```http Content-Type: application/x-www-form-urlencoded ``` **Body Parameters:** ``` grant_type=client_credentials client_id=YOUR_CLIENT_ID client_secret=YOUR_CLIENT_SECRET ``` #### Example Request ```bash curl -X POST https://api.mvmnt.io/oauth2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" ``` #### Success Response **Status:** `200 OK` ```json { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600 } ``` **Response Fields:** - `access_token`: JWT Bearer token to use for API requests - `token_type`: Always `Bearer` - `expires_in`: Token lifetime in seconds (3600 = 1 hour) ## Idempotency Mutating requests (POST, PATCH, DELETE) accept an optional `Idempotency-Key` header (up to 255 characters). Retrying a request with the same key and the same body returns the original result instead of repeating the operation; reusing a key with a different body fails. Keys are scoped to your organization — keys chosen by other tenants can never collide with yours. Use a stable identifier from your system (for example your own record id plus the action) rather than a random value per attempt. contact: name: MVMNT Support email: support@mvmnt.io url: https://docs.mvmnt.io license: name: Proprietary url: https://mvmnt.io/legal/terms x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: The MVMNT API enables you to automate freight brokerage workflows by integrating children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: directly with our Transportation Management System. children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: level: 2 children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: Authentication children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: heading annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: 'OAuth 2.0 client credentials flow. See ' children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: href: /getting-started/authentication children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: Authentication Guide children: [] type: text annotations: [] slots: {} type: link annotations: [] slots: {} redocly:::linkOriginal:href: /getting-started/authentication - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: ' for details.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} servers: - url: https://api.mvmnt.io/v1 description: Production - url: https://api.demo.mvmnt.io/v1 description: Demo (non-production) security: - BearerAuth: [] tags: - name: Carriers description: Carrier management operations - name: Carrier Contacts description: Carrier contact management operations - name: Carrier Factors description: Carrier factor (factoring company) management operations - name: Carrier Payment Methods description: Carrier payment method management operations - name: Companies description: Company management operations - name: Credit Memos description: | AR credit memo management operations. Credit memos represent customer credits that can be applied to invoices. - name: Bills description: | AP bill management operations. Bills represent carrier and vendor invoices to be paid. - name: Bill Payments description: | AP bill payment management operations. Bill payments record payments made to carriers and vendors. - name: Customers description: Customer management operations - name: Customer Contacts description: Customer contact management operations - name: Documents description: | Document management operations. Documents are files (PDFs, images) that can be attached to orders, loads, or services. - name: Invoices description: | AR invoice management operations. Invoices represent customer billing for shipment services. - name: Loads description: | Load management operations. Loads represent carrier execution - which carrier is moving the freight. - name: Locations description: Location management operations - name: Location Contacts description: Location contact management operations - name: Payment Terms description: Payment term management operations - name: Reference Data description: | Read-only catalogs (equipment, charge codes, special requirements) referenced by id from other resources. Every catalog also answers on its short top-level path, so `GET /v1/charge-codes` and `GET /v1/reference-data/charge-codes` are the same endpoint. The documented `/reference-data/*` form is canonical — it keeps the catalogs grouped here as more are added (port codes, cities, zip codes) — and the short form is a convenience alias. - name: Payments description: | AR payment management operations. Payments represent received customer payments applied to invoices. - name: Quotes description: | Quote management operations. Quotes are pricing requests/responses that can be converted to shipments. - name: Saved Searches description: Saved search management operations - name: Search description: Global search operations - name: Services description: | Service (vended service) management operations. Services represent non-carrier vendor work (drayage, customs, warehousing). - name: Shipments description: | Shipment tracking and management operations. Shipments contain orders, loads, and services. - name: Teams description: Team management operations - name: Users description: User management operations - name: Vendors description: Vendor management operations - name: Vendor Contacts description: Vendor contact management operations - name: Vendor Payment Methods description: Vendor payment method management operations paths: /companies/filter: post: tags: - Companies summary: Filter companies description: | Query companies using flexible filter criteria with AND/OR logic. By default, only non-deleted companies are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterCompanies requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompanyFilterRequest' responses: '200': description: Filtered companies with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/Company' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /companies: post: tags: - Companies summary: Create a new company description: Create a new company within an organization operationId: createCompany requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompanyInput' responses: '201': description: Company created successfully content: application/json: schema: $ref: '#/components/schemas/Company' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /companies/{id}: get: tags: - Companies summary: Get a company by ID description: Retrieve a single company by its unique identifier operationId: getCompanyById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Company found content: application/json: schema: $ref: '#/components/schemas/Company' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Companies summary: Update a company description: | Partially update a company. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateCompany parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompanyPatch' responses: '200': description: Company updated successfully content: application/json: schema: $ref: '#/components/schemas/Company' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Companies summary: Delete a company description: | Soft delete a company (sets deletedAt timestamp). The company will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCompany parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Company deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /carrier-contacts/filter: post: tags: - Carrier Contacts summary: Filter carrier contacts description: | Query carrier contacts using flexible filter criteria with AND/OR logic. By default, only non-deleted carrier contacts are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterCarrierContacts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierContactFilterRequest' responses: '200': description: Filtered carrier contacts with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/CarrierContact' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /carrier-contacts: post: tags: - Carrier Contacts summary: Create carrier contact description: | Create a new carrier contact. The contactInfo will create a new Contact record, and the CarrierContact will reference it via contactId (managed internally). operationId: createCarrierContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierContactInput' responses: '201': description: Carrier contact created successfully content: application/json: schema: $ref: '#/components/schemas/CarrierContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /carrier-contacts/{id}: get: tags: - Carrier Contacts summary: Get carrier contact description: Retrieve a single carrier contact by its unique identifier operationId: getCarrierContactById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Carrier contact found content: application/json: schema: $ref: '#/components/schemas/CarrierContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Carrier Contacts summary: Update carrier contact description: | Partially update a carrier contact. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable When updating contactInfo, the underlying Contact record is updated. operationId: updateCarrierContact parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierContactPatch' responses: '200': description: Carrier contact updated successfully content: application/json: schema: $ref: '#/components/schemas/CarrierContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Carrier Contacts summary: Delete carrier contact description: | Soft delete a carrier contact (sets deletedAt timestamp). The contact will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCarrierContact parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Carrier contact deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /carriers/filter: post: tags: - Carriers summary: Filter carriers description: | Query carriers using flexible filter criteria with AND/OR logic. By default, only non-deleted carriers are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. Returns carriers of all types (TRUCKLOAD, AIR, CARTAGE, LINEHAUL, LTL, OCEAN, RAIL) with type-specific fields included based on carrier type. operationId: filterCarriers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierFilterRequest' responses: '200': description: Filtered carriers with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/Carrier' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /carriers: post: tags: - Carriers summary: Create a new carrier description: | Create a new carrier within an organization. The carrier type must be specified and determines which fields are available: - **TRUCKLOAD**: Includes insurance, safety rating, and FMCSA inspection fields - **AIR, CARTAGE, LINEHAUL, LTL, OCEAN, RAIL**: Include only base carrier fields Note: In the backend, null carrier type is represented as TRUCKLOAD in the public API. operationId: createCarrier requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierInput' examples: truckload: summary: Truckload carrier with insurance value: name: Swift Transportation Co type: TRUCKLOAD email: dispatch@swifttrans.com phone: +1-555-987-6543 status: ACTIVE mcNumber: MC-123456 dotNumber: '1234567' insuranceCompany: State Farm Insurance insuranceAutoLiabilityLimit: 1000000 rating: SATISFACTORY inFmcsa: true air: summary: Air carrier value: name: FedEx Express type: AIR email: cargo@fedex.com phone: +1-555-123-4567 status: ACTIVE iataCode: FX ltl: summary: LTL carrier value: name: XPO Logistics type: LTL email: dispatch@xpo.com phone: +1-555-456-7890 status: ACTIVE scac: XPOL responses: '201': description: Carrier created successfully content: application/json: schema: $ref: '#/components/schemas/Carrier' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /carriers/{id}: get: tags: - Carriers summary: Get a carrier by ID description: | Retrieve a single carrier by its unique identifier. The response will include type-specific fields based on the carrier's type: - **TRUCKLOAD**: Includes insurance, safety rating, and FMCSA inspection fields - **AIR, CARTAGE, LINEHAUL, LTL, OCEAN, RAIL**: Include only base carrier fields operationId: getCarrierById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Carrier found content: application/json: schema: $ref: '#/components/schemas/Carrier' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Carriers summary: Update a carrier description: | Partially update a carrier. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable The carrier type determines which fields can be updated: - **TRUCKLOAD**: Can update insurance, safety rating, and FMCSA fields - **AIR, CARTAGE, LINEHAUL, LTL, OCEAN, RAIL**: Can only update base carrier fields Changing the carrier type will affect which specialized fields are available. operationId: updateCarrier parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierPatch' responses: '200': description: Carrier updated successfully content: application/json: schema: $ref: '#/components/schemas/Carrier' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Carriers summary: Delete a carrier description: | Soft delete a carrier (sets deletedAt timestamp). The carrier will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCarrier parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Carrier deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /carriers/search: post: summary: Search carriers description: | Search carriers using OpenSearch-powered full-text and field-specific search. This endpoint searches both: - **ONBOARDED carriers**: Carriers with profiles in your organization - **FMCSA carriers**: Public carrier records from FMCSA database Features: - Full-text search across multiple fields - Field-specific filtering with various operators - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) carriers are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete carrier objects with all relationships operationId: searchCarriers tags: - Carriers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierSearchRequest' responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/CarrierSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /carrier-factors/filter: post: tags: - Carrier Factors summary: Filter carrier factors description: | Query carrier factors (factoring companies) using flexible filter criteria with AND/OR logic. By default, only non-deleted carrier factors are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. Carrier factors represent factoring companies that provide payment services for carriers. operationId: filterCarrierFactors requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierFactorFilterRequest' responses: '200': description: Filtered carrier factors with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/CarrierFactor' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /carrier-factors: post: tags: - Carrier Factors summary: Create carrier factor description: | Create a new carrier factor (factoring company). Factoring companies provide payment services for carriers, allowing them to receive immediate payment for invoices. operationId: createCarrierFactor requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierFactorInput' examples: basic: summary: Basic carrier factor value: companyName: Capital Factoring Services Inc email: accounting@capitalfactoring.com phoneNumber: +1-555-234-5678 addressLine1: 789 Finance Ave city: Dallas state: TX country: USA zipCode: '75201' withBanking: summary: Carrier factor with banking details value: companyName: Capital Factoring Services Inc email: accounting@capitalfactoring.com phoneNumber: +1-555-234-5678 addressLine1: 789 Finance Ave city: Dallas state: TX country: USA zipCode: '75201' bankName: Chase Bank accountName: Capital Factoring Services Inc accountNumber: '1234567890' abaAch: '021000021' swiftCode: CHASUS33 currency: USD responses: '201': description: Carrier factor created successfully content: application/json: schema: $ref: '#/components/schemas/CarrierFactor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /carrier-factors/{id}: get: tags: - Carrier Factors summary: Get carrier factor description: | Retrieve a single carrier factor by its unique identifier. Carrier factors represent factoring companies that provide payment services. operationId: getCarrierFactorById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Carrier factor found content: application/json: schema: $ref: '#/components/schemas/CarrierFactor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Carrier Factors summary: Update carrier factor description: | Partially update a carrier factor. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateCarrierFactor parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierFactorPatch' examples: updateContact: summary: Update contact information value: email: newemail@capitalfactoring.com phoneNumber: +1-555-999-8888 updateBanking: summary: Update banking details value: bankName: Bank of America accountNumber: '9876543210' abaAch: '026009593' responses: '200': description: Carrier factor updated successfully content: application/json: schema: $ref: '#/components/schemas/CarrierFactor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Carrier Factors summary: Delete carrier factor description: | Soft delete a carrier factor (sets deletedAt timestamp). The carrier factor will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCarrierFactor parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Carrier factor deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /carrier-payment-methods/filter: post: tags: - Carrier Payment Methods summary: Filter carrier payment methods description: | Query carrier payment methods using flexible filter criteria with AND/OR logic. By default, only non-deleted payment methods are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. Carrier payment methods define how and where payments are sent for a specific carrier. operationId: filterCarrierPaymentMethods requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethodFilterRequest' responses: '200': description: Filtered carrier payment methods with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/CarrierPaymentMethod' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /carrier-payment-methods: post: tags: - Carrier Payment Methods summary: Create carrier payment method description: | Create a new carrier payment method. **Payment Recipient Type Constraints:** - **DIRECT**: Payment goes to carrier directly. `carrierFactorId` must be null or omitted. - **FACTOR**: Payment goes to factoring company. `carrierFactorId` is required. **Important**: The `carrierId` cannot be changed after creation. operationId: createCarrierPaymentMethod requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethodInput' examples: directPayment: summary: Direct ACH payment to carrier value: carrierId: 770e8400-e29b-41d4-a716-446655440000 paymentRecipientType: DIRECT paymentMethodType: ACH isPreferred: true bankName: Chase Bank accountName: Carrier Transport Inc accountNumber: '1234567890' abaAch: '021000021' currency: USD factorPayment: summary: Payment through factoring company value: carrierId: 770e8400-e29b-41d4-a716-446655440000 paymentRecipientType: FACTOR paymentMethodType: ACH_WIRE carrierFactorId: 550e8400-e29b-41d4-a716-446655440000 isPreferred: false zelle: summary: Zelle payment value: carrierId: 770e8400-e29b-41d4-a716-446655440000 paymentRecipientType: DIRECT paymentMethodType: ZELLE email: payments@carrier.com phone: +1-555-123-4567 username: carrier_payments responses: '201': description: Carrier payment method created successfully content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/InternalServerError' /carrier-payment-methods/{id}: get: tags: - Carrier Payment Methods summary: Get carrier payment method description: | Retrieve a single carrier payment method by its unique identifier. Returns full details including banking information and associated carrier/factor references. operationId: getCarrierPaymentMethodById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Carrier payment method found content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Carrier Payment Methods summary: Update carrier payment method description: | Partially update a carrier payment method. Only provided fields will be updated. **IMPORTANT**: The `carrierId` field cannot be changed after creation. **Payment Recipient Type Constraints:** - When changing to **DIRECT**: `carrierFactorId` must be set to null - When changing to **FACTOR**: `carrierFactorId` is required - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateCarrierPaymentMethod parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethodPatch' examples: updateBanking: summary: Update banking details value: bankName: Bank of America accountNumber: '9876543210' abaAch: '026009593' changeToFactor: summary: Change from direct to factor payment value: paymentRecipientType: FACTOR carrierFactorId: 550e8400-e29b-41d4-a716-446655440000 makePreferred: summary: Set as preferred payment method value: isPreferred: true responses: '200': description: Carrier payment method updated successfully content: application/json: schema: $ref: '#/components/schemas/CarrierPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Carrier Payment Methods summary: Delete carrier payment method description: | Soft delete a carrier payment method (sets deletedAt timestamp). The payment method will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCarrierPaymentMethod parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Carrier payment method deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /customer-contacts/filter: post: tags: - Customer Contacts summary: Filter customer contacts description: | Query customer contacts using flexible filter criteria with AND/OR logic. By default, only non-deleted customer contacts are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterCustomerContacts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerContactFilterRequest' responses: '200': description: Filtered customer contacts with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/CustomerContact' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /customer-contacts: post: tags: - Customer Contacts summary: Create customer contact description: | Create a new customer contact. The contact details are provided inline via contactInfo; no internal identifiers are required or exposed. operationId: createCustomerContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerContactInput' responses: '201': description: Customer contact created successfully content: application/json: schema: $ref: '#/components/schemas/CustomerContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /customer-contacts/{id}: get: tags: - Customer Contacts summary: Get customer contact description: Retrieve a single customer contact by its unique identifier operationId: getCustomerContactById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Customer contact found content: application/json: schema: $ref: '#/components/schemas/CustomerContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Customer Contacts summary: Update customer contact description: | Partially update a customer contact. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable When updating contactInfo, the underlying Contact record is updated. operationId: updateCustomerContact parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerContactPatch' responses: '200': description: Customer contact updated successfully content: application/json: schema: $ref: '#/components/schemas/CustomerContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Customer Contacts summary: Delete customer contact description: | Soft delete a customer contact (sets deletedAt timestamp). The contact will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteCustomerContact parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Customer contact deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /customers/filter: post: summary: Filter customers description: | Filter customers using comprehensive query criteria with AND/OR logic and multiple operators. Supports complex filtering similar to GraphQL capabilities. Note: Soft-deleted customers are excluded by default (deletedAt defaults to { isNull: true }). operationId: filterCustomers tags: - Customers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerFilterRequest' responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Customer' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Filter customers using comprehensive query criteria with AND/OR logic and multiple operators. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Supports complex filtering similar to GraphQL capabilities. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: 'Note: Soft-deleted customers are excluded by default (deletedAt defaults to { isNull: true }).' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} /customers: post: summary: Create customer description: Create a new customer in your organization operationId: createCustomer tags: - Customers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerInput' responses: '201': description: Customer created successfully content: application/json: schema: $ref: '#/components/schemas/Customer' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /customers/{id}: get: summary: Get customer description: Retrieve a customer by ID or client key operationId: getCustomer tags: - Customers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' patch: summary: Update customer description: Partially update a customer. Only provided fields will be updated. operationId: updateCustomer tags: - Customers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerPatch' responses: '200': description: Customer updated successfully content: application/json: schema: $ref: '#/components/schemas/Customer' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' delete: summary: Delete customer description: Soft delete a customer (sets deletedAt timestamp) operationId: deleteCustomer tags: - Customers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Customer deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' /customers/search: post: summary: Search customers description: | Search customers using OpenSearch-powered full-text and field-specific search. This endpoint provides fast, indexed search across customer data with support for: - Full-text search across multiple fields - Field-specific filtering with various operators - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) customers are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete customer objects with all relationships operationId: searchCustomers tags: - Customers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerSearchRequest' responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/CustomerSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /locations/filter: post: tags: - Locations summary: Filter locations description: | Query locations using flexible filter criteria with AND/OR logic. By default, only non-deleted locations are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterLocations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationFilterRequest' responses: '200': description: Filtered locations with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/Location' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /locations: post: tags: - Locations summary: Create a new location description: | Create a new location for a customer. Locations represent pickup or delivery points (warehouses, distribution centers, etc.). operationId: createLocation requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationInput' examples: warehouse: summary: Warehouse location value: customerId: 550e8400-e29b-41d4-a716-446655440000 address: line1: 2100 Ross Ave city: Dallas state: TX zipCode: '75201' country: US name: ABC Warehouse - Dallas key: ERP-LOC-DALLAS-01 type: SHIPPER isAppointmentRequired: true notes: Call 24 hours ahead for appointment distribution_center: summary: Distribution center value: customerId: 550e8400-e29b-41d4-a716-446655440000 address: line1: 500 Commerce St city: Fort Worth state: TX zipCode: '76102' country: US name: XYZ Distribution Center type: BOTH isAppointmentRequired: false responses: '201': description: Location created successfully content: application/json: schema: $ref: '#/components/schemas/Location' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /locations/{id}: get: tags: - Locations summary: Get a location by ID description: | Retrieve a single location by its unique identifier. operationId: getLocationById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Location found content: application/json: schema: $ref: '#/components/schemas/Location' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Locations summary: Update a location description: | Partially update a location. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateLocation parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationPatch' examples: updateNotes: summary: Update notes value: notes: Updated appointment requirements updateType: summary: Update location type value: type: BOTH responses: '200': description: Location updated successfully content: application/json: schema: $ref: '#/components/schemas/Location' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Locations summary: Delete a location description: | Soft delete a location (sets deletedAt timestamp). The location will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteLocation parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Location deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /locations/search: post: summary: Search locations description: | Search locations using OpenSearch-powered full-text and field-specific search. This endpoint provides fast, indexed search across location data with support for: - Full-text search across multiple fields - Field-specific filtering with various operators - Geographic search capabilities - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) locations are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete location objects with all relationships operationId: searchLocations tags: - Locations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationSearchRequest' responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/LocationSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /location-contacts/filter: post: tags: - Location Contacts summary: Filter location contacts description: | Query location contacts using flexible filter criteria with AND/OR logic. By default, only non-deleted location contacts are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterLocationContacts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationContactFilterRequest' responses: '200': description: Filtered location contacts with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/LocationContact' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /location-contacts: post: tags: - Location Contacts summary: Create a new location contact description: | Link a customer contact to a location with specific contact types/roles. Location contacts represent the relationship between a customer contact and a specific location, defining what role the contact has at that location. operationId: createLocationContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationContactInput' examples: primary_manager: summary: Primary location manager value: locationId: 770e8400-e29b-41d4-a716-446655440000 customerContactId: 660e8400-e29b-41d4-a716-446655440000 isPrimary: true contactTypes: - LOCATION_MANAGER - SHIPPING key: ERP-LOC-CONTACT-001 billing_contact: summary: Billing contact value: locationId: 770e8400-e29b-41d4-a716-446655440000 customerContactId: 660e8400-e29b-41d4-a716-446655440001 isPrimary: false contactTypes: - BILLING responses: '201': description: Location contact created successfully content: application/json: schema: $ref: '#/components/schemas/LocationContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /location-contacts/{id}: get: tags: - Location Contacts summary: Get a location contact by ID description: | Retrieve a single location contact by its unique identifier. operationId: getLocationContactById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Location contact found content: application/json: schema: $ref: '#/components/schemas/LocationContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Location Contacts summary: Update a location contact description: | Partially update a location contact. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateLocationContact parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LocationContactPatch' examples: updateContactTypes: summary: Update contact types value: contactTypes: - LOCATION_MANAGER - SHIPPING - RECEIVING updatePrimary: summary: Set as primary value: isPrimary: true responses: '200': description: Location contact updated successfully content: application/json: schema: $ref: '#/components/schemas/LocationContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Location Contacts summary: Delete a location contact description: | Soft delete a location contact (sets deletedAt timestamp). The location contact will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteLocationContact parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Location contact deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /payment-terms/filter: post: summary: Filter payment terms description: | Filter payment terms using comprehensive query criteria with AND/OR logic and multiple operators. Supports complex filtering similar to GraphQL capabilities. Note: Soft-deleted payment terms are excluded by default (deletedAt defaults to { isNull: true }). operationId: filterPaymentTerms tags: - Payment Terms requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentTermFilterRequest' responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/PaymentTerm' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Filter payment terms using comprehensive query criteria with AND/OR logic and multiple operators. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Supports complex filtering similar to GraphQL capabilities. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: 'Note: Soft-deleted payment terms are excluded by default (deletedAt defaults to { isNull: true }).' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} /payment-terms: post: summary: Create payment term description: Create a new payment term configuration in your organization operationId: createPaymentTerm tags: - Payment Terms requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentTermInput' responses: '201': description: Payment term created successfully content: application/json: schema: $ref: '#/components/schemas/PaymentTerm' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /payment-terms/{id}: get: summary: Get payment term description: Retrieve a payment term by ID or client key operationId: getPaymentTerm tags: - Payment Terms parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/PaymentTerm' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' patch: summary: Update payment term description: Partially update a payment term. Only provided fields will be updated. operationId: updatePaymentTerm tags: - Payment Terms parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentTermPatch' responses: '200': description: Payment term updated successfully content: application/json: schema: $ref: '#/components/schemas/PaymentTerm' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' delete: summary: Delete payment term description: Soft delete a payment term (sets deletedAt timestamp) operationId: deletePaymentTerm tags: - Payment Terms parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Payment term deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' /reference-data/equipment: get: summary: List equipment description: | Read-only catalog of equipment types. The ids are what order and load `equipment` arrays reference. The list is system-managed and small — fetch it once and cache it, or hardcode the ids your integration uses. The catalog is global and organization-independent: every authenticated organization sees the same rows. operationId: listReferenceEquipment tags: - Reference Data parameters: - name: categoryId in: query required: false description: Only return equipment in this category schema: type: string format: uuid - name: groupId in: query required: false description: Only return equipment in this top-level group schema: type: string format: uuid - name: subcategoryId in: query required: false description: Only return equipment in this subcategory schema: type: string format: uuid responses: '200': description: Successful response content: application/json: schema: type: object required: - data properties: data: type: array items: $ref: '#/components/schemas/Equipment' '401': $ref: '#/components/responses/UnauthorizedError' '429': $ref: '#/components/responses/RateLimitExceeded' /reference-data/charge-codes: get: summary: List charge codes description: | Read-only catalog of charge codes. The integer ids are what charge `chargeCodeId` fields reference. The list is system-managed — fetch it once and cache it. The catalog is global and organization-independent: every authenticated organization sees the same rows. operationId: listReferenceChargeCodes tags: - Reference Data parameters: - name: code in: query required: false description: Only return the charge code with this exact accounting code schema: type: string example: LH responses: '200': description: Successful response content: application/json: schema: type: object required: - data properties: data: type: array items: $ref: '#/components/schemas/ChargeCode' '401': $ref: '#/components/responses/UnauthorizedError' '429': $ref: '#/components/responses/RateLimitExceeded' /reference-data/special-requirements: get: summary: List special requirements description: | Read-only catalog of special requirements (equipment accessories, driver services, freight handling, location constraints). The ids are what order and load `specialRequirements` arrays reference. Filter by `type` to get one category. The catalog is global and organization-independent: every authenticated organization sees the same rows. operationId: listReferenceSpecialRequirements tags: - Reference Data parameters: - name: type in: query required: false description: Only return requirements of this type schema: $ref: '#/components/schemas/SpecialRequirementType' responses: '200': description: Successful response content: application/json: schema: type: object required: - data properties: data: type: array items: $ref: '#/components/schemas/SpecialRequirement' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '429': $ref: '#/components/responses/RateLimitExceeded' /teams/filter: post: summary: Filter teams description: | Filter teams using comprehensive query criteria with AND/OR logic and multiple operators. Supports complex filtering similar to GraphQL capabilities. Note: Soft-deleted teams are excluded by default (deletedAt defaults to { isNull: true }). operationId: filterTeams tags: - Teams requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TeamFilterRequest' responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Team' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Filter teams using comprehensive query criteria with AND/OR logic and multiple operators. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Supports complex filtering similar to GraphQL capabilities. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: 'Note: Soft-deleted teams are excluded by default (deletedAt defaults to { isNull: true }).' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} /teams: post: summary: Create team description: Create a new team in your organization operationId: createTeam tags: - Teams requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TeamInput' responses: '201': description: Team created successfully content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /teams/{id}: get: summary: Get team description: Retrieve a team by ID or client key operationId: getTeam tags: - Teams parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/Team' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' patch: summary: Update team description: Partially update a team. Only provided fields will be updated. operationId: updateTeam tags: - Teams parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TeamPatch' responses: '200': description: Team updated successfully content: application/json: schema: $ref: '#/components/schemas/Team' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' delete: summary: Delete team description: Soft delete a team (sets deletedAt timestamp) operationId: deleteTeam tags: - Teams parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Team deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' /users/filter: post: summary: Filter users description: | Filter users using comprehensive query criteria with AND/OR logic and multiple operators. Supports complex filtering similar to GraphQL capabilities. Note: Soft-deleted users are excluded by default (deletedAt defaults to { isNull: true }). operationId: filterUsers tags: - Users requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserFilterRequest' responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/User' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Filter users using comprehensive query criteria with AND/OR logic and multiple operators. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Supports complex filtering similar to GraphQL capabilities. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: 'Note: Soft-deleted users are excluded by default (deletedAt defaults to { isNull: true }).' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} /users: post: summary: Create user description: Create a new user in your organization operationId: createUser tags: - Users requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserInput' responses: '201': description: User created successfully content: application/json: schema: $ref: '#/components/schemas/User' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /users/{id}: get: summary: Get user description: Retrieve a user by ID or client key operationId: getUser tags: - Users parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/User' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' patch: summary: Update user description: Partially update a user. Only provided fields will be updated. operationId: updateUser tags: - Users parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserPatch' responses: '200': description: User updated successfully content: application/json: schema: $ref: '#/components/schemas/User' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' delete: summary: Delete user description: Soft delete a user (sets deletedAt timestamp) operationId: deleteUser tags: - Users parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: User deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' /users/search: post: summary: Search users description: | Search users using OpenSearch-powered full-text and field-specific search. This endpoint provides fast, indexed search across user data with support for: - Full-text search across multiple fields - Field-specific filtering with various operators - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) users are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete user objects with all relationships operationId: searchUsers tags: - Users requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserSearchRequest' responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/UserSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /vendors/filter: post: tags: - Vendors summary: Filter vendors description: | Query vendors using flexible filter criteria with AND/OR logic. By default, only non-deleted vendors are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterVendors requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorFilterRequest' responses: '200': description: Filtered vendors with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/Vendor' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /vendors: post: tags: - Vendors summary: Create a new vendor description: | Create a new vendor within an organization. Vendors represent service providers (warehousing, storage, etc.) that are not carriers. operationId: createVendor requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorInput' examples: warehouse: summary: Warehouse vendor value: name: ABC Warehouse Services email: billing@abcwarehouse.com phone: +1-555-123-4567 status: ACTIVE currency: USD taxId: 12-3456789 storage: summary: Storage facility value: name: SecureStore Facilities email: accounts@securestore.com phone: +1-555-987-6543 status: ACTIVE currency: USD responses: '201': description: Vendor created successfully content: application/json: schema: $ref: '#/components/schemas/Vendor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /vendors/{id}: get: tags: - Vendors summary: Get a vendor by ID description: | Retrieve a single vendor by its unique identifier. operationId: getVendorById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Vendor found content: application/json: schema: $ref: '#/components/schemas/Vendor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Vendors summary: Update a vendor description: | Partially update a vendor. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateVendor parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorPatch' examples: updateContact: summary: Update contact information value: email: newemail@abcwarehouse.com phone: +1-555-999-8888 updateStatus: summary: Update vendor status value: status: INACTIVE notes: Contract ended responses: '200': description: Vendor updated successfully content: application/json: schema: $ref: '#/components/schemas/Vendor' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Vendors summary: Delete a vendor description: | Soft delete a vendor (sets deletedAt timestamp). The vendor will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteVendor parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Vendor deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /vendors/search: post: summary: Search vendors description: | Search vendors using OpenSearch-powered full-text and field-specific search. This endpoint provides fast, indexed search across vendor data with support for: - Full-text search across multiple fields - Field-specific filtering with various operators - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) vendors are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete vendor objects with all relationships operationId: searchVendors tags: - Vendors requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorSearchRequest' responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/VendorSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /vendor-contacts/filter: post: tags: - Vendor Contacts summary: Filter vendor contacts description: | Query vendor contacts using flexible filter criteria with AND/OR logic. By default, only non-deleted contacts are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. operationId: filterVendorContacts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorContactFilterRequest' responses: '200': description: Filtered vendor contacts with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/VendorContact' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /vendor-contacts: post: tags: - Vendor Contacts summary: Create a new vendor contact description: | Create a new contact for a vendor. Contacts represent individuals at the vendor who can be reached for various purposes. operationId: createVendorContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorContactInput' examples: billing: summary: Billing contact value: vendorId: 550e8400-e29b-41d4-a716-446655440001 name: Dana Reyes email: billing@abcwarehouse.com phone: +1-555-123-4567 roles: - BILLING operations: summary: Operations contact value: vendorId: 550e8400-e29b-41d4-a716-446655440001 name: Sam Okafor email: ops@abcwarehouse.com phone: +1-555-987-6543 roles: - OPERATION - AGENT responses: '201': description: Vendor contact created successfully content: application/json: schema: $ref: '#/components/schemas/VendorContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' /vendor-contacts/{id}: get: tags: - Vendor Contacts summary: Get a vendor contact by ID description: | Retrieve a single vendor contact by its unique identifier. operationId: getVendorContactById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Vendor contact found content: application/json: schema: $ref: '#/components/schemas/VendorContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Vendor Contacts summary: Update a vendor contact description: | Partially update a vendor contact. Only provided fields will be updated. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateVendorContact parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorContactPatch' examples: updateEmail: summary: Update email address value: email: newemail@abcwarehouse.com updateRoles: summary: Update contact roles value: roles: - BILLING - OWNER responses: '200': description: Vendor contact updated successfully content: application/json: schema: $ref: '#/components/schemas/VendorContact' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Vendor Contacts summary: Delete a vendor contact description: | Soft delete a vendor contact (sets deletedAt timestamp). The contact will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteVendorContact parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Vendor contact deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /vendor-payment-methods/filter: post: tags: - Vendor Payment Methods summary: Filter vendor payment methods description: | Query vendor payment methods using flexible filter criteria with AND/OR logic. By default, only non-deleted payment methods are returned (deletedAt: { isNull: true }). Override this by explicitly setting deletedAt filter criteria. Vendor payment methods define how and where payments are sent for a specific vendor. operationId: filterVendorPaymentMethods requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethodFilterRequest' responses: '200': description: Filtered vendor payment methods with pagination content: application/json: schema: type: object required: - data - pageInfo properties: data: type: array items: $ref: '#/components/schemas/VendorPaymentMethod' pageInfo: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '500': $ref: '#/components/responses/InternalServerError' /vendor-payment-methods: post: tags: - Vendor Payment Methods summary: Create vendor payment method description: | Create a new vendor payment method. **Important**: The `vendorId` cannot be changed after creation. operationId: createVendorPaymentMethod requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethodInput' examples: achPayment: summary: ACH payment to vendor value: vendorId: 770e8400-e29b-41d4-a716-446655440000 paymentMethodType: ACH isPreferred: true bankName: Chase Bank accountName: Vendor Services Inc accountNumber: '1234567890' abaAch: '021000021' currency: USD zelle: summary: Zelle payment value: vendorId: 770e8400-e29b-41d4-a716-446655440000 paymentMethodType: ZELLE email: payments@vendor.com phone: +1-555-123-4567 username: vendor_payments check: summary: Check payment value: vendorId: 770e8400-e29b-41d4-a716-446655440000 paymentMethodType: CHECK companyName: Vendor Services Inc isPreferred: false responses: '201': description: Vendor payment method created successfully content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': $ref: '#/components/responses/ConflictError' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/InternalServerError' /vendor-payment-methods/{id}: get: tags: - Vendor Payment Methods summary: Get vendor payment method description: | Retrieve a single vendor payment method by its unique identifier. Returns full details including banking information and associated vendor references. operationId: getVendorPaymentMethodById parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '200': description: Vendor payment method found content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' patch: tags: - Vendor Payment Methods summary: Update vendor payment method description: | Partially update a vendor payment method. Only provided fields will be updated. **IMPORTANT**: The `vendorId` field cannot be changed after creation. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable operationId: updateVendorPaymentMethod parameters: - $ref: '#/components/parameters/IdOrClientKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethodPatch' examples: updateBanking: summary: Update banking details value: bankName: Bank of America accountNumber: '9876543210' abaAch: '026009593' makePreferred: summary: Set as preferred payment method value: isPreferred: true updateContact: summary: Update contact information value: email: newemail@vendor.com phone: +1-555-999-8888 responses: '200': description: Vendor payment method updated successfully content: application/json: schema: $ref: '#/components/schemas/VendorPaymentMethod' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Vendor Payment Methods summary: Delete vendor payment method description: | Soft delete a vendor payment method (sets deletedAt timestamp). The payment method will no longer appear in default queries but can be retrieved by explicitly filtering for deleted records. operationId: deleteVendorPaymentMethod parameters: - $ref: '#/components/parameters/IdOrClientKey' responses: '204': description: Vendor payment method deleted successfully '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '500': $ref: '#/components/responses/InternalServerError' /saved-searches/filter: post: summary: Filter saved searches description: | Filter saved searches using comprehensive query criteria with AND/OR logic and multiple operators. Supports complex filtering similar to GraphQL capabilities. Returns only saved searches accessible to the authenticated user (either owned by them or public). operationId: filterSavedSearches tags: - Saved Searches requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SavedSearchFilterRequest' responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/SavedSearch' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /saved-searches: post: summary: Create saved search description: | Create a new saved search configuration in your organization. The saved search can be used to quickly apply predefined search criteria, sorting, and display preferences. The saved search will be owned by the authenticated user unless otherwise specified. operationId: createSavedSearch tags: - Saved Searches requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SavedSearchInput' responses: '201': description: Saved search created successfully content: application/json: schema: $ref: '#/components/schemas/SavedSearch' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /saved-searches/{id}: get: summary: Get saved search description: | Retrieve a saved search by ID. You can only retrieve saved searches that you own or that are public in your organization. operationId: getSavedSearch tags: - Saved Searches parameters: - name: id in: path required: true description: Saved search UUID schema: type: string format: uuid responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/SavedSearch' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' patch: summary: Update saved search description: | Partially update a saved search. Only provided fields will be updated. You can only update saved searches that you own. operationId: updateSavedSearch tags: - Saved Searches parameters: - name: id in: path required: true description: Saved search UUID schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SavedSearchPatch' responses: '200': description: Saved search updated successfully content: application/json: schema: $ref: '#/components/schemas/SavedSearch' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' delete: summary: Delete saved search description: | Permanently delete a saved search. You can only delete saved searches that you own. operationId: deleteSavedSearch tags: - Saved Searches parameters: - name: id in: path required: true description: Saved search UUID schema: type: string format: uuid responses: '204': description: Saved search deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '429': $ref: '#/components/responses/RateLimitExceeded' /shipments/track: post: summary: Get tracking link description: | Search for shipments by reference field values (BOL #, PRO #, MAWB #, etc.) and return tracking information. ## Usage 1. Provide an array of search queries in the `searches` field 2. Optionally filter which reference field types to search using `referenceFields` 3. Results are returned in the same order as input searches 4. If no match is found, the result contains only the original `query` (other fields are null) ## Matching Behavior - Searches are case-insensitive - If multiple shipments match a query, the most recently created shipment is returned - If `referenceFields` is omitted, all reference field types are searched ## Example Use Cases - **Customer portal**: Look up shipment status by BOL or PRO number - **EDI integration**: Validate shipment references before sending updates - **Bulk status check**: Query multiple shipments in a single request ## Rate Limits - Maximum 100 searches per request - Standard API rate limits apply (see Rate Limiting documentation) operationId: trackShipments tags: - Shipments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShipmentTrackRequest' examples: singleSearch: summary: Single shipment lookup description: Look up a single shipment by reference value value: searches: - query: MAWB123456 multipleSearches: summary: Multiple shipments with field filter description: Look up multiple shipments, limiting search to specific reference field types value: searches: - query: MAWB123456 - query: BOL789 - query: PRO-001 referenceFields: - MASTER_AIRWAYBILL_NUMBER - BOL_NUMBER - PRO_NUMBER bulkLookup: summary: Bulk BOL lookup description: Look up multiple shipments by BOL number only value: searches: - query: BOL-2025-001 - query: BOL-2025-002 - query: BOL-2025-003 - query: BOL-2025-004 referenceFields: - BOL_NUMBER responses: '200': description: Track results returned successfully content: application/json: schema: $ref: '#/components/schemas/ShipmentTrackResponse' examples: allFound: summary: All shipments found description: All search queries returned matching shipments value: results: - query: MAWB123456 id: 550e8400-e29b-41d4-a716-446655440000 key: SHIP-001 friendlyId: SHP-12345 status: IN_TRANSIT field: MASTER_AIRWAYBILL_NUMBER value: MAWB123456 origin: Los Angeles, CA 90210 destination: New York, NY 10001 pickUpDate: '2025-01-15' deliveryDate: '2025-01-20' trackingUrl: https://app.mvmnt.io/shipments/550e8400-e29b-41d4-a716-446655440000 - query: BOL789012 id: 660e8400-e29b-41d4-a716-446655440001 key: SHIP-002 friendlyId: SHP-12346 status: DELIVERED field: BOL_NUMBER value: BOL-789012 origin: Chicago, IL 60601 destination: Miami, FL 33101 pickUpDate: '2025-01-16' deliveryDate: '2025-01-21' trackingUrl: https://app.mvmnt.io/shipments/660e8400-e29b-41d4-a716-446655440001 mixedResults: summary: Some found, some not found description: Mix of found and not-found results value: results: - query: MAWB123456 id: 550e8400-e29b-41d4-a716-446655440000 key: SHIP-001 friendlyId: SHP-12345 status: PICKED_UP field: MASTER_AIRWAYBILL_NUMBER value: MAWB123456 origin: Los Angeles, CA 90210 destination: New York, NY 10001 pickUpDate: '2025-01-15' deliveryDate: '2025-01-20' trackingUrl: https://app.mvmnt.io/shipments/550e8400-e29b-41d4-a716-446655440000 - query: NOTFOUND123 id: null key: null friendlyId: null status: null field: null value: null origin: null destination: null pickUpDate: null deliveryDate: null trackingUrl: null noneFound: summary: No shipments found description: No matching shipments for any query value: results: - query: UNKNOWN-REF-1 id: null key: null friendlyId: null status: null field: null value: null origin: null destination: null pickUpDate: null deliveryDate: null trackingUrl: null - query: UNKNOWN-REF-2 id: null key: null friendlyId: null status: null field: null value: null origin: null destination: null pickUpDate: null deliveryDate: null trackingUrl: null '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /documents/filter: post: summary: Filter documents description: | Search for documents using filter criteria. ## Usage Documents are typically associated with other entities (orders, loads, services). Use filters to find documents by type, status, or date range. ## Example Filters - Find all invoices: `{ "filter": { "type": { "equalTo": "INVOICE" } } }` - Find uploaded documents: `{ "filter": { "status": { "equalTo": "UPLOADED" } } }` - Find documents created today: `{ "filter": { "createdAt": { "greaterThanOrEqualTo": "2025-01-15T00:00:00Z" } } }` operationId: filterDocuments tags: - Documents requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DocumentFilterRequest' examples: filterByType: summary: Filter by document type value: filter: type: equalTo: INVOICE pageSize: 50 filterByStatus: summary: Filter by upload status value: filter: status: equalTo: UPLOADED filterByDateRange: summary: Filter by creation date value: filter: createdAt: greaterThanOrEqualTo: '2025-01-01T00:00:00Z' lessThanOrEqualTo: '2025-01-31T23:59:59Z' responses: '200': description: Documents matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Document' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /documents: post: summary: Create a document description: | Create a new document record and receive a pre-signed URL for uploading the file. ## Workflow 1. Call this endpoint with document metadata (type, fileName, contentType) 2. Receive the created document with an `uploadUrl` 3. Upload the file directly to S3 using the `uploadUrl` (PUT request) 4. Document status changes from `PENDING_UPLOAD` to `UPLOADED` automatically ## Upload Instructions The `uploadUrl` is a pre-signed S3 URL. Upload your file with: ```bash curl -X PUT -H "Content-Type: application/pdf" \ --data-binary @your-file.pdf \ "https://s3.amazonaws.com/bucket/key?signature=..." ``` **Important:** - The `uploadUrl` expires after 15 minutes - Use the exact `contentType` specified in the request - Maximum file size: 100MB operationId: createDocument tags: - Documents requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DocumentInput' examples: pdfInvoice: summary: Create PDF invoice document value: type: INVOICE fileName: invoice-2025-001.pdf contentType: application/pdf fileSize: 102400 tags: invoiceNumber: INV-2025-001 podImage: summary: Create POD image value: type: PROOF_OF_DELIVERY fileName: pod-delivery-photo.jpg contentType: image/jpeg responses: '201': description: Document created successfully content: application/json: schema: $ref: '#/components/schemas/Document' examples: created: summary: Newly created document with upload URL value: id: 550e8400-e29b-41d4-a716-446655440000 type: INVOICE fileName: invoice-2025-001.pdf extension: pdf contentType: application/pdf fileSize: 102400 status: PENDING_UPLOAD uploadUrl: https://s3.amazonaws.com/bucket/key?X-Amz-Signature=... downloadUrl: null tags: invoiceNumber: INV-2025-001 createdAt: '2025-01-15T10:30:00Z' updatedAt: null '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /documents/{id}: get: summary: Get a document description: | Retrieve a document by ID or key. Returns the document metadata including a fresh `downloadUrl` if the file is uploaded. **Note:** The `downloadUrl` is a pre-signed S3 URL that expires after 1 hour. Each GET request generates a fresh URL. operationId: getDocument tags: - Documents parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Document retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Document' examples: uploaded: summary: Document with download URL value: id: 550e8400-e29b-41d4-a716-446655440000 key: doc-inv-2025-001 type: INVOICE fileName: invoice-2025-001.pdf extension: pdf contentType: application/pdf fileSize: 102400 status: UPLOADED uploadUrl: null downloadUrl: https://s3.amazonaws.com/bucket/key?X-Amz-Signature=... tags: invoiceNumber: INV-2025-001 createdAt: '2025-01-15T10:30:00Z' updatedAt: '2025-01-15T10:35:00Z' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a document description: | Update document metadata. **Note:** File content cannot be changed after upload. To replace a file, create a new document. operationId: updateDocument tags: - Documents parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DocumentPatch' examples: updateTags: summary: Update document tags value: tags: invoiceNumber: INV-2025-001-REVISED approved: true updateType: summary: Change document type value: type: PROOF_OF_DELIVERY responses: '200': description: Document updated successfully content: application/json: schema: $ref: '#/components/schemas/Document' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a document description: | Soft delete a document. The document record is marked as deleted but not permanently removed. Associated files in S3 may be cleaned up asynchronously. operationId: deleteDocument tags: - Documents parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Document deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /quotes/filter: post: summary: Filter quotes description: | Search for quotes using filter criteria. ## Common Filters - Active quotes: `{ "filter": { "status": { "in": ["DRAFT", "REQUESTED", "QUOTED"] } } }` - Won quotes: `{ "filter": { "status": { "equalTo": "WON" } } }` - By customer: `{ "filter": { "customerId": { "equalTo": "uuid" } } }` - Expiring soon: `{ "filter": { "expiresAt": { "lessThanOrEqualTo": "2025-01-20T00:00:00Z" } } }` operationId: filterQuotes tags: - Quotes requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QuoteFilterRequest' examples: activeQuotes: summary: Filter active quotes value: filter: status: in: - DRAFT - REQUESTED - QUOTED pageSize: 50 byCustomer: summary: Filter by customer value: filter: customerId: equalTo: 550e8400-e29b-41d4-a716-446655440000 responses: '200': description: Quotes matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Quote' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /quotes: post: summary: Create a quote description: | Create a new quote with order details. ## How it works Creating a quote also creates an associated Order containing the route and freight details. The Order is embedded in the Quote and cannot be managed separately. ## Required fields - `customer`: Reference to the customer (shipper profile) - `order`: Order details including stops and mode ## Example workflow 1. Create quote with customer and order details 2. Add pricing (amount) via PATCH 3. Send to customer (status changes to QUOTED) 4. Convert to shipment when accepted (POST /quotes/{id}/convert-to-shipment) operationId: createQuote tags: - Quotes requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QuoteInput' examples: basicQuote: summary: Basic FTL quote value: customer: id: 550e8400-e29b-41d4-a716-446655440000 order: mode: FTL stops: - type: PICKUP address: line1: 123 Warehouse Ave city: Los Angeles country: US market: LAX requestedStartDate: '2025-01-20' - type: DELIVERY address: line1: 456 Distribution Center city: New York country: US market: JFK requestedStartDate: '2025-01-25' freight: handlingUnitQuantity: 10 handlingUnitType: PALLET weight: 15000 amount: 2500 expiresAt: '2025-01-18T23:59:59Z' responses: '201': description: Quote created successfully content: application/json: schema: $ref: '#/components/schemas/Quote' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /quotes/{id}: get: summary: Get a quote description: | Retrieve a quote by ID or key. The response includes embedded order details (route, freight, equipment). operationId: getQuote tags: - Quotes parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Quote retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Quote' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a quote description: | Update quote fields including status changes. ## Status changes Status changes use this endpoint (not separate action endpoints): - Set to QUOTED: `{ "status": "QUOTED", "amount": 2500 }` - Set to WON: `{ "status": "WON" }` - Set to LOST: `{ "status": "LOST", "lostReason": "TOO_HIGH" }` ## Validation rules - When setting `status` to `LOST`, `lostReason` is required - When `lostReason` is `OTHER`, `lostReasonText` is required ## Note To convert a won quote to a shipment, use POST /quotes/{id}/convert-to-shipment operationId: updateQuote tags: - Quotes parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QuotePatch' examples: setQuoted: summary: Set quote as quoted value: status: QUOTED amount: 2500 setWon: summary: Mark quote as won value: status: WON setLost: summary: Mark quote as lost value: status: LOST lostReason: TOO_HIGH setLostOther: summary: Mark lost with custom reason value: status: LOST lostReason: OTHER lostReasonText: Customer chose competitor with faster transit time responses: '200': description: Quote updated successfully content: application/json: schema: $ref: '#/components/schemas/Quote' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a quote description: | Soft delete a quote. The quote record is marked as deleted but not permanently removed. Associated orders are also soft deleted. operationId: deleteQuote tags: - Quotes parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Quote deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /quotes/{id}/convert-to-shipment: post: summary: Convert quote to shipment description: | Convert an accepted quote into a shipment. ## What happens 1. Quote status is set to WON (if not already) 2. A new Shipment is created 3. The Order from the quote is linked to the shipment 4. Optionally, additional orders can be added ## Prerequisites - Quote must be in QUOTED or WON status - Quote cannot already have a shipment ## Response Returns the IDs of both the quote and the newly created shipment. operationId: convertQuoteToShipment tags: - Quotes parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/ConvertToShipmentRequest' examples: simpleConvert: summary: Simple conversion value: {} withAdditionalOrder: summary: Add additional order value: additionalOrders: - mode: FTL stops: - type: PICKUP location: id: 550e8400-e29b-41d4-a716-446655440001 requestedStartDate: '2025-01-22' - type: DELIVERY location: id: 550e8400-e29b-41d4-a716-446655440002 requestedStartDate: '2025-01-27' responses: '200': description: Quote converted to shipment successfully content: application/json: schema: $ref: '#/components/schemas/ConvertToShipmentResponse' examples: converted: summary: Successful conversion value: quoteId: 550e8400-e29b-41d4-a716-446655440000 quoteStatus: WON shipmentId: 660e8400-e29b-41d4-a716-446655440001 shipmentKey: SHP-12345 orderId: 770e8400-e29b-41d4-a716-446655440002 '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': $ref: '#/components/responses/ConflictError' /shipments/search: post: summary: Search shipments description: | Search shipments using OpenSearch-powered full-text and field-specific search. This endpoint provides fast, indexed search across shipment data with support for: - Full-text search across multiple fields (references, locations, parties) - Field-specific filtering with various operators - Sorting and pagination - Saved search preferences **Note:** Only active (non-deleted) shipments are searchable. Soft-deleted records are automatically excluded from all search results. **Response Formats:** - `flat` (default): Returns indexed fields only for faster performance - `full`: Returns complete shipment objects with all relationships operationId: searchShipments tags: - Shipments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShipmentSearchRequest' examples: byCustomer: summary: Shipments for a customer value: criteria: shipperName: operator: INCLUDES values: - Acme pagination: pageNumber: 1 pageSize: 50 byStatus: summary: In-transit shipments value: criteria: status: operator: ONE_OF values: - IN_TRANSIT responses: '200': description: Successful search results content: application/json: schema: $ref: '#/components/schemas/ShipmentSearchResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' /shipments/filter: post: summary: Filter shipments description: | Search for shipments using filter criteria. Each row in the response carries the fully nested shipment payload (orders with stops, freight, references, charges; loads with carriers). With a large `pageSize`, responses can be sizable — use a smaller page size if you only need scalar fields. ## Common Filters - Active shipments: `{ "filter": { "status": { "notIn": ["DELIVERED", "CANCELED"] } } }` - Delivered today: `{ "filter": { "deliveredAt": { "greaterThanOrEqualTo": "2025-01-15T00:00:00Z" } } }` - By customer: `{ "filter": { "customerId": { "equalTo": "uuid" } } }` operationId: filterShipments tags: - Shipments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShipmentFilterRequest' examples: activeShipments: summary: Filter active shipments value: filter: status: notIn: - DELIVERED - CANCELED pageSize: 50 inTransit: summary: Filter in-transit shipments value: filter: status: equalTo: IN_TRANSIT responses: '200': description: Shipments matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Shipment' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /shipments: post: summary: Create a shipment description: | Create a new shipment with orders, loads, and services. ## Required fields - `customer`: Reference to the customer - `orders`: At least one order with stops and mode ## What gets created - Shipment record - Order(s) with stops, freight, and charges - Optionally: Load(s) and Service(s) ## Relationship to Quotes If you have a Quote, use `POST /quotes/{id}/convert-to-shipment` instead. Direct shipment creation is for cases without a quote. operationId: createShipment tags: - Shipments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShipmentInput' examples: basicShipment: summary: Basic FTL shipment value: customer: id: 550e8400-e29b-41d4-a716-446655440000 orders: - mode: FTL stops: - type: PICKUP location: id: 660e8400-e29b-41d4-a716-446655440001 requestedStartDate: '2025-01-20' - type: DELIVERY location: id: 770e8400-e29b-41d4-a716-446655440002 requestedStartDate: '2025-01-25' freight: handlingUnitQuantity: 10 handlingUnitType: PALLET weight: 15000 responses: '201': description: Shipment created successfully content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /shipments/{id}: get: summary: Get a shipment description: | Retrieve a shipment by ID or key. The response includes embedded orders, loads, and services. The internal ShipmentDetail layer is hidden - all data is flattened. operationId: getShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Shipment retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Shipment' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a shipment description: | Update shipment fields. **Note:** To update orders, loads, or services, use their respective endpoints: - Orders: Updates happen via order-specific endpoints - Loads: PATCH /loads/{id} - Services: PATCH /services/{id} operationId: updateShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShipmentPatch' examples: changeCustomerRep: summary: Change customer rep value: customerRep: id: 550e8400-e29b-41d4-a716-446655440001 responses: '200': description: Shipment updated successfully content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a shipment description: | Soft delete a shipment. The shipment and all associated orders, loads, and services are marked as deleted. operationId: deleteShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Shipment deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /shipments/{id}/cancel: post: summary: Cancel a shipment description: | Cancel a shipment. ## What happens - Shipment status is set to CANCELED - All orders are canceled - All loads are canceled - All services are canceled ## Prerequisites - Shipment must not already be delivered or canceled operationId: cancelShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/CancelShipmentRequest' examples: withReason: summary: Cancel with reason value: reason: Customer requested cancellation due to production delay responses: '200': description: Shipment canceled successfully content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot cancel - shipment is delivered or already canceled content: application/problem+json: schema: $ref: '#/components/schemas/Error' /shipments/{id}/uncancel: post: summary: Un-cancel a shipment description: | Reactivate a canceled shipment. ## What happens - Shipment status is restored to previous state - Orders, loads, and services are reactivated ## Prerequisites - Shipment must be in CANCELED status operationId: uncancelShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Shipment un-canceled successfully content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot un-cancel - shipment is not canceled content: application/problem+json: schema: $ref: '#/components/schemas/Error' /shipments/{id}/duplicate: post: summary: Duplicate a shipment description: | Create a copy of an existing shipment. ## What gets duplicated - Customer and customer rep - Order(s) with stops, freight, and references - Equipment and special requirements ## What is NOT duplicated - Loads and carriers - Services - Documents - Status history ## New shipment The duplicate is created in DRAFT status with new dates if provided. operationId: duplicateShipment tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/DuplicateShipmentRequest' examples: withNewDates: summary: Duplicate with new dates value: pickUpDate: '2025-02-01' deliveryDate: '2025-02-05' responses: '201': description: Shipment duplicated successfully content: application/json: schema: $ref: '#/components/schemas/DuplicateShipmentResponse' example: originalShipmentId: 550e8400-e29b-41d4-a716-446655440000 newShipmentId: 660e8400-e29b-41d4-a716-446655440001 newShipmentKey: SHP-12346 '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /shipments/{id}/ready-to-invoice: post: summary: Mark shipment ready to invoice description: | Mark a shipment as ready for invoicing. ## What happens - Shipment billing status changes to READY_TO_INVOICE - Shipment is now visible in invoice generation workflows ## Prerequisites - Shipment must have delivery documents attached - Shipment must be in DOCS_NEEDED or NOT_READY_TO_INVOICE status operationId: markShipmentReadyToInvoice tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Shipment marked ready to invoice content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Shipment not in valid status for this action content: application/problem+json: schema: $ref: '#/components/schemas/Error' /shipments/{id}/not-ready-to-invoice: post: summary: Revert shipment to not ready description: | Revert a shipment from ready-to-invoice back to not ready. ## What happens - Shipment billing status changes back to NOT_READY_TO_INVOICE ## Prerequisites - Shipment must be in READY_TO_INVOICE status - Shipment must not already be invoiced operationId: markShipmentNotReadyToInvoice tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Shipment reverted to not ready content: application/json: schema: $ref: '#/components/schemas/Shipment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Shipment not in valid status for this action content: application/problem+json: schema: $ref: '#/components/schemas/Error' /shipments/{id}/invoice/generate: post: summary: Generate invoice for shipment description: | Generate an invoice PDF for the shipment. ## What happens - Invoice PDF is generated - Invoice document is attached to the shipment - Shipment billing status changes to INVOICED ## Prerequisites - Shipment must be in READY_TO_INVOICE status operationId: generateShipmentInvoice tags: - Shipments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Invoice generated content: application/json: schema: type: object properties: shipmentId: type: string format: uuid invoiceId: type: string format: uuid description: The generated invoice ID documentId: type: string format: uuid description: The invoice PDF document ID downloadUrl: type: string format: uri description: URL to download the invoice PDF '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Shipment not in valid status for invoice generation content: application/problem+json: schema: $ref: '#/components/schemas/Error' /loads/filter: post: summary: Filter loads description: | Search for loads using filter criteria. Each row carries the fully nested load payload (stops with addresses, carriers with charges). With a large `pageSize`, responses can be sizable. ## Common Filters - By shipment: `{ "filter": { "shipmentId": { "equalTo": "uuid" } } }` - Active loads: `{ "filter": { "status": { "notIn": ["COMPLETE", "CANCELED"] } } }` - FTL loads: `{ "filter": { "mode": { "equalTo": "FTL" } } }` operationId: filterLoads tags: - Loads requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoadFilterRequest' examples: byShipment: summary: Filter by shipment value: filter: shipmentId: equalTo: 550e8400-e29b-41d4-a716-446655440000 activeLoads: summary: Active loads only value: filter: status: notIn: - COMPLETE - CANCELED responses: '200': description: Loads matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Load' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /loads: post: summary: Add an additional load description: | Add an additional load to an **existing shipment**. This endpoint requires a shipment — it cannot create one. Creating a shipment already creates its first load structure; use this endpoint only for multi-load scenarios (extra legs, split moves). ## What happens - Load is created for the specified shipment - Optionally assigns an initial carrier To book a carrier on a load afterwards, use the load-carrier endpoints — that is the primary booking flow. operationId: createLoad tags: - Loads requestBody: required: true content: application/json: schema: type: object required: - shipmentId - load properties: shipmentId: type: string format: uuid description: Parent shipment ID load: $ref: '#/components/schemas/LoadInput' examples: basicLoad: summary: Create FTL load value: shipmentId: 550e8400-e29b-41d4-a716-446655440000 load: mode: FTL withCarrier: summary: Create load with carrier value: shipmentId: 550e8400-e29b-41d4-a716-446655440000 load: mode: FTL carrier: carrier: id: 660e8400-e29b-41d4-a716-446655440001 charges: - chargeCode: key: LINEHAUL amount: 2000 responses: '201': description: Load created successfully content: application/json: schema: $ref: '#/components/schemas/Load' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /loads/{id}: get: summary: Get a load description: | Retrieve a load by ID. The response includes embedded carriers and stops. operationId: getLoad tags: - Loads parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Load retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Load' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a load description: | Update load fields. **Note:** To manage carriers, use the carrier-specific endpoints. operationId: updateLoad tags: - Loads parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoadPatch' responses: '200': description: Load updated successfully content: application/json: schema: $ref: '#/components/schemas/Load' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a load description: | Soft delete a load. ## Prerequisites - Load must not have any active carriers operationId: deleteLoad tags: - Loads parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Load deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot delete - load has active carriers content: application/problem+json: schema: $ref: '#/components/schemas/Error' /loads/{id}/add-carrier: post: summary: Add carrier to load description: | Add an additional carrier to a load. ## Use cases - Split loads (multiple carriers for same load) - Adding backup carrier - Re-assigning after TONU/bounce ## What happens - New LoadCarrier record is created - Carrier is notified (if configured) operationId: addCarrierToLoad tags: - Loads parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoadCarrierInput' examples: addCarrier: summary: Add carrier with costs value: carrier: id: 550e8400-e29b-41d4-a716-446655440000 contact: id: 660e8400-e29b-41d4-a716-446655440001 charges: - chargeCode: key: LINEHAUL amount: 2000 driverName: John Smith driverPhone: '+15551234567' responses: '201': description: Carrier added successfully content: application/json: schema: $ref: '#/components/schemas/AddCarrierResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' /loads/{id}/rebook: post: summary: Rebook a TONU load description: | Create a new load to replace a TONU'd load. ## Use case After a carrier reports TONU, use this to create a replacement load that can be assigned to a new carrier. ## What happens - New Load is created with same stops - Original load remains in TONU status - New load is ready for carrier assignment operationId: rebookLoad tags: - Loads parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '201': description: Load rebooked successfully content: application/json: schema: $ref: '#/components/schemas/RebookLoadResponse' example: originalLoadId: 550e8400-e29b-41d4-a716-446655440000 newLoadId: 660e8400-e29b-41d4-a716-446655440001 newLoadKey: LD-12346 '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Load is not in TONU status content: application/problem+json: schema: $ref: '#/components/schemas/Error' /loads/{loadId}/carriers/{carrierId}: get: summary: Get load carrier description: Retrieve a specific carrier assignment for a load. operationId: getLoadCarrier tags: - Loads parameters: - name: loadId in: path required: true schema: type: string description: Load ID - name: carrierId in: path required: true schema: type: string description: LoadCarrier ID responses: '200': description: Load carrier retrieved content: application/json: schema: $ref: '#/components/schemas/LoadCarrier' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update load carrier description: | Update carrier assignment details. Use this to update driver info, truck/trailer numbers, or contact. operationId: updateLoadCarrier tags: - Loads parameters: - name: loadId in: path required: true schema: type: string - name: carrierId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoadCarrierPatch' examples: updateDriver: summary: Update driver info value: driverName: Jane Doe driverPhone: '+15559876543' truckNumber: TRK-123 trailerNumber: TRL-456 responses: '200': description: Load carrier updated content: application/json: schema: $ref: '#/components/schemas/LoadCarrier' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' /loads/{loadId}/carriers/{carrierId}/bounce: post: summary: Bounce carrier description: | Mark carrier as bounced (rejected load without payment). ## What happens - LoadCarrier status changes to BOUNCED - Carrier is removed from active execution - No payment is recorded ## When to use Use bounce when carrier rejects the load before dispatch, or fails to show up without prior notice. For carriers who were dispatched but cancelled, use TONU instead. operationId: bounceCarrier tags: - Loads parameters: - name: loadId in: path required: true schema: type: string - name: carrierId in: path required: true schema: type: string requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/BounceCarrierRequest' examples: bounceWithReason: summary: Bounce with reason value: reason: CAN_NO_LONGER_TAKE_LOAD reasonText: Driver did not show up at scheduled time responses: '200': description: Carrier bounced successfully content: application/json: schema: $ref: '#/components/schemas/LoadCarrier' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Carrier is not in valid status for bounce content: application/problem+json: schema: $ref: '#/components/schemas/Error' /loads/{loadId}/carriers/{carrierId}/tonu: post: summary: Report TONU description: | Report Truck Ordered Not Used (TONU). ## What happens - LoadCarrier status changes to TONU - TONU costs are recorded if provided - Optionally creates a replacement load ## When to use Use TONU when: - Carrier was dispatched but load was cancelled - Carrier arrived but freight wasn't ready - Carrier was turned away at shipper TONU typically involves some payment to the carrier. operationId: reportTonu tags: - Loads parameters: - name: loadId in: path required: true schema: type: string - name: carrierId in: path required: true schema: type: string requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/ReportTonuRequest' examples: tonuWithCosts: summary: TONU with costs value: reason: Freight not ready at shipper costs: - chargeCode: key: TONU amount: 250 description: TONU fee createReplacementLoad: true responses: '200': description: TONU reported successfully content: application/json: schema: type: object properties: loadCarrier: $ref: '#/components/schemas/LoadCarrier' replacementLoadId: type: string format: uuid description: New load ID if replacement was requested nullable: true '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Carrier is not in valid status for TONU content: application/problem+json: schema: $ref: '#/components/schemas/Error' /services/filter: post: summary: Filter services description: | Search for services using filter criteria. ## Common Filters - By shipment: `{ "filter": { "shipmentId": { "equalTo": "uuid" } } }` - By vendor: `{ "filter": { "vendorId": { "equalTo": "uuid" } } }` - Awaiting invoice: `{ "filter": { "status": { "equalTo": "AWAITING_INVOICE" } } }` operationId: filterServices tags: - Services requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ServiceFilterRequest' examples: byShipment: summary: Filter by shipment value: filter: shipmentId: equalTo: 550e8400-e29b-41d4-a716-446655440000 awaitingInvoice: summary: Awaiting invoice value: filter: status: equalTo: AWAITING_INVOICE responses: '200': description: Services matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Service' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /services: post: summary: Create a service description: | Create a new service for a shipment. ## What happens - Service is created for the specified shipment - Vendor is associated with the service - Charges are recorded ## Note Services are typically created as part of shipment creation. Use this endpoint to add additional services to an existing shipment. operationId: createService tags: - Services requestBody: required: true content: application/json: schema: type: object required: - shipmentId - service properties: shipmentId: type: string format: uuid description: Parent shipment ID service: $ref: '#/components/schemas/ServiceInput' examples: drayageService: summary: Create drayage service value: shipmentId: 550e8400-e29b-41d4-a716-446655440000 service: vendor: id: 660e8400-e29b-41d4-a716-446655440001 description: Port drayage from Long Beach charges: - chargeCode: key: DRAY amount: 450 scheduledDate: '2025-01-20' customsService: summary: Create customs service value: shipmentId: 550e8400-e29b-41d4-a716-446655440000 service: vendor: id: 770e8400-e29b-41d4-a716-446655440002 description: Import customs clearance charges: - chargeCode: key: CUSTOMS amount: 175 referenceNumber: CB-2025-1234 responses: '201': description: Service created successfully content: application/json: schema: $ref: '#/components/schemas/Service' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /services/{id}: get: summary: Get a service description: | Retrieve a service by ID. The response includes vendor info and charges. operationId: getService tags: - Services parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Service retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Service' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a service description: | Update service fields. **Note:** Status changes happen automatically based on billing workflow. operationId: updateService tags: - Services parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ServicePatch' examples: updateSchedule: summary: Update scheduled date value: scheduledDate: '2025-01-22' markComplete: summary: Mark as completed value: completedDate: '2025-01-20' responses: '200': description: Service updated successfully content: application/json: schema: $ref: '#/components/schemas/Service' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a service description: | Soft delete a service. ## Prerequisites - Service must not be paid operationId: deleteService tags: - Services parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Service deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot delete - service is paid content: application/problem+json: schema: $ref: '#/components/schemas/Error' /invoices/filter: post: summary: Filter invoices description: | Search for AR invoices using filter criteria. ## Common Filters - By customer: `{ "filter": { "customerId": { "equalTo": "uuid" } } }` - Unpaid: `{ "filter": { "status": { "in": ["AWAITING_PAYMENT", "PARTIALLY_PAID"] } } }` - Overdue: `{ "filter": { "overdue": true } }` - By shipment: `{ "filter": { "shipmentId": { "equalTo": "uuid" } } }` operationId: filterInvoices tags: - Invoices requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvoiceFilterRequest' examples: unpaidInvoices: summary: Unpaid invoices value: filter: status: in: - AWAITING_PAYMENT - PARTIALLY_PAID overdueByCustomer: summary: Overdue invoices for customer value: filter: customerId: equalTo: 550e8400-e29b-41d4-a716-446655440000 overdue: true responses: '200': description: Invoices matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Invoice' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /invoices: post: summary: Create an invoice description: | Create a new invoice for an order. ## What happens - Invoice record is created for the order - Order status updates to `DELIVERED_UNPAID` - Due date calculated from payment term if not provided ## Note Each shipment can have only one AR invoice. Use `POST /shipments/{id}/invoice/generate` to generate the invoice PDF document. operationId: createInvoice tags: - Invoices requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvoiceInput' examples: basic: summary: Create invoice value: orderId: 550e8400-e29b-41d4-a716-446655440000 invoiceDate: '2025-01-15' dueDate: '2025-02-14' amount: 2500 currency: USD withTerm: summary: With payment term value: orderId: 550e8400-e29b-41d4-a716-446655440000 invoiceDate: '2025-01-15' amount: 2500 paymentTermId: 660e8400-e29b-41d4-a716-446655440001 responses: '201': description: Invoice created successfully content: application/json: schema: $ref: '#/components/schemas/Invoice' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': description: Order already has an invoice content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' /invoices/{id}: get: summary: Get an invoice description: | Retrieve an invoice by ID. The response includes payments, credits, and document info. operationId: getInvoice tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Invoice retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Invoice' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update an invoice description: | Update invoice fields. **Note:** Amount cannot be changed directly. Update order charges instead. operationId: updateInvoice tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvoicePatch' examples: updateDueDate: summary: Update due date value: dueDate: '2025-02-28' updateReference: summary: Update reference value: reference: INV-CUST-123-REV responses: '200': description: Invoice updated successfully content: application/json: schema: $ref: '#/components/schemas/Invoice' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Void an invoice description: | Void/cancel an invoice. ## Prerequisites - Invoice must not have any payments applied - Invoice must not be factored operationId: voidInvoice tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Invoice voided successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot void - invoice has payments or is factored content: application/problem+json: schema: $ref: '#/components/schemas/Error' /invoices/{id}/mark-awaiting: post: summary: Mark invoice as awaiting payment description: | Mark invoice as awaiting payment. ## What happens - Sets invoice date and due date - Updates order status to `DELIVERED_UNPAID` - Invoice is now ready for payment collection operationId: markInvoiceAwaiting tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/MarkAwaitingPaymentRequest' examples: withDates: summary: With dates value: invoiceDate: '2025-01-15' dueDate: '2025-02-14' responses: '200': description: Invoice marked as awaiting payment content: application/json: schema: $ref: '#/components/schemas/Invoice' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /invoices/{id}/send: post: summary: Email invoice description: | Send invoice to customer via email. ## What happens - Generates invoice PDF if not already generated - Sends email with PDF attachment - Logs email in activity feed operationId: sendInvoiceEmail tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendInvoiceEmailRequest' examples: basic: summary: Basic email value: toEmails: - billing@customer.com withMessage: summary: With custom message value: toEmails: - billing@customer.com ccEmails: - accounts@broker.com subject: Invoice INV-00001 for Shipment SHP-00123 message: Please find attached your invoice for recent shipment services. responses: '200': description: Email sent successfully content: application/json: schema: type: object properties: success: type: boolean emailId: type: string format: uuid '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /invoices/{id}/payments: get: summary: Get invoice payments description: List all payments applied to a specific invoice. operationId: getInvoicePayments tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Payments retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/InvoicePayment' totalPaid: type: number openBalance: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /invoices/batch-generate: post: summary: Batch generate invoices description: | Generate invoices for multiple shipments in a single request. ## What happens - Creates invoice records for each shipment - Generates PDF documents - Optionally sends emails grouped by customer ## Note Shipments that already have invoices or are missing requirements will be skipped and returned in the `failed` array. operationId: batchGenerateInvoices tags: - Invoices requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BatchGenerateInvoicesRequest' examples: basic: summary: Generate only value: orderIds: - 550e8400-e29b-41d4-a716-446655440000 - 550e8400-e29b-41d4-a716-446655440001 withEmail: summary: Generate and email value: orderIds: - 550e8400-e29b-41d4-a716-446655440000 - 550e8400-e29b-41d4-a716-446655440001 sendEmail: true emailConfig: groupByCustomer: true responses: '200': description: Batch generation completed content: application/json: schema: $ref: '#/components/schemas/BatchGenerateInvoicesResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' /invoices/aging-report: get: summary: Get aging report description: | Generate accounts receivable aging report. ## Report buckets By default: Current, 1-30, 31-60, 61-90, 90+ days ## Export formats - JSON (default) - CSV (set Accept header to text/csv) operationId: getAgingReport tags: - Invoices parameters: - name: customerId in: query schema: type: string format: uuid description: Filter by specific customer - name: daysPerBucket in: query schema: type: integer default: 30 description: Days per aging bucket - name: maxDays in: query schema: type: integer default: 120 description: Maximum days to track responses: '200': description: Aging report generated content: application/json: schema: $ref: '#/components/schemas/AgingReportResponse' text/csv: schema: type: string '401': $ref: '#/components/responses/UnauthorizedError' /payments/filter: post: summary: Filter payments description: | Search for AR payments using filter criteria. ## Common Filters - By customer: `{ "filter": { "customerId": { "equalTo": "uuid" } } }` - By invoice: `{ "filter": { "invoiceId": { "equalTo": "uuid" } } }` - By date range: `{ "filter": { "paymentDate": { "greaterThanOrEqualTo": "2025-01-01" } } }` - By method: `{ "filter": { "paymentMethodType": { "equalTo": "check" } } }` operationId: filterPayments tags: - Payments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentFilterRequest' examples: byCustomer: summary: Filter by customer value: filter: customerId: equalTo: 550e8400-e29b-41d4-a716-446655440000 byDateRange: summary: Filter by date range value: filter: paymentDate: greaterThanOrEqualTo: '2025-01-01T00:00:00Z' lessThanOrEqualTo: '2025-01-31T23:59:59Z' responses: '200': description: Payments matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Payment' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /payments: post: summary: Create a payment description: | Record a customer payment applied to invoices. ## What happens - Payment record is created - Specified amounts are applied to invoices - Invoice/order status updated to `PAID` when fully paid - Overpayment creates a credit memo automatically ## Validations - Payment date must be >= invoice date for all applied invoices - Application amounts must not exceed invoice open balances - Customer must match invoice customer operationId: createPayment tags: - Payments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentInput' examples: singleInvoice: summary: Single invoice payment value: customerId: 550e8400-e29b-41d4-a716-446655440000 paymentDate: '2025-01-15' paymentMethodType: CHECK reference: CHK-12345 applications: - invoiceId: 660e8400-e29b-41d4-a716-446655440001 amount: 2500 multipleInvoices: summary: Multiple invoices value: customerId: 550e8400-e29b-41d4-a716-446655440000 paymentDate: '2025-01-15' paymentMethodType: ACH_WIRE reference: ACH-98765 notes: January payment batch applications: - invoiceId: 660e8400-e29b-41d4-a716-446655440001 amount: 1500 - invoiceId: 660e8400-e29b-41d4-a716-446655440002 amount: 2500 withCredits: summary: With credits applied value: customerId: 550e8400-e29b-41d4-a716-446655440000 paymentDate: '2025-01-15' paymentMethodType: CHECK reference: CHK-12345 applications: - invoiceId: 660e8400-e29b-41d4-a716-446655440001 amount: 2000 creditApplications: - creditMemoId: 770e8400-e29b-41d4-a716-446655440003 amount: 500 responses: '201': description: Payment created successfully content: application/json: schema: $ref: '#/components/schemas/Payment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /payments/{id}: get: summary: Get a payment description: | Retrieve a payment by ID. The response includes all invoice applications and credit applications. operationId: getPayment tags: - Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Payment retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Payment' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a payment description: | Update payment details or reassign invoice applications. ## What happens - Payment fields are updated - Invoice applications are replaced if provided - Order statuses are recalculated ## Note Updating applications replaces all existing applications. Include all desired applications in the request. operationId: updatePayment tags: - Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaymentPatch' examples: updateReference: summary: Update reference value: reference: CHK-12345-REV notes: Corrected check number updateMethod: summary: Update method value: paymentMethodType: ACH_WIRE reassignApplications: summary: Reassign to different invoices value: applications: - invoiceId: 660e8400-e29b-41d4-a716-446655440001 amount: 1500 responses: '200': description: Payment updated successfully content: application/json: schema: $ref: '#/components/schemas/Payment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a payment description: | Delete a payment and remove all invoice applications. ## What happens - Payment record is deleted - Invoice applications are removed - Order statuses revert if needed (PAID → UNPAID) ## Note This action cannot be undone. Consider voiding instead if you need to maintain a record. operationId: deletePayment tags: - Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Payment deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot delete - payment is synced to QBO content: application/problem+json: schema: $ref: '#/components/schemas/Error' /payments/{id}/applications: get: summary: Get payment applications description: List all invoice applications for a payment. operationId: getPaymentApplications tags: - Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Applications retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/PaymentApplication' totalApplied: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /customers/{id}/payments: get: summary: Get customer payments description: List all payments from a specific customer. operationId: getCustomerPayments tags: - Customers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' - name: pageSize in: query schema: type: integer minimum: 1 maximum: 100 default: 50 - name: cursor in: query schema: type: string responses: '200': description: Payments retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Payment' pagination: $ref: '#/components/schemas/PaginationInfo' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /customers/{id}/outstanding-invoices: get: summary: Get outstanding invoices description: | List invoices available for payment from a customer. Returns invoices with status `AWAITING_PAYMENT` or `PARTIALLY_PAID`. operationId: getCustomerOutstandingInvoices tags: - Customers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Outstanding invoices retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingInvoicesResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /credit-memos/filter: post: summary: Filter credit memos description: | Search for credit memos using filter criteria. ## Common Filters - By customer: `{ "filter": { "customerId": { "equalTo": "uuid" } } }` - With balance: `{ "filter": { "hasRemainingBalance": true } }` - Open credits: `{ "filter": { "status": { "in": ["OPEN", "PARTIALLY_APPLIED"] } } }` operationId: filterCreditMemos tags: - Credit Memos requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreditMemoFilterRequest' examples: byCustomer: summary: Filter by customer value: filter: customerId: equalTo: 550e8400-e29b-41d4-a716-446655440000 availableCredits: summary: Credits with balance value: filter: hasRemainingBalance: true status: notEqualTo: VOIDED responses: '200': description: Credit memos matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CreditMemo' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /credit-memos: post: summary: Create a credit memo description: | Create a new credit memo for a customer. ## Use cases - Customer refunds - Service adjustments - Promotional credits - Manual corrections ## Note Credit memos from overpayments are created automatically when a payment exceeds invoice totals. operationId: createCreditMemo tags: - Credit Memos requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreditMemoInput' examples: refund: summary: Customer refund value: customerId: 550e8400-e29b-41d4-a716-446655440000 amount: 500 currency: USD memoDate: '2025-01-15' reference: CM-00001 notes: Refund for damaged goods adjustment: summary: Service adjustment value: customerId: 550e8400-e29b-41d4-a716-446655440000 amount: 150 memoDate: '2025-01-15' notes: Price adjustment per agreement responses: '201': description: Credit memo created successfully content: application/json: schema: $ref: '#/components/schemas/CreditMemo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /credit-memos/{id}: get: summary: Get a credit memo description: | Retrieve a credit memo by ID. The response includes all applications showing how the credit has been used. operationId: getCreditMemo tags: - Credit Memos parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Credit memo retrieved successfully content: application/json: schema: $ref: '#/components/schemas/CreditMemo' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a credit memo description: | Update credit memo fields. ## Constraints - Amount cannot be changed if any applications exist - Customer cannot be changed once created operationId: updateCreditMemo tags: - Credit Memos parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreditMemoPatch' examples: updateReference: summary: Update reference value: reference: CM-00001-REV updateNotes: summary: Update notes value: notes: 'Updated: Refund for damaged goods and shipping issues' responses: '200': description: Credit memo updated successfully content: application/json: schema: $ref: '#/components/schemas/CreditMemo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': $ref: '#/components/responses/ValidationError' /credit-memos/{id}/void: post: summary: Void a credit memo description: | Void/cancel a credit memo. ## Prerequisites - Credit memo must have no applications (full balance remaining) - Must unapply all applications before voiding ## What happens - Credit memo status changes to VOIDED - Credit is no longer available for application - QBO sync will delete the credit memo operationId: voidCreditMemo tags: - Credit Memos parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/VoidCreditMemoRequest' examples: withReason: summary: Void with reason value: reason: Credit issued in error responses: '200': description: Credit memo voided successfully content: application/json: schema: $ref: '#/components/schemas/CreditMemo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot void - credit memo has applications content: application/problem+json: schema: $ref: '#/components/schemas/Error' /credit-memos/{id}/apply: post: summary: Apply credit to invoice description: | Apply credit memo amount to an invoice. ## What happens - Creates credit application record - Reduces credit memo remaining balance - Reduces invoice open balance - Updates order status if invoice is fully paid ## Constraints - Amount must not exceed remaining balance - Invoice must belong to same customer - Invoice must have outstanding balance - Currency must match operationId: applyCreditMemo tags: - Credit Memos parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ApplyCreditRequest' examples: applyCredit: summary: Apply credit value: invoiceId: 660e8400-e29b-41d4-a716-446655440001 amount: 200 responses: '200': description: Credit applied successfully content: application/json: schema: $ref: '#/components/schemas/ApplyCreditResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot apply - insufficient balance or invalid invoice content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' /credit-memos/{id}/applications: get: summary: Get credit applications description: List all invoice applications for a credit memo. operationId: getCreditMemoApplications tags: - Credit Memos parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Applications retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CreditMemoApplication' totalApplied: type: number remainingBalance: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /credit-memos/{creditMemoId}/applications/{applicationId}: delete: summary: Unapply credit from invoice description: | Remove a credit application from an invoice. ## What happens - Application record is deleted - Credit memo remaining balance increases - Invoice open balance increases - Order status may revert if invoice becomes unpaid operationId: unapplyCreditMemo tags: - Credit Memos parameters: - name: creditMemoId in: path required: true schema: type: string description: Credit memo ID - name: applicationId in: path required: true schema: type: string format: uuid description: Application ID responses: '200': description: Credit unapplied successfully content: application/json: schema: $ref: '#/components/schemas/CreditMemo' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /invoices/{id}/available-credits: get: summary: Get available credits for invoice description: | List credit memos that can be applied to an invoice. Returns credits for the same customer with remaining balance and matching currency. operationId: getAvailableCreditsForInvoice tags: - Invoices parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Available credits retrieved content: application/json: schema: $ref: '#/components/schemas/AvailableCreditsResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bills/filter: post: summary: Filter bills description: | Search for AP bills using filter criteria. ## Common Filters - By carrier: `{ "filter": { "carrierId": { "equalTo": "uuid" } } }` - By vendor: `{ "filter": { "vendorId": { "equalTo": "uuid" } } }` - Awaiting approval: `{ "filter": { "status": { "equalTo": "IN_REVIEW" } } }` - By shipment: `{ "filter": { "shipmentId": { "equalTo": "uuid" } } }` - Overdue: `{ "filter": { "overdue": true } }` operationId: filterBills tags: - Bills requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillFilterRequest' examples: awaitingApproval: summary: Bills awaiting approval value: filter: status: equalTo: IN_REVIEW byCarrier: summary: Bills by carrier value: filter: carrierId: equalTo: 550e8400-e29b-41d4-a716-446655440000 entityType: equalTo: CARRIER approvedToPay: summary: Bills approved to pay value: filter: status: equalTo: APPROVED_TO_PAY responses: '200': description: Bills matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/Bill' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /bills: post: summary: Record a bill description: | Record a carrier or vendor bill (invoice). ## What happens - Bill record is created for the load carrier or vended service - Entity status updates to `IN_REVIEW` - Due date calculated from payment term if not provided ## Prerequisites - LoadCarrier or VendedService must exist - Entity must be in `AWAITING_INVOICE` status operationId: createBill tags: - Bills requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillInput' examples: carrierBill: summary: Record carrier bill value: entityType: CARRIER entityId: 550e8400-e29b-41d4-a716-446655440000 invoiceDate: '2025-01-15' dueDate: '2025-02-14' amount: 2500 reference: INV-CARRIER-123 currency: USD vendorBill: summary: Record vendor bill value: entityType: VENDOR entityId: 660e8400-e29b-41d4-a716-446655440001 invoiceDate: '2025-01-15' amount: 500 reference: VS-2025-001 responses: '201': description: Bill created successfully content: application/json: schema: $ref: '#/components/schemas/Bill' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': description: Entity already has a bill or is not in correct status content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' /bills/{id}: get: summary: Get a bill description: | Retrieve a bill by ID. The response includes payments applied and carrier/vendor details. operationId: getBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bill retrieved successfully content: application/json: schema: $ref: '#/components/schemas/Bill' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a bill description: | Update bill fields. ## Constraints - Cannot change amount if payments have been applied - Status changes use action endpoints operationId: updateBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillPatch' examples: updateDueDate: summary: Update due date value: dueDate: '2025-02-28' updateReference: summary: Update reference value: reference: INV-CARRIER-123-REV responses: '200': description: Bill updated successfully content: application/json: schema: $ref: '#/components/schemas/Bill' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot update - bill has payments content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a bill description: | Delete a bill. ## Prerequisites - Bill must not have any payments applied ## What happens - Bill record is deleted - Entity status reverts to `AWAITING_INVOICE` operationId: deleteBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Bill deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Cannot delete - bill has payments content: application/problem+json: schema: $ref: '#/components/schemas/Error' /bills/{id}/approve: post: summary: Approve bill for payment description: | Approve a bill for payment. ## What happens - Bill status changes to `APPROVED_TO_PAY` - Bill is now ready for payment ## Prerequisites - Bill must be in `IN_REVIEW` status operationId: approveBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bill approved successfully content: application/json: schema: $ref: '#/components/schemas/Bill' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Bill is not in valid status for approval content: application/problem+json: schema: $ref: '#/components/schemas/Error' /bills/batch-approve: post: summary: Batch approve bills description: | Approve multiple bills for payment in a single request. Bills that cannot be approved will be returned in the `failed` array. operationId: batchApproveBills tags: - Bills requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ApproveBillsRequest' examples: approveBills: summary: Approve multiple bills value: billIds: - 550e8400-e29b-41d4-a716-446655440000 - 550e8400-e29b-41d4-a716-446655440001 responses: '200': description: Batch approval completed content: application/json: schema: $ref: '#/components/schemas/ApproveBillsResponse' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' /bills/{id}/unapprove: post: summary: Unapprove bill description: | Revert bill from approved back to in review. ## What happens - Bill status changes to `IN_REVIEW` ## Prerequisites - Bill must be in `APPROVED_TO_PAY` status - Bill must not have any payments operationId: unapproveBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bill unapproved successfully content: application/json: schema: $ref: '#/components/schemas/Bill' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Bill is not in valid status or has payments content: application/problem+json: schema: $ref: '#/components/schemas/Error' /bills/{id}/revert: post: summary: Revert bill to awaiting invoice description: | Revert bill completely back to awaiting invoice state. ## What happens - Bill record is deleted - Any payments are deleted - Entity status reverts to `AWAITING_INVOICE` ## Use case Use when a bill was recorded incorrectly and needs to start over. operationId: revertBill tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/RevertBillRequest' examples: withReason: summary: Revert with reason value: reason: Invoice amount was incorrect responses: '200': description: Bill reverted successfully content: application/json: schema: type: object properties: success: type: boolean entityStatus: type: string description: New status of the load carrier or vended service '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bills/{id}/payments: get: summary: Get bill payments description: List all payments applied to a specific bill. operationId: getBillPayments tags: - Bills parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Payments retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/BillPaymentApplied' totalPaid: type: number openBalance: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /carriers/{id}/outstanding-bills: get: summary: Get carrier outstanding bills description: | List outstanding (unpaid) bills for a carrier. Returns bills with status `APPROVED_TO_PAY`. operationId: getCarrierOutstandingBills tags: - Carriers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Outstanding bills retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingBillsResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /vendors/{id}/outstanding-bills: get: summary: Get vendor outstanding bills description: | List outstanding (unpaid) bills for a vendor. Returns bills with status `APPROVED_TO_PAY`. operationId: getVendorOutstandingBills tags: - Vendors parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Outstanding bills retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingBillsResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bills/aging-report: get: summary: Get AP aging report description: | Generate accounts payable aging report. ## Report buckets By default: Current, 1-30, 31-60, 61-90, 90+ days ## Export formats - JSON (default) - CSV (set Accept header to text/csv) operationId: getApAgingReport tags: - Bills parameters: - name: carrierId in: query schema: type: string format: uuid description: Filter by specific carrier - name: vendorId in: query schema: type: string format: uuid description: Filter by specific vendor - name: entityType in: query schema: $ref: '#/components/schemas/BillEntityType' description: Filter by entity type - name: daysPerBucket in: query schema: type: integer default: 30 description: Days per aging bucket - name: maxDays in: query schema: type: integer default: 120 description: Maximum days to track responses: '200': description: AP aging report generated content: application/json: schema: $ref: '#/components/schemas/ApAgingReportResponse' text/csv: schema: type: string '401': $ref: '#/components/responses/UnauthorizedError' /bill-payments/filter: post: summary: Filter bill payments description: | Search for bill payments using filter criteria. ## Common Filters - By carrier: `{ "filter": { "carrierId": { "equalTo": "uuid" } } }` - By vendor: `{ "filter": { "vendorId": { "equalTo": "uuid" } } }` - By factor: `{ "filter": { "carrierFactorId": { "equalTo": "uuid" } } }` - By date range: `{ "filter": { "paymentDate": { "gte": "2025-01-01", "lte": "2025-01-31" } } }` - By method: `{ "filter": { "paymentMethodType": { "equalTo": "check" } } }` operationId: filterBillPayments tags: - Bill Payments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillPaymentFilterRequest' examples: byCarrier: summary: Payments by carrier value: filter: carrierId: equalTo: 550e8400-e29b-41d4-a716-446655440000 byDateRange: summary: Payments in date range value: filter: paymentDate: greaterThanOrEqualTo: '2025-01-01T00:00:00Z' lessThanOrEqualTo: '2025-01-31T23:59:59Z' byMethod: summary: Check payments value: filter: paymentMethodType: equalTo: CHECK responses: '200': description: Bill payments matching filter criteria content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/BillPayment' pagination: $ref: '#/components/schemas/PaginationInfo' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' /bill-payments: post: summary: Create a bill payment description: | Record a payment for one or more carrier/vendor bills. ## What happens - PaymentGroup record is created - Payment applications are created for each bill - Bill open balances are reduced - Load/service status updates to PAID when fully paid ## Carrier factor payments To pay a carrier's factor instead of the carrier directly, specify `carrierFactorId` in the request. ## Overpayments If `allowOverpayment` is true and payment exceeds bill totals, a credit memo is automatically created for the difference. operationId: createBillPayment tags: - Bill Payments requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillPaymentInput' examples: singleBill: summary: Pay single bill value: paymentDate: '2025-01-15' paymentMethodType: CHECK reference: CHK-12345 applications: - billId: 550e8400-e29b-41d4-a716-446655440000 amount: 2500 multipleBills: summary: Pay multiple bills value: paymentDate: '2025-01-15' paymentMethodType: ACH_WIRE reference: ACH-2025-001 notes: January carrier payments applications: - billId: 550e8400-e29b-41d4-a716-446655440000 amount: 2500 - billId: 550e8400-e29b-41d4-a716-446655440001 amount: 3500 factorPayment: summary: Pay carrier factor value: paymentDate: '2025-01-15' paymentMethodType: ACH_WIRE carrierFactorId: 770e8400-e29b-41d4-a716-446655440002 reference: ACH-FACTOR-001 applications: - billId: 550e8400-e29b-41d4-a716-446655440000 amount: 2500 responses: '201': description: Bill payment created successfully content: application/json: schema: $ref: '#/components/schemas/BillPayment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '409': description: Conflict - bill already paid or invalid state content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' /bill-payments/{id}: get: summary: Get a bill payment description: | Retrieve a bill payment by ID. The response includes all payment applications and their associated bills. operationId: getBillPayment tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bill payment retrieved successfully content: application/json: schema: $ref: '#/components/schemas/BillPayment' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' patch: summary: Update a bill payment description: | Update bill payment fields. ## Constraints - Cannot change carrier factor after creation - Can add/remove/update payment applications ## Updating applications In the `applications` array: - Include `id` to update an existing application - Omit `id` and include `billId` to add a new application - Set `delete: true` with `id` to remove an application operationId: updateBillPayment tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BillPaymentPatch' examples: updateReference: summary: Update reference value: reference: CHK-12345-UPDATED updateAmounts: summary: Update payment amounts value: applications: - id: 660e8400-e29b-41d4-a716-446655440001 amount: 2600 addApplication: summary: Add new bill to payment value: applications: - billId: 770e8400-e29b-41d4-a716-446655440002 amount: 1000 removeApplication: summary: Remove bill from payment value: applications: - id: 660e8400-e29b-41d4-a716-446655440001 delete: true responses: '200': description: Bill payment updated successfully content: application/json: schema: $ref: '#/components/schemas/BillPayment' '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '409': description: Conflict - invalid state for update content: application/problem+json: schema: $ref: '#/components/schemas/Error' '422': $ref: '#/components/responses/ValidationError' delete: summary: Delete a bill payment description: | Delete a bill payment and all its applications. ## What happens - PaymentGroup record is deleted - All Payment applications are deleted - Bill open balances are restored - Load/service status may revert if payment made them PAID operationId: deleteBillPayment tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '204': description: Bill payment deleted successfully '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bill-payments/{id}/applications: get: summary: Get bill payment applications description: List all bills paid by this payment group. operationId: getBillPaymentApplications tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Applications retrieved successfully content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/BillPaymentApplication' totalAmount: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /carriers/{id}/bills-for-payment: get: summary: Get carrier bills available for payment description: | List bills available for payment from a carrier. Returns bills with status `APPROVED_TO_PAY` and open balance. ## Carrier factor If the carrier has a factor configured, factor details are included. operationId: getCarrierBillsForPayment tags: - Carriers parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bills for payment retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingBillsForPaymentResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /vendors/{id}/bills-for-payment: get: summary: Get vendor bills available for payment description: | List bills available for payment from a vendor. Returns bills with status `APPROVED_TO_PAY` and open balance. operationId: getVendorBillsForPayment tags: - Vendors parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bills for payment retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingBillsForPaymentResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /carrier-factors/{id}/bills-for-payment: get: summary: Get bills payable to a carrier factor description: | List bills that should be paid to this carrier factor. Returns bills from carriers that use this factor with status `APPROVED_TO_PAY`. operationId: getCarrierFactorBillsForPayment tags: - Carrier Factors parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Bills for payment retrieved content: application/json: schema: $ref: '#/components/schemas/OutstandingBillsForPaymentResponse' '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bill-payments/{id}/remittance-advice: get: summary: Generate remittance advice description: | Generate a remittance advice document for a bill payment. ## Formats - PDF (default): Set Accept header to application/pdf - JSON: Set Accept header to application/json operationId: getBillPaymentRemittanceAdvice tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' responses: '200': description: Remittance advice generated content: application/pdf: schema: type: string format: binary application/json: schema: type: object properties: paymentDate: type: string format: date paymentMethod: type: string reference: type: string payee: type: object properties: name: type: string address: type: string applications: type: array items: type: object properties: billFriendlyId: type: string shipmentFriendlyId: type: string invoiceDate: type: string format: date amount: type: number totalAmount: type: number '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' /bill-payments/{id}/send-remittance: post: summary: Send remittance advice email description: | Email the remittance advice to the carrier or vendor. Uses the recipient's default email from their profile. operationId: sendBillPaymentRemittance tags: - Bill Payments parameters: - $ref: '#/components/parameters/IdOrClientKey' - $ref: '#/components/parameters/LookupBy' requestBody: required: false content: application/json: schema: type: object properties: toEmail: type: string format: email description: Override recipient email ccEmails: type: array items: type: string format: email description: CC recipients message: type: string maxLength: 2000 description: Additional message in email body examples: defaultEmail: summary: Send to default contact value: {} customRecipient: summary: Send to specific email value: toEmail: accounts@carrier.com message: Please find attached remittance advice for recent payments. responses: '200': description: Remittance advice sent successfully content: application/json: schema: type: object properties: success: type: boolean sentTo: type: string format: email '401': $ref: '#/components/responses/UnauthorizedError' '404': $ref: '#/components/responses/NotFoundError' '422': description: No email address available content: application/problem+json: schema: $ref: '#/components/schemas/Error' /global-search: post: summary: Search globally description: | Search across multiple entity types simultaneously (shipments, customers, carriers, users, vendors). **Use Cases:** - Unified search bar for finding any type of record - Quick lookup by name, ID, or reference number - Cross-entity discovery **Search Behavior:** - Searches across default searchable fields for each entity type - Results are sorted by object type priority: SHIPMENT → CUSTOMER → CARRIER → USER → VENDOR - Within each object type, results are sorted by most recently updated **Prefix Filtering:** Use "type:query" syntax to search specific object types: - `carrier:acme` - searches only carriers - `shipment:12345` - searches only shipments - `customer:west` - searches only customers **IMPORTANT: Eventually Consistent** This endpoint queries OpenSearch indices which are updated asynchronously. Changes typically appear within 2 seconds, but this is not guaranteed. operationId: globalSearch tags: - Search requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GlobalSearchRequest' examples: simpleSearch: summary: Simple search value: query: acme filteredSearch: summary: Filter by object types value: query: acme objects: - SHIPMENT - CUSTOMER pagination: pageNumber: 1 pageSize: 20 prefixSearch: summary: Prefix-filtered search value: query: carrier:trucking responses: '200': description: Search results content: application/json: schema: $ref: '#/components/schemas/GlobalSearchResponse' example: data: - object: SHIPMENT id: 550e8400-e29b-41d4-a716-446655440001 key: ERP-SHIP-001 entityName: SHIPMENT title: SHIP-12345 subtitle: Acme Corporation field: Customer highlight: Acme Corporation - object: CUSTOMER id: 550e8400-e29b-41d4-a716-446655440002 key: ERP-CUST-001 entityName: SHIPPER_PROFILE title: Acme Corporation subtitle: CUST-001 field: Name highlight: Acme Corporation pagination: pageNumber: 1 pageSize: 20 totalPages: 3 totalResults: 42 '400': $ref: '#/components/responses/BadRequestError' '401': $ref: '#/components/responses/UnauthorizedError' '422': $ref: '#/components/responses/ValidationError' '429': $ref: '#/components/responses/RateLimitExceeded' components: parameters: IdOrClientKey: name: id in: path required: true description: Resource ID (UUID) or client key schema: type: string example: 550e8400-e29b-41d4-a716-446655440000 LookupBy: name: by in: query description: | Specify lookup type for faster retrieval. If omitted, defaults to looking up by ID first, then falls back to client key if not found. Use `by=key` when you know you're providing a client key for best performance. schema: type: string enum: - id - key example: key x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: Specify lookup type for faster retrieval. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: If omitted, defaults to looking up by ID first, then falls back to client key if not found. children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: 'Use ' children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: by=key children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 3 inline: true attributes: content: ' when you know you''re providing a client key for best performance.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} responses: BadRequestError: description: Bad request - invalid input content: application/json: schema: $ref: '#/components/schemas/Error' example: error: bad_request message: Invalid request parameters UnauthorizedError: description: Unauthorized - invalid or missing access token content: application/json: schema: $ref: '#/components/schemas/Error' example: error: unauthorized message: Invalid or expired access token NotFoundError: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/Error' example: error: not_found message: Resource not found ConflictError: description: Conflict - resource already exists or constraint violation content: application/json: schema: $ref: '#/components/schemas/Error' example: error: conflict message: A resource with this identifier already exists InternalServerError: description: Internal server error content: application/json: schema: $ref: '#/components/schemas/Error' example: error: internal_server_error message: An unexpected error occurred ValidationError: description: Validation error - invalid field values content: application/json: schema: $ref: '#/components/schemas/ValidationError' example: error: validation_error message: Invalid field values details: - field: email message: Must be a valid email address - field: status message: Must be one of PENDING, ACTIVE, INACTIVE RateLimitExceeded: description: Rate limit exceeded content: application/json: schema: $ref: '#/components/schemas/Error' example: error: rate_limit_exceeded message: Too many requests. Please retry after 60 seconds. headers: X-RateLimit-Limit: description: Request limit per minute schema: type: integer X-RateLimit-Remaining: description: Remaining requests in current window schema: type: integer X-RateLimit-Reset: description: Unix timestamp when rate limit resets schema: type: integer Retry-After: description: Seconds to wait before retrying schema: type: integer schemas: PaginationInfo: type: object required: - pageSize - hasNextPage properties: pageSize: type: integer description: Number of items per page example: 50 hasNextPage: type: boolean description: Whether there are more pages example: true hasPreviousPage: type: boolean description: Whether there are previous pages example: false endCursor: type: string description: Cursor for the next page (null if no next page) example: eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCJ9 nullable: true ResourceReference: type: object description: Reference to another resource (returned in responses) required: - id properties: id: type: string format: uuid description: Resource UUID key: type: string description: Client-defined reference ID if set nullable: true example: id: 550e8400-e29b-41d4-a716-446655440000 key: ERP-USER-12345 ResourceReferenceInput: type: object description: Reference to another resource by either ID or client key (used in create/update requests) properties: id: type: string format: uuid description: Resource UUID key: type: string description: Client-defined reference ID oneOf: - required: - id - required: - key example: id: 550e8400-e29b-41d4-a716-446655440000 PaymentTermReference: type: object description: | Enhanced reference to a payment term resource (returned in responses). Includes full payment term details in addition to id/key. required: - id - name - createdAt - updatedAt properties: id: type: string format: uuid description: Payment term UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-PAYTERM-NET30 nullable: true name: type: string description: Payment term name example: Net 30 description: type: string description: Payment term description or notes example: Payment due 30 days from invoice date nullable: true days: type: integer description: Number of days until payment is due example: 30 nullable: true quickPayFee: type: number format: float description: Quick pay fee percentage (e.g., 0.05 for 5%) example: 0.05 x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Quick pay fee percentage (e.g., 0.05 for 5%) children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} nullable: true apOnly: type: boolean description: Whether this payment term is for accounts payable only example: false nullable: true doNotUse: type: boolean description: Flag to prevent using this payment term for new transactions example: false nullable: true createdAt: type: string format: date-time description: When the payment term was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the payment term was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time description: When the payment term was soft deleted (null if active) example: null nullable: true UserReference: type: object description: | Enhanced reference to a user resource (returned in responses). Includes full user details in addition to id/key. Note: Does NOT include nested references (teams, etc.) to prevent recursion. Maximum nesting depth: 1 level. required: - id - email - status - createdAt - updatedAt properties: id: type: string format: uuid description: User UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-USER-12345 nullable: true email: type: string format: email description: User's email address example: john.doe@example.com name: type: string description: User's full name example: John Doe nullable: true phone: type: string description: User's phone number example: +1-555-123-4567 nullable: true phoneExt: type: string description: Phone extension example: '123' nullable: true status: type: string description: User account status enum: - PENDING - ACTIVE - INACTIVE example: ACTIVE avatarId: type: string format: uuid description: Profile avatar document ID example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true createdAt: type: string format: date-time description: When the user was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the user was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time description: When the user was soft deleted (null if active) example: null nullable: true CustomerReference: type: object description: | Enhanced reference to a customer resource (returned in responses). Includes full customer details in addition to id/key. Note: Does NOT include nested references (paymentTerm, contacts, etc.) to prevent recursion. Maximum nesting depth: 1 level. required: - id - name - friendlyId - status - createdAt - updatedAt properties: id: type: string format: uuid description: Customer UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-CUSTOMER-ACME nullable: true name: type: string description: Customer company name example: Acme Manufacturing Corp friendlyId: type: string description: Human-readable customer identifier example: A123456 status: type: string description: Customer status enum: - NEW - CONTACTED - QUALIFIED - QUOTED - NURTURING - PENDING - ACTIVE - INACTIVE - BLOCKED - CLOSED example: ACTIVE phoneNumber: type: string description: Primary phone number example: +1-555-123-4567 nullable: true website: type: string description: Customer website URL example: https://acme-manufacturing.com nullable: true createdAt: type: string format: date-time description: When the customer was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the customer was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time description: When the customer was soft deleted (null if active) example: null nullable: true CarrierReference: type: object description: | Enhanced reference to a carrier resource (returned in responses). Includes full carrier details in addition to id/key. Note: Does NOT include nested references (contacts, etc.) to prevent recursion. Maximum nesting depth: 1 level. required: - id - name - createdAt - updatedAt properties: id: type: string format: uuid description: Carrier UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-CARRIER-SWIFT nullable: true name: type: string description: Carrier company name example: Swift Transportation phoneNumber: type: string description: Primary phone number example: +1-555-987-6543 nullable: true email: type: string format: email description: Primary email address example: dispatch@swifttrans.com nullable: true createdAt: type: string format: date-time description: When the carrier was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the carrier was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time description: When the carrier was soft deleted (null if active) example: null nullable: true CarrierType: type: string description: | Type of carrier operation. Note: In the backend, null carrier type is represented as TRUCKLOAD in the public API. enum: - TRUCKLOAD - AIR - CARTAGE - LINEHAUL - LTL - OCEAN - AGENT - RAIL example: TRUCKLOAD CarrierEquipment: type: string description: Equipment types that a carrier can operate enum: - CONTAINER - FLATBED - POWER_ONLY - REEFER - SPECIALIZED - TANKER - VAN example: VAN Currency: type: string description: Currency code (ISO 4217) enum: - ARS - AUD - BRL - CAD - CNY - EUR - GBP - IDR - INR - JPY - KRW - MXN - RUB - SAR - TRY - USD - ZAR example: USD CarrierBase: type: object required: - id - name - friendlyId - status - createdAt - updatedAt properties: object: type: string enum: - CARRIER readOnly: true description: Object type identifier example: CARRIER id: type: string format: uuid readOnly: true description: Unique carrier identifier example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string readOnly: true description: Human-readable carrier identifier example: C123456 type: allOf: - $ref: '#/components/schemas/CarrierType' description: Carrier operation type (discriminator field) name: type: string description: Carrier legal name example: Swift Transportation Co dbaName: type: string description: Doing Business As name example: Swift Logistics nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-SWIFT-001 nullable: true email: type: string format: email description: Primary email address example: dispatch@swifttrans.com nullable: true phone: type: string description: Primary phone number example: +1-555-987-6543 nullable: true website: type: string description: Company website URL example: https://swifttrans.com nullable: true status: type: string description: Carrier status example: ACTIVE statusReason: type: string description: Reason for current status example: Active and in good standing nullable: true notes: type: string description: Internal notes about the carrier example: Preferred carrier for midwest routes nullable: true corporateAddress: description: Corporate headquarters address $ref: '#/components/schemas/Address' nullable: true billingAddress: description: Billing address for invoices $ref: '#/components/schemas/Address' nullable: true mcNumber: type: string description: Motor Carrier (MC) number example: MC-123456 nullable: true dotNumber: type: string description: Department of Transportation (DOT) number example: '1234567' nullable: true scac: type: string description: Standard Carrier Alpha Code example: SWFT nullable: true einNumber: type: string description: Employer Identification Number example: 12-3456789 nullable: true ffNumber: type: string description: Freight Forwarder (FF) number example: FF-123456 nullable: true mxNumber: type: string description: Mexico carrier registration number example: MX-123456 nullable: true rfcNumber: type: string description: RFC (Mexico tax ID) number example: ABCD123456XYZ nullable: true iataCode: type: string description: International Air Transport Association code example: AA nullable: true equipments: type: array description: Equipment types this carrier operates items: $ref: '#/components/schemas/CarrierEquipment' example: - VAN - REEFER isHazmat: type: boolean description: Whether carrier is certified to transport hazardous materials example: false nullable: true tsaApproved: type: boolean description: Whether carrier is TSA approved example: true nullable: true trucks: type: integer description: Number of trucks in fleet example: 50 nullable: true trailers: type: integer description: Number of trailers in fleet example: 100 nullable: true drivers: type: integer description: Number of drivers employed example: 75 nullable: true powerUnits: type: integer description: Number of power units example: 50 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/Currency' nullable: true paymentTerm: description: Payment terms for this carrier $ref: '#/components/schemas/PaymentTermReference' nullable: true isFactoringPreferred: type: boolean description: Whether carrier prefers factoring for payment example: false nullable: true goldenCarrierId: type: string format: uuid description: Reference to golden carrier record (for deduplication) example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true paymentMethods: type: array description: Payment methods configured for this carrier items: $ref: '#/components/schemas/CarrierPaymentMethodReference' contacts: type: array description: Contacts for this carrier items: $ref: '#/components/schemas/CarrierContactReference' createdAt: type: string format: date-time readOnly: true description: When the carrier was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the carrier was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the carrier was soft deleted (null if active) example: null nullable: true TruckloadCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Truckload carrier with insurance, safety rating, and FMCSA data required: - type properties: type: type: string enum: - TRUCKLOAD description: Carrier type discriminator example: TRUCKLOAD insuranceCompany: type: string description: Insurance company name example: State Farm Insurance nullable: true insuranceAgent: type: string description: Insurance agent name example: John Smith nullable: true insuranceAgentPhone: type: string description: Insurance agent phone number example: +1-555-123-4567 nullable: true insuranceAuthorityDate: type: string format: date-time description: Date insurance authority was granted example: '2025-01-01T00:00:00Z' nullable: true insuranceExpirationDate: type: string format: date-time description: Insurance policy expiration date example: '2025-12-31T23:59:59Z' nullable: true insuranceAutoLiabilityLimit: type: number format: float description: Auto liability insurance limit (in dollars) example: 1000000 nullable: true insuranceCargoLiabilityLimit: type: number format: float description: Cargo liability insurance limit (in dollars) example: 100000 nullable: true insuranceGeneralLiabilityLimit: type: number format: float description: General liability insurance limit (in dollars) example: 1000000 nullable: true rating: type: string description: Carrier safety rating example: SATISFACTORY nullable: true ratingDate: type: string format: date description: Date of last safety rating example: '2025-01-15' nullable: true reviewType: type: string description: Type of safety review conducted example: COMPLIANCE_REVIEW nullable: true reviewDate: type: string format: date description: Date of last safety review example: '2025-01-15' nullable: true operatingAbility: type: string description: FMCSA operating authority status example: AUTHORIZED nullable: true inFmcsa: type: boolean description: Whether carrier is registered in FMCSA database example: true nullable: true usDriverInspections: type: integer description: Total number of US driver inspections example: 100 nullable: true usDriverInspectionsOos: type: integer description: Number of US driver inspections resulting in out-of-service example: 5 nullable: true usDriverInspectionsOosPct: type: number format: float description: Percentage of US driver inspections resulting in out-of-service example: 5 nullable: true usVehicleInspections: type: integer description: Total number of US vehicle inspections example: 150 nullable: true usVehicleInspectionsOos: type: integer description: Number of US vehicle inspections resulting in out-of-service example: 8 nullable: true usVehicleInspectionsOosPct: type: number format: float description: Percentage of US vehicle inspections resulting in out-of-service example: 5.33 nullable: true AirCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Air cargo carrier required: - type properties: type: type: string enum: - AIR description: Carrier type discriminator example: AIR CartageCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Cartage (local pickup/delivery) carrier required: - type properties: type: type: string enum: - CARTAGE description: Carrier type discriminator example: CARTAGE LinehaulCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Linehaul (long-distance) carrier required: - type properties: type: type: string enum: - LINEHAUL description: Carrier type discriminator example: LINEHAUL LtlCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Less-than-truckload (LTL) carrier required: - type properties: type: type: string enum: - LTL description: Carrier type discriminator example: LTL OceanCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Ocean freight carrier required: - type properties: type: type: string enum: - OCEAN description: Carrier type discriminator example: OCEAN RailCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Rail freight carrier required: - type properties: type: type: string enum: - RAIL description: Carrier type discriminator example: RAIL Carrier: oneOf: - $ref: '#/components/schemas/TruckloadCarrier' - $ref: '#/components/schemas/AirCarrier' - $ref: '#/components/schemas/CartageCarrier' - $ref: '#/components/schemas/LinehaulCarrier' - $ref: '#/components/schemas/LtlCarrier' - $ref: '#/components/schemas/OceanCarrier' - $ref: '#/components/schemas/RailCarrier' - $ref: '#/components/schemas/AgentCarrier' discriminator: propertyName: type mapping: TRUCKLOAD: '#/components/schemas/TruckloadCarrier' AIR: '#/components/schemas/AirCarrier' CARTAGE: '#/components/schemas/CartageCarrier' LINEHAUL: '#/components/schemas/LinehaulCarrier' LTL: '#/components/schemas/LtlCarrier' OCEAN: '#/components/schemas/OceanCarrier' RAIL: '#/components/schemas/RailCarrier' AGENT: '#/components/schemas/AgentCarrier' CarrierInputBase: type: object required: - name - type properties: name: type: string description: Carrier legal name example: Swift Transportation Co type: $ref: '#/components/schemas/CarrierType' description: Carrier operation type (discriminator field) dbaName: type: string description: Doing Business As name example: Swift Logistics key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-SWIFT-001 email: type: string format: email description: Primary email address example: dispatch@swifttrans.com phone: type: string description: Primary phone number example: +1-555-987-6543 website: type: string description: Company website URL example: https://swifttrans.com status: type: string description: Carrier status example: ACTIVE statusReason: type: string description: Reason for current status example: Active and in good standing notes: type: string description: Internal notes about the carrier example: Preferred carrier for midwest routes corporateAddress: $ref: '#/components/schemas/AddressInput' description: Corporate headquarters address billingAddress: $ref: '#/components/schemas/AddressInput' description: Billing address for invoices mcNumber: type: string description: Motor Carrier (MC) number example: MC-123456 dotNumber: type: string description: Department of Transportation (DOT) number example: '1234567' scac: type: string description: Standard Carrier Alpha Code example: SWFT einNumber: type: string description: Employer Identification Number example: 12-3456789 ffNumber: type: string description: Freight Forwarder (FF) number example: FF-123456 mxNumber: type: string description: Mexico carrier registration number example: MX-123456 rfcNumber: type: string description: RFC (Mexico tax ID) number example: ABCD123456XYZ iataCode: type: string description: International Air Transport Association code example: AA equipments: type: array description: Equipment types this carrier operates items: $ref: '#/components/schemas/CarrierEquipment' example: - VAN - REEFER isHazmat: type: boolean description: Whether carrier is certified to transport hazardous materials example: false tsaApproved: type: boolean description: Whether carrier is TSA approved example: true trucks: type: integer description: Number of trucks in fleet example: 50 trailers: type: integer description: Number of trailers in fleet example: 100 drivers: type: integer description: Number of drivers employed example: 75 powerUnits: type: integer description: Number of power units example: 50 currency: $ref: '#/components/schemas/Currency' description: Preferred currency for transactions paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 isFactoringPreferred: type: boolean description: Whether carrier prefers factoring for payment example: false goldenCarrierId: type: string format: uuid description: Reference to golden carrier record (for deduplication) example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 TruckloadCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating a truckload carrier required: - type properties: type: type: string enum: - TRUCKLOAD description: Carrier type discriminator (must be TRUCKLOAD) example: TRUCKLOAD insuranceCompany: type: string description: Insurance company name example: State Farm Insurance insuranceAgent: type: string description: Insurance agent name example: John Smith insuranceAgentPhone: type: string description: Insurance agent phone number example: +1-555-123-4567 insuranceAuthorityDate: type: string format: date-time description: Date insurance authority was granted example: '2025-01-01T00:00:00Z' insuranceExpirationDate: type: string format: date-time description: Insurance policy expiration date example: '2025-12-31T23:59:59Z' insuranceAutoLiabilityLimit: type: number format: float description: Auto liability insurance limit (in dollars) example: 1000000 insuranceCargoLiabilityLimit: type: number format: float description: Cargo liability insurance limit (in dollars) example: 100000 insuranceGeneralLiabilityLimit: type: number format: float description: General liability insurance limit (in dollars) example: 1000000 rating: type: string description: Carrier safety rating example: SATISFACTORY ratingDate: type: string format: date description: Date of last safety rating example: '2025-01-15' reviewType: type: string description: Type of safety review conducted example: COMPLIANCE_REVIEW reviewDate: type: string format: date description: Date of last safety review example: '2025-01-15' operatingAbility: type: string description: FMCSA operating authority status example: AUTHORIZED inFmcsa: type: boolean description: Whether carrier is registered in FMCSA database example: true usDriverInspections: type: integer description: Total number of US driver inspections example: 100 usDriverInspectionsOos: type: integer description: Number of US driver inspections resulting in out-of-service example: 5 usDriverInspectionsOosPct: type: number format: float description: Percentage of US driver inspections resulting in out-of-service example: 5 usVehicleInspections: type: integer description: Total number of US vehicle inspections example: 150 usVehicleInspectionsOos: type: integer description: Number of US vehicle inspections resulting in out-of-service example: 8 usVehicleInspectionsOosPct: type: number format: float description: Percentage of US vehicle inspections resulting in out-of-service example: 5.33 AirCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating an air carrier required: - type properties: type: type: string enum: - AIR description: Carrier type discriminator (must be AIR) example: AIR CartageCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating a cartage carrier required: - type properties: type: type: string enum: - CARTAGE description: Carrier type discriminator (must be CARTAGE) example: CARTAGE LinehaulCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating a linehaul carrier required: - type properties: type: type: string enum: - LINEHAUL description: Carrier type discriminator (must be LINEHAUL) example: LINEHAUL LtlCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating an LTL carrier required: - type properties: type: type: string enum: - LTL description: Carrier type discriminator (must be LTL) example: LTL OceanCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating an ocean carrier required: - type properties: type: type: string enum: - OCEAN description: Carrier type discriminator (must be OCEAN) example: OCEAN RailCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating a rail carrier required: - type properties: type: type: string enum: - RAIL description: Carrier type discriminator (must be RAIL) example: RAIL CarrierInput: oneOf: - $ref: '#/components/schemas/TruckloadCarrierInput' - $ref: '#/components/schemas/AirCarrierInput' - $ref: '#/components/schemas/CartageCarrierInput' - $ref: '#/components/schemas/LinehaulCarrierInput' - $ref: '#/components/schemas/LtlCarrierInput' - $ref: '#/components/schemas/OceanCarrierInput' - $ref: '#/components/schemas/RailCarrierInput' - $ref: '#/components/schemas/AgentCarrierInput' discriminator: propertyName: type mapping: TRUCKLOAD: '#/components/schemas/TruckloadCarrierInput' AIR: '#/components/schemas/AirCarrierInput' CARTAGE: '#/components/schemas/CartageCarrierInput' LINEHAUL: '#/components/schemas/LinehaulCarrierInput' LTL: '#/components/schemas/LtlCarrierInput' OCEAN: '#/components/schemas/OceanCarrierInput' RAIL: '#/components/schemas/RailCarrierInput' AGENT: '#/components/schemas/AgentCarrierInput' CarrierPatchBase: type: object description: | Partial carrier update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Carrier legal name example: Swift Transportation Co type: $ref: '#/components/schemas/CarrierType' description: Carrier operation type dbaName: type: string description: Doing Business As name example: Swift Logistics nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-SWIFT-001 nullable: true email: type: string format: email description: Primary email address example: dispatch@swifttrans.com nullable: true phone: type: string description: Primary phone number example: +1-555-987-6543 nullable: true website: type: string description: Company website URL example: https://swifttrans.com nullable: true status: type: string description: Carrier status example: ACTIVE statusReason: type: string description: Reason for current status example: Active and in good standing nullable: true notes: type: string description: Internal notes about the carrier example: Preferred carrier for midwest routes nullable: true corporateAddress: $ref: '#/components/schemas/AddressPatch' description: Corporate headquarters address billingAddress: $ref: '#/components/schemas/AddressPatch' description: Billing address for invoices mcNumber: type: string description: Motor Carrier (MC) number example: MC-123456 nullable: true dotNumber: type: string description: Department of Transportation (DOT) number example: '1234567' nullable: true scac: type: string description: Standard Carrier Alpha Code example: SWFT nullable: true einNumber: type: string description: Employer Identification Number example: 12-3456789 nullable: true ffNumber: type: string description: Freight Forwarder (FF) number example: FF-123456 nullable: true mxNumber: type: string description: Mexico carrier registration number example: MX-123456 nullable: true rfcNumber: type: string description: RFC (Mexico tax ID) number example: ABCD123456XYZ nullable: true iataCode: type: string description: International Air Transport Association code example: AA nullable: true equipments: type: array description: Equipment types this carrier operates items: $ref: '#/components/schemas/CarrierEquipment' example: - VAN - REEFER isHazmat: type: boolean description: Whether carrier is certified to transport hazardous materials example: false nullable: true tsaApproved: type: boolean description: Whether carrier is TSA approved example: true nullable: true trucks: type: integer description: Number of trucks in fleet example: 50 nullable: true trailers: type: integer description: Number of trailers in fleet example: 100 nullable: true drivers: type: integer description: Number of drivers employed example: 75 nullable: true powerUnits: type: integer description: Number of power units example: 50 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/Currency' nullable: true paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 nullable: true isFactoringPreferred: type: boolean description: Whether carrier prefers factoring for payment example: false nullable: true goldenCarrierId: type: string format: uuid description: Reference to golden carrier record (for deduplication) example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true TruckloadCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for truckload carrier properties: type: type: string enum: - TRUCKLOAD description: Carrier type discriminator (optional - only needed if changing type) example: TRUCKLOAD insuranceCompany: type: string description: Insurance company name example: State Farm Insurance nullable: true insuranceAgent: type: string description: Insurance agent name example: John Smith nullable: true insuranceAgentPhone: type: string description: Insurance agent phone number example: +1-555-123-4567 nullable: true insuranceAuthorityDate: type: string format: date-time description: Date insurance authority was granted example: '2025-01-01T00:00:00Z' nullable: true insuranceExpirationDate: type: string format: date-time description: Insurance policy expiration date example: '2025-12-31T23:59:59Z' nullable: true insuranceAutoLiabilityLimit: type: number format: float description: Auto liability insurance limit (in dollars) example: 1000000 nullable: true insuranceCargoLiabilityLimit: type: number format: float description: Cargo liability insurance limit (in dollars) example: 100000 nullable: true insuranceGeneralLiabilityLimit: type: number format: float description: General liability insurance limit (in dollars) example: 1000000 nullable: true rating: type: string description: Carrier safety rating example: SATISFACTORY nullable: true ratingDate: type: string format: date description: Date of last safety rating example: '2025-01-15' nullable: true reviewType: type: string description: Type of safety review conducted example: COMPLIANCE_REVIEW nullable: true reviewDate: type: string format: date description: Date of last safety review example: '2025-01-15' nullable: true operatingAbility: type: string description: FMCSA operating authority status example: AUTHORIZED nullable: true inFmcsa: type: boolean description: Whether carrier is registered in FMCSA database example: true nullable: true usDriverInspections: type: integer description: Total number of US driver inspections example: 100 nullable: true usDriverInspectionsOos: type: integer description: Number of US driver inspections resulting in out-of-service example: 5 nullable: true usDriverInspectionsOosPct: type: number format: float description: Percentage of US driver inspections resulting in out-of-service example: 5 nullable: true usVehicleInspections: type: integer description: Total number of US vehicle inspections example: 150 nullable: true usVehicleInspectionsOos: type: integer description: Number of US vehicle inspections resulting in out-of-service example: 8 nullable: true usVehicleInspectionsOosPct: type: number format: float description: Percentage of US vehicle inspections resulting in out-of-service example: 5.33 nullable: true AirCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for air carrier properties: type: type: string enum: - AIR description: Carrier type discriminator (optional - only needed if changing type) example: AIR CartageCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for cartage carrier properties: type: type: string enum: - CARTAGE description: Carrier type discriminator (optional - only needed if changing type) example: CARTAGE LinehaulCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for linehaul carrier properties: type: type: string enum: - LINEHAUL description: Carrier type discriminator (optional - only needed if changing type) example: LINEHAUL LtlCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for LTL carrier properties: type: type: string enum: - LTL description: Carrier type discriminator (optional - only needed if changing type) example: LTL OceanCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for ocean carrier properties: type: type: string enum: - OCEAN description: Carrier type discriminator (optional - only needed if changing type) example: OCEAN RailCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for rail carrier properties: type: type: string enum: - RAIL description: Carrier type discriminator (optional - only needed if changing type) example: RAIL CarrierPatch: description: | Partial carrier update, discriminated by `type`. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable — except `type`, which only changes through a discriminator value oneOf: - $ref: '#/components/schemas/TruckloadCarrierPatch' - $ref: '#/components/schemas/AirCarrierPatch' - $ref: '#/components/schemas/CartageCarrierPatch' - $ref: '#/components/schemas/LinehaulCarrierPatch' - $ref: '#/components/schemas/LtlCarrierPatch' - $ref: '#/components/schemas/OceanCarrierPatch' - $ref: '#/components/schemas/RailCarrierPatch' - $ref: '#/components/schemas/AgentCarrierPatch' discriminator: propertyName: type mapping: TRUCKLOAD: '#/components/schemas/TruckloadCarrierPatch' AIR: '#/components/schemas/AirCarrierPatch' CARTAGE: '#/components/schemas/CartageCarrierPatch' LINEHAUL: '#/components/schemas/LinehaulCarrierPatch' LTL: '#/components/schemas/LtlCarrierPatch' OCEAN: '#/components/schemas/OceanCarrierPatch' RAIL: '#/components/schemas/RailCarrierPatch' AGENT: '#/components/schemas/AgentCarrierPatch' CarrierFilter: type: object description: Filter criteria for carriers with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CarrierFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CarrierFilter' not: $ref: '#/components/schemas/CarrierFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' friendlyId: $ref: '#/components/schemas/StringFilter' name: $ref: '#/components/schemas/StringFilter' dbaName: $ref: '#/components/schemas/StringFilter' key: $ref: '#/components/schemas/ClientKeyFilter' email: $ref: '#/components/schemas/StringFilter' phone: $ref: '#/components/schemas/StringFilter' website: $ref: '#/components/schemas/StringFilter' status: $ref: '#/components/schemas/StringFilter' statusReason: $ref: '#/components/schemas/StringFilter' type: $ref: '#/components/schemas/StringFilter' mcNumber: $ref: '#/components/schemas/StringFilter' dotNumber: $ref: '#/components/schemas/StringFilter' scac: $ref: '#/components/schemas/StringFilter' einNumber: $ref: '#/components/schemas/StringFilter' ffNumber: $ref: '#/components/schemas/StringFilter' mxNumber: $ref: '#/components/schemas/StringFilter' rfcNumber: $ref: '#/components/schemas/StringFilter' iataCode: $ref: '#/components/schemas/StringFilter' isHazmat: $ref: '#/components/schemas/BooleanFilter' tsaApproved: $ref: '#/components/schemas/BooleanFilter' trucks: $ref: '#/components/schemas/IntFilter' trailers: $ref: '#/components/schemas/IntFilter' drivers: $ref: '#/components/schemas/IntFilter' powerUnits: $ref: '#/components/schemas/IntFilter' currency: $ref: '#/components/schemas/StringFilter' isFactoringPreferred: $ref: '#/components/schemas/BooleanFilter' goldenCarrierId: $ref: '#/components/schemas/UUIDFilter' paymentTermId: $ref: '#/components/schemas/UUIDFilter' rating: $ref: '#/components/schemas/StringFilter' ratingDate: $ref: '#/components/schemas/DatetimeFilter' operatingAbility: $ref: '#/components/schemas/StringFilter' inFmcsa: $ref: '#/components/schemas/BooleanFilter' insuranceCompany: $ref: '#/components/schemas/StringFilter' insuranceExpirationDate: $ref: '#/components/schemas/DatetimeFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CarrierFilterRequest: type: object description: Request body for filtering carriers properties: filter: $ref: '#/components/schemas/CarrierFilter' description: | Filter criteria (optional - omit to return all carriers). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - type: equalTo: TRUCKLOAD - status: equalTo: ACTIVE - inFmcsa: equalTo: true pageSize: 50 CarrierFactor: type: object required: - id - companyName - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique carrier factor identifier example: 550e8400-e29b-41d4-a716-446655440000 companyName: type: string description: Factoring company legal name example: Capital Factoring Services Inc key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-FACTOR-001 nullable: true email: type: string format: email description: Primary email address example: accounting@capitalfactoring.com nullable: true phoneNumber: type: string description: Primary phone number example: +1-555-234-5678 nullable: true phoneExtension: type: string description: Primary phone extension example: '123' nullable: true fax: type: string description: Fax number example: +1-555-234-9999 nullable: true addressLine1: type: string description: Primary street address example: 789 Finance Ave nullable: true addressLine2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 500 nullable: true city: type: string description: City name example: Dallas nullable: true state: type: string description: State or province example: TX nullable: true country: type: string description: Country code or name example: USA nullable: true zipCode: type: string description: Postal/ZIP code example: '75201' nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Capital Factoring Services Inc nullable: true accountNumber: type: string description: Bank account number example: '****1234' nullable: true abaAch: type: string description: ABA/ACH routing number for electronic transfers example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking identifier) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true paymentTerm: description: Payment terms for this factoring company $ref: '#/components/schemas/PaymentTermReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the carrier factor was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the carrier factor was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the carrier factor was soft deleted (null if active) example: null nullable: true CarrierFactorInput: type: object required: - companyName properties: companyName: type: string description: Factoring company legal name example: Capital Factoring Services Inc key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-FACTOR-001 email: type: string format: email description: Primary email address example: accounting@capitalfactoring.com phoneNumber: type: string description: Primary phone number example: +1-555-234-5678 phoneExtension: type: string description: Primary phone extension example: '123' fax: type: string description: Fax number example: +1-555-234-9999 addressLine1: type: string description: Primary street address example: 789 Finance Ave addressLine2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 500 city: type: string description: City name example: Dallas state: type: string description: State or province example: TX country: type: string description: Country code or name example: USA zipCode: type: string description: Postal/ZIP code example: '75201' bankName: type: string description: Bank name example: Chase Bank bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 accountName: type: string description: Bank account holder name example: Capital Factoring Services Inc accountNumber: type: string description: Bank account number example: '1234567890' abaAch: type: string description: ABA/ACH routing number for electronic transfers example: '021000021' wire: type: string description: Wire transfer routing number example: '026009593' swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' clabe: type: string description: CLABE number (Mexican banking identifier) example: '012180001234567897' currency: type: string description: Preferred currency code (ISO 4217) example: USD paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 CarrierFactorPatch: type: object description: | Partial carrier factor update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: companyName: type: string description: Factoring company legal name example: Capital Factoring Services Inc key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-FACTOR-001 nullable: true email: type: string format: email description: Primary email address example: accounting@capitalfactoring.com nullable: true phoneNumber: type: string description: Primary phone number example: +1-555-234-5678 nullable: true phoneExtension: type: string description: Primary phone extension example: '123' nullable: true fax: type: string description: Fax number example: +1-555-234-9999 nullable: true addressLine1: type: string description: Primary street address example: 789 Finance Ave nullable: true addressLine2: type: string description: Secondary address line example: Suite 500 nullable: true city: type: string description: City name example: Dallas nullable: true state: type: string description: State or province example: TX nullable: true country: type: string description: Country code or name example: USA nullable: true zipCode: type: string description: Postal/ZIP code example: '75201' nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Capital Factoring Services Inc nullable: true accountNumber: type: string description: Bank account number example: '1234567890' nullable: true abaAch: type: string description: ABA/ACH routing number example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 nullable: true CarrierFactorFilter: type: object description: Filter criteria for carrier factors with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CarrierFactorFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CarrierFactorFilter' not: $ref: '#/components/schemas/CarrierFactorFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' key: $ref: '#/components/schemas/ClientKeyFilter' companyName: $ref: '#/components/schemas/StringFilter' email: $ref: '#/components/schemas/StringFilter' phoneNumber: $ref: '#/components/schemas/StringFilter' phoneExtension: $ref: '#/components/schemas/StringFilter' fax: $ref: '#/components/schemas/StringFilter' city: $ref: '#/components/schemas/StringFilter' state: $ref: '#/components/schemas/StringFilter' country: $ref: '#/components/schemas/StringFilter' zipCode: $ref: '#/components/schemas/StringFilter' bankName: $ref: '#/components/schemas/StringFilter' currency: $ref: '#/components/schemas/StringFilter' paymentTermId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CarrierFactorFilterRequest: type: object description: Request body for filtering carrier factors properties: filter: $ref: '#/components/schemas/CarrierFactorFilter' description: | Filter criteria (optional - omit to return all carrier factors). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - companyName: includes: Capital - currency: equalTo: USD pageSize: 50 CarrierFactorReference: type: object description: | Enhanced reference to a carrier factor (factoring company). Includes full carrier factor details in addition to id/key. required: - id - companyName - createdAt - updatedAt properties: id: type: string format: uuid description: Carrier factor UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-FACTOR-001 nullable: true companyName: type: string description: Factoring company legal name example: Capital Factoring Services Inc email: type: string format: email description: Primary email address example: accounting@capitalfactoring.com nullable: true phoneNumber: type: string description: Primary phone number example: +1-555-234-5678 nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true createdAt: type: string format: date-time description: When the carrier factor was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the carrier factor was last updated example: '2025-01-15T14:30:00Z' PaymentRecipientType: type: string description: | Who receives the payment. - `DIRECT`: Payment goes directly to the carrier - `FACTOR`: Payment goes to a factoring company (requires carrierFactorId) enum: - DIRECT - FACTOR example: DIRECT PaymentRecipientTypeFilter: type: object description: Filter for payment recipient type properties: equalTo: $ref: '#/components/schemas/PaymentRecipientType' notEqualTo: $ref: '#/components/schemas/PaymentRecipientType' in: type: array items: $ref: '#/components/schemas/PaymentRecipientType' notIn: type: array items: $ref: '#/components/schemas/PaymentRecipientType' PaymentMethodType: type: string description: Payment method type enum: - ACH_WIRE - ZELLE - VENMO - ACH - CHECK - WIRE - CAD_EFT - TRIUMPH_PAY - COMCHECK - EFS - ECHECK - E_TRANSFER - EFT_DIRECT_DEPOSIT - SPEI example: ACH PaymentMethodTypeFilter: type: object description: Filter for payment method type properties: equalTo: $ref: '#/components/schemas/PaymentMethodType' notEqualTo: $ref: '#/components/schemas/PaymentMethodType' in: type: array items: $ref: '#/components/schemas/PaymentMethodType' notIn: type: array items: $ref: '#/components/schemas/PaymentMethodType' CarrierPaymentMethod: type: object required: - id - carrierId - carrier - paymentRecipientType - paymentMethodType - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique carrier payment method identifier example: 550e8400-e29b-41d4-a716-446655440000 carrierId: type: string format: uuid readOnly: true description: | Carrier profile ID (read-only after creation). This field cannot be changed after the payment method is created. example: 770e8400-e29b-41d4-a716-446655440000 carrier: $ref: '#/components/schemas/CarrierReference' description: Carrier profile reference with full details paymentRecipientType: $ref: '#/components/schemas/PaymentRecipientType' description: | Who receives the payment. - **DIRECT**: Payment goes directly to the carrier (carrierFactorId must be null) - **FACTOR**: Payment goes to a factoring company (carrierFactorId is required) paymentMethodType: $ref: '#/components/schemas/PaymentMethodType' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method for the carrier example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@carrier.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method (may differ from carrier name) example: Carrier Payments LLC nullable: true username: type: string description: Username for payment platforms (e.g., Zelle, Venmo) example: carrier_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Carrier Transport Inc nullable: true accountNumber: type: string description: Bank account number (masked in responses) example: '****1234' nullable: true abaAch: type: string description: ABA/ACH routing number for electronic transfers example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking identifier) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true carrierFactor: description: | Factoring company reference (required when paymentRecipientType is FACTOR). When paymentRecipientType is DIRECT, this must be null. $ref: '#/components/schemas/CarrierFactorReference' nullable: true paymentTerm: description: Payment terms for this payment method $ref: '#/components/schemas/PaymentTermReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the payment method was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the payment method was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the payment method was soft deleted (null if active) example: null nullable: true deletedBy: readOnly: true description: User who deleted this payment method $ref: '#/components/schemas/UserReference' nullable: true CarrierPaymentMethodInput: type: object required: - carrierId - paymentRecipientType - paymentMethodType properties: carrierId: type: string format: uuid description: | Carrier profile ID. **IMPORTANT**: This field cannot be changed after creation. example: 770e8400-e29b-41d4-a716-446655440000 paymentRecipientType: $ref: '#/components/schemas/PaymentRecipientType' description: | Who receives the payment. - **DIRECT**: carrierFactorId must be null or omitted - **FACTOR**: carrierFactorId is required paymentMethodType: $ref: '#/components/schemas/PaymentMethodType' description: How payment is made status: type: string description: Payment method status example: ACTIVE isPreferred: type: boolean description: Whether this is the preferred payment method example: true email: type: string format: email description: Email address for payment notifications example: payments@carrier.com phone: type: string description: Phone number for payment contact example: +1-555-123-4567 companyName: type: string description: Company name for this payment method example: Carrier Payments LLC username: type: string description: Username for payment platforms example: carrier_payments bankName: type: string description: Bank name example: Chase Bank bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 accountName: type: string description: Bank account holder name example: Carrier Transport Inc accountNumber: type: string description: Bank account number example: '1234567890' abaAch: type: string description: ABA/ACH routing number example: '021000021' wire: type: string description: Wire transfer routing number example: '026009593' swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' clabe: type: string description: CLABE number (Mexican banking) example: '012180001234567897' currency: type: string description: Preferred currency code (ISO 4217) example: USD carrierFactorId: type: string format: uuid description: | Carrier factor (factoring company) ID. **Constraint**: Required when paymentRecipientType is FACTOR, must be null when DIRECT. example: 550e8400-e29b-41d4-a716-446655440000 paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 CarrierPaymentMethodPatch: type: object description: | Partial carrier payment method update. All fields are optional. **IMPORTANT**: The `carrierId` field cannot be changed after creation. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: paymentRecipientType: $ref: '#/components/schemas/PaymentRecipientType' description: | Who receives the payment. - **DIRECT**: carrierFactorId must be null - **FACTOR**: carrierFactorId is required paymentMethodType: $ref: '#/components/schemas/PaymentMethodType' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@carrier.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method example: Carrier Payments LLC nullable: true username: type: string description: Username for payment platforms example: carrier_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Carrier Transport Inc nullable: true accountNumber: type: string description: Bank account number example: '1234567890' nullable: true abaAch: type: string description: ABA/ACH routing number example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number example: '001' nullable: true eftTransit: type: string description: EFT transit number example: '00010' nullable: true clabe: type: string description: CLABE number example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code example: USD nullable: true carrierFactorId: type: string format: uuid description: | Carrier factor ID. **Constraint**: Required when paymentRecipientType is FACTOR, must be null when DIRECT. example: 550e8400-e29b-41d4-a716-446655440000 nullable: true paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 nullable: true CarrierPaymentMethodFilter: type: object description: Filter criteria for carrier payment methods with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CarrierPaymentMethodFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CarrierPaymentMethodFilter' not: $ref: '#/components/schemas/CarrierPaymentMethodFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' carrierId: $ref: '#/components/schemas/UUIDFilter' paymentRecipientType: $ref: '#/components/schemas/PaymentRecipientTypeFilter' paymentMethodType: $ref: '#/components/schemas/PaymentMethodTypeFilter' status: $ref: '#/components/schemas/StringFilter' isPreferred: $ref: '#/components/schemas/BooleanFilter' email: $ref: '#/components/schemas/StringFilter' companyName: $ref: '#/components/schemas/StringFilter' bankName: $ref: '#/components/schemas/StringFilter' currency: $ref: '#/components/schemas/StringFilter' carrierFactorId: $ref: '#/components/schemas/UUIDFilter' paymentTermId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CarrierPaymentMethodFilterRequest: type: object description: Request body for filtering carrier payment methods properties: filter: $ref: '#/components/schemas/CarrierPaymentMethodFilter' description: | Filter criteria (optional - omit to return all carrier payment methods). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - carrierId: equalTo: 770e8400-e29b-41d4-a716-446655440000 - paymentRecipientType: equalTo: DIRECT - isPreferred: equalTo: true pageSize: 50 Address: type: object description: | Physical address/location details (nested, without id). This is an embedded object representing a Location record. The id is managed internally and not exposed in the API. required: - line1 - city - country - market - isAirportOrAirbase - isConstructionOrUtilitySite - isSmartyValidated - obeysDst properties: line1: type: string description: Primary street address line example: 123 Main St line2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 400 nullable: true city: type: string description: City name example: Chicago state: type: string description: State or province code example: IL nullable: true zipCode: type: string description: Postal / ZIP code example: '60601' nullable: true country: type: string description: Country name or code example: USA market: type: string description: Market or region identifier example: CHI latitude: type: string description: Latitude coordinate example: '41.8781' nullable: true longitude: type: string description: Longitude coordinate example: '-87.6298' nullable: true isAirportOrAirbase: type: boolean description: Whether this location is an airport or airbase example: false isConstructionOrUtilitySite: type: boolean description: Whether this location is a construction or utility site example: false isSmartyValidated: type: boolean description: Whether address has been validated by SmartyStreets example: true obeysDst: type: boolean description: Whether this location observes daylight saving time example: true cityId: type: string format: uuid description: Reference to standardized city record (internal use) example: null nullable: true AddressInput: type: object description: Address data for creating a new location required: - line1 - city - country properties: line1: type: string description: Primary street address line example: 123 Main St line2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 400 city: type: string description: City name example: Chicago state: type: string description: State or province code example: IL zipCode: type: string description: Postal / ZIP code example: '60601' country: type: string description: Country name or code example: USA market: type: string description: Market or region identifier example: CHI latitude: type: string description: Latitude coordinate example: '41.8781' longitude: type: string description: Longitude coordinate example: '-87.6298' isAirportOrAirbase: type: boolean default: false description: Whether this location is an airport or airbase example: false isConstructionOrUtilitySite: type: boolean default: false description: Whether this location is a construction or utility site example: false isSmartyValidated: type: boolean default: false description: Whether address has been validated by SmartyStreets example: true obeysDst: type: boolean default: true description: Whether this location observes daylight saving time example: true cityId: type: string format: uuid description: Reference to standardized city record (internal use) AddressPatch: type: object description: | Partial address update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Treated as omitted (null-clears are not yet supported for address fields) properties: line1: type: string description: Primary street address line example: 123 Main St line2: type: string description: Secondary address line example: Suite 400 nullable: true city: type: string description: City name example: Chicago state: type: string description: State or province code example: IL zipCode: type: string description: Postal / ZIP code example: '60601' country: type: string description: Country name or code example: USA market: type: string description: Market or region identifier example: CHI latitude: type: string description: Latitude coordinate example: '41.8781' nullable: true longitude: type: string description: Longitude coordinate example: '-87.6298' nullable: true isAirportOrAirbase: type: boolean description: Whether this location is an airport or airbase example: false isConstructionOrUtilitySite: type: boolean description: Whether this location is a construction or utility site example: false isSmartyValidated: type: boolean description: Whether address has been validated by SmartyStreets example: true obeysDst: type: boolean description: Whether this location observes daylight saving time example: true cityId: type: string format: uuid description: Reference to standardized city record example: null nullable: true ContactInfo: type: object description: | Contact information details (nested, without id). This is an embedded object representing a Contact record. The id is managed internally and not exposed in the API. required: - name properties: name: type: string description: Contact person's full name example: John Smith email: type: string format: email description: Email address example: john.smith@example.com nullable: true phoneNumber: type: string description: Phone number example: +1-555-0100 nullable: true title: type: string description: Job title or position example: Operations Manager nullable: true ContactInfoInput: type: object description: Contact information for creating a new contact record required: - name properties: name: type: string description: Contact person's full name example: John Smith email: type: string format: email description: Email address example: john.smith@example.com phoneNumber: type: string description: Phone number example: +1-555-0100 title: type: string description: Job title or position example: Operations Manager ContactInfoPatch: type: object description: | Partial contact information update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Contact person's full name example: John Smith email: type: string format: email description: Email address example: john.smith@example.com nullable: true phoneNumber: type: string description: Phone number example: +1-555-0100 nullable: true title: type: string description: Job title or position example: Operations Manager nullable: true StringFilter: type: object description: Filter options for string fields properties: equalTo: type: string description: Exact match notEqualTo: type: string description: Not equal to in: type: array items: type: string description: Matches any value in the array notIn: type: array items: type: string description: Does not match any value in the array includes: type: string description: Contains substring (case-insensitive) notIncludes: type: string description: Does not contain substring (case-insensitive) startsWith: type: string description: Starts with prefix (case-insensitive) notStartsWith: type: string description: Does not start with prefix (case-insensitive) endsWith: type: string description: Ends with suffix (case-insensitive) notEndsWith: type: string description: Does not end with suffix (case-insensitive) isNull: type: boolean description: Field is null (true) or not null (false) IntFilter: type: object description: Filter options for integer fields properties: equalTo: type: integer description: Exact match notEqualTo: type: integer description: Not equal to lessThan: type: integer description: Less than lessThanOrEqualTo: type: integer description: Less than or equal to greaterThan: type: integer description: Greater than greaterThanOrEqualTo: type: integer description: Greater than or equal to in: type: array items: type: integer description: Matches any value in the array notIn: type: array items: type: integer description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) FloatFilter: type: object description: Filter options for float/number fields properties: equalTo: type: number format: float description: Exact match notEqualTo: type: number format: float description: Not equal to lessThan: type: number format: float description: Less than lessThanOrEqualTo: type: number format: float description: Less than or equal to greaterThan: type: number format: float description: Greater than greaterThanOrEqualTo: type: number format: float description: Greater than or equal to isNull: type: boolean description: Field is null (true) or not null (false) BooleanFilter: type: object description: Filter options for boolean fields properties: equalTo: type: boolean description: Exact match notEqualTo: type: boolean description: Not equal to isNull: type: boolean description: Field is null (true) or not null (false) DatetimeFilter: type: object description: Filter options for datetime fields properties: equalTo: type: string format: date-time description: Exact match notEqualTo: type: string format: date-time description: Not equal to lessThan: type: string format: date-time description: Before this datetime lessThanOrEqualTo: type: string format: date-time description: On or before this datetime greaterThan: type: string format: date-time description: After this datetime greaterThanOrEqualTo: type: string format: date-time description: On or after this datetime isNull: type: boolean description: Field is null (true) or not null (false) IDFilter: type: object description: Filter options for ID fields (limited operations - exact match only) properties: equalTo: type: string format: uuid description: Exact match in: type: array description: Matches any UUID in the array items: type: string format: uuid ClientKeyFilter: type: object description: Filter options for client key fields (limited operations - exact match only) properties: equalTo: type: string description: Exact match in: type: array description: Matches any value in the array items: type: string isNull: type: boolean description: Field is null (true) or not null (false) CompanyFilter: type: object description: Filter criteria for companies with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CompanyFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CompanyFilter' not: $ref: '#/components/schemas/CompanyFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' addressLine1: $ref: '#/components/schemas/StringFilter' addressLine2: $ref: '#/components/schemas/StringFilter' city: $ref: '#/components/schemas/StringFilter' country: $ref: '#/components/schemas/StringFilter' fax: $ref: '#/components/schemas/StringFilter' invoiceOnly: $ref: '#/components/schemas/BooleanFilter' invoiceVerbiage: $ref: '#/components/schemas/StringFilter' primaryContactName: $ref: '#/components/schemas/StringFilter' primaryContactEmail: $ref: '#/components/schemas/StringFilter' primaryContactPhone: $ref: '#/components/schemas/StringFilter' createdById: $ref: '#/components/schemas/UUIDFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CompanyFilterRequest: type: object description: Request body for filtering companies properties: filter: $ref: '#/components/schemas/CompanyFilter' description: | Filter criteria (optional - omit to return all companies). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - invoiceOnly: equalTo: false - name: includes: Inc pageSize: 50 Company: type: object required: - id - name - createdAt - updatedAt properties: object: type: string enum: - COMPANY readOnly: true description: Object type identifier example: COMPANY id: type: string format: uuid readOnly: true description: Unique company identifier example: 550e8400-e29b-41d4-a716-446655440000 name: type: string description: Company legal name example: Acme Logistics Inc addressLine1: type: string description: Primary street address example: 123 Main St nullable: true addressLine2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 400 nullable: true city: type: string description: City name example: Chicago nullable: true country: type: string description: Country code or name example: USA nullable: true fax: type: string description: Fax number example: +1-555-0123 nullable: true invoiceOnly: type: boolean description: Whether this company is used only for invoicing purposes example: false nullable: true invoiceVerbiage: type: string description: Custom text to include on invoices for this company example: Please remit payment within 30 days nullable: true primaryContactName: type: string description: Name of primary contact person example: John Smith nullable: true primaryContactEmail: type: string format: email description: Email address of primary contact example: john.smith@acmelogistics.com nullable: true primaryContactPhone: type: string description: Phone number of primary contact example: +1-555-0100 nullable: true createdBy: readOnly: true description: User who created this company (full user details) $ref: '#/components/schemas/UserReference' nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-COMPANY-ACME-001 nullable: true createdAt: type: string format: date-time readOnly: true description: When the company was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the company was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the company was soft deleted (null if active) example: null nullable: true CompanyInput: type: object required: - name properties: name: type: string description: Company legal name example: Acme Logistics Inc addressLine1: type: string description: Primary street address example: 123 Main St addressLine2: type: string description: Secondary address line (suite, floor, etc.) example: Suite 400 city: type: string description: City name example: Chicago country: type: string description: Country code or name example: USA fax: type: string description: Fax number example: +1-555-0123 invoiceOnly: type: boolean description: Whether this company is used only for invoicing purposes example: false invoiceVerbiage: type: string description: Custom text to include on invoices for this company example: Please remit payment within 30 days primaryContactName: type: string description: Name of primary contact person example: John Smith primaryContactEmail: type: string format: email description: Email address of primary contact example: john.smith@acmelogistics.com primaryContactPhone: type: string description: Phone number of primary contact example: +1-555-0100 key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-COMPANY-ACME-001 CompanyPatch: type: object description: | Partial company update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Company legal name example: Acme Logistics Inc addressLine1: type: string description: Primary street address example: 123 Main St nullable: true addressLine2: type: string description: Secondary address line example: Suite 400 nullable: true city: type: string description: City name example: Chicago nullable: true country: type: string description: Country code or name example: USA nullable: true fax: type: string description: Fax number example: +1-555-0123 nullable: true invoiceOnly: type: boolean description: Whether this company is used only for invoicing purposes example: false nullable: true invoiceVerbiage: type: string description: Custom text to include on invoices example: Please remit payment within 30 days nullable: true primaryContactName: type: string description: Name of primary contact person example: John Smith nullable: true primaryContactEmail: type: string format: email description: Email address of primary contact example: john.smith@acmelogistics.com nullable: true primaryContactPhone: type: string description: Phone number of primary contact example: +1-555-0100 nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-COMPANY-ACME-001 nullable: true CarrierContactType: type: string description: Type of carrier contact role enum: - ACCOUNTING - AFTER_HOURS - CENSUS - CLAIMS - DISPATCH - DRIVER - EMERGENCY - MANAGER - OWNER CarrierContactTypeFilter: type: object description: Filter for contact type enum array field properties: includes: $ref: '#/components/schemas/CarrierContactType' description: Array contains this contact type notIncludes: $ref: '#/components/schemas/CarrierContactType' description: Array does not contain this contact type isNull: type: boolean description: Field is null (true) or not null (false) CarrierContactFilter: type: object description: Filter criteria for carrier contacts with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CarrierContactFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CarrierContactFilter' not: $ref: '#/components/schemas/CarrierContactFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' carrierId: $ref: '#/components/schemas/UUIDFilter' name: $ref: '#/components/schemas/StringFilter' email: $ref: '#/components/schemas/StringFilter' phoneNumber: $ref: '#/components/schemas/StringFilter' contactTypes: $ref: '#/components/schemas/CarrierContactTypeFilter' invitedUserId: $ref: '#/components/schemas/UUIDFilter' deletedById: $ref: '#/components/schemas/UUIDFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CarrierContactFilterRequest: type: object description: Request body for filtering carrier contacts properties: filter: $ref: '#/components/schemas/CarrierContactFilter' description: | Filter criteria (optional - omit to return all contacts). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - contactTypes: includes: DISPATCH - email: isNull: false pageSize: 50 CarrierContact: type: object required: - id - carrier - name - contactInfo - createdAt properties: object: type: string enum: - CARRIER_CONTACT readOnly: true description: Object type identifier example: CARRIER_CONTACT id: type: string format: uuid readOnly: true description: Unique contact identifier example: 550e8400-e29b-41d4-a716-446655440000 carrier: $ref: '#/components/schemas/CarrierReference' description: Carrier this contact belongs to (full carrier details) name: type: string description: Contact person's name (denormalized from ContactInfo for convenience) example: Jane Dispatcher contactInfo: allOf: - $ref: '#/components/schemas/ContactInfo' description: Contact information details (email, phone, title) - nested from parent Contact record contactTypes: type: array items: $ref: '#/components/schemas/CarrierContactType' description: Types/roles this contact serves example: - DISPATCH - AFTER_HOURS nullable: true invitedUser: readOnly: true description: User account invited/created for this contact (full user details) $ref: '#/components/schemas/UserReference' nullable: true deletedBy: readOnly: true description: User who deleted this contact (full user details) $ref: '#/components/schemas/UserReference' nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-CONTACT-001 nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted (null if active) example: null nullable: true CarrierContactInput: type: object required: - carrierId - name - contactInfo properties: carrierId: type: string format: uuid description: Carrier this contact belongs to example: 550e8400-e29b-41d4-a716-446655440001 name: type: string description: Contact person's name (should match contactInfo.name) example: Jane Dispatcher contactInfo: $ref: '#/components/schemas/ContactInfoInput' description: Contact information details (will create new Contact record) contactTypes: type: array items: $ref: '#/components/schemas/CarrierContactType' description: Types/roles this contact serves example: - DISPATCH - AFTER_HOURS key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-CONTACT-001 CarrierContactPatch: type: object description: | Partial carrier contact update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable Note: carrierId cannot be updated after creation. properties: name: type: string description: Contact person's name (should match contactInfo.name if updating both) example: Jane Dispatcher contactInfo: description: | Contact information update. Provide partial or full contact data to update the parent Contact record. Cannot be set to null (contact info is required). $ref: '#/components/schemas/ContactInfoPatch' nullable: true contactTypes: type: array items: $ref: '#/components/schemas/CarrierContactType' description: Types/roles this contact serves (replaces entire array) example: - DISPATCH - AFTER_HOURS nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-CONTACT-001 nullable: true CustomerContactType: type: string description: Type of customer contact role enum: - ACCOUNT_MANAGER - BILLING - DOCK_SHIPPING - EMERGENCY - LOCATION_MANAGER - OWNER - PROCUREMENT - PURCHASING - RATES_PRICING - RECEIVING - SHIPPING CustomerContactNotificationType: type: string description: Types of shipment notifications the contact should receive enum: - SHIPMENT_DELIVERED - SHIPMENT_IN_TRANSIT - SHIPMENT_LOADING - SHIPMENT_OUT_FOR_DELIVERY - SHIPMENT_PICKED_UP - SHIPMENT_TENDER_REJECTED - SHIPMENT_UNLOADING CustomerContactTypeFilter: type: object description: Filter for contact type enum array field properties: includes: $ref: '#/components/schemas/CustomerContactType' description: Array contains this contact type notIncludes: $ref: '#/components/schemas/CustomerContactType' description: Array does not contain this contact type isNull: type: boolean description: Field is null (true) or not null (false) CustomerContactNotificationTypeFilter: type: object description: Filter for notification type enum array field properties: includes: $ref: '#/components/schemas/CustomerContactNotificationType' description: Array contains this notification type notIncludes: $ref: '#/components/schemas/CustomerContactNotificationType' description: Array does not contain this notification type isNull: type: boolean description: Field is null (true) or not null (false) CustomerContactFilter: type: object description: Filter criteria for contacts with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CustomerContactFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CustomerContactFilter' not: $ref: '#/components/schemas/CustomerContactFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' customerId: $ref: '#/components/schemas/UUIDFilter' name: $ref: '#/components/schemas/StringFilter' email: $ref: '#/components/schemas/StringFilter' phoneNumber: $ref: '#/components/schemas/StringFilter' phoneExtension: $ref: '#/components/schemas/StringFilter' isPrimary: $ref: '#/components/schemas/BooleanFilter' contactTypes: $ref: '#/components/schemas/CustomerContactTypeFilter' notifications: $ref: '#/components/schemas/CustomerContactNotificationTypeFilter' invitedUserId: $ref: '#/components/schemas/UUIDFilter' deletedById: $ref: '#/components/schemas/UUIDFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' CustomerContactFilterRequest: type: object description: Request body for filtering contacts properties: filter: $ref: '#/components/schemas/CustomerContactFilter' description: | Filter criteria (optional - omit to return all contacts). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - isPrimary: equalTo: true - contactTypes: includes: BILLING pageSize: 50 CustomerContact: type: object required: - id - customer - name - isPrimary - contactInfo - createdAt properties: object: type: string enum: - CUSTOMER_CONTACT readOnly: true description: Object type identifier example: CUSTOMER_CONTACT id: type: string format: uuid readOnly: true description: Unique contact identifier example: 550e8400-e29b-41d4-a716-446655440000 customer: $ref: '#/components/schemas/CustomerReference' description: Customer this contact belongs to (full customer details) name: type: string description: Contact person's name (denormalized from ContactInfo for convenience) example: John Smith contactInfo: allOf: - $ref: '#/components/schemas/ContactInfo' description: Contact information details (email, phone, title) - nested from parent Contact record phoneExtension: type: string description: Phone extension specific to this contact role example: '1234' nullable: true isPrimary: type: boolean description: Whether this is the primary contact for the customer example: true contactTypes: type: array items: $ref: '#/components/schemas/CustomerContactType' description: Types/roles this contact serves example: - BILLING - ACCOUNT_MANAGER nullable: true notifications: type: array items: $ref: '#/components/schemas/CustomerContactNotificationType' description: Shipment notification types to send to this contact example: - SHIPMENT_PICKED_UP - SHIPMENT_DELIVERED nullable: true invitedUser: readOnly: true description: User account invited/created for this contact (full user details) $ref: '#/components/schemas/UserReference' nullable: true deletedBy: readOnly: true description: User who deleted this contact (full user details) $ref: '#/components/schemas/UserReference' nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CONTACT-JOHN-001 nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted (null if active) example: null nullable: true CustomerContactInput: type: object required: - customerId - name - contactInfo properties: customerId: type: string format: uuid description: Customer this contact belongs to example: 550e8400-e29b-41d4-a716-446655440001 name: type: string description: Contact person's name (should match contactInfo.name) example: John Smith contactInfo: $ref: '#/components/schemas/ContactInfoInput' description: Contact information details (will create new Contact record) phoneExtension: type: string description: Phone extension specific to this contact role example: '1234' isPrimary: type: boolean default: false description: Whether this is the primary contact for the customer example: true contactTypes: type: array items: $ref: '#/components/schemas/CustomerContactType' description: Types/roles this contact serves example: - BILLING - ACCOUNT_MANAGER notifications: type: array items: $ref: '#/components/schemas/CustomerContactNotificationType' description: Shipment notification types to send to this contact example: - SHIPMENT_PICKED_UP - SHIPMENT_DELIVERED key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CONTACT-JOHN-001 CustomerContactPatch: type: object description: | Partial contact update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable Note: customerId cannot be updated after creation. properties: name: type: string description: Contact person's name (should match contactInfo.name if updating both) example: John Smith contactInfo: description: | Contact information update. Provide partial or full contact data to update the parent Contact record. Cannot be set to null (contact info is required). $ref: '#/components/schemas/ContactInfoPatch' nullable: true phoneExtension: type: string description: Phone extension example: '1234' nullable: true isPrimary: type: boolean description: Whether this is the primary contact example: true contactTypes: type: array items: $ref: '#/components/schemas/CustomerContactType' description: Types/roles this contact serves (replaces entire array) example: - BILLING - ACCOUNT_MANAGER nullable: true notifications: type: array items: $ref: '#/components/schemas/CustomerContactNotificationType' description: Notification types (replaces entire array) example: - SHIPMENT_PICKED_UP - SHIPMENT_DELIVERED nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CONTACT-JOHN-001 nullable: true CustomerStatus: type: string enum: - NEW - CONTACTED - QUALIFIED - QUOTED - NURTURING - PENDING - ACTIVE - INACTIVE - BLOCKED - CLOSED description: | Customer account status (includes lead stages): - `NEW`: New lead, not yet contacted - `CONTACTED`: Initial contact made with lead - `QUALIFIED`: Lead has been qualified as potential customer - `QUOTED`: Quote has been provided to lead - `NURTURING`: Lead being nurtured for future opportunity - `PENDING`: Customer prospect pending activation - `ACTIVE`: Active customer account - `INACTIVE`: Deactivated customer account - `BLOCKED`: Customer account blocked from operations - `CLOSED`: Customer account permanently closed x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: 'Customer account status (includes lead stages):' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 11 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: NEW children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': New lead, not yet contacted' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: CONTACTED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Initial contact made with lead' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: QUALIFIED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Lead has been qualified as potential customer' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: QUOTED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: ': Quote has been provided to lead' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: NURTURING children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: ': Lead being nurtured for future opportunity' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 6 - 7 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 6 - 7 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 6 - 7 inline: true attributes: content: PENDING children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 6 - 7 inline: true attributes: content: ': Customer prospect pending activation' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 7 - 8 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 7 - 8 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 7 - 8 inline: true attributes: content: ACTIVE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 7 - 8 inline: true attributes: content: ': Active customer account' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 8 - 9 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 8 - 9 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 8 - 9 inline: true attributes: content: INACTIVE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 8 - 9 inline: true attributes: content: ': Deactivated customer account' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 9 - 10 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 9 - 10 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 9 - 10 inline: true attributes: content: BLOCKED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 9 - 10 inline: true attributes: content: ': Customer account blocked from operations' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 10 - 11 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 10 - 11 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 10 - 11 inline: true attributes: content: CLOSED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 10 - 11 inline: true attributes: content: ': Customer account permanently closed' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} CustomerServiceTier: type: string enum: - TIER_1 - TIER_2 - TIER_3 description: Service tier level for the customer CustomerSpendType: type: string enum: - CONTRACT - SPOT description: | Customer spend type: - `CONTRACT`: Customer operates under contract pricing - `SPOT`: Customer operates on spot market pricing x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: 'Customer spend type:' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 3 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: CONTRACT children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Customer operates under contract pricing' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: SPOT children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Customer operates on spot market pricing' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} CustomerDeactivationReason: type: string enum: - NOT_PAYING_INVOICE - ACQUIRED - DUPLICATE - NOT_IN_BUSINESS - OTHER description: | Reason for customer deactivation: - `NOT_PAYING_INVOICE`: Customer is not paying invoices - `ACQUIRED`: Customer was acquired by another company - `DUPLICATE`: Duplicate customer record - `NOT_IN_BUSINESS`: Customer is no longer in business - `OTHER`: Other reason (see deactivationNotes for details) x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: 'Reason for customer deactivation:' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 6 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: NOT_PAYING_INVOICE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Customer is not paying invoices' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ACQUIRED children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Customer was acquired by another company' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: DUPLICATE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Duplicate customer record' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: NOT_IN_BUSINESS children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: ': Customer is no longer in business' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: OTHER children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: ': Other reason (see deactivationNotes for details)' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} CustomerIndustry: type: string enum: - AGRICULTURE_FORESTRY - CONSTRUCTION - CONSUMER_GOODS - EDUCATIONAL_SERVICES - ENTERTAINMENT - FOOD_SERVICES - HEALTHCARE - INDUSTRIAL_MACHINERY - MANUFACTURING - MINING - RETAIL_TRADE - TRANSPORTATION_WAREHOUSING - UTILITIES - WHOLESALE_TRADE description: Industry classification for the customer CustomerAnnualSpend: type: string enum: - _0_TO_25K - _25_TO_150K - _150K_TO_300K - _300K_TO_1M - _1_TO_5M - _5M_TO_25M - _25M_TO_75M - _75M_PLUS description: Annual freight spend estimate range CustomerAnnualRevenue: type: string enum: - _0_TO_500K - _500K_TO_3M - _3M_TO_10M - _10M_TO_25M - _25M_TO_50M - _50M_TO_100M - _100M_TO_500M - _500M_PLUS description: Annual revenue range CustomerNumberOfEmployees: type: string enum: - _0_TO_1 - _2_TO_5 - _6_TO_9 - _10_TO_24 - _25_TO_99 - _100_TO_249 - _250_TO_499 - _500_OR_MORE description: Number of employees in the company CustomerCurrency: type: string enum: - USD - CAD - MXN - EUR - GBP - JPY - CNY - AUD - BRL - INR - KRW - RUB - SAR - TRY - IDR - ARS - ZAR description: Preferred currency for transactions CustomerTransportationMode: type: string enum: - FTL - LTL - AIR - OCEAN - RAIL - INTERMODAL - DRAYAGE - EXPEDITED_GROUND - EXPEDITED_AIR - AUTO - PTL - RLTL description: Transportation mode type CustomerStatusFilter: type: object description: Filter options for CustomerStatus enum properties: equalTo: $ref: '#/components/schemas/CustomerStatus' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerStatus' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerStatus' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerStatus' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerServiceTierFilter: type: object description: Filter options for CustomerServiceTier enum properties: equalTo: $ref: '#/components/schemas/CustomerServiceTier' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerServiceTier' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerServiceTier' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerServiceTier' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerSpendTypeFilter: type: object description: Filter options for CustomerSpendType enum properties: equalTo: $ref: '#/components/schemas/CustomerSpendType' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerSpendType' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerSpendType' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerSpendType' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerDeactivationReasonFilter: type: object description: Filter options for CustomerDeactivationReason enum properties: equalTo: $ref: '#/components/schemas/CustomerDeactivationReason' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerDeactivationReason' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerDeactivationReason' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerDeactivationReason' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerIndustryFilter: type: object description: Filter options for CustomerIndustry enum properties: equalTo: $ref: '#/components/schemas/CustomerIndustry' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerIndustry' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerIndustry' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerIndustry' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerAnnualSpendFilter: type: object description: Filter options for CustomerAnnualSpend enum properties: equalTo: $ref: '#/components/schemas/CustomerAnnualSpend' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerAnnualSpend' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerAnnualSpend' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerAnnualSpend' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerAnnualRevenueFilter: type: object description: Filter options for CustomerAnnualRevenue enum properties: equalTo: $ref: '#/components/schemas/CustomerAnnualRevenue' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerAnnualRevenue' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerAnnualRevenue' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerAnnualRevenue' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerNumberOfEmployeesFilter: type: object description: Filter options for CustomerNumberOfEmployees enum properties: equalTo: $ref: '#/components/schemas/CustomerNumberOfEmployees' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerNumberOfEmployees' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerNumberOfEmployees' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerNumberOfEmployees' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerCurrencyFilter: type: object description: Filter options for CustomerCurrency enum properties: equalTo: $ref: '#/components/schemas/CustomerCurrency' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerCurrency' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerCurrency' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerCurrency' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerTransportationModeFilter: type: object description: Filter options for CustomerTransportationMode enum properties: equalTo: $ref: '#/components/schemas/CustomerTransportationMode' description: Exact match notEqualTo: $ref: '#/components/schemas/CustomerTransportationMode' description: Not equal to in: type: array items: $ref: '#/components/schemas/CustomerTransportationMode' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/CustomerTransportationMode' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) CustomerFilter: type: object description: Filter criteria for customers with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/CustomerFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/CustomerFilter' not: $ref: '#/components/schemas/CustomerFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' friendlyId: $ref: '#/components/schemas/StringFilter' status: $ref: '#/components/schemas/CustomerStatusFilter' serviceTier: $ref: '#/components/schemas/CustomerServiceTierFilter' website: $ref: '#/components/schemas/StringFilter' phoneNumber: $ref: '#/components/schemas/StringFilter' industry: $ref: '#/components/schemas/CustomerIndustryFilter' annualRevenue: $ref: '#/components/schemas/CustomerAnnualRevenueFilter' annualSpend: $ref: '#/components/schemas/CustomerAnnualSpendFilter' spendType: $ref: '#/components/schemas/CustomerSpendTypeFilter' naics: $ref: '#/components/schemas/StringFilter' ein: $ref: '#/components/schemas/StringFilter' duns: $ref: '#/components/schemas/StringFilter' leadSource: $ref: '#/components/schemas/StringFilter' deactivationReason: $ref: '#/components/schemas/CustomerDeactivationReasonFilter' numberOfEmployees: $ref: '#/components/schemas/CustomerNumberOfEmployeesFilter' currency: $ref: '#/components/schemas/CustomerCurrencyFilter' defaultMode: $ref: '#/components/schemas/CustomerTransportationModeFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' closedAt: $ref: '#/components/schemas/DatetimeFilter' deactivationDate: $ref: '#/components/schemas/DatetimeFilter' CustomerFilterRequest: type: object description: Request body for filtering customers properties: filter: $ref: '#/components/schemas/CustomerFilter' description: | Filter criteria (optional - omit to return all customers). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: Filter criteria (optional - omit to return all customers). children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: 'Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - status: equalTo: ACTIVE - industry: equalTo: MANUFACTURING pageSize: 50 Customer: type: object required: - id - name - status - friendlyId - createdAt - updatedAt properties: object: type: string enum: - CUSTOMER readOnly: true description: Object type identifier example: CUSTOMER id: type: string format: uuid readOnly: true description: Unique customer identifier example: 550e8400-e29b-41d4-a716-446655440000 name: type: string description: Customer company name example: Acme Manufacturing Corp friendlyId: type: string readOnly: true description: Human-readable customer identifier, starts with "A" example: A123456 status: $ref: '#/components/schemas/CustomerStatus' serviceTier: description: Service tier level $ref: '#/components/schemas/CustomerServiceTier' nullable: true website: type: string description: Customer website URL example: https://acme-manufacturing.com nullable: true phoneNumber: type: string description: Primary phone number example: +1-555-123-4567 nullable: true industry: description: Industry classification $ref: '#/components/schemas/CustomerIndustry' nullable: true annualRevenue: description: Annual revenue range $ref: '#/components/schemas/CustomerAnnualRevenue' nullable: true annualSpend: description: Annual freight spend estimate $ref: '#/components/schemas/CustomerAnnualSpend' nullable: true spendType: description: Customer spend type (contract vs spot pricing) $ref: '#/components/schemas/CustomerSpendType' nullable: true naics: type: string description: NAICS industry code example: '336411' nullable: true ein: type: string description: Employer Identification Number example: 12-3456789 nullable: true duns: type: string description: Dun & Bradstreet number example: '123456789' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Dun & Bradstreet number children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} nullable: true leadSource: type: string description: How this customer was acquired example: Referral nullable: true dbaName: type: string description: Doing business as name example: Acme Corp DBA nullable: true numberOfEmployees: description: Company size by number of employees $ref: '#/components/schemas/CustomerNumberOfEmployees' nullable: true externalId: type: string description: External system identifier example: EXT-12345 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/CustomerCurrency' nullable: true creditLimit: type: number format: float description: Maximum credit allowed example: 50000 nullable: true creditUsageWarning: type: number format: float description: Credit usage warning threshold example: 40000 nullable: true freeCreditReq: type: number format: float description: Free credit requirement example: 5000 nullable: true defaultMode: description: | Default transportation mode. Values outside the enum are rejected with 400; customers whose internal mode isn't in the public enum return the field omitted. $ref: '#/components/schemas/CustomerTransportationMode' nullable: true defaultMargin: type: number format: float description: Default margin percentage (0-1, e.g., 0.15 for 15%) example: 0.15 nullable: true minMargin: type: number format: float description: Minimum margin threshold example: 0.1 nullable: true maxMargin: type: number format: float description: Maximum margin threshold example: 0.25 nullable: true defaultInternalNotes: type: string description: Default internal notes template example: Contact via email only nullable: true defaultCarrierNotes: type: string description: Default carrier-facing notes template used when note splitting is enabled example: Call pickup contact before arrival nullable: true defaultExternalNotes: type: string description: Default external notes template example: Please call 1 hour before delivery nullable: true defaultShowNotes: description: Controls whether default external notes are reused on carrier docs or split from default carrier notes $ref: '#/components/schemas/ShowNotes' nullable: true autoAcceptTender: type: boolean description: Auto-accept tender flag example: false nullable: true group: description: Customer group reference (minimal - id and key only) $ref: '#/components/schemas/ResourceReference' nullable: true paymentTerm: description: Payment term configuration reference with full details $ref: '#/components/schemas/PaymentTermReference' nullable: true notes: type: string description: Internal notes about this customer example: Prefers email communication nullable: true deactivationReason: description: Reason for deactivation if status is INACTIVE $ref: '#/components/schemas/CustomerDeactivationReason' nullable: true deactivationNotes: type: string description: Additional details about deactivation nullable: true deactivationDate: type: string format: date-time description: When the customer was deactivated example: null nullable: true closedAt: type: string format: date-time description: When the customer account was closed example: null nullable: true closedBy: readOnly: true description: User who closed the account (full user details) $ref: '#/components/schemas/UserReference' nullable: true closedNotes: type: string description: Notes about account closure nullable: true corporateAddress: description: Corporate headquarters address (nested location data) $ref: '#/components/schemas/Address' nullable: true billingAddress: description: Billing address (nested location data) $ref: '#/components/schemas/Address' nullable: true qboCustomerId: type: string description: QuickBooks Online customer ID example: null nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier for this customer example: ERP-CUSTOMER-12345 nullable: true contacts: type: array description: Contacts for this customer items: $ref: '#/components/schemas/CustomerContactReference' createdAt: type: string format: date-time readOnly: true description: Timestamp when customer was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when customer was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when customer was soft-deleted (null if active) example: null nullable: true deletedBy: readOnly: true description: User who deleted the customer (full user details) $ref: '#/components/schemas/UserReference' nullable: true CustomerInput: type: object required: - name - status properties: name: type: string description: Customer company name (required) example: Acme Manufacturing Corp status: $ref: '#/components/schemas/CustomerStatus' serviceTier: $ref: '#/components/schemas/CustomerServiceTier' website: type: string description: Customer website URL example: https://acme-manufacturing.com phoneNumber: type: string description: Primary phone number example: +1-555-123-4567 industry: $ref: '#/components/schemas/CustomerIndustry' annualRevenue: $ref: '#/components/schemas/CustomerAnnualRevenue' annualSpend: $ref: '#/components/schemas/CustomerAnnualSpend' spendType: $ref: '#/components/schemas/CustomerSpendType' naics: type: string description: NAICS industry code example: '336411' ein: type: string description: Employer Identification Number example: 12-3456789 duns: type: string description: Dun & Bradstreet number example: '123456789' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Dun & Bradstreet number children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} leadSource: type: string description: How this customer was acquired example: Referral dbaName: type: string description: Doing business as name example: Acme Corp DBA numberOfEmployees: $ref: '#/components/schemas/CustomerNumberOfEmployees' externalId: type: string description: External system identifier example: EXT-12345 currency: $ref: '#/components/schemas/CustomerCurrency' creditLimit: type: number format: float description: Maximum credit allowed example: 50000 creditUsageWarning: type: number format: float description: Credit usage warning threshold example: 40000 freeCreditReq: type: number format: float description: Free credit requirement example: 5000 defaultMode: $ref: '#/components/schemas/CustomerTransportationMode' defaultMargin: type: number format: float description: Default margin percentage (0-1, e.g., 0.15 for 15%) example: 0.15 minMargin: type: number format: float description: Minimum margin threshold example: 0.1 maxMargin: type: number format: float description: Maximum margin threshold example: 0.25 defaultInternalNotes: type: string description: Default internal notes template example: Contact via email only defaultCarrierNotes: type: string description: Default carrier-facing notes template used when note splitting is enabled example: Call pickup contact before arrival defaultExternalNotes: type: string description: Default external notes template example: Please call 1 hour before delivery defaultShowNotes: $ref: '#/components/schemas/ShowNotes' autoAcceptTender: type: boolean description: Auto-accept tender flag example: false groupId: type: string format: uuid description: Customer group reference paymentTerm: $ref: '#/components/schemas/ResourceReferenceInput' notes: type: string description: Internal notes about this customer example: Prefers email communication deactivationReason: $ref: '#/components/schemas/CustomerDeactivationReason' deactivationNotes: type: string description: Additional details about deactivation deactivationDate: type: string format: date-time description: When the customer was deactivated corporateAddress: $ref: '#/components/schemas/AddressInput' description: Corporate headquarters address (will create new location record) billingAddress: $ref: '#/components/schemas/AddressInput' description: Billing address (will create new location record) qboCustomerId: type: string description: QuickBooks Online customer ID key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CUSTOMER-12345 CustomerPatch: type: object description: | Partial customer update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Customer company name example: Acme Manufacturing Corp status: $ref: '#/components/schemas/CustomerStatus' serviceTier: description: Service tier level $ref: '#/components/schemas/CustomerServiceTier' nullable: true website: type: string description: Customer website URL example: https://acme-manufacturing.com nullable: true phoneNumber: type: string description: Primary phone number example: +1-555-123-4567 nullable: true industry: description: Industry classification $ref: '#/components/schemas/CustomerIndustry' nullable: true annualRevenue: description: Annual revenue range $ref: '#/components/schemas/CustomerAnnualRevenue' nullable: true annualSpend: description: Annual freight spend estimate $ref: '#/components/schemas/CustomerAnnualSpend' nullable: true spendType: description: Customer spend type (contract vs spot pricing) $ref: '#/components/schemas/CustomerSpendType' nullable: true naics: type: string description: NAICS industry code example: '336411' nullable: true ein: type: string description: Employer Identification Number example: 12-3456789 nullable: true duns: type: string description: Dun & Bradstreet number example: '123456789' x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Dun & Bradstreet number children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} nullable: true leadSource: type: string description: How this customer was acquired example: Referral nullable: true dbaName: type: string description: Doing business as name example: Acme Corp DBA nullable: true numberOfEmployees: description: Company size by number of employees $ref: '#/components/schemas/CustomerNumberOfEmployees' nullable: true externalId: type: string description: External system identifier example: EXT-12345 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/CustomerCurrency' nullable: true creditLimit: type: number format: float description: Maximum credit allowed example: 50000 nullable: true creditUsageWarning: type: number format: float description: Credit usage warning threshold example: 40000 nullable: true freeCreditReq: type: number format: float description: Free credit requirement example: 5000 nullable: true defaultMode: description: | Default transportation mode. Values outside the enum are rejected with 400; customers whose internal mode isn't in the public enum return the field omitted. $ref: '#/components/schemas/CustomerTransportationMode' nullable: true defaultMargin: type: number format: float description: Default margin percentage (0-1, e.g., 0.15 for 15%) example: 0.15 nullable: true minMargin: type: number format: float description: Minimum margin threshold example: 0.1 nullable: true maxMargin: type: number format: float description: Maximum margin threshold example: 0.25 nullable: true defaultInternalNotes: type: string description: Default internal notes template example: Contact via email only nullable: true defaultCarrierNotes: type: string description: Default carrier-facing notes template used when note splitting is enabled example: Call pickup contact before arrival nullable: true defaultExternalNotes: type: string description: Default external notes template example: Please call 1 hour before delivery nullable: true defaultShowNotes: description: Controls whether default external notes are reused on carrier docs or split from default carrier notes $ref: '#/components/schemas/ShowNotes' nullable: true autoAcceptTender: type: boolean description: Auto-accept tender flag example: false nullable: true groupId: type: string format: uuid description: Customer group reference example: null nullable: true paymentTerm: description: Payment term configuration reference $ref: '#/components/schemas/ResourceReferenceInput' nullable: true notes: type: string description: Internal notes example: Prefers email communication nullable: true deactivationReason: description: Reason for deactivation $ref: '#/components/schemas/CustomerDeactivationReason' nullable: true deactivationNotes: type: string description: Additional deactivation details nullable: true deactivationDate: type: string format: date-time description: Deactivation date nullable: true corporateAddress: description: | Corporate address update. Provide partial or full address data to update the existing location. Set to null to clear the address reference. $ref: '#/components/schemas/AddressPatch' nullable: true billingAddress: description: | Billing address update. Provide partial or full address data to update the existing location. Set to null to clear the address reference. $ref: '#/components/schemas/AddressPatch' nullable: true qboCustomerId: type: string description: QuickBooks Online customer ID nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CUSTOMER-12345 nullable: true x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Partial customer update. All fields are optional. children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 4 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: Omitted fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Not modified (current value preserved)' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: Provided fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Updated to the new value' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: Null values children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Clear the field (set to null) where applicable' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} LocationType: type: string enum: - SHIPPER - RECEIVER - BOTH description: | The type of location: - `SHIPPER`: Pickup location only - `RECEIVER`: Delivery location only - `BOTH`: Can be used for both pickup and delivery LocationFilter: type: object description: Filter criteria for locations with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/LocationFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/LocationFilter' not: $ref: '#/components/schemas/LocationFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' customerId: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' key: $ref: '#/components/schemas/ClientKeyFilter' type: $ref: '#/components/schemas/StringFilter' isAppointmentRequired: $ref: '#/components/schemas/BooleanFilter' notes: $ref: '#/components/schemas/StringFilter' internalNotes: $ref: '#/components/schemas/StringFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' LocationFilterRequest: type: object description: Request body for filtering locations properties: filter: $ref: '#/components/schemas/LocationFilter' description: | Filter criteria (optional - omit to return all locations). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - customerId: equalTo: 550e8400-e29b-41d4-a716-446655440000 - type: equalTo: SHIPPER pageSize: 50 Location: type: object required: - id - customerId - name - isAppointmentRequired - createdAt - updatedAt properties: object: type: string enum: - LOCATION readOnly: true description: Object type identifier example: LOCATION id: type: string format: uuid readOnly: true description: Unique location identifier example: 770e8400-e29b-41d4-a716-446655440000 customerId: type: string format: uuid description: Customer (shipper profile) this location belongs to example: 550e8400-e29b-41d4-a716-446655440000 customer: $ref: '#/components/schemas/Customer' readOnly: true description: The customer this location belongs to address: $ref: '#/components/schemas/Address' readOnly: true description: Physical address of this location name: type: string description: Location name example: ABC Warehouse - Dallas key: type: string maxLength: 512 description: Client-defined reference identifier for this location example: ERP-LOC-DALLAS-01 nullable: true type: $ref: '#/components/schemas/LocationType' description: Type of location (SHIPPER, RECEIVER, or BOTH) example: SHIPPER isAppointmentRequired: type: boolean description: Whether appointments are required for this location example: true notes: type: string description: External notes visible to carriers example: Call 24 hours ahead for appointment nullable: true internalNotes: type: string description: Internal notes (not visible to carriers) example: Use dock door 5 for expedited shipments nullable: true contacts: type: array description: Contacts for this location items: $ref: '#/components/schemas/LocationContactReference' createdAt: type: string format: date-time readOnly: true description: Timestamp when location was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when location was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when location was soft-deleted (null if active) example: null nullable: true LocationInput: type: object required: - customerId - address - name - isAppointmentRequired properties: customerId: type: string format: uuid description: Customer (shipper profile) this location belongs to (required) example: 550e8400-e29b-41d4-a716-446655440000 address: $ref: '#/components/schemas/LocationAddressInput' description: | Physical address for this location (required). The backing address record is created and linked automatically — no separate address or location id is needed. `country` accepts US, CA, or MX. name: type: string description: Location name (required) example: ABC Warehouse - Dallas key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-LOC-DALLAS-01 type: $ref: '#/components/schemas/LocationType' description: Type of location (SHIPPER, RECEIVER, or BOTH) example: SHIPPER isAppointmentRequired: type: boolean description: Whether appointments are required for this location (required) example: true notes: type: string description: External notes visible to carriers example: Call 24 hours ahead for appointment internalNotes: type: string description: Internal notes (not visible to carriers) example: Use dock door 5 for expedited shipments LocationPatch: type: object description: | Partial location update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: customerId: type: string format: uuid description: Customer (shipper profile) this location belongs to example: 550e8400-e29b-41d4-a716-446655440000 address: $ref: '#/components/schemas/AddressPatch' description: | Partial update of the location's physical address. Provided fields update the backing address record in place. Null values are treated as omitted for address fields (null-clears are not yet supported). name: type: string description: Location name example: ABC Warehouse - Dallas key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-LOC-DALLAS-01 nullable: true type: $ref: '#/components/schemas/LocationType' description: Type of location (SHIPPER, RECEIVER, or BOTH) example: SHIPPER isAppointmentRequired: type: boolean description: Whether appointments are required for this location example: true notes: type: string description: External notes visible to carriers example: Call 24 hours ahead for appointment nullable: true internalNotes: type: string description: Internal notes (not visible to carriers) example: Use dock door 5 for expedited shipments nullable: true LocationContactType: type: string description: Type of location contact role enum: - ACCOUNT_MANAGER - BILLING - DOCK_SHIPPING - EMERGENCY - LOCATION_MANAGER - OWNER - PROCUREMENT - PURCHASING - RATES_PRICING - RECEIVING - SHIPPING LocationContactTypeFilter: type: object description: Filter for contact type enum array field properties: includes: $ref: '#/components/schemas/LocationContactType' description: Array contains this contact type notIncludes: $ref: '#/components/schemas/LocationContactType' description: Array does not contain this contact type isNull: type: boolean description: Field is null (true) or not null (false) LocationContactFilter: type: object description: Filter criteria for location contacts with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/LocationContactFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/LocationContactFilter' not: $ref: '#/components/schemas/LocationContactFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' locationId: $ref: '#/components/schemas/UUIDFilter' customerContactId: $ref: '#/components/schemas/UUIDFilter' isPrimary: $ref: '#/components/schemas/BooleanFilter' contactTypes: $ref: '#/components/schemas/LocationContactTypeFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' LocationContactFilterRequest: type: object description: Request body for filtering location contacts properties: filter: $ref: '#/components/schemas/LocationContactFilter' description: | Filter criteria (optional - omit to return all location contacts). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - locationId: equalTo: 770e8400-e29b-41d4-a716-446655440000 - isPrimary: equalTo: true pageSize: 50 LocationContact: type: object required: - id - locationId - customerContactId - isPrimary - createdAt - updatedAt properties: object: type: string enum: - LOCATION_CONTACT readOnly: true description: Object type identifier example: LOCATION_CONTACT id: type: string format: uuid readOnly: true description: Unique location contact identifier example: 880e8400-e29b-41d4-a716-446655440000 locationId: type: string format: uuid description: Location this contact is associated with example: 770e8400-e29b-41d4-a716-446655440000 location: $ref: '#/components/schemas/Location' readOnly: true description: The location this contact is associated with customerContactId: type: string format: uuid description: Customer contact linked to this location example: 660e8400-e29b-41d4-a716-446655440000 customerContact: $ref: '#/components/schemas/CustomerContact' readOnly: true description: The customer contact details isPrimary: type: boolean description: Whether this is the primary contact for the location example: true contactTypes: type: array items: $ref: '#/components/schemas/LocationContactType' description: Roles/types for this location contact example: - LOCATION_MANAGER - SHIPPING key: type: string maxLength: 512 description: Client-defined reference identifier for this location contact example: ERP-LOC-CONTACT-001 nullable: true createdAt: type: string format: date-time readOnly: true description: Timestamp when location contact was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when location contact was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when location contact was soft-deleted (null if active) example: null nullable: true LocationContactReference: type: object description: | Location contact reference for embedding in Location responses. Identical to LocationContact but excludes the location and locationId fields to avoid circular references. required: - id - customerContactId - isPrimary - createdAt - updatedAt properties: object: type: string enum: - LOCATION_CONTACT readOnly: true description: Object type identifier example: LOCATION_CONTACT id: type: string format: uuid readOnly: true description: Unique location contact identifier example: 880e8400-e29b-41d4-a716-446655440000 customerContactId: type: string format: uuid description: Customer contact linked to this location example: 660e8400-e29b-41d4-a716-446655440000 customerContact: $ref: '#/components/schemas/CustomerContact' readOnly: true description: The customer contact details isPrimary: type: boolean description: Whether this is the primary contact for the location example: true contactTypes: type: array items: $ref: '#/components/schemas/LocationContactType' description: Roles/types for this location contact example: - LOCATION_MANAGER - SHIPPING key: type: string maxLength: 512 description: Client-defined reference identifier for this location contact example: ERP-LOC-CONTACT-001 nullable: true createdAt: type: string format: date-time readOnly: true description: Timestamp when location contact was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when location contact was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when location contact was soft-deleted (null if active) example: null nullable: true LocationContactInput: type: object required: - locationId - customerContactId - isPrimary properties: locationId: type: string format: uuid description: Location this contact is associated with (required) example: 770e8400-e29b-41d4-a716-446655440000 customerContactId: type: string format: uuid description: Customer contact to link to this location (required) example: 660e8400-e29b-41d4-a716-446655440000 isPrimary: type: boolean description: Whether this is the primary contact for the location (required) example: true contactTypes: type: array items: $ref: '#/components/schemas/LocationContactType' description: Roles/types for this location contact example: - LOCATION_MANAGER - SHIPPING key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-LOC-CONTACT-001 LocationContactPatch: type: object description: | Partial location contact update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: locationId: type: string format: uuid description: Location this contact is associated with example: 770e8400-e29b-41d4-a716-446655440000 customerContactId: type: string format: uuid description: Customer contact linked to this location example: 660e8400-e29b-41d4-a716-446655440000 isPrimary: type: boolean description: Whether this is the primary contact for the location example: true contactTypes: type: array items: $ref: '#/components/schemas/LocationContactType' description: Roles/types for this location contact example: - LOCATION_MANAGER - SHIPPING key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-LOC-CONTACT-001 nullable: true PaymentTermFilter: type: object description: Filter criteria for payment terms with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/PaymentTermFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/PaymentTermFilter' not: $ref: '#/components/schemas/PaymentTermFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' description: $ref: '#/components/schemas/StringFilter' days: $ref: '#/components/schemas/IntFilter' quickPayFee: $ref: '#/components/schemas/FloatFilter' apOnly: $ref: '#/components/schemas/BooleanFilter' doNotUse: $ref: '#/components/schemas/BooleanFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' PaymentTermFilterRequest: type: object description: Request body for filtering payment terms properties: filter: $ref: '#/components/schemas/PaymentTermFilter' description: | Filter criteria (optional - omit to return all payment terms). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: Filter criteria (optional - omit to return all payment terms). children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: 'Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - doNotUse: equalTo: false - days: greaterThan: 0 pageSize: 50 PaymentTerm: type: object required: - id - name - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique payment term identifier example: 550e8400-e29b-41d4-a716-446655440000 name: type: string description: Payment term name example: Net 30 description: type: string description: Payment term description or notes example: Payment due 30 days from invoice date nullable: true days: type: integer description: Number of days until payment is due example: 30 nullable: true quickPayFee: type: number format: float description: Quick pay fee percentage (e.g., 0.05 for 5%) example: 0.05 x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Quick pay fee percentage (e.g., 0.05 for 5%) children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} nullable: true apOnly: type: boolean description: Whether this payment term is for accounts payable only example: false nullable: true doNotUse: type: boolean description: Flag to prevent using this payment term for new transactions example: false nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-PAYTERM-NET30 nullable: true createdAt: type: string format: date-time readOnly: true description: When the payment term was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the payment term was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the payment term was soft deleted (null if active) example: null nullable: true PaymentTermInput: type: object required: - name properties: name: type: string description: Payment term name example: Net 30 description: type: string description: Payment term description or notes example: Payment due 30 days from invoice date days: type: integer description: Number of days until payment is due example: 30 quickPayFee: type: number format: float description: Quick pay fee percentage (e.g., 0.05 for 5%) example: 0.05 x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Quick pay fee percentage (e.g., 0.05 for 5%) children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} apOnly: type: boolean description: Whether this payment term is for accounts payable only example: false doNotUse: type: boolean description: Flag to prevent using this payment term for new transactions example: false key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-PAYTERM-NET30 PaymentTermPatch: type: object description: | Partial payment term update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Payment term name example: Net 30 description: type: string description: Payment term description example: Payment due 30 days from invoice date nullable: true days: type: integer description: Number of days until payment is due example: 30 nullable: true quickPayFee: type: number format: float description: Quick pay fee percentage example: 0.05 nullable: true apOnly: type: boolean description: Whether this payment term is for accounts payable only example: false nullable: true doNotUse: type: boolean description: Flag to prevent using this payment term example: false nullable: true key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-PAYTERM-NET30 nullable: true x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Partial payment term update. All fields are optional. children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 4 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: Omitted fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Not modified (current value preserved)' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: Provided fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Updated to the new value' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: Null values children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Clear the field (set to null) where applicable' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} TeamFilter: type: object description: Filter criteria for teams with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/TeamFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/TeamFilter' not: $ref: '#/components/schemas/TeamFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' key: $ref: '#/components/schemas/ClientKeyFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' TeamFilterRequest: type: object description: Request body for filtering teams properties: filter: $ref: '#/components/schemas/TeamFilter' description: | Filter criteria (optional - omit to return all teams). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: Filter criteria (optional - omit to return all teams). children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: 'Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: name: includes: Sales pageSize: 50 Team: type: object required: - id - name - createdAt - updatedAt properties: object: type: string enum: - TEAM readOnly: true description: Object type identifier example: TEAM id: type: string format: uuid readOnly: true description: Unique team identifier example: 123e4567-e89b-12d3-a456-426614174000 name: type: string description: Team name example: Sales Team - West Coast key: type: string maxLength: 512 description: Client-defined reference identifier for this team example: ERP-TEAM-WEST nullable: true users: type: array description: Users who are members of this team items: $ref: '#/components/schemas/UserReference-2' createdAt: type: string format: date-time readOnly: true description: Timestamp when team was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when team was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when team was soft-deleted (null if active) example: null nullable: true TeamInput: type: object required: - name properties: name: type: string description: Team name (required) example: Sales Team - West Coast key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-TEAM-WEST users: type: array description: Users to add to this team items: $ref: '#/components/schemas/ResourceReferenceInput' example: - id: 550e8400-e29b-41d4-a716-446655440000 - key: ERP-USER-12345 TeamPatch: type: object description: | Partial team update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Team name example: Sales Team - West Coast key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-TEAM-WEST nullable: true users: type: array description: Team members (replaces all existing memberships) items: $ref: '#/components/schemas/ResourceReferenceInput' example: - id: 550e8400-e29b-41d4-a716-446655440000 - key: ERP-USER-12345 x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Partial team update. All fields are optional. children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 4 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: Omitted fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Not modified (current value preserved)' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: Provided fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Updated to the new value' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: Null values children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Clear the field (set to null) where applicable' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} UserStatus: type: string enum: - PENDING - ACTIVE - INACTIVE description: | User account status: - `PENDING`: User invited but has not completed onboarding - `ACTIVE`: User account is active and can access the system - `INACTIVE`: User account is deactivated x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: 'User account status:' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 4 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: PENDING children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': User invited but has not completed onboarding' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ACTIVE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': User account is active and can access the system' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: INACTIVE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': User account is deactivated' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} UserRole: type: string enum: - CUSTOMER_REP - CARRIER_REP - AR_AP - COMPLIANCE - MANAGER - ADMIN description: | User role within the organization: - `CUSTOMER_REP`: Customer service representative - `CARRIER_REP`: Carrier service representative - `AR_AP`: Accounts receivable/payable - `COMPLIANCE`: Compliance officer - `ADMIN`: System administrator x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: 'User role within the organization:' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 6 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: CUSTOMER_REP children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Customer service representative' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: CARRIER_REP children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Carrier service representative' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: AR_AP children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Accounts receivable/payable' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: COMPLIANCE children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 4 - 5 inline: true attributes: content: ': Compliance officer' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: ADMIN children: [] type: code annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 5 - 6 inline: true attributes: content: ': System administrator' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} UserStatusFilter: type: object description: Filter options for UserStatus enum properties: equalTo: $ref: '#/components/schemas/UserStatus' description: Exact match notEqualTo: $ref: '#/components/schemas/UserStatus' description: Not equal to in: type: array items: $ref: '#/components/schemas/UserStatus' description: Matches any value in the array notIn: type: array items: $ref: '#/components/schemas/UserStatus' description: Does not match any value in the array isNull: type: boolean description: Field is null (true) or not null (false) UserRoleFilter: type: object description: Filter options for UserRole enum array properties: contains: $ref: '#/components/schemas/UserRole' description: Array contains this role containsAll: type: array items: $ref: '#/components/schemas/UserRole' description: Array contains all of these roles containsAny: type: array items: $ref: '#/components/schemas/UserRole' description: Array contains at least one of these roles isNull: type: boolean description: Field is null (true) or not null (false) UserFilter: type: object description: Filter criteria for users with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/UserFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/UserFilter' not: $ref: '#/components/schemas/UserFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' email: $ref: '#/components/schemas/StringFilter' name: $ref: '#/components/schemas/StringFilter' phone: $ref: '#/components/schemas/StringFilter' status: $ref: '#/components/schemas/UserStatusFilter' roles: $ref: '#/components/schemas/UserRoleFilter' key: $ref: '#/components/schemas/ClientKeyFilter' datUsername: $ref: '#/components/schemas/StringFilter' mcpUsername: $ref: '#/components/schemas/StringFilter' avatarId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' UserFilterRequest: type: object description: Request body for filtering users properties: filter: $ref: '#/components/schemas/UserFilter' description: | Filter criteria (optional - omit to return all users). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: Filter criteria (optional - omit to return all users). children: [] type: text annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: {} children: [] type: softbreak annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 0 - 2 inline: true attributes: content: 'Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden.' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - status: equalTo: ACTIVE - roles: contains: CUSTOMER_REP - email: includes: '@example.com' pageSize: 50 User: type: object required: - id - email - status - roles - createdAt - updatedAt properties: object: type: string enum: - USER readOnly: true description: Object type identifier example: USER id: type: string format: uuid readOnly: true description: Unique user identifier example: 550e8400-e29b-41d4-a716-446655440000 email: type: string format: email description: User's email address example: john.doe@example.com name: type: string description: User's full name example: John Doe nullable: true phone: type: string description: User's phone number example: +1-555-123-4567 nullable: true phoneExt: type: string description: Phone extension example: '123' nullable: true status: $ref: '#/components/schemas/UserStatus' roles: type: array description: User's roles within the organization items: $ref: '#/components/schemas/UserRole' example: - CUSTOMER_REP - ADMIN key: type: string maxLength: 512 description: Client-defined reference identifier for this user example: ERP-USER-12345 nullable: true datUsername: type: string description: DAT (Load Board) integration username example: johndoe_dat nullable: true mcpUsername: type: string description: MyCarrierPortal integration username example: johndoe_mcp nullable: true avatarId: type: string format: uuid description: Profile avatar document ID example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true teams: type: array description: Teams this user belongs to items: $ref: '#/components/schemas/TeamReference' createdAt: type: string format: date-time readOnly: true description: Timestamp when user was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when user was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when user was soft-deleted (null if active) example: null nullable: true UserInput: type: object required: - email - status - roles properties: email: type: string format: email description: User's email address (required) example: john.doe@example.com name: type: string description: User's full name example: John Doe phone: type: string description: User's phone number example: +1-555-123-4567 phoneExt: type: string description: Phone extension example: '123' status: $ref: '#/components/schemas/UserStatus' roles: type: array description: User's roles within the organization (required) items: $ref: '#/components/schemas/UserRole' minItems: 1 example: - CUSTOMER_REP key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-USER-12345 datUsername: type: string description: DAT (Load Board) integration username example: johndoe_dat mcpUsername: type: string description: MyCarrierPortal integration username example: johndoe_mcp avatarId: type: string format: uuid description: Profile avatar document ID example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 teams: type: array description: Teams to add this user to items: $ref: '#/components/schemas/ResourceReferenceInput' example: - id: 123e4567-e89b-12d3-a456-426614174000 - key: TEAM-WEST-COAST UserPatch: type: object description: | Partial user update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: email: type: string format: email description: User's email address example: john.doe@example.com name: type: string description: User's full name example: John Doe nullable: true phone: type: string description: User's phone number example: +1-555-123-4567 nullable: true phoneExt: type: string description: Phone extension example: '123' nullable: true status: $ref: '#/components/schemas/UserStatus' roles: type: array description: User's roles (replaces all existing roles) items: $ref: '#/components/schemas/UserRole' minItems: 1 example: - CUSTOMER_REP - ADMIN key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-USER-12345 nullable: true datUsername: type: string description: DAT integration username example: johndoe_dat nullable: true mcpUsername: type: string description: MyCarrierPortal integration username example: johndoe_mcp nullable: true avatarId: type: string format: uuid description: Profile avatar document ID example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true teams: type: array description: Teams this user belongs to (replaces all existing team memberships) items: $ref: '#/components/schemas/ResourceReferenceInput' example: - id: 123e4567-e89b-12d3-a456-426614174000 - key: TEAM-WEST-COAST x-parsed-md-description: result: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 0 - 1 inline: true attributes: content: Partial user update. All fields are optional. children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: paragraph annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 4 inline: false attributes: ordered: false marker: '-' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: Omitted fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 1 - 2 inline: true attributes: content: ': Not modified (current value preserved)' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: Provided fields children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 2 - 3 inline: true attributes: content: ': Updated to the new value' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: false attributes: {} children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: marker: '**' children: - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: Null values children: [] type: text annotations: [] slots: {} type: strong annotations: [] slots: {} - $$mdtype: Node errors: [] lines: - 3 - 4 inline: true attributes: content: ': Clear the field (set to null) where applicable' children: [] type: text annotations: [] slots: {} type: inline annotations: [] slots: {} type: item annotations: [] slots: {} type: list annotations: [] slots: {} VendorStatus: type: string description: Vendor status enum: - ACTIVE - INACTIVE - DO_NOT_USE VendorStatusFilter: type: object description: Filter for vendor status enum field properties: equalTo: $ref: '#/components/schemas/VendorStatus' description: Exact match notEqualTo: $ref: '#/components/schemas/VendorStatus' description: Not equal to in: type: array items: $ref: '#/components/schemas/VendorStatus' description: Matches any value in the list notIn: type: array items: $ref: '#/components/schemas/VendorStatus' description: Does not match any value in the list isNull: type: boolean description: Field is null (true) or not null (false) VendorFilter: type: object description: Filter criteria for vendors with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/VendorFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/VendorFilter' not: $ref: '#/components/schemas/VendorFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' friendlyId: $ref: '#/components/schemas/StringFilter' name: $ref: '#/components/schemas/StringFilter' key: $ref: '#/components/schemas/ClientKeyFilter' email: $ref: '#/components/schemas/StringFilter' phone: $ref: '#/components/schemas/StringFilter' status: $ref: '#/components/schemas/VendorStatusFilter' notes: $ref: '#/components/schemas/StringFilter' taxId: $ref: '#/components/schemas/StringFilter' currency: $ref: '#/components/schemas/CurrencyFilter' paymentTermId: $ref: '#/components/schemas/UUIDFilter' isMvmnt: $ref: '#/components/schemas/BooleanFilter' deletedById: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' VendorFilterRequest: type: object description: Request body for filtering vendors properties: filter: $ref: '#/components/schemas/VendorFilter' description: | Filter criteria (optional - omit to return all vendors). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - status: equalTo: ACTIVE - currency: equalTo: USD pageSize: 50 Vendor: type: object required: - id - friendlyId - name - createdAt - updatedAt properties: object: type: string enum: - VENDOR readOnly: true description: Object type identifier example: VENDOR id: type: string format: uuid readOnly: true description: Unique vendor identifier example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string readOnly: true description: Human-readable vendor identifier example: V123456 name: type: string description: Vendor legal name example: ABC Warehouse Services key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-VENDOR-ABC-001 nullable: true email: type: string format: email description: Primary email address example: billing@abcwarehouse.com nullable: true phone: type: string description: Primary phone number example: +1-555-123-4567 nullable: true status: type: string description: Vendor status example: ACTIVE nullable: true notes: type: string description: Internal notes about the vendor example: Preferred vendor for warehouse services nullable: true taxId: type: string description: Tax identification number example: 12-3456789 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/Currency-2' nullable: true corporateAddress: description: Corporate headquarters address $ref: '#/components/schemas/Address' nullable: true billingAddress: description: Billing address for invoices $ref: '#/components/schemas/Address' nullable: true paymentTerm: description: Payment terms for this vendor $ref: '#/components/schemas/PaymentTermReference' nullable: true isMvmnt: type: boolean description: Whether this vendor is MVMNT itself example: false nullable: true requiredDocuments: type: array items: type: string description: List of required document types example: - W9 - INSURANCE_CERTIFICATE nullable: true paymentMethods: type: array description: Payment methods configured for this vendor items: $ref: '#/components/schemas/VendorPaymentMethodReference' contacts: type: array description: Contacts for this vendor items: $ref: '#/components/schemas/VendorContactReference' deletedBy: readOnly: true description: User who deleted this vendor (full user details) $ref: '#/components/schemas/UserReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the vendor was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the vendor was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the vendor was soft deleted (null if active) example: null nullable: true VendorInput: type: object required: - name properties: name: type: string description: Vendor legal name example: ABC Warehouse Services key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-VENDOR-ABC-001 email: type: string format: email description: Primary email address example: billing@abcwarehouse.com phone: type: string description: Primary phone number example: +1-555-123-4567 status: type: string description: Vendor status example: ACTIVE notes: type: string description: Internal notes about the vendor example: Preferred vendor for warehouse services taxId: type: string description: Tax identification number example: 12-3456789 currency: $ref: '#/components/schemas/Currency-2' description: Preferred currency for transactions corporateAddress: $ref: '#/components/schemas/AddressInput' description: Corporate headquarters address billingAddress: $ref: '#/components/schemas/AddressInput' description: Billing address for invoices paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440001 isMvmnt: type: boolean description: Whether this vendor is MVMNT itself example: false requiredDocuments: type: array items: type: string description: List of required document types example: - W9 - INSURANCE_CERTIFICATE VendorPatch: type: object description: | Partial vendor update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Vendor legal name example: ABC Warehouse Services key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-VENDOR-ABC-001 nullable: true email: type: string format: email description: Primary email address example: billing@abcwarehouse.com nullable: true phone: type: string description: Primary phone number example: +1-555-123-4567 nullable: true status: type: string description: Vendor status example: ACTIVE nullable: true notes: type: string description: Internal notes about the vendor example: Preferred vendor for warehouse services nullable: true taxId: type: string description: Tax identification number example: 12-3456789 nullable: true currency: description: Preferred currency for transactions $ref: '#/components/schemas/Currency-2' nullable: true corporateAddress: description: Corporate headquarters address $ref: '#/components/schemas/AddressInput' nullable: true billingAddress: description: Billing address for invoices $ref: '#/components/schemas/AddressInput' nullable: true paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440001 nullable: true isMvmnt: type: boolean description: Whether this vendor is MVMNT itself example: false nullable: true requiredDocuments: type: array items: type: string description: List of required document types example: - W9 - INSURANCE_CERTIFICATE nullable: true VendorContactRole: type: string description: Type of vendor contact role enum: - AGENT - BILLING - OPERATION - OWNER VendorContactRoleFilter: type: object description: Filter for contact role enum array field properties: includes: $ref: '#/components/schemas/VendorContactRole' description: Array contains this contact role notIncludes: $ref: '#/components/schemas/VendorContactRole' description: Array does not contain this contact role isNull: type: boolean description: Field is null (true) or not null (false) VendorContactFilter: type: object description: Filter criteria for vendor contacts with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/VendorContactFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/VendorContactFilter' not: $ref: '#/components/schemas/VendorContactFilter' description: Negates the filter vendorId: $ref: '#/components/schemas/UUIDFilter' email: $ref: '#/components/schemas/StringFilter' phone: $ref: '#/components/schemas/StringFilter' role: $ref: '#/components/schemas/StringFilter' roles: $ref: '#/components/schemas/VendorContactRoleFilter' deletedById: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' VendorContactFilterRequest: type: object description: Request body for filtering vendor contacts properties: filter: $ref: '#/components/schemas/VendorContactFilter' description: | Filter criteria (optional - omit to return all vendor contacts). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - roles: includes: BILLING - vendorId: equalTo: 550e8400-e29b-41d4-a716-446655440001 pageSize: 50 VendorContact: type: object required: - vendor - createdAt properties: object: type: string enum: - VENDOR_CONTACT readOnly: true description: Object type identifier example: VENDOR_CONTACT vendor: $ref: '#/components/schemas/ResourceReference' description: Vendor this contact belongs to (id and key only) email: type: string format: email description: Contact email address example: john.smith@abcwarehouse.com nullable: true phone: type: string description: Contact phone number example: +1-555-123-4567 nullable: true role: type: string description: Contact role or title (deprecated - use roles array) example: Billing Manager nullable: true roles: type: array items: $ref: '#/components/schemas/VendorContactRole' description: Types/roles this contact serves example: - BILLING - AGENT nullable: true deletedBy: readOnly: true description: User who deleted this contact (full user details) $ref: '#/components/schemas/UserReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted (null if active) example: null nullable: true VendorContactInput: type: object required: - vendorId - name properties: vendorId: type: string format: uuid description: Vendor this contact belongs to example: 550e8400-e29b-41d4-a716-446655440001 name: type: string description: Contact person's name (required) example: John Smith email: type: string format: email description: Contact email address example: john.smith@abcwarehouse.com phone: type: string description: Contact phone number example: +1-555-123-4567 role: type: string description: Contact role or title (deprecated - use roles array) example: Billing Manager roles: type: array items: $ref: '#/components/schemas/VendorContactRole' description: Types/roles this contact serves example: - BILLING - AGENT VendorContactPatch: type: object description: | Partial vendor contact update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable Note: vendorId cannot be updated after creation. properties: email: type: string format: email description: Contact email address example: john.smith@abcwarehouse.com nullable: true phone: type: string description: Contact phone number example: +1-555-123-4567 nullable: true role: type: string description: Contact role or title (deprecated - use roles array) example: Billing Manager nullable: true roles: type: array items: $ref: '#/components/schemas/VendorContactRole' description: Types/roles this contact serves (replaces entire array) example: - BILLING - AGENT nullable: true VendorReference: type: object description: | Enhanced reference to a vendor profile. Includes full vendor details in addition to id/key. required: - id - friendlyId - name - createdAt - updatedAt properties: id: type: string format: uuid description: Vendor UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference ID if set example: ERP-VENDOR-ABC-001 nullable: true friendlyId: type: string description: Human-readable vendor identifier example: V123456 name: type: string description: Vendor legal name example: ABC Warehouse Services email: type: string format: email description: Primary email address example: billing@abcwarehouse.com nullable: true phone: type: string description: Primary phone number example: +1-555-123-4567 nullable: true status: type: string description: Vendor status example: ACTIVE nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true createdAt: type: string format: date-time description: When the vendor was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time description: When the vendor was last updated example: '2025-01-15T14:30:00Z' VendorPaymentMethodType: $ref: '#/components/schemas/PaymentMethodType-2' VendorPaymentMethodTypeFilter: $ref: '#/components/schemas/PaymentMethodTypeFilter-2' VendorPaymentMethod: type: object required: - id - vendorId - vendor - paymentMethodType - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique vendor payment method identifier example: 550e8400-e29b-41d4-a716-446655440000 vendorId: type: string format: uuid readOnly: true description: | Vendor profile ID (read-only after creation). This field cannot be changed after the payment method is created. example: 770e8400-e29b-41d4-a716-446655440000 vendor: $ref: '#/components/schemas/VendorReference' description: Vendor profile reference with full details paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-2' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method for the vendor example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@vendor.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method (may differ from vendor name) example: Vendor Payments LLC nullable: true username: type: string description: Username for payment platforms (e.g., Zelle, Venmo) example: vendor_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Vendor Services Inc nullable: true accountNumber: type: string description: Bank account number (masked in responses) example: '****1234' nullable: true abaAch: type: string description: ABA/ACH routing number for electronic transfers example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking identifier) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code (ISO 4217) example: USD nullable: true paymentTerm: description: Payment terms for this payment method $ref: '#/components/schemas/PaymentTermReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the payment method was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the payment method was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the payment method was soft deleted (null if active) example: null nullable: true deletedBy: readOnly: true description: User who deleted this payment method $ref: '#/components/schemas/UserReference' nullable: true VendorPaymentMethodInput: type: object required: - vendorId - paymentMethodType properties: vendorId: type: string format: uuid description: | Vendor profile ID. **IMPORTANT**: This field cannot be changed after creation. example: 770e8400-e29b-41d4-a716-446655440000 paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-2' description: How payment is made status: type: string description: Payment method status example: ACTIVE isPreferred: type: boolean description: Whether this is the preferred payment method example: true email: type: string format: email description: Email address for payment notifications example: payments@vendor.com phone: type: string description: Phone number for payment contact example: +1-555-123-4567 companyName: type: string description: Company name for this payment method example: Vendor Payments LLC username: type: string description: Username for payment platforms example: vendor_payments bankName: type: string description: Bank name example: Chase Bank bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 accountName: type: string description: Bank account holder name example: Vendor Services Inc accountNumber: type: string description: Bank account number example: '1234567890' abaAch: type: string description: ABA/ACH routing number example: '021000021' wire: type: string description: Wire transfer routing number example: '026009593' swiftCode: type: string description: SWIFT/BIC code for international transfers example: CHASUS33 eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' clabe: type: string description: CLABE number (Mexican banking) example: '012180001234567897' currency: type: string description: Preferred currency code (ISO 4217) example: USD paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 VendorPaymentMethodPatch: type: object description: | Partial vendor payment method update. All fields are optional. **IMPORTANT**: The `vendorId` field cannot be changed after creation. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-2' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@vendor.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method example: Vendor Payments LLC nullable: true username: type: string description: Username for payment platforms example: vendor_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Vendor Services Inc nullable: true accountNumber: type: string description: Bank account number example: '1234567890' nullable: true abaAch: type: string description: ABA/ACH routing number example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number example: '001' nullable: true eftTransit: type: string description: EFT transit number example: '00010' nullable: true clabe: type: string description: CLABE number example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code example: USD nullable: true paymentTermId: type: string format: uuid description: Payment term ID example: 550e8400-e29b-41d4-a716-446655440002 nullable: true VendorPaymentMethodFilter: type: object description: Filter criteria for vendor payment methods with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/VendorPaymentMethodFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/VendorPaymentMethodFilter' not: $ref: '#/components/schemas/VendorPaymentMethodFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' vendorId: $ref: '#/components/schemas/UUIDFilter' paymentMethodType: $ref: '#/components/schemas/PaymentMethodTypeFilter-2' status: $ref: '#/components/schemas/StringFilter' isPreferred: $ref: '#/components/schemas/BooleanFilter' email: $ref: '#/components/schemas/StringFilter' companyName: $ref: '#/components/schemas/StringFilter' bankName: $ref: '#/components/schemas/StringFilter' currency: $ref: '#/components/schemas/StringFilter' paymentTermId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deletedAt: $ref: '#/components/schemas/DatetimeFilter' VendorPaymentMethodFilterRequest: type: object description: Request body for filtering vendor payment methods properties: filter: $ref: '#/components/schemas/VendorPaymentMethodFilter' description: | Filter criteria (optional - omit to return all vendor payment methods). Note: deletedAt automatically defaults to { isNull: true } unless explicitly overridden. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: and: - vendorId: equalTo: 770e8400-e29b-41d4-a716-446655440000 - isPreferred: equalTo: true pageSize: 50 SavedSearchType: type: string description: | Type of entity this saved search applies to. Each type corresponds to a specific entity's search view. **Entity Mapping:** - `INVOICE`: Customer invoices (AR Invoices) - money owed to you - `BILL`: Vendor/Carrier bills (AP Invoices) - money you owe - `INVOICE_PAYMENT`: Customer payment groups (AR Payment Groups) - `BILL_PAYMENT`: Vendor/Carrier payment groups (AP Payment Groups) enum: - SHIPMENT - INVOICE - BILL - USER - CUSTOMER - VENDOR - QUOTE - COMMISSION - CARRIER - INVOICE_PAYMENT - BILL_PAYMENT - LOAD - TRUCK_POSTING - LOCATION - CARRIER_FACTOR - COMMISSION_PAYMENT - AR_CREDIT_MEMO - AP_CREDIT_MEMO example: SHIPMENT SavedSearchFilter: type: object description: Filter criteria for saved searches with AND/OR logic support properties: and: type: array description: All conditions must match (recursive) items: $ref: '#/components/schemas/SavedSearchFilter' or: type: array description: At least one condition must match (recursive) items: $ref: '#/components/schemas/SavedSearchFilter' not: $ref: '#/components/schemas/SavedSearchFilter' description: Negates the filter id: $ref: '#/components/schemas/IDFilter' name: $ref: '#/components/schemas/StringFilter' preferenceType: $ref: '#/components/schemas/StringFilter' isPublic: $ref: '#/components/schemas/BooleanFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' SavedSearchFilterRequest: type: object description: Request body for filtering saved searches properties: filter: $ref: '#/components/schemas/SavedSearchFilter' description: | Filter criteria (optional - omit to return all saved searches). Returns only saved searches accessible to the authenticated user. pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor for next page example: filter: preferenceType: equalTo: SHIPMENT isPublic: equalTo: true pageSize: 50 SearchConfigurationState: type: object description: | The saved search configuration state containing criteria, sorting, and display preferences. This is stored in the jsonValue field. properties: searchCriteria: type: object description: Search criteria configuration properties: filters: type: array description: Array of field-level search filters items: type: object required: - field - searchCriteria properties: field: type: string description: The field name to filter on example: status searchCriteria: type: object description: The search criteria for this field required: - operator properties: operator: type: string description: Search operator (e.g., EQUALS, ONE_OF, BETWEEN) example: ONE_OF values: type: array description: Array of values for multi-value operators items: oneOf: - type: string - type: number - type: boolean example: - ACTIVE - PENDING value: oneOf: - type: string - type: number - type: boolean description: Single value for single-value operators min: oneOf: - type: string - type: number description: Minimum value for range operators max: oneOf: - type: string - type: number description: Maximum value for range operators minRelative: type: integer description: Relative minimum (e.g., -7 for 7 units ago) minRelativeUnit: type: string description: Time unit for minRelative enum: - YEAR - MONTH - WEEK - DAY - HOUR - MINUTE - SECOND maxRelative: type: integer description: Relative maximum maxRelativeUnit: type: string description: Time unit for maxRelative enum: - YEAR - MONTH - WEEK - DAY - HOUR - MINUTE - SECOND valueRelative: type: integer description: Relative value valueRelativeUnit: type: string description: Time unit for valueRelative enum: - YEAR - MONTH - WEEK - DAY - HOUR - MINUTE - SECOND sorting: type: array description: Sort configuration items: type: object required: - id - desc properties: id: type: string description: Field name to sort by example: createdAt desc: type: boolean description: Sort in descending order if true example: true columnVisibility: type: object description: Column visibility settings (key is column name, value is visibility) additionalProperties: type: boolean example: status: true createdAt: true updatedAt: false columnOrder: type: array description: Order of columns for display items: type: string example: - id - name - status - createdAt example: searchCriteria: filters: - field: status searchCriteria: operator: ONE_OF values: - ACTIVE - PENDING sorting: - id: createdAt desc: true columnVisibility: status: true createdAt: true columnOrder: - id - status - createdAt SavedSearch: type: object required: - id - name - preferenceType - createdAt - updatedAt description: | A saved search configuration that can be used to quickly apply predefined search criteria, sorting, and display preferences. Saved searches are stored per organization and can be shared publicly or kept private to a specific user. properties: object: type: string enum: - SAVED_SEARCH readOnly: true description: Object type identifier example: SAVED_SEARCH id: type: string format: uuid readOnly: true description: Unique saved search identifier example: 550e8400-e29b-41d4-a716-446655440000 name: type: string description: Display name for the saved search example: Active Shipments - West Coast preferenceType: allOf: - $ref: '#/components/schemas/SavedSearchType' description: | The entity type this saved search applies to. Must match the search endpoint where this saved search will be used. jsonValue: allOf: - $ref: '#/components/schemas/SearchConfigurationState' description: The saved search configuration (criteria, sorting, display preferences) isPublic: type: boolean description: | Whether this saved search is visible to all users in the organization. If false or null, only the owner can see it. example: true nullable: true ownedByUser: type: string format: uuid readOnly: true description: | User ID who owns this saved search. Null means it's an organization-level saved search. example: 550e8400-e29b-41d4-a716-446655440001 nullable: true groupId: type: string format: uuid description: Optional group this saved search belongs to example: null nullable: true createdAt: type: string format: date-time readOnly: true description: Timestamp when saved search was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when saved search was last updated example: '2025-01-15T14:30:00Z' SavedSearchInput: type: object required: - name - preferenceType - jsonValue description: Input for creating a new saved search properties: name: type: string description: Display name for the saved search (required) example: Active Shipments - West Coast preferenceType: allOf: - $ref: '#/components/schemas/SavedSearchType' description: | The entity type this saved search applies to (required). Determines which search endpoint can use this saved search. jsonValue: allOf: - $ref: '#/components/schemas/SearchConfigurationState' description: The saved search configuration (required) isPublic: type: boolean description: Whether this saved search is visible to all users in the organization default: false example: true groupId: type: string format: uuid description: Optional group this saved search belongs to example: name: Active Shipments - West Coast preferenceType: SHIPMENT jsonValue: searchCriteria: filters: - field: status searchCriteria: operator: ONE_OF values: - ACTIVE - PENDING sorting: - id: createdAt desc: true isPublic: true SavedSearchPatch: type: object description: | Partial saved search update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: name: type: string description: Display name for the saved search example: Updated Shipments View jsonValue: allOf: - $ref: '#/components/schemas/SearchConfigurationState' description: The saved search configuration isPublic: type: boolean description: Whether this saved search is visible to all users example: true nullable: true groupId: type: string format: uuid description: Optional group this saved search belongs to example: null nullable: true example: name: Updated Shipments View isPublic: true CustomerSearchCriteria: type: object description: | Search criteria for filtering customers. Note: Only active (non-deleted) customers are searchable. Soft-deleted records are automatically excluded. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' friendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' name: $ref: '#/components/schemas/TextSearchCriteria' dbaName: $ref: '#/components/schemas/TextSearchCriteria' status: $ref: '#/components/schemas/KeywordSearchCriteria' description: Customer status (new, contacted, qualified, quoted, nurturing, pending, active, inactive, blocked, closed) city: $ref: '#/components/schemas/TextSearchCriteria' state: $ref: '#/components/schemas/KeywordSearchCriteria' description: State/Province code (uppercase) location: $ref: '#/components/schemas/TextSearchCriteria' description: Computed field "city, state" zip: $ref: '#/components/schemas/KeywordSearchCriteria' country: $ref: '#/components/schemas/KeywordSearchCriteria' description: Country code (uppercase) teamId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Team ID (internal field groupId) teamName: $ref: '#/components/schemas/TextSearchCriteria' description: Team name (internal field groupName) userIds: $ref: '#/components/schemas/UUIDSearchCriteria' description: IDs of users associated with this customer userNames: $ref: '#/components/schemas/TextSearchCriteria' description: Names of users associated with this customer accountOwnerId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Primary account owner user ID accountOwnerName: $ref: '#/components/schemas/TextSearchCriteria' description: Primary account owner name operatedById: $ref: '#/components/schemas/UUIDSearchCriteria' description: Operations representative user ID operatedByName: $ref: '#/components/schemas/TextSearchCriteria' description: Operations representative name primaryContactName: $ref: '#/components/schemas/TextSearchCriteria' primaryContactEmail: $ref: '#/components/schemas/TextSearchCriteria' primaryContactPhone: $ref: '#/components/schemas/TextSearchCriteria' serviceTier: $ref: '#/components/schemas/KeywordSearchCriteria' yearsInBusiness: $ref: '#/components/schemas/KeywordSearchCriteria' numberOfEmployees: $ref: '#/components/schemas/KeywordSearchCriteria' industry: $ref: '#/components/schemas/KeywordSearchCriteria' sic: $ref: '#/components/schemas/KeywordSearchCriteria' description: Standard Industrial Classification code naics: $ref: '#/components/schemas/KeywordSearchCriteria' description: North American Industry Classification System code paymentTermName: $ref: '#/components/schemas/KeywordSearchCriteria' creditLimit: $ref: '#/components/schemas/FloatSearchCriteria' outstandingBalance: $ref: '#/components/schemas/FloatSearchCriteria' totalRevenue: $ref: '#/components/schemas/FloatSearchCriteria' totalTransportationCost: $ref: '#/components/schemas/FloatSearchCriteria' totalGrossProfit: $ref: '#/components/schemas/FloatSearchCriteria' description: Computed as totalRevenue - totalTransportationCost ordersCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of non-canceled/rejected shipments quotesCount: $ref: '#/components/schemas/IntSearchCriteria' quotesWon: $ref: '#/components/schemas/IntSearchCriteria' quoteWinRate: $ref: '#/components/schemas/FloatSearchCriteria' description: Computed win rate (quotesWon / quotesCount) mostRecentOrderCreationAt: $ref: '#/components/schemas/DatetimeSearchCriteria' description: Date of the most recent order nextFollowUp: $ref: '#/components/schemas/DateSearchCriteria' lastOutreach: $ref: '#/components/schemas/DatetimeSearchCriteria' quickbooksCustomerId: $ref: '#/components/schemas/KeywordSearchCriteria' description: QuickBooks Online customer ID (internal field qboCustomerId) tags: $ref: '#/components/schemas/TextSearchCriteria' description: Tag labels associated with the customer createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' updatedAt: $ref: '#/components/schemas/DatetimeSearchCriteria' CustomerSearchRequest: type: object description: Request body for searching customers properties: criteria: $ref: '#/components/schemas/CustomerSearchCriteria' description: Search criteria to filter customers pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: | Optional saved search to load preferences from. When provided, the saved search criteria will be loaded and merged with any explicit criteria. format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete customer objects CustomerSearchRow: type: object description: | Flattened customer data from search index. Note: This represents only active customers. Soft-deleted records are never returned. properties: object: type: string enum: - CUSTOMER_SEARCH_ROW description: Object type identifier for discriminating between flat and full response formats id: type: string format: uuid friendlyId: type: string example: CUST-0001 name: type: string dbaName: type: string nullable: true status: type: string enum: - new - contacted - qualified - quoted - nurturing - pending - active - inactive - blocked - closed city: type: string nullable: true state: type: string description: State/Province code (uppercase) nullable: true location: type: string description: Computed as "city, state" nullable: true zip: type: string nullable: true country: type: string description: Country code (uppercase) nullable: true teamId: type: string format: uuid description: Team ID (maps from groupId) nullable: true teamName: type: string description: Team name (maps from groupName) nullable: true userIds: type: array items: type: string format: uuid description: IDs of users associated with this customer userNames: type: array items: type: string description: Names of users associated with this customer (may be hidden in some contexts) accountOwnerId: type: string format: uuid nullable: true accountOwnerName: type: string nullable: true operatedById: type: string format: uuid nullable: true operatedByName: type: string nullable: true primaryContactName: type: string nullable: true primaryContactEmail: type: string format: email nullable: true primaryContactPhone: type: string nullable: true serviceTier: type: string nullable: true yearsInBusiness: type: string nullable: true numberOfEmployees: type: string nullable: true industry: type: string nullable: true sic: type: string description: Standard Industrial Classification code nullable: true naics: type: string description: North American Industry Classification System code nullable: true paymentTermName: type: string nullable: true creditLimit: type: number format: float nullable: true outstandingBalance: type: number format: float nullable: true totalRevenue: type: number format: float nullable: true totalTransportationCost: type: number format: float nullable: true totalGrossProfit: type: number format: float description: Computed as totalRevenue - totalTransportationCost nullable: true ordersCount: type: integer description: Number of non-canceled/rejected shipments nullable: true quotesCount: type: integer nullable: true quotesWon: type: integer nullable: true quoteWinRate: type: number format: float description: Win rate percentage (0-100) nullable: true mostRecentOrderCreationAt: type: string format: date-time nullable: true nextFollowUp: type: string format: date nullable: true lastOutreach: type: string format: date-time nullable: true quickbooksCustomerId: type: string description: QuickBooks Online customer ID (maps from qboCustomerId) nullable: true tags: type: array items: type: string description: Tag labels createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - object - id - friendlyId - name - status - createdAt - updatedAt CustomerSearchResponse: type: object description: | Response for customer search requests. Note: Only active (non-deleted) customers are included in results. required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full customer objects based on format parameter items: oneOf: - $ref: '#/components/schemas/CustomerSearchRow' - $ref: '#/components/schemas/Customer' discriminator: propertyName: object mapping: CUSTOMER_SEARCH_ROW: '#/components/schemas/CustomerSearchRow' CUSTOMER: '#/components/schemas/Customer' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results (excluding soft-deleted records) minimum: 0 CarrierSearchCriteria: type: object description: | Search criteria for filtering carriers. Note: Only active (non-deleted) carriers are searchable. Soft-deleted records are automatically excluded. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' description: Carrier ID (carrierProfileId for onboarded, goldenCarrierId otherwise) carrierProfileId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Profile ID for onboarded carriers only goldenCarrierId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Golden carrier ID from FMCSA data friendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' description: Account ID for onboarded carriers name: $ref: '#/components/schemas/TextSearchCriteria' description: Carrier company name carrierStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: Status within the system (pending, active, inactive, doNotUse, review) type: $ref: '#/components/schemas/KeywordSearchCriteria' description: Carrier type (TL, LTL, LINEHAUL, CARTAGE, AIR, OCEAN, RAIL) city: $ref: '#/components/schemas/TextSearchCriteria' market: $ref: '#/components/schemas/KeywordSearchCriteria' description: DAT market zone: $ref: '#/components/schemas/KeywordSearchCriteria' description: DAT zone primaryContactName: $ref: '#/components/schemas/TextSearchCriteria' primaryContactPhone: $ref: '#/components/schemas/TextSearchCriteria' primaryContactEmail: $ref: '#/components/schemas/TextSearchCriteria' fmcsaStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: FMCSA status (active, inactive, no_docket) mcNumber: $ref: '#/components/schemas/KeywordSearchCriteria' description: Motor Carrier number dotNumber: $ref: '#/components/schemas/KeywordSearchCriteria' description: DOT number einNumber: $ref: '#/components/schemas/KeywordSearchCriteria' description: Employer Identification Number safetyRating: $ref: '#/components/schemas/KeywordSearchCriteria' description: FMCSA safety rating equipments: $ref: '#/components/schemas/KeywordSearchCriteria' description: Equipment types (VAN, REEFER, FLATBED, POWER_ONLY, SPECIALIZED, CONTAINER, TANKER) powerUnits: $ref: '#/components/schemas/IntSearchCriteria' description: Number of power units trucks: $ref: '#/components/schemas/IntSearchCriteria' description: Number of trucks monthsActiveAuthority: $ref: '#/components/schemas/IntSearchCriteria' description: Months of active authority highwayId: $ref: '#/components/schemas/KeywordSearchCriteria' description: Highway ID highwayRulesAssessment: $ref: '#/components/schemas/KeywordSearchCriteria' description: Highway rules assessment rmisId: $ref: '#/components/schemas/KeywordSearchCriteria' description: RMIS ID rmisOperatingStatus: $ref: '#/components/schemas/TextSearchCriteria' description: RMIS operating status rmisInvitationStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: RMIS invitation status (ERROR, INVITED, SUCCESS) mcpStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: MyCarrierPortal invite status mcpReviewStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: MyCarrierPortal review status (e.g. ACCEPTABLE, MODERATE, UNACCEPTABLE, UNACCEPTABLE_REVIEW, UNACCEPTABLE_FAIL) quickbooksVendorId: $ref: '#/components/schemas/KeywordSearchCriteria' description: QuickBooks Online vendor ID (internal field qboVendorId) factorBankNames: $ref: '#/components/schemas/TextSearchCriteria' description: Factoring company names paymentTermName: $ref: '#/components/schemas/KeywordSearchCriteria' description: Payment term quickPayFee: $ref: '#/components/schemas/FloatSearchCriteria' description: Quick pay discount rate accountOwnerId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Account owner user ID accountOwnerName: $ref: '#/components/schemas/TextSearchCriteria' description: Carrier owner name loadsCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of loads delivered totalMiles: $ref: '#/components/schemas/FloatSearchCriteria' description: Total miles driven totalRevenue: $ref: '#/components/schemas/FloatSearchCriteria' description: Total revenue generated totalCostOfGoodsSold: $ref: '#/components/schemas/FloatSearchCriteria' description: Total COGS ratePerMile: $ref: '#/components/schemas/FloatSearchCriteria' description: Average rate per mile quotesCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of quotes createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' description: Onboarding date CarrierSearchRequest: type: object description: Request body for searching carriers properties: criteria: $ref: '#/components/schemas/CarrierSearchCriteria' description: Search criteria to filter carriers pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: | Optional saved search to load preferences from. When provided, the saved search criteria will be loaded and merged with any explicit criteria. format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete carrier objects CarrierSearchRow: type: object description: | Flattened carrier data from search index. Includes both ONBOARDED carriers and FMCSA records. properties: object: type: string enum: - CARRIER_SEARCH_ROW description: Object type identifier for discriminating between flat and full response formats id: type: string format: uuid description: Carrier ID (carrierProfileId if onboarded, goldenCarrierId otherwise) carrierProfileId: type: string format: uuid description: Profile ID (only for onboarded carriers) nullable: true goldenCarrierId: type: string format: uuid description: Golden carrier ID from FMCSA friendlyId: type: string description: Account ID (only for onboarded carriers) nullable: true name: type: string description: Carrier company name carrierStatus: type: string enum: - pending - active - inactive - doNotUse - review description: Status (only for onboarded carriers) nullable: true type: type: string enum: - TL - LTL - LINEHAUL - CARTAGE - AIR - OCEAN - RAIL nullable: true city: type: string nullable: true market: type: string description: DAT market nullable: true zone: type: string description: DAT zone nullable: true primaryContactName: type: string nullable: true primaryContactPhone: type: string nullable: true primaryContactEmail: type: string format: email nullable: true fmcsaStatus: type: string enum: - active - inactive - no_docket nullable: true mcNumber: type: string nullable: true dotNumber: type: string nullable: true einNumber: type: string nullable: true safetyRating: type: string nullable: true equipments: type: array items: type: string enum: - VAN - REEFER - FLATBED - POWER_ONLY - SPECIALIZED - CONTAINER - TANKER description: Equipment types available powerUnits: type: integer nullable: true trucks: type: integer nullable: true monthsActiveAuthority: type: integer description: Months of active authority nullable: true highwayId: type: string nullable: true highwayRulesAssessment: type: string nullable: true rmisId: type: string nullable: true rmisOperatingStatus: type: string nullable: true rmisInvitationStatus: type: string enum: - ERROR - INVITED - SUCCESS nullable: true mcpStatus: type: string description: | MyCarrierPortal invite status. Open-ended passthrough from the MCP feed; commonly seen values include COMPLETE, INCOMPLETE, INVITED, IN_PROCESS, NOT_INVITED. nullable: true mcpReviewStatus: type: string description: | MyCarrierPortal risk assessment. Open-ended passthrough from the MCP feed; commonly seen values include ACCEPTABLE, MODERATE, UNACCEPTABLE, UNACCEPTABLE_REVIEW, UNACCEPTABLE_FAIL. nullable: true quickbooksVendorId: type: string description: QuickBooks Online vendor ID nullable: true factorBankNames: type: array items: type: string description: Factoring companies paymentTermName: type: string nullable: true quickPayFee: type: number format: float description: Quick pay discount rate nullable: true accountOwnerId: type: string format: uuid nullable: true accountOwnerName: type: string nullable: true loadsCount: type: integer description: Number of loads delivered nullable: true totalMiles: type: number format: float nullable: true totalRevenue: type: number format: float nullable: true totalCostOfGoodsSold: type: number format: float nullable: true ratePerMile: type: number format: float description: Average rate per mile nullable: true quotesCount: type: integer nullable: true createdAt: type: string format: date-time description: Onboarding date nullable: true required: - object - id - goldenCarrierId - name CarrierSearchResponse: type: object description: | Response for carrier search requests. Note: Only active (non-deleted) carriers are included in results. required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full carrier objects based on format parameter items: oneOf: - $ref: '#/components/schemas/CarrierSearchRow' - $ref: '#/components/schemas/Carrier' discriminator: propertyName: object mapping: CARRIER_SEARCH_ROW: '#/components/schemas/CarrierSearchRow' CARRIER: '#/components/schemas/Carrier' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results (excluding soft-deleted records) minimum: 0 VendorSearchCriteria: type: object description: | Search criteria for filtering vendors. Note: Only active (non-deleted) vendors are searchable. Soft-deleted records are automatically excluded. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' friendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' description: Vendor ID name: $ref: '#/components/schemas/TextSearchCriteria' description: Vendor name status: $ref: '#/components/schemas/KeywordSearchCriteria' description: Status (active, inactive, do_not_use) service: $ref: '#/components/schemas/KeywordSearchCriteria' description: Services provided by the vendor taxId: $ref: '#/components/schemas/TextSearchCriteria' description: EIN or other tax ID location: $ref: '#/components/schemas/TextSearchCriteria' description: Computed field "city, state" city: $ref: '#/components/schemas/TextSearchCriteria' state: $ref: '#/components/schemas/KeywordSearchCriteria' zip: $ref: '#/components/schemas/KeywordSearchCriteria' description: Postal code country: $ref: '#/components/schemas/KeywordSearchCriteria' primaryContactName: $ref: '#/components/schemas/TextSearchCriteria' primaryContactEmail: $ref: '#/components/schemas/TextSearchCriteria' primaryContactPhone: $ref: '#/components/schemas/TextSearchCriteria' paymentTermName: $ref: '#/components/schemas/KeywordSearchCriteria' quickbooksVendorId: $ref: '#/components/schemas/KeywordSearchCriteria' description: QuickBooks Online vendor ID (internal field qboVendorId) numberOfTimesUsed: $ref: '#/components/schemas/IntSearchCriteria' description: Number of times vendor was used lastUsed: $ref: '#/components/schemas/DateSearchCriteria' description: Last date vendor was used createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' VendorSearchRequest: type: object description: Request body for searching vendors properties: criteria: $ref: '#/components/schemas/VendorSearchCriteria' description: Search criteria to filter vendors pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: | Optional saved search to load preferences from. When provided, the saved search criteria will be loaded and merged with any explicit criteria. format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete vendor objects VendorSearchRow: type: object description: | Flattened vendor data from search index. Note: This represents only active vendors. Soft-deleted records are never returned. properties: object: type: string enum: - VENDOR_SEARCH_ROW description: Object type identifier for discriminating between flat and full response formats id: type: string format: uuid friendlyId: type: string description: Vendor ID name: type: string status: type: string enum: - active - inactive - do_not_use nullable: true taxId: type: string description: EIN or other tax ID nullable: true service: type: array items: type: string description: Services provided location: type: string description: Computed as "city, state" nullable: true city: type: string nullable: true state: type: string nullable: true zip: type: string description: Postal code nullable: true country: type: string nullable: true primaryContactName: type: string nullable: true primaryContactEmail: type: string format: email nullable: true primaryContactPhone: type: string nullable: true paymentTermName: type: string nullable: true quickbooksVendorId: type: string description: QuickBooks Online vendor ID nullable: true numberOfTimesUsed: type: integer description: Number of times used lastUsed: type: string format: date description: Last date used nullable: true createdAt: type: string format: date-time required: - object - id - friendlyId - name - numberOfTimesUsed - createdAt VendorSearchResponse: type: object description: | Response for vendor search requests. Note: Only active (non-deleted) vendors are included in results. required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full vendor objects based on format parameter items: oneOf: - $ref: '#/components/schemas/VendorSearchRow' - $ref: '#/components/schemas/Vendor' discriminator: propertyName: object mapping: VENDOR_SEARCH_ROW: '#/components/schemas/VendorSearchRow' VENDOR: '#/components/schemas/Vendor' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results (excluding soft-deleted records) minimum: 0 UserSearchCriteria: type: object description: | Search criteria for filtering users. Note: Only active (non-deleted) users are searchable. Soft-deleted records are automatically excluded. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' name: $ref: '#/components/schemas/TextSearchCriteria' description: User name email: $ref: '#/components/schemas/TextSearchCriteria' description: Email address emailVerified: $ref: '#/components/schemas/BooleanSearchCriteria' description: Whether email is verified phone: $ref: '#/components/schemas/TextSearchCriteria' description: Phone number status: $ref: '#/components/schemas/KeywordSearchCriteria' description: Status (pending, active, inactive) roles: $ref: '#/components/schemas/KeywordSearchCriteria' description: User roles visibility: $ref: '#/components/schemas/KeywordSearchCriteria' description: Visibility level (ALL, LIMITED) teamIds: $ref: '#/components/schemas/UUIDSearchCriteria' description: Team IDs (internal field groupIds) teamNames: $ref: '#/components/schemas/TextSearchCriteria' description: Team names (internal field groupNames) customersCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of customers (internal field shippersCount) quotesCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of quotes quotesWon: $ref: '#/components/schemas/IntSearchCriteria' description: Number of quotes won quoteWinRate: $ref: '#/components/schemas/FloatSearchCriteria' description: Quote win rate percentage ordersCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of shipments ordersTotalRevenue: $ref: '#/components/schemas/FloatSearchCriteria' description: Total shipment revenue ordersTotalTransportationCost: $ref: '#/components/schemas/FloatSearchCriteria' description: Total shipment transportation cost ordersTotalGrossProfit: $ref: '#/components/schemas/FloatSearchCriteria' description: Total shipment gross profit averageGrossProfitPerOrder: $ref: '#/components/schemas/FloatSearchCriteria' description: Average gross profit per shipment carriersCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of carriers createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' lastInvitedAt: $ref: '#/components/schemas/DatetimeSearchCriteria' description: When the user was last invited UserSearchRequest: type: object description: Request body for searching users properties: criteria: $ref: '#/components/schemas/UserSearchCriteria' description: Search criteria to filter users pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: | Optional saved search to load preferences from. When provided, the saved search criteria will be loaded and merged with any explicit criteria. format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete user objects UserSearchRow: type: object description: | Flattened user data from search index. Note: This represents only active users. Soft-deleted records are never returned. properties: object: type: string enum: - USER_SEARCH_ROW description: Object type identifier for discriminating between flat and full response formats id: type: string format: uuid name: type: string email: type: string format: email emailVerified: type: boolean description: Whether email is verified phone: type: string nullable: true status: type: string enum: - pending - active - inactive roles: type: array items: type: string description: User roles visibility: type: string enum: - ALL - LIMITED nullable: true teamIds: type: array items: type: string format: uuid description: Team IDs (maps from groupIds) teamNames: type: array items: type: string description: Team names (maps from groupNames) customersCount: type: integer description: Number of customers (maps from shippersCount) quotesCount: type: integer nullable: true quotesWon: type: integer nullable: true quoteWinRate: type: number format: float description: Win rate percentage nullable: true ordersCount: type: integer description: Number of shipments ordersTotalRevenue: type: number format: float description: Total shipment revenue ordersTotalTransportationCost: type: number format: float description: Total transportation cost ordersTotalGrossProfit: type: number format: float description: Total gross profit averageGrossProfitPerOrder: type: number format: float description: Average gross profit per shipment nullable: true carriersCount: type: integer description: Number of carriers createdAt: type: string format: date-time lastInvitedAt: type: string format: date-time nullable: true required: - object - id - name - email - emailVerified - status - customersCount - ordersCount - ordersTotalRevenue - ordersTotalTransportationCost - ordersTotalGrossProfit - carriersCount - createdAt UserSearchResponse: type: object description: | Response for user search requests. Note: Only active (non-deleted) users are included in results. required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full user objects based on format parameter items: oneOf: - $ref: '#/components/schemas/UserSearchRow' - $ref: '#/components/schemas/User' discriminator: propertyName: object mapping: USER_SEARCH_ROW: '#/components/schemas/UserSearchRow' USER: '#/components/schemas/User' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results (excluding soft-deleted records) minimum: 0 LocationSearchCriteria: type: object description: | Search criteria for filtering locations (shipper/receiver locations). Note: Only active (non-deleted) locations are searchable. Soft-deleted records are automatically excluded. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' customerId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Customer ID (internal field shipperProfileId) customerName: $ref: '#/components/schemas/TextSearchCriteria' description: Customer name (internal field shipperProfileName) customerFriendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' description: Customer company ID (internal field shipperProfileFriendlyId) type: $ref: '#/components/schemas/KeywordSearchCriteria' description: Location type (SHIPPER, RECEIVER, BOTH) name: $ref: '#/components/schemas/TextSearchCriteria' description: Location name externalId: $ref: '#/components/schemas/KeywordSearchCriteria' description: External reference ID line1: $ref: '#/components/schemas/TextSearchCriteria' description: Address line 1 line2: $ref: '#/components/schemas/TextSearchCriteria' description: Address line 2 city: $ref: '#/components/schemas/TextSearchCriteria' state: $ref: '#/components/schemas/KeywordSearchCriteria' postalCode: $ref: '#/components/schemas/KeywordSearchCriteria' country: $ref: '#/components/schemas/KeywordSearchCriteria' market: $ref: '#/components/schemas/KeywordSearchCriteria' description: DAT market zone: $ref: '#/components/schemas/KeywordSearchCriteria' description: DAT zone phoneNumber: $ref: '#/components/schemas/TextSearchCriteria' description: Primary contact phone appointmentRequired: $ref: '#/components/schemas/BooleanSearchCriteria' description: Whether appointments are required (internal field apptReq) stopsCount: $ref: '#/components/schemas/IntSearchCriteria' description: Number of stops at this location createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' LocationSearchRequest: type: object description: Request body for searching locations properties: criteria: $ref: '#/components/schemas/LocationSearchCriteria' description: Search criteria to filter locations pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: | Optional saved search to load preferences from. When provided, the saved search criteria will be loaded and merged with any explicit criteria. format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete location objects LocationSearchRow: type: object description: | Flattened location data from search index. Note: This represents only active locations. Soft-deleted records are never returned. properties: object: type: string enum: - LOCATION_SEARCH_ROW description: Object type identifier for discriminating between flat and full response formats id: type: string format: uuid customerId: type: string format: uuid description: Customer ID (maps from shipperProfileId) customerName: type: string description: Customer name (maps from shipperProfileName) customerFriendlyId: type: string description: Customer company ID (maps from shipperProfileFriendlyId) type: type: string enum: - SHIPPER - RECEIVER - BOTH description: Location type name: type: string description: Location name externalId: type: string description: External reference ID nullable: true line1: type: string nullable: true line2: type: string nullable: true city: type: string nullable: true state: type: string nullable: true postalCode: type: string nullable: true country: type: string nullable: true market: type: string description: DAT market nullable: true zone: type: string description: DAT zone nullable: true point: type: object properties: lat: type: number format: float lon: type: number format: float description: Geographic coordinates nullable: true phoneNumber: type: string description: Primary contact phone nullable: true appointmentRequired: type: boolean description: Whether appointments are required (maps from apptReq) nullable: true stopsCount: type: integer description: Number of stops nullable: true createdAt: type: string format: date-time required: - object - id - customerId - customerName - name - createdAt LocationSearchResponse: type: object description: | Response for location search requests. Note: Only active (non-deleted) locations are included in results. required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full location objects based on format parameter items: oneOf: - $ref: '#/components/schemas/LocationSearchRow' - $ref: '#/components/schemas/Location' discriminator: propertyName: object mapping: LOCATION_SEARCH_ROW: '#/components/schemas/LocationSearchRow' LOCATION: '#/components/schemas/Location' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results (excluding soft-deleted records) minimum: 0 GlobalSearchObjectType: type: string enum: - SHIPMENT - CUSTOMER - CARRIER - USER - VENDOR description: | Object types available for global search: - `SHIPMENT`: Shipment records - `CUSTOMER`: Customer/shipper profiles - `CARRIER`: Carrier profiles - `USER`: User accounts - `VENDOR`: Vendor profiles GlobalSearchRequest: type: object description: Request body for global search across multiple entity types required: - query properties: query: type: string description: | Search query string. Searches across default searchable fields for each entity type. Supports prefix filtering using "type:query" syntax: - `carrier:acme` - searches only carriers for "acme" - `shipment:12345` - searches only shipments for "12345" - `user:john` - searches only users for "john" example: acme corp objects: type: array items: $ref: '#/components/schemas/GlobalSearchObjectType' description: | Optional filter to limit search to specific object types. If not provided, searches across all object types. example: - SHIPMENT - CUSTOMER pagination: $ref: '#/components/schemas/SearchPaginationInput' GlobalSearchRow: type: object description: | A single global search result row. Results are sorted by object type priority: SHIPMENT, CUSTOMER, CARRIER, USER, VENDOR. required: - object - id - entityName - title - field properties: object: $ref: '#/components/schemas/GlobalSearchObjectType' description: The type of object this result represents id: type: string format: uuid description: Unique identifier of the matched record key: type: string maxLength: 512 description: Client-defined reference identifier if set example: ERP-CUST-12345 nullable: true entityName: type: string description: | Internal entity type name (for backwards compatibility). Prefer using the `object` field instead. example: SHIPPER_PROFILE title: type: string description: Primary display text for the result (e.g., name, friendlyId) example: Acme Corporation subtitle: type: string description: Secondary display text (varies by entity type) example: CUST-12345 nullable: true field: type: string description: Name of the field that matched the search query example: Name highlight: type: string description: | Matched text with highlight markers. Contains HTML <em> tags around matched portions. example: Acme Corporation nullable: true GlobalSearchResponse: type: object description: Response for global search requests required: - data - pagination - totalResults properties: data: type: array description: | Search results sorted by object type priority: SHIPMENT → CUSTOMER → CARRIER → USER → VENDOR items: $ref: '#/components/schemas/GlobalSearchRow' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results across all object types minimum: 0 example: 42 ShipmentReferenceField: type: string enum: - BOL_NUMBER - PICKUP_NUMBER - DELIVERY_NUMBER - PURCHASE_ORDER_NUMBER - GENERAL_LEDGER_CODE - CUSTOMER_REFERENCE_NUMBER - PRO_NUMBER - ITEM_IDENTIFICATION - PART_NUMBER - ACCOUNT_NUMBER - CONSIGNEE_ACCOUNT_NUMBER - PICKUP_LOCATION_IDENTIFICATION - DELIVER_LOCATION_IDENTIFICATION - PRODUCT_IDENTIFICATION - OTHER_IDENTIFICATION - CONTAINER_NUMBER - MACROPOINT_REFERENCE_NUMBER - DROP_TRAILER_NUMBER - APPOINTMENT_NUMBER - MASTER_BILL_OF_LADING_NUMBER - HOUSE_BILL_OF_LADING_NUMBER - LOCATION_IDENTIFICATION - TENDER_METHOD - ROUTE_NUMBER - SHOW_DECORATOR_NAME - SHOW_BOOTH_NUMBER - CARE_OF - TENDER_ID - ORDER_NUMBER - SHOW_NAME - AES_ITN - FIRMS_CODE - IT_NUMBER - JOB_NUMBER - TMS_ID - MASTER_AIRWAYBILL_NUMBER - HOUSE_AIRWAYBILL_NUMBER - AMS_HOUSE_BILL_OF_LADING_NUMBER - QUOTE_NUMBER - BOOKING_NUMBER - PAPS_NUMBER - PARS_NUMBER - INTERNAL_ID - LOT_NUMBER description: | Reference field types for shipment tracking. Common field types: - `BOL_NUMBER`: Bill of Lading Number - `PRO_NUMBER`: PRO Number (carrier tracking number) - `PURCHASE_ORDER_NUMBER`: Purchase Order Number - `CUSTOMER_REFERENCE_NUMBER`: Customer Reference Number - `CONTAINER_NUMBER`: Container Number - `MASTER_BILL_OF_LADING_NUMBER`: Master Bill of Lading Number - `HOUSE_BILL_OF_LADING_NUMBER`: House Bill of Lading Number - `MASTER_AIRWAYBILL_NUMBER`: Master Airway Bill Number - `HOUSE_AIRWAYBILL_NUMBER`: House Airway Bill Number Additional field types: - `PICKUP_NUMBER`: Pickup Number - `DELIVERY_NUMBER`: Delivery Number - `GENERAL_LEDGER_CODE`: GL Code - `ITEM_IDENTIFICATION`: Item ID - `PART_NUMBER`: Part Number - `ACCOUNT_NUMBER`: Account Number - `CONSIGNEE_ACCOUNT_NUMBER`: Consignee Account Number - `PICKUP_LOCATION_IDENTIFICATION`: Pickup Location ID - `DELIVER_LOCATION_IDENTIFICATION`: Delivery Location ID - `PRODUCT_IDENTIFICATION`: Product ID - `OTHER_IDENTIFICATION`: Other ID - `MACROPOINT_REFERENCE_NUMBER`: MacroPoint Reference Number - `DROP_TRAILER_NUMBER`: Drop Trailer Number - `APPOINTMENT_NUMBER`: Appointment Number - `LOCATION_IDENTIFICATION`: Location ID - `TENDER_METHOD`: Tender Method - `ROUTE_NUMBER`: Route Number - `SHOW_DECORATOR_NAME`: Show Decorator Name - `SHOW_BOOTH_NUMBER`: Show Booth Number - `CARE_OF`: Care Of - `TENDER_ID`: EDI Tender ID - `ORDER_NUMBER`: Order Number - `SHOW_NAME`: Show Name - `AES_ITN`: AES ITN (Automated Export System Internal Transaction Number) - `FIRMS_CODE`: FIRMS Code (Facility Information and Resources Management System) - `IT_NUMBER`: IT Number (Immediate Transportation) - `JOB_NUMBER`: Job Number - `TMS_ID`: TMS ID - `AMS_HOUSE_BILL_OF_LADING_NUMBER`: AMS House Bill of Lading Number - `QUOTE_NUMBER`: Quote Number - `BOOKING_NUMBER`: Booking Number - `PAPS_NUMBER`: PAPS Number - `PARS_NUMBER`: PARS Number - `INTERNAL_ID`: Internal ID - `LOT_NUMBER`: Lot Number ShipmentTrackSearch: type: object required: - query properties: query: type: string minLength: 4 maxLength: 255 description: Reference value to search for (minimum 4 characters) example: MAWB123456 ShipmentTrackRequest: type: object required: - searches properties: searches: type: array minItems: 1 maxItems: 100 items: $ref: '#/components/schemas/ShipmentTrackSearch' description: | Array of search queries. Results are returned in the same order as the input searches. Maximum 100 searches per request. referenceFields: type: array items: $ref: '#/components/schemas/ShipmentReferenceField' description: | Optional filter for reference field types to search. If omitted, searches all reference field types. Common use: limit search to specific field types for faster results or to avoid false matches across different reference types. example: - MASTER_AIRWAYBILL_NUMBER - BOL_NUMBER - PRO_NUMBER example: searches: - query: MAWB123456 - query: BOL789 referenceFields: - MASTER_AIRWAYBILL_NUMBER - BOL_NUMBER ShipmentTrackResult: type: object required: - query properties: query: type: string description: Original search query (always present, even when no match found) example: MAWB123456 id: type: string format: uuid description: Shipment UUID (null if not found) example: 550e8400-e29b-41d4-a716-446655440000 nullable: true key: type: string maxLength: 512 description: Client-defined key (null if not found or not set) example: SHIP-001 nullable: true friendlyId: type: string description: Human-readable shipment ID (null if not found) example: SHP-12345 nullable: true status: description: Current shipment status (null if not found) example: IN_TRANSIT $ref: '#/components/schemas/ShipmentStatus' nullable: true field: description: Reference field type that matched the query (null if not found) $ref: '#/components/schemas/ShipmentReferenceField' nullable: true value: type: string description: The actual value stored in the matched reference field (null if not found) example: MAWB123456 nullable: true origin: type: string description: | Origin city, state/region, and zip code (null if not found). Format: "City, ST" or "City, ST ZIP" if zip code is available. example: Los Angeles, CA 90210 nullable: true destination: type: string description: | Destination city, state/region, and zip code (null if not found). Format: "City, ST" or "City, ST ZIP" if zip code is available. example: New York, NY 10001 nullable: true pickUpDate: type: string format: date description: | Scheduled or actual pickup date in ISO 8601 date format (YYYY-MM-DD). Null if not found or not set. example: '2025-01-15' nullable: true deliveryDate: type: string format: date description: | Scheduled or actual delivery date in ISO 8601 date format (YYYY-MM-DD). Null if not found or not set. example: '2025-01-20' nullable: true trackingUrl: type: string format: uri description: | Direct URL to view shipment details in MVMNT (null if not found). Uses the organization's configured domain or defaults to app.mvmnt.io. example: https://app.mvmnt.io/shipments/550e8400-e29b-41d4-a716-446655440000 nullable: true truckerToolsUrl: type: string format: uri description: | Direct link to the Trucker Tools tracking page for the shipment's load, when live tracking is active. The MVMNT `trackingUrl` embeds the same map plus shipment milestones; use this one only if you want the raw Trucker Tools view. nullable: true ShipmentTrackResponse: type: object required: - results properties: results: type: array items: $ref: '#/components/schemas/ShipmentTrackResult' description: | Array of tracking results in the same order as input searches. Each result contains the original query plus matching shipment data. If no match is found, only the `query` field is populated (all other fields are null). If multiple shipments match a query, the most recently created shipment is returned. example: results: - query: MAWB123456 id: 550e8400-e29b-41d4-a716-446655440000 key: SHIP-001 friendlyId: SHP-12345 status: IN_TRANSIT field: MASTER_AIRWAYBILL_NUMBER value: MAWB123456 origin: Los Angeles, CA 90210 destination: New York, NY 10001 pickUpDate: '2025-01-15' deliveryDate: '2025-01-20' trackingUrl: https://app.mvmnt.io/shipments/550e8400-e29b-41d4-a716-446655440000 - query: NOTFOUND123 id: null key: null friendlyId: null status: null field: null value: null origin: null destination: null pickUpDate: null deliveryDate: null trackingUrl: null DocumentType: type: string enum: - INVOICE - BILL_OF_LADING - RATE_CON - PROOF_OF_DELIVERY - CERTIFICATE_OF_INSURANCE - W9 - CARRIER_INVOICE - LUMPER_RECEIPT - DETENTION - DELIVERY_ORDER - LOAD_TENDER - HOUSE_AIRWAY_BILL - MASTER_AIRWAY_BILL - QUOTE - AIR_CARGO_MANIFEST - AIR_CHUTE - AIR_FREIGHT_DEPARTURE_CARTAGE_ADVICE_WITH_RECEIPT - AUTHORITY - AUTHORITY_TO_MAKE_ENTRY - BROKER_CARRIER_AGREEMENT - COI_AUTO - COI_BIPD - COI_CARGO - COMMERCIAL_DRIVERS_LICENSE - COMMERCIAL_INVOICE - CUSTOMER_ACCESSORIAL_SCHEDULE - CUSTOMER_AGREEMENT - CUSTOMER_AWARDED_BIDS - CUSTOMER_AWARDED_RATES_LANES - CUSTOMER_CREDIT_REPORT - DELIVERY_ALERT - FACTOR_NOTICE_OF_ASSIGNMENT - FREIGHT_BILL - FUEL_RECEIPT - GBL - HOUSE_AIRWAY_BILL_LABEL - HOUSE_AIRWAY_BILL_LABEL_MULTI - IAC_CERTIFICATION - INTERNATIONAL_HOUSE_AIRWAY_BILL - INTERNATIONAL_MASTER_AIRWAY_BILL - LOAD_SUMMARY - LOG - LOGO - LOGO_DOC - LOGO_RECTANGLE - PACKING_LIST - PHOTOGRAPH - PROOF_OF_PERFORMANCE - REEFER_KEYPAD - ROUTING_ALERT - SCALE_RECEIPT - SEAL - SHIPPING_LABEL - SIDE_OF_TRUCK - SIGNED_CARRIER_AGREEMENT - TRIP_SHEET - OTHER description: | Type of document. Common types: - `INVOICE`: Customer invoice - `BILL_OF_LADING`: Bill of lading document - `RATE_CON`: Rate confirmation - `PROOF_OF_DELIVERY`: Proof of delivery (POD) - `CERTIFICATE_OF_INSURANCE`: Certificate of insurance (COI) - `W9`: W-9 tax form - `CARRIER_INVOICE`: Carrier invoice/bill - `LUMPER_RECEIPT`: Lumper receipt - `DETENTION`: Detention documentation - `DELIVERY_ORDER`: Delivery order - `LOAD_TENDER`: Load tender - `HOUSE_AIRWAY_BILL`: House airway bill (HAWB) - `MASTER_AIRWAY_BILL`: Master airway bill (MAWB) - `QUOTE`: Quote document - `OTHER`: Other document type The remaining values mirror the document types available in the MVMNT TMS UI (carrier compliance, air freight, customer agreements, receipts, alerts, and branding assets). Values outside this list are rejected with 400. Documents created internally with other types are returned as `OTHER`. DocumentStatus: type: string enum: - PENDING_UPLOAD - UPLOADED description: | Upload status of the document. - `PENDING_UPLOAD`: Document record created, file not yet uploaded - `UPLOADED`: File has been uploaded to storage Document: type: object required: - id - type - fileName - contentType - status - createdAt properties: id: type: string format: uuid description: Unique identifier for the document example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined key for external reference example: doc-inv-2025-001 nullable: true type: $ref: '#/components/schemas/DocumentType' fileName: type: string description: Original file name example: invoice-2025-001.pdf extension: type: string description: File extension (without dot) example: pdf contentType: type: string description: MIME content type example: application/pdf fileSize: type: integer description: File size in bytes example: 102400 nullable: true status: $ref: '#/components/schemas/DocumentStatus' uploadUrl: type: string format: uri description: | Pre-signed URL for uploading the file. Only present immediately after document creation. Expires after 15 minutes. example: https://s3.amazonaws.com/bucket/key?signature=... nullable: true downloadUrl: type: string format: uri description: | Pre-signed URL for downloading the file. Present when document status is UPLOADED. Expires after 1 hour. example: https://s3.amazonaws.com/bucket/key?signature=... nullable: true tags: type: object additionalProperties: true description: Arbitrary key-value tags for the document example: invoiceNumber: INV-2025-001 customerPO: PO-12345 nullable: true createdAt: type: string format: date-time description: When the document was created example: '2025-01-15T10:30:00Z' updatedAt: type: string format: date-time description: When the document was last updated example: '2025-01-15T10:35:00Z' nullable: true DocumentInput: type: object required: - type - fileName - contentType properties: key: type: string maxLength: 512 description: Optional client-defined key for external reference example: doc-inv-2025-001 type: $ref: '#/components/schemas/DocumentType' fileName: type: string minLength: 1 maxLength: 255 description: File name (including extension) example: invoice-2025-001.pdf contentType: type: string description: MIME content type of the file example: application/pdf fileSize: type: integer minimum: 1 description: File size in bytes (optional, for validation) example: 102400 tags: type: object additionalProperties: true description: Optional key-value tags example: invoiceNumber: INV-2025-001 DocumentPatch: type: object description: | Partial document update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: key: type: string maxLength: 512 description: Update client-defined key nullable: true type: $ref: '#/components/schemas/DocumentType' fileName: type: string minLength: 1 maxLength: 255 description: Update file name tags: type: object additionalProperties: true description: Update or clear tags (null to clear) nullable: true DocumentFilter: type: object properties: entityType: $ref: '#/components/schemas/DocumentEntityType' entityId: type: string format: uuid description: | Scope results to documents attached to this entity. Must be provided together with `entityType`. Must appear at the top level of the filter (not nested inside `or` or `not` clauses). Combines with the other filter fields (they apply on top of the entity scope). id: $ref: '#/components/schemas/UUIDFilter' type: $ref: '#/components/schemas/DocumentTypeFilter' status: $ref: '#/components/schemas/DocumentStatusFilter' fileName: $ref: '#/components/schemas/StringFilter' contentType: $ref: '#/components/schemas/StringFilter' extension: $ref: '#/components/schemas/StringFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/DocumentFilter' or: type: array items: $ref: '#/components/schemas/DocumentFilter' not: $ref: '#/components/schemas/DocumentFilter' description: Filter criteria for documents DocumentFilterRequest: type: object properties: filter: $ref: '#/components/schemas/DocumentFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 description: Number of results per page cursor: type: string description: Pagination cursor from previous response description: Request body for filtering documents QuoteStatus: type: string enum: - CREATED - NOT_A_QUOTE - DRAFT - REQUESTED - QUOTED - RECEIVED_REPLY - SENT_REPLY - RECEIVED_COUNTER - SENT_COUNTER - WON - LOST - PASS - CANCELED description: | Current status in the quote lifecycle. Initial states: - `CREATED`: Quote being built (not yet drafted) - `NOT_A_QUOTE`: Marked as not an actual quote - `DRAFT`: Quote being drafted - `REQUESTED`: Customer requested a quote (needs pricing) Active states: - `QUOTED`: Price sent to customer - `RECEIVED_REPLY`: Received reply from customer - `SENT_REPLY`: Sent reply to customer - `RECEIVED_COUNTER`: Received counter-offer - `SENT_COUNTER`: Sent counter-offer Final states: - `WON`: Customer accepted the quote - `LOST`: Quote not accepted - `PASS`: Broker declined to quote - `CANCELED`: Quote canceled QuoteSide: type: string enum: - SELL - BUY description: | Quote direction. - `SELL`: Selling to shipper (customer quote) - `BUY`: Buying from carrier (carrier quote) QuoteLostReason: type: string enum: - EXPIRED - NO_REASON - NO_RESPONSE - TOO_HIGH - TOO_SLOW - TRUCK_NOT_AVAILABLE - WITHDRAWN - OTHER description: | Reason why the quote was lost. - `EXPIRED`: Quote expired without response - `NO_REASON`: No specific reason given - `NO_RESPONSE`: Customer didn't respond - `TOO_HIGH`: Price was too high - `TOO_SLOW`: Response was too slow - `TRUCK_NOT_AVAILABLE`: Capacity not available - `WITHDRAWN`: The offer was withdrawn before it was accepted - `OTHER`: Other reason (see lostReasonText) TransportMode: type: string enum: - FTL - TL - LTL - PTL - RLTL - AIR - OCEAN - RAIL - INTERMODAL - DRAYAGE - AUTO - EXPEDITED_AIR - EXPEDITED_GROUND description: | Transportation mode. Optional on write — a shipment or load created without one is stored with no mode, the same as one created in the TMS. - `FTL`: Full Truckload — the value the TMS stores and always returns - `TL`: legacy spelling of `FTL`, still accepted on write, never returned - `LTL`: Less than Truckload - `PTL`: Partial Truckload - `RLTL`: Retail LTL - `AUTO`: Auto transport - `EXPEDITED_AIR`: Expedited air - `EXPEDITED_GROUND`: Expedited ground - `AIR`: Air freight - `OCEAN`: Ocean freight - `RAIL`: Rail freight - `INTERMODAL`: Intermodal (multiple modes) - `DRAYAGE`: Drayage/cartage OrderInput: type: object required: - stops - mode properties: mode: $ref: '#/components/schemas/TransportMode' stops: type: array items: $ref: '#/components/schemas/OrderStopInput' minItems: 2 description: At least origin and destination stops freight: $ref: '#/components/schemas/OrderFreightInput' equipment: type: array items: $ref: '#/components/schemas/ResourceReferenceInput' description: Equipment types required references: type: array items: type: object required: - type - value properties: type: type: string description: Reference type (e.g., BOL_NUMBER, PO_NUMBER) value: type: string description: Reference value description: Reference numbers for the order specialRequirements: type: array items: $ref: '#/components/schemas/ResourceReferenceInput' description: Special requirements (e.g., liftgate, team drivers) description: | Order definition used when creating Quotes or Shipments. Contains route (stops), freight details, and requirements. OrderStopInput: type: object required: - type properties: type: type: string enum: - PICKUP - DELIVERY description: Type of stop location: $ref: '#/components/schemas/ResourceReferenceInput' description: Reference to an existing location address: $ref: '#/components/schemas/AddressInput' description: Address for ad-hoc stop (if no location reference) requestedStartDate: type: string format: date description: Requested start date for the stop requestedEndDate: type: string format: date description: Requested end date for the stop requestedStartTime: type: string pattern: ^([01]\d|2[0-3]):([0-5]\d)$ description: Requested start time (HH:MM format) requestedEndTime: type: string pattern: ^([01]\d|2[0-3]):([0-5]\d)$ description: Requested end time (HH:MM format) appointmentRequired: type: boolean default: false description: Whether an appointment is required notes: type: string maxLength: 2000 description: Special instructions for the stop description: Stop definition for an order OrderFreightInput: type: object properties: handlingUnitQuantity: type: integer minimum: 1 description: Number of handling units handlingUnitType: type: string description: | Handling unit name. Org-configurable list (e.g. Pallet, Skid, Crate, Drum, Roll, Gaylord, Totes) — not a closed enum; match the names your organization uses in the TMS. weight: type: number minimum: 0 description: Total weight in pounds volume: type: number minimum: 0 description: | Total volume in cubic feet. Accepted for compatibility but not currently persisted. length: type: number minimum: 0 description: Length in inches width: type: number minimum: 0 description: Width in inches height: type: number minimum: 0 description: Height in inches commodityDescription: type: string maxLength: 500 description: Description of the commodity hazmat: type: boolean default: false description: Whether freight is hazardous materials stackable: type: boolean default: true description: Whether freight is stackable description: Freight details for an order Quote: type: object required: - id - friendlyId - side - status - createdAt properties: id: type: string format: uuid description: Unique identifier example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable quote ID (e.g., "Q003602") example: Q003602 key: type: string description: Client-defined reference identifier for this quote example: my-quote-001 nullable: true side: $ref: '#/components/schemas/QuoteSide' status: $ref: '#/components/schemas/QuoteStatus' amount: type: number description: Quoted price example: 2500 nullable: true target: type: number description: Target price for margin calculation example: 2200 nullable: true margin: type: number description: Calculated margin percentage example: 12 nullable: true expiresAt: type: string format: date-time description: Quote expiration timestamp nullable: true customer: $ref: '#/components/schemas/CustomerReference' description: Customer (for SELL quotes) carrier: $ref: '#/components/schemas/CarrierReference' description: Carrier (for BUY quotes) order: $ref: '#/components/schemas/OrderSummary' description: Order details (route, freight) lostReason: description: Why the quote was lost $ref: '#/components/schemas/QuoteLostReason' nullable: true lostReasonText: type: string description: Additional text for lost reason nullable: true closedTime: type: string format: date-time description: When the quote was closed (won/lost) nullable: true assignee: $ref: '#/components/schemas/UserReference' description: Assigned sales rep shipmentId: type: string format: uuid description: Shipment ID if converted nullable: true shipmentKey: type: string description: Shipment friendly ID if converted nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true QuoteInput: type: object required: - customer - order properties: customer: $ref: '#/components/schemas/ResourceReferenceInput' description: Customer reference (for SELL quotes) carrier: $ref: '#/components/schemas/ResourceReferenceInput' description: Carrier reference (for BUY quotes) order: $ref: '#/components/schemas/OrderInput' description: Order details (route, freight) amount: type: number minimum: 0 description: Quoted price expiresAt: type: string format: date-time description: Quote expiration assignee: $ref: '#/components/schemas/ResourceReferenceInput' description: Assigned user description: Input for creating a new quote QuotePatch: type: object properties: status: $ref: '#/components/schemas/QuoteStatus' amount: type: number minimum: 0 nullable: true target: type: number minimum: 0 nullable: true expiresAt: type: string format: date-time nullable: true lostReason: $ref: '#/components/schemas/QuoteLostReason' description: Required when status is LOST lostReasonText: type: string description: Required when lostReason is OTHER assignee: $ref: '#/components/schemas/ResourceReferenceInput' description: | Partial update fields for a quote. **Validation rules:** - When `status` is `LOST`, `lostReason` is required - When `lostReason` is `OTHER`, `lostReasonText` is required QuoteFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/QuoteStatusFilter' side: $ref: '#/components/schemas/QuoteSideFilter' customerId: $ref: '#/components/schemas/UUIDFilter' carrierId: $ref: '#/components/schemas/UUIDFilter' assigneeId: $ref: '#/components/schemas/UUIDFilter' amount: $ref: '#/components/schemas/FloatFilter' expiresAt: $ref: '#/components/schemas/DatetimeFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/QuoteFilter' or: type: array items: $ref: '#/components/schemas/QuoteFilter' not: $ref: '#/components/schemas/QuoteFilter' QuoteFilterRequest: type: object properties: filter: $ref: '#/components/schemas/QuoteFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string ConvertToShipmentRequest: type: object properties: additionalOrders: type: array items: $ref: '#/components/schemas/OrderInput' description: Optional additional orders to add to the shipment description: Request body for converting a quote to a shipment ConvertToShipmentResponse: type: object required: - quoteId - quoteStatus - shipmentId - shipmentKey - orderId properties: quoteId: type: string format: uuid description: Quote ID that was converted quoteStatus: type: string enum: - WON description: Quote status after conversion (always WON) shipmentId: type: string format: uuid description: Created shipment ID shipmentKey: type: string description: Created shipment friendly ID orderId: type: string format: uuid description: Order ID from the quote ShipmentLifecycleStatus: type: string enum: - DRAFT - TENDER_PENDING - ON_HOLD - PLANNING - SELECTED - BOOKED - DISPATCHED - LOADING - PICKED_UP - IN_TRANSIT - UNLOADING - ARRIVED_AT_DELIVERY_TERMINAL - OUT_FOR_DELIVERY - RECOVERED - DELIVERED - CANCELED - TENDER_REJECTED - CONSOLIDATED description: | Current status of the shipment lifecycle. **Pre-transit:** - `DRAFT`: Shipment being created - `TENDER_PENDING`: Awaiting carrier tender acceptance - `TENDER_REJECTED`: Carrier rejected the tender - `ON_HOLD`: Shipment temporarily paused - `PLANNING`: Being planned/scheduled - `SELECTED`: Carrier selected - `BOOKED`: Carrier confirmed booking - `DISPATCHED`: Dispatched to carrier **In-transit:** - `LOADING`: Loading at pickup - `PICKED_UP`: Picked up - `IN_TRANSIT`: In transit - `UNLOADING`: Unloading at delivery - `ARRIVED_AT_DELIVERY_TERMINAL`: At delivery terminal (LTL) - `OUT_FOR_DELIVERY`: Out for final delivery - `RECOVERED`: Shipment has been recovered **Final:** - `DELIVERED`: Delivered - `CANCELED`: Canceled - `CONSOLIDATED`: Merged into a consolidated shipment OrderBillingStatus: type: string enum: - DOCS_NEEDED - NOT_READY_TO_INVOICE - READY_TO_INVOICE - INVOICED - PAID description: | Billing status for the order (AR side). - `DOCS_NEEDED`: Waiting for delivery documents - `NOT_READY_TO_INVOICE`: Not ready to invoice - `READY_TO_INVOICE`: Ready to generate invoice - `INVOICED`: Invoice generated and sent - `PAID`: Fully paid Order: type: object properties: id: type: string format: uuid friendlyId: type: string description: Human-readable order ID (e.g., "ORD-12345") key: type: string description: Client-defined reference identifier for this order nullable: true mode: $ref: '#/components/schemas/TransportMode' status: $ref: '#/components/schemas/ShipmentLifecycleStatus' billingStatus: $ref: '#/components/schemas/OrderBillingStatus' stops: type: array items: $ref: '#/components/schemas/OrderStop' description: Flattened stops array freight: $ref: '#/components/schemas/OrderFreight' references: type: array items: $ref: '#/components/schemas/OrderReference' charges: type: array items: $ref: '#/components/schemas/OrderCharge' equipment: type: array items: type: string format: uuid description: Equipment ids. Resolve names via the reference-data equipment endpoint. specialRequirements: type: array items: type: string format: uuid description: Special-requirement ids. Resolve names via the reference-data endpoint. mileage: type: number nullable: true totalRevenue: type: number description: Sum of all charges nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true OrderStop: type: object properties: id: type: string format: uuid type: type: string enum: - PICKUP - DELIVERY sequence: type: integer description: Stop order in the route location: $ref: '#/components/schemas/ResourceReference' address: allOf: - $ref: '#/components/schemas/Address' description: | Full address from the stop's linked location. Absent when the stop has no linked shipper location. requestedStartDate: type: string format: date nullable: true requestedEndDate: type: string format: date nullable: true requestedStartTime: type: string nullable: true requestedEndTime: type: string nullable: true actualArrival: type: string format: date-time nullable: true actualDeparture: type: string format: date-time nullable: true appointmentRequired: type: boolean notes: type: string nullable: true OrderFreight: type: object properties: handlingUnitQuantity: type: integer nullable: true handlingUnitType: type: string nullable: true weight: type: number description: Weight in pounds nullable: true volume: type: number description: Volume in cubic feet nullable: true length: type: number nullable: true width: type: number nullable: true height: type: number nullable: true commodityDescription: type: string nullable: true hazmat: type: boolean stackable: type: boolean OrderCharge: type: object properties: id: type: string format: uuid chargeCodeId: type: integer description: Charge code id. Resolve code/name via the reference-data charge-codes endpoint. nullable: true description: type: string nullable: true amount: type: number quantity: type: number default: 1 rate: type: number nullable: true Shipment: type: object required: - id - friendlyId - status - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable shipment ID (e.g., "SHP-12345") example: SHP-12345 key: type: string description: Client-defined reference identifier for this shipment example: my-shipment-001 nullable: true status: $ref: '#/components/schemas/ShipmentLifecycleStatus' customer: $ref: '#/components/schemas/CustomerReference' customerRep: $ref: '#/components/schemas/UserReference' description: Customer representative orders: type: array items: $ref: '#/components/schemas/Order' description: Orders in this shipment loads: type: array items: $ref: '#/components/schemas/LoadSummary' description: Loads for carrier execution services: type: array items: $ref: '#/components/schemas/ServiceSummary' description: Vended services totalRevenue: type: number description: Sum of all order charges nullable: true totalCost: type: number description: Sum of all load and service costs nullable: true margin: type: number description: Revenue minus cost nullable: true marginPercent: type: number description: Margin as percentage of revenue nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true deliveredAt: type: string format: date-time nullable: true ShipmentInput: type: object required: - customer - orders properties: customer: $ref: '#/components/schemas/ResourceReferenceInput' description: Customer reference customerRep: $ref: '#/components/schemas/ResourceReferenceInput' description: Assigned customer rep orders: type: array items: $ref: '#/components/schemas/OrderInput' minItems: 1 description: Orders to create (at least one required) loads: type: array items: $ref: '#/components/schemas/LoadInput' description: Optional loads to create services: type: array items: $ref: '#/components/schemas/ServiceInput' description: Optional services to create ShipmentPatch: type: object properties: customer: $ref: '#/components/schemas/ResourceReferenceInput' customerRep: $ref: '#/components/schemas/ResourceReferenceInput' description: Partial update fields for a shipment ShipmentFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' key: $ref: '#/components/schemas/StringFilter' status: $ref: '#/components/schemas/ShipmentStatusFilter' customerId: $ref: '#/components/schemas/UUIDFilter' customerRepId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' updatedAt: $ref: '#/components/schemas/DatetimeFilter' deliveredAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/ShipmentFilter' or: type: array items: $ref: '#/components/schemas/ShipmentFilter' not: $ref: '#/components/schemas/ShipmentFilter' ShipmentFilterRequest: type: object properties: filter: $ref: '#/components/schemas/ShipmentFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string CancelShipmentRequest: type: object properties: reason: type: string maxLength: 1000 description: Reason for cancellation description: Request body for canceling a shipment DuplicateShipmentRequest: type: object properties: pickUpDate: type: string format: date description: New pickup date for the duplicate deliveryDate: type: string format: date description: New delivery date for the duplicate description: Request body for duplicating a shipment DuplicateShipmentResponse: type: object required: - originalShipmentId - newShipmentId - newShipmentKey properties: originalShipmentId: type: string format: uuid newShipmentId: type: string format: uuid newShipmentKey: type: string LoadStatus: type: string enum: - SOURCING - SELECTED - BOOKED - DISPATCHED - LOADING - PICKED_UP - IN_TRANSIT - UNLOADING - ARRIVED_AT_DELIVERY_TERMINAL - OUT_FOR_DELIVERY - RECOVERED - DELIVERED_AWAITING_INVOICE - DELIVERED_INVOICE_IN_REVIEW - DELIVERED_APPROVED_TO_BE_PAID - DELIVERED_PAID - COMPLETE - SERVICE_FAILURE - ON_HOLD - CANCELED description: | Current status of the load. **Pre-transit:** - `SOURCING`: Looking for carrier - `SELECTED`: Carrier selected - `BOOKED`: Carrier booked - `DISPATCHED`: Dispatched to carrier **In-transit:** - `LOADING`: Loading at pickup - `PICKED_UP`: Picked up - `IN_TRANSIT`: In transit - `UNLOADING`: Unloading at delivery - `ARRIVED_AT_DELIVERY_TERMINAL`: Arrived at delivery terminal - `OUT_FOR_DELIVERY`: Out for delivery - `RECOVERED`: Recovered after a service issue **Delivered (accounts payable lifecycle):** - `DELIVERED_AWAITING_INVOICE`: Delivered, awaiting carrier invoice - `DELIVERED_INVOICE_IN_REVIEW`: Carrier invoice in review - `DELIVERED_APPROVED_TO_BE_PAID`: Approved to be paid - `DELIVERED_PAID`: Paid **Final / exceptions:** - `COMPLETE`: Complete - `SERVICE_FAILURE`: Service failure - `ON_HOLD`: On hold - `CANCELED`: Canceled LoadCarrierStatus: type: string enum: - ACTIVE - TONU - BOUNCED description: | Status of the carrier assignment. - `ACTIVE`: Carrier is actively assigned - `TONU`: Truck Ordered Not Used (carrier dispatched but cancelled) - `BOUNCED`: Carrier bounced/rejected load LoadBillingStatus: type: string enum: - AWAITING_INVOICE - INVOICE_IN_REVIEW - APPROVED_TO_PAY - PAID description: | Billing status for the load (AP side). - `AWAITING_INVOICE`: Waiting for carrier invoice - `INVOICE_IN_REVIEW`: Invoice received, under review - `APPROVED_TO_PAY`: Approved for payment - `PAID`: Paid to carrier Load: type: object required: - id - status - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable load ID (e.g., "LD-12345") example: LD-12345 key: type: string description: Client-defined reference identifier for this load example: my-load-001 nullable: true shipmentId: type: string format: uuid description: Parent shipment shipmentKey: type: string description: Parent shipment human-readable ID (friendlyId) nullable: true mode: $ref: '#/components/schemas/TransportMode' status: $ref: '#/components/schemas/LoadStatus' stops: type: array items: $ref: '#/components/schemas/LoadStop' description: Load stops carriers: type: array items: $ref: '#/components/schemas/LoadCarrier' description: Carrier assignments (flattened from LoadCarriersConnection) totalCost: type: number description: Total carrier costs nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true pickedUpAt: type: string format: date-time nullable: true deliveredAt: type: string format: date-time nullable: true LoadCarrier: type: object properties: id: type: string format: uuid carrier: $ref: '#/components/schemas/CarrierReference' contact: type: object properties: id: type: string format: uuid name: type: string phone: type: string nullable: true email: type: string nullable: true status: $ref: '#/components/schemas/LoadCarrierStatus' billingStatus: $ref: '#/components/schemas/LoadBillingStatus' bookedAt: type: string format: date-time nullable: true dispatchedAt: type: string format: date-time nullable: true removedAt: type: string format: date-time description: | When this assignment was removed from the load (bounce, TONU, rebook). Removed assignments stay in `carriers` as history but their charges are excluded from the load `totalCost`. nullable: true charges: type: array items: $ref: '#/components/schemas/LoadCarrierCharge' description: Flattened charges array totalCost: type: number description: Sum of all charges nullable: true driverName: type: string nullable: true driverPhone: type: string nullable: true truckNumber: type: string nullable: true trailerNumber: type: string nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true LoadInput: type: object properties: mode: $ref: '#/components/schemas/TransportMode' orderStopIds: type: array items: type: string format: uuid description: Order stop IDs to include in this load carrier: $ref: '#/components/schemas/LoadCarrierInput' description: Initial carrier assignment LoadCarrierInput: type: object required: - carrier properties: carrier: $ref: '#/components/schemas/ResourceReferenceInput' description: Carrier reference contact: $ref: '#/components/schemas/ResourceReferenceInput' description: Carrier contact charges: type: array items: type: object required: - chargeCode - amount properties: chargeCode: $ref: '#/components/schemas/ResourceReferenceInput' description: type: string amount: type: number quantity: type: number default: 1 driverName: type: string driverPhone: type: string truckNumber: type: string trailerNumber: type: string LoadPatch: type: object properties: mode: $ref: '#/components/schemas/TransportMode' LoadCarrierPatch: type: object properties: contact: $ref: '#/components/schemas/ResourceReferenceInput' driverName: type: string nullable: true driverPhone: type: string nullable: true truckNumber: type: string nullable: true trailerNumber: type: string nullable: true LoadFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' shipmentId: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/LoadStatusFilter' mode: type: object properties: equalTo: $ref: '#/components/schemas/TransportMode' in: type: array items: $ref: '#/components/schemas/TransportMode' createdAt: $ref: '#/components/schemas/DatetimeFilter' deliveredAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/LoadFilter' or: type: array items: $ref: '#/components/schemas/LoadFilter' not: $ref: '#/components/schemas/LoadFilter' LoadFilterRequest: type: object properties: filter: $ref: '#/components/schemas/LoadFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string ReportTonuRequest: type: object properties: reason: type: string maxLength: 1000 description: Reason for TONU costs: type: array items: type: object required: - chargeCode - amount properties: chargeCode: $ref: '#/components/schemas/ResourceReferenceInput' description: type: string amount: type: number description: TONU costs to record createReplacementLoad: type: boolean default: false description: Whether to create a replacement load description: Request body for reporting TONU BounceCarrierRequest: type: object properties: reason: $ref: '#/components/schemas/LoadCarrierRemovalReason' reasonText: type: string maxLength: 1000 description: Additional reason details description: Request body for bouncing a carrier ServiceStatus: type: string enum: - ACTIVE - AWAITING_INVOICE - INVOICE_IN_REVIEW - APPROVED_TO_PAY - PAID - CANCELED description: | Current status of the service. **Active states:** - `ACTIVE`: Service is active/in progress **Billing states (AP):** - `AWAITING_INVOICE`: Waiting for vendor invoice - `INVOICE_IN_REVIEW`: Invoice received, under review - `APPROVED_TO_PAY`: Approved for payment - `PAID`: Paid to vendor **Final states:** - `CANCELED`: Service canceled Service: type: object required: - id - status - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 key: type: string description: Human-readable service ID example: SVC-12345 nullable: true shipmentId: type: string format: uuid description: Parent shipment shipmentKey: type: string description: Parent shipment friendly ID nullable: true vendor: $ref: '#/components/schemas/VendorReference' vendorContact: type: object properties: id: type: string format: uuid name: type: string phone: type: string nullable: true email: type: string nullable: true status: $ref: '#/components/schemas/ServiceStatus' description: type: string description: Service description nullable: true charges: type: array items: $ref: '#/components/schemas/ServiceCharge' description: Flattened charges array totalCost: type: number description: Sum of all charges nullable: true scheduledDate: type: string format: date nullable: true completedDate: type: string format: date nullable: true referenceNumber: type: string description: Vendor reference number nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true ServiceInput: type: object required: - vendor properties: vendor: $ref: '#/components/schemas/ResourceReferenceInput' description: Vendor reference vendorContact: $ref: '#/components/schemas/ResourceReferenceInput' description: Vendor contact description: type: string maxLength: 2000 charges: type: array items: type: object required: - chargeCode - amount properties: chargeCode: $ref: '#/components/schemas/ResourceReferenceInput' description: type: string amount: type: number quantity: type: number default: 1 scheduledDate: type: string format: date referenceNumber: type: string ServicePatch: type: object description: | Partial service update. All fields are optional. - **Omitted fields**: Not modified (current value preserved) - **Provided fields**: Updated to the new value - **Null values**: Clear the field (set to null) where applicable properties: vendorContact: $ref: '#/components/schemas/ResourceReferenceInput' description: type: string nullable: true scheduledDate: type: string format: date nullable: true completedDate: type: string format: date nullable: true referenceNumber: type: string nullable: true ServiceFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' shipmentId: $ref: '#/components/schemas/UUIDFilter' vendorId: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/ServiceStatusFilter' scheduledDate: $ref: '#/components/schemas/DatetimeFilter' completedDate: $ref: '#/components/schemas/DatetimeFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/ServiceFilter' or: type: array items: $ref: '#/components/schemas/ServiceFilter' not: $ref: '#/components/schemas/ServiceFilter' ServiceFilterRequest: type: object properties: filter: $ref: '#/components/schemas/ServiceFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string InvoiceStatus: type: string enum: - DRAFT - AWAITING_PAYMENT - PARTIALLY_PAID - PAID - VOIDED description: | Current status of the invoice. - `DRAFT`: Invoice record exists but not finalized - `AWAITING_PAYMENT`: Invoice finalized, awaiting payment - `PARTIALLY_PAID`: Some payments received, balance remains - `PAID`: Fully paid - `VOIDED`: Invoice cancelled/voided FactoringProvider: type: string enum: - ARTISPAY - DENIM - HAUL_PAY - TRIUMPH description: | Factoring provider for invoice financing. - `DENIM`: Denim factoring - `HAULPAY`: HaulPay factoring InvoicePayment: type: object properties: id: type: string format: uuid paymentGroupId: type: string format: uuid amount: type: number description: Amount applied to this invoice paymentDate: type: string format: date reference: type: string description: Check number, transaction ID, etc. nullable: true paymentMethodType: type: string description: Payment method (check, ach_wire, etc.) nullable: true InvoiceCredit: type: object properties: id: type: string format: uuid creditMemoId: type: string format: uuid creditMemoReference: type: string nullable: true amount: type: number description: Credit amount applied appliedAt: type: string format: date-time Invoice: type: object required: - id - friendlyId - status - invoiceDate - amount - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable invoice ID example: INV-00001 key: type: string description: Client-defined key nullable: true orderId: type: string format: uuid description: Associated order ID orderKey: type: string description: Order friendly ID nullable: true shipmentId: type: string format: uuid description: Associated shipment ID shipmentKey: type: string description: Shipment friendly ID nullable: true customer: $ref: '#/components/schemas/CustomerReference' status: $ref: '#/components/schemas/InvoiceStatus' invoiceDate: type: string format: date description: Date invoice was issued dueDate: type: string format: date description: Payment due date nullable: true amount: type: number description: Total invoice amount currency: type: string description: Currency code (USD, CAD) example: USD nullable: true reference: type: string description: External reference number nullable: true amountPaid: type: number description: Total payments received amountOwed: type: number description: Outstanding balance creditsApplied: type: number description: Total credits applied nullable: true paymentTerm: $ref: '#/components/schemas/PaymentTermReference' payments: type: array items: $ref: '#/components/schemas/InvoicePayment' description: Payments applied to this invoice credits: type: array items: $ref: '#/components/schemas/InvoiceCredit' description: Credits applied to this invoice factorName: $ref: '#/components/schemas/FactoringProvider' factorJobId: type: string description: External factoring job ID nullable: true factorStatus: type: string description: Current factoring status nullable: true qboId: type: string description: QuickBooks Online invoice ID nullable: true documentId: type: string format: uuid description: Generated invoice PDF document ID nullable: true documentUrl: type: string description: Download URL for invoice PDF nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true InvoiceInput: type: object required: - orderId - invoiceDate - amount properties: orderId: type: string format: uuid description: Order to invoice invoiceDate: type: string format: date description: Invoice date dueDate: type: string format: date description: Payment due date amount: type: number description: Invoice amount (typically calculated from order charges) reference: type: string maxLength: 500 description: External reference number currency: type: string description: Currency code (defaults to customer currency) paymentTermId: type: string format: uuid description: Payment term (defaults to customer default) InvoicePatch: type: object properties: dueDate: type: string format: date nullable: true reference: type: string nullable: true paymentTermId: type: string format: uuid InvoiceFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' orderId: $ref: '#/components/schemas/UUIDFilter' shipmentId: $ref: '#/components/schemas/UUIDFilter' customerId: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/InvoiceStatusFilter' invoiceDate: $ref: '#/components/schemas/DatetimeFilter' dueDate: $ref: '#/components/schemas/DatetimeFilter' amount: $ref: '#/components/schemas/FloatFilter' amountOwed: $ref: '#/components/schemas/FloatFilter' overdue: type: boolean description: Filter to overdue invoices only factored: type: boolean description: Filter to factored invoices only createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/InvoiceFilter' or: type: array items: $ref: '#/components/schemas/InvoiceFilter' not: $ref: '#/components/schemas/InvoiceFilter' InvoiceFilterRequest: type: object properties: filter: $ref: '#/components/schemas/InvoiceFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string GenerateInvoiceRequest: type: object properties: invoiceDate: type: string format: date description: Invoice date (defaults to today) dueDate: type: string format: date description: Due date (defaults based on payment term) attachmentDocumentIds: type: array items: type: string format: uuid description: Document IDs to attach to invoice PDF GenerateInvoiceResponse: type: object required: - invoice - document properties: invoice: $ref: '#/components/schemas/Invoice' document: type: object properties: id: type: string format: uuid url: type: string description: Download URL for invoice PDF BatchGenerateInvoicesRequest: type: object required: - orderIds properties: orderIds: type: array items: type: string format: uuid description: Order IDs to generate invoices for maxItems: 100 sendEmail: type: boolean default: false description: Email invoices to customers after generation emailConfig: type: object properties: ccEmails: type: array items: type: string format: email groupByCustomer: type: boolean default: true description: Group invoices by customer in emails BatchGenerateInvoicesResponse: type: object properties: generated: type: array items: type: object properties: orderId: type: string format: uuid invoiceId: type: string format: uuid documentId: type: string format: uuid failed: type: array items: type: object properties: orderId: type: string format: uuid error: type: string emailsSent: type: integer SendInvoiceEmailRequest: type: object required: - toEmails properties: toEmails: type: array items: type: string format: email minItems: 1 ccEmails: type: array items: type: string format: email subject: type: string description: Email subject (defaults to standard invoice subject) message: type: string description: Email body message MarkAwaitingPaymentRequest: type: object properties: invoiceDate: type: string format: date description: Invoice date (defaults to today) dueDate: type: string format: date description: Due date (defaults based on payment term) AgingReportResponse: type: object required: - asOfDate - buckets - customers - totals properties: asOfDate: type: string format: date buckets: type: array items: type: string example: - Current - 1-30 - 31-60 - 61-90 - 90+ customers: type: array items: type: object properties: id: type: string format: uuid name: type: string friendlyId: type: string current: type: number days1to30: type: number days31to60: type: number days61to90: type: number over90: type: number total: type: number totals: type: object properties: current: type: number days1to30: type: number days31to60: type: number days61to90: type: number over90: type: number total: type: number ARPaymentMethodType: $ref: '#/components/schemas/PaymentMethodType-3' PaymentApplication: type: object required: - id - invoiceId - amount properties: id: type: string format: uuid invoiceId: type: string format: uuid invoiceFriendlyId: type: string nullable: true invoiceAmount: type: number description: Total invoice amount nullable: true invoiceOpenBalance: type: number description: Invoice balance before this payment nullable: true amount: type: number description: Amount applied to this invoice PaymentCreditApplication: type: object properties: id: type: string format: uuid creditMemoId: type: string format: uuid creditMemoReference: type: string nullable: true amount: type: number description: Credit amount applied in this payment Payment: type: object required: - id - paymentDate - totalAmount - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 key: type: string description: Human-readable payment key example: PMT-00001 nullable: true customer: $ref: '#/components/schemas/CustomerReference' paymentDate: type: string format: date description: Date payment was received paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-3' reference: type: string description: Check number, transaction ID, etc. nullable: true notes: type: string description: Payment notes nullable: true currency: type: string description: Currency code example: USD nullable: true totalAmount: type: number description: Total payment amount applications: type: array items: $ref: '#/components/schemas/PaymentApplication' description: Invoices this payment is applied to creditApplications: type: array items: $ref: '#/components/schemas/PaymentCreditApplication' description: Credits applied in this payment overpaymentAmount: type: number description: Amount in excess of invoice totals nullable: true overpaymentCreditMemoId: type: string format: uuid description: Credit memo created from overpayment nullable: true shipmentIds: type: array items: type: string format: uuid description: Related shipment IDs shipmentKeys: type: array items: type: string description: Related shipment friendly IDs qboId: type: string description: QuickBooks Online payment ID nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true PaymentApplicationInput: type: object required: - invoiceId - amount properties: invoiceId: type: string format: uuid description: Invoice to apply payment to amount: type: number minimum: 0.01 description: Amount to apply to this invoice PaymentCreditApplicationInput: type: object required: - creditMemoId - amount properties: creditMemoId: type: string format: uuid description: Credit memo to apply amount: type: number minimum: 0.01 description: Credit amount to apply PaymentInput: type: object required: - customerId - paymentDate - applications properties: customerId: type: string format: uuid description: Customer making the payment paymentDate: type: string format: date description: Date payment was received paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-3' reference: type: string maxLength: 500 description: Check number, transaction ID, etc. notes: type: string maxLength: 2000 description: Payment notes applications: type: array items: $ref: '#/components/schemas/PaymentApplicationInput' minItems: 1 description: Invoices to apply payment to creditApplications: type: array items: $ref: '#/components/schemas/PaymentCreditApplicationInput' description: Credits to apply in this payment PaymentPatch: type: object properties: paymentDate: type: string format: date paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-3' reference: type: string nullable: true notes: type: string nullable: true applications: type: array items: $ref: '#/components/schemas/PaymentApplicationInput' description: Replace all invoice applications creditApplications: type: array items: $ref: '#/components/schemas/PaymentCreditApplicationInput' description: Replace all credit applications PaymentFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' customerId: $ref: '#/components/schemas/UUIDFilter' invoiceId: $ref: '#/components/schemas/UUIDFilter' shipmentId: $ref: '#/components/schemas/UUIDFilter' paymentDate: $ref: '#/components/schemas/DatetimeFilter' paymentMethodType: $ref: '#/components/schemas/PaymentMethodTypeFilter-3' totalAmount: $ref: '#/components/schemas/FloatFilter' reference: $ref: '#/components/schemas/StringFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/PaymentFilter' or: type: array items: $ref: '#/components/schemas/PaymentFilter' not: $ref: '#/components/schemas/PaymentFilter' PaymentFilterRequest: type: object properties: filter: $ref: '#/components/schemas/PaymentFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string OutstandingInvoicesResponse: type: object required: - invoices - totalOutstanding properties: invoices: type: array items: type: object properties: id: type: string format: uuid friendlyId: type: string amount: type: number invoiceDate: type: string format: date dueDate: type: string format: date nullable: true openBalance: type: number isOverdue: type: boolean payments: type: array items: type: object properties: id: type: string format: uuid amount: type: number paymentDate: type: string format: date totalOutstanding: type: number description: Total outstanding balance for customer CreditMemoStatus: type: string enum: - OPEN - PARTIALLY_APPLIED - APPLIED - VOIDED description: | Current status of the credit memo (derived from remaining balance). - `OPEN`: No applications, full balance available - `PARTIALLY_APPLIED`: Some amount applied, balance remains - `APPLIED`: Fully applied to invoices - `VOIDED`: Credit memo cancelled CreditMemoApplication: type: object required: - id - invoiceId - amount properties: id: type: string format: uuid invoiceId: type: string format: uuid invoiceFriendlyId: type: string nullable: true paymentId: type: string format: uuid description: Payment through which this credit was applied paymentKey: type: string nullable: true amount: type: number description: Amount applied appliedAt: type: string format: date-time CreditMemo: type: object required: - id - amount - remainingBalance - status - memoDate - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 key: type: string description: Client-defined key nullable: true reference: type: string description: Reference number example: CM-00001 nullable: true customer: $ref: '#/components/schemas/CustomerReference' amount: type: number description: Original credit amount appliedAmount: type: number description: Total amount applied to invoices remainingBalance: type: number description: Available balance currency: type: string description: Currency code example: USD nullable: true status: $ref: '#/components/schemas/CreditMemoStatus' memoDate: type: string format: date description: Credit memo date notes: type: string description: Notes or description nullable: true sourcePaymentGroupId: type: string format: uuid description: Payment that created this credit (if from overpayment) nullable: true sourcePaymentKey: type: string nullable: true applications: type: array items: $ref: '#/components/schemas/CreditMemoApplication' description: Invoices this credit is applied to qboId: type: string description: QuickBooks Online credit memo ID nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true voidedAt: type: string format: date-time nullable: true voidReason: type: string nullable: true createdBy: $ref: '#/components/schemas/UserReference' CreditMemoInput: type: object required: - customerId - amount - memoDate properties: customerId: type: string format: uuid description: Customer to credit amount: type: number minimum: 0.01 description: Credit amount currency: type: string description: Currency code (defaults to customer currency) memoDate: type: string format: date description: Credit memo date reference: type: string maxLength: 500 description: Reference number notes: type: string maxLength: 2000 description: Notes or description CreditMemoPatch: type: object properties: reference: type: string nullable: true notes: type: string nullable: true memoDate: type: string format: date CreditMemoFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' customerId: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/CreditMemoStatusFilter' memoDate: $ref: '#/components/schemas/DatetimeFilter' amount: $ref: '#/components/schemas/FloatFilter' remainingBalance: $ref: '#/components/schemas/FloatFilter' hasRemainingBalance: type: boolean description: Filter to credits with available balance sourcePaymentGroupId: $ref: '#/components/schemas/UUIDFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/CreditMemoFilter' or: type: array items: $ref: '#/components/schemas/CreditMemoFilter' not: $ref: '#/components/schemas/CreditMemoFilter' CreditMemoFilterRequest: type: object properties: filter: $ref: '#/components/schemas/CreditMemoFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string ApplyCreditRequest: type: object required: - invoiceId - amount properties: invoiceId: type: string format: uuid description: Invoice to apply credit to amount: type: number minimum: 0.01 description: Amount to apply ApplyCreditResponse: type: object required: - application - creditMemo properties: application: $ref: '#/components/schemas/CreditMemoApplication' creditMemo: $ref: '#/components/schemas/CreditMemo' VoidCreditMemoRequest: type: object properties: reason: type: string maxLength: 1000 description: Reason for voiding AvailableCreditsResponse: type: object required: - availableCredits - totalAvailable properties: availableCredits: type: array items: type: object properties: id: type: string format: uuid reference: type: string nullable: true remainingBalance: type: number currency: type: string memoDate: type: string format: date notes: type: string nullable: true totalAvailable: type: number description: Total available credit balance BillStatus: type: string enum: - AWAITING_INVOICE - IN_REVIEW - APPROVED_TO_PAY - PAID description: | Current status of the bill (AP invoice). - `AWAITING_INVOICE`: Waiting for carrier/vendor to submit invoice - `IN_REVIEW`: Invoice received, under review - `APPROVED_TO_PAY`: Approved and ready for payment - `PAID`: Fully paid BillEntityType: type: string enum: - CARRIER - VENDOR description: | Type of entity the bill is for. - `CARRIER`: Bill for a carrier (LoadCarrier) - `VENDOR`: Bill for a vendor service (VendedService) BillPaymentApplied: type: object properties: id: type: string format: uuid paymentGroupId: type: string format: uuid amount: type: number description: Amount applied to this bill paymentDate: type: string format: date reference: type: string description: Check number, transaction ID, etc. nullable: true Bill: type: object required: - id - friendlyId - status - entityType - amount - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable bill ID example: BILL-00001 key: type: string description: Client-defined key nullable: true entityType: $ref: '#/components/schemas/BillEntityType' loadCarrierId: type: string format: uuid description: Associated load carrier ID (if carrier bill) nullable: true vendedServiceId: type: string format: uuid description: Associated vended service ID (if vendor bill) nullable: true carrier: $ref: '#/components/schemas/CarrierReference' vendor: $ref: '#/components/schemas/VendorReference' loadId: type: string format: uuid nullable: true loadKey: type: string nullable: true shipmentId: type: string format: uuid nullable: true shipmentKey: type: string nullable: true status: $ref: '#/components/schemas/BillStatus' invoiceDate: type: string format: date description: Date of carrier/vendor invoice nullable: true dueDate: type: string format: date description: Payment due date nullable: true amount: type: number description: Bill amount currency: type: string description: Currency code example: USD nullable: true reference: type: string description: Carrier/vendor invoice reference number nullable: true amountPaid: type: number description: Total payments received amountOwed: type: number description: Outstanding balance payments: type: array items: $ref: '#/components/schemas/BillPaymentApplied' description: Payments applied to this bill paymentTerm: $ref: '#/components/schemas/PaymentTermReference' carrierFactor: $ref: '#/components/schemas/CarrierFactorReference' factorJobId: type: string description: External factoring job ID nullable: true factorStatus: type: string description: Current factoring status nullable: true qboId: type: string description: QuickBooks Online bill ID nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true BillInput: type: object required: - entityType - entityId - invoiceDate - amount properties: entityType: $ref: '#/components/schemas/BillEntityType' entityId: type: string format: uuid description: LoadCarrier ID or VendedService ID invoiceDate: type: string format: date description: Invoice date from carrier/vendor dueDate: type: string format: date description: Payment due date amount: type: number description: Invoice amount reference: type: string maxLength: 500 description: Carrier/vendor invoice reference number currency: type: string description: Currency code (defaults to carrier/vendor currency) paymentTermId: type: string format: uuid description: Payment term BillPatch: type: object properties: invoiceDate: type: string format: date nullable: true dueDate: type: string format: date nullable: true amount: type: number reference: type: string nullable: true paymentTermId: type: string format: uuid BillFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' loadCarrierId: $ref: '#/components/schemas/UUIDFilter' vendedServiceId: $ref: '#/components/schemas/UUIDFilter' carrierId: $ref: '#/components/schemas/UUIDFilter' vendorId: $ref: '#/components/schemas/UUIDFilter' loadId: $ref: '#/components/schemas/UUIDFilter' shipmentId: $ref: '#/components/schemas/UUIDFilter' status: $ref: '#/components/schemas/BillStatusFilter' entityType: $ref: '#/components/schemas/BillEntityTypeFilter' invoiceDate: $ref: '#/components/schemas/DatetimeFilter' dueDate: $ref: '#/components/schemas/DatetimeFilter' amount: $ref: '#/components/schemas/FloatFilter' overdue: type: boolean description: Filter to overdue bills only createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/BillFilter' or: type: array items: $ref: '#/components/schemas/BillFilter' not: $ref: '#/components/schemas/BillFilter' BillFilterRequest: type: object properties: filter: $ref: '#/components/schemas/BillFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string ApproveBillsRequest: type: object required: - billIds properties: billIds: type: array items: type: string format: uuid minItems: 1 maxItems: 100 description: Bill IDs to approve ApproveBillsResponse: type: object properties: approved: type: array items: type: object properties: billId: type: string format: uuid status: $ref: '#/components/schemas/BillStatus' failed: type: array items: type: object properties: billId: type: string format: uuid error: type: string RevertBillRequest: type: object properties: reason: type: string maxLength: 1000 description: Reason for reverting OutstandingBillsResponse: type: object required: - bills - totalOutstanding properties: bills: type: array items: type: object properties: id: type: string format: uuid friendlyId: type: string entityType: $ref: '#/components/schemas/BillEntityType' carrier: $ref: '#/components/schemas/CarrierReference' vendor: $ref: '#/components/schemas/VendorReference' amount: type: number invoiceDate: type: string format: date nullable: true dueDate: type: string format: date nullable: true openBalance: type: number isOverdue: type: boolean totalOutstanding: type: number description: Total outstanding balance ApAgingReportResponse: type: object required: - asOfDate - buckets - payees - totals properties: asOfDate: type: string format: date buckets: type: array items: type: string example: - Current - 1-30 - 31-60 - 61-90 - 90+ payees: type: array items: type: object properties: id: type: string format: uuid name: type: string friendlyId: type: string nullable: true entityType: $ref: '#/components/schemas/BillEntityType' current: type: number days1to30: type: number days31to60: type: number days61to90: type: number over90: type: number total: type: number totals: type: object properties: current: type: number days1to30: type: number days31to60: type: number days61to90: type: number over90: type: number total: type: number BillPaymentMethodType: type: string enum: - ACH_WIRE - CHECK - CREDIT_CARD - EFT_DIRECT_DEPOSIT - E_TRANSFER - VENMO - ZELLE description: | Payment method used for the bill payment. - `ACH_WIRE`: ACH wire transfer - `CHECK`: Paper check - `CREDIT_CARD`: Credit card payment - `EFT_DIRECT_DEPOSIT`: EFT direct deposit - `E_TRANSFER`: Electronic transfer - `VENMO`: Venmo payment - `ZELLE`: Zelle payment BillPaymentRecipientType: type: string enum: - CARRIER - VENDOR description: | Type of recipient for the payment. - `CARRIER`: Payment to a carrier - `VENDOR`: Payment to a vendor BillPaymentApplication: type: object required: - id - billId - amount properties: id: type: string format: uuid billId: type: string format: uuid description: Bill (invoice) this payment applies to billFriendlyId: type: string description: Human-readable bill ID nullable: true amount: type: number description: Amount applied to this bill loadCarrierId: type: string format: uuid description: Associated load carrier (for carrier bills) nullable: true vendedServiceId: type: string format: uuid description: Associated vended service (for vendor bills) nullable: true shipmentId: type: string format: uuid nullable: true shipmentFriendlyId: type: string nullable: true BillPayment: type: object required: - id - paymentDate - recipientType - totalAmount - applications - createdAt properties: id: type: string format: uuid example: 550e8400-e29b-41d4-a716-446655440000 key: type: string description: Client-defined key nullable: true recipientType: $ref: '#/components/schemas/BillPaymentRecipientType' carrier: $ref: '#/components/schemas/CarrierReference' vendor: $ref: '#/components/schemas/VendorReference' carrierFactor: $ref: '#/components/schemas/CarrierFactorReference-2' paymentDate: type: string format: date description: Date the payment was made paymentMethodType: $ref: '#/components/schemas/BillPaymentMethodType' reference: type: string description: Check number, transaction ID, etc. nullable: true notes: type: string description: Additional notes nullable: true totalAmount: type: number description: Total payment amount (sum of all applications) overpayment: type: number description: Amount paid in excess of invoice totals nullable: true overpaymentCreditMemoId: type: string format: uuid description: Credit memo created for overpayment nullable: true applications: type: array items: $ref: '#/components/schemas/BillPaymentApplication' description: Individual bill payments in this group qboId: type: string description: QuickBooks Online bill payment ID nullable: true syncStatus: type: string enum: - pending - synced - error description: QuickBooks sync status nullable: true syncError: type: string description: QuickBooks sync error message nullable: true createdAt: type: string format: date-time updatedAt: type: string format: date-time nullable: true BillPaymentApplicationInput: type: object required: - billId - amount properties: billId: type: string format: uuid description: Bill (invoice) to apply payment to amount: type: number minimum: 0.01 description: Amount to apply to this bill BillPaymentInput: type: object required: - paymentDate - applications properties: paymentDate: type: string format: date description: Date of payment paymentMethodType: $ref: '#/components/schemas/BillPaymentMethodType' carrierFactorId: type: string format: uuid description: Carrier factor to pay (for factored payments) reference: type: string maxLength: 500 description: Check number, transaction ID, etc. notes: type: string maxLength: 2000 description: Additional notes applications: type: array items: $ref: '#/components/schemas/BillPaymentApplicationInput' minItems: 1 description: Bills to pay allowOverpayment: type: boolean default: false description: Allow payment amount to exceed bill totals BillPaymentPatch: type: object properties: paymentDate: type: string format: date paymentMethodType: $ref: '#/components/schemas/BillPaymentMethodType' reference: type: string nullable: true notes: type: string nullable: true applications: type: array items: $ref: '#/components/schemas/BillPaymentApplicationPatch' description: Update payment applications BillPaymentFilter: type: object properties: id: $ref: '#/components/schemas/UUIDFilter' carrierId: $ref: '#/components/schemas/UUIDFilter' vendorId: $ref: '#/components/schemas/UUIDFilter' carrierFactorId: $ref: '#/components/schemas/UUIDFilter' recipientType: type: object properties: equalTo: $ref: '#/components/schemas/BillPaymentRecipientType' in: type: array items: $ref: '#/components/schemas/BillPaymentRecipientType' paymentMethodType: $ref: '#/components/schemas/BillPaymentMethodTypeFilter' paymentDate: $ref: '#/components/schemas/DatetimeFilter' totalAmount: $ref: '#/components/schemas/FloatFilter' reference: $ref: '#/components/schemas/StringFilter' createdAt: $ref: '#/components/schemas/DatetimeFilter' and: type: array items: $ref: '#/components/schemas/BillPaymentFilter' or: type: array items: $ref: '#/components/schemas/BillPaymentFilter' not: $ref: '#/components/schemas/BillPaymentFilter' BillPaymentFilterRequest: type: object properties: filter: $ref: '#/components/schemas/BillPaymentFilter' pageSize: type: integer minimum: 1 maximum: 100 default: 50 cursor: type: string OutstandingBill: type: object properties: id: type: string format: uuid friendlyId: type: string entityType: $ref: '#/components/schemas/BillEntityType' carrier: $ref: '#/components/schemas/CarrierReference' vendor: $ref: '#/components/schemas/VendorReference' invoiceDate: type: string format: date nullable: true dueDate: type: string format: date nullable: true amount: type: number amountPaid: type: number openBalance: type: number isOverdue: type: boolean shipmentId: type: string format: uuid nullable: true shipmentFriendlyId: type: string nullable: true OutstandingBillsForPaymentResponse: type: object required: - bills - totalOutstanding properties: bills: type: array items: $ref: '#/components/schemas/OutstandingBill' totalOutstanding: type: number description: Total outstanding balance carrier: $ref: '#/components/schemas/CarrierReference' vendor: $ref: '#/components/schemas/VendorReference' carrierFactor: $ref: '#/components/schemas/CarrierFactorReference-2' SavedSearchLookup: type: object description: | Reference to a saved search by ID or client key. Provide either id or key (not both). properties: id: type: string format: uuid description: Saved search UUID example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined key for the saved search example: my-carrier-search example: id: 550e8400-e29b-41d4-a716-446655440000 UUIDFilter: type: object description: Filter options for UUID fields (all operations) properties: equalTo: type: string format: uuid description: Exact match notEqualTo: type: string format: uuid description: Not equal to in: type: array items: type: string format: uuid description: Matches any UUID in the array notIn: type: array items: type: string format: uuid description: Does not match any UUID in the array isNull: type: boolean description: Field is null (true) or not null (false) Error: type: object required: - error - message properties: error: type: string description: Error code message: type: string description: Human-readable error message ValidationError: type: object required: - error - message - details properties: error: type: string description: Error code example: validation_error message: type: string description: Human-readable error message details: type: array description: Validation error details items: type: object required: - field - message properties: field: type: string description: Field name that failed validation message: type: string description: Validation error message WebhookEvent: type: string description: The type of webhook event enum: - CARRIER_ACTIVATED - CARRIER_CONTACT_CREATED - CARRIER_CONTACT_UPDATED - CARRIER_CONTACT_DELETED - CARRIER_CREATED - CARRIER_DEACTIVATED - CARRIER_DELETED - CARRIER_FACTOR_CREATED - CARRIER_FACTOR_UPDATED - CARRIER_FACTOR_DELETED - CARRIER_INVOICE_CREATED - CARRIER_PAYMENT_CREATED - CARRIER_PAYMENT_METHOD_CREATED - CARRIER_PAYMENT_METHOD_UPDATED - CARRIER_PAYMENT_METHOD_DELETED - CARRIER_UPDATED - COMMISSION_APPROVED - COMMISSION_CREATED - COMPANY_CREATED - COMPANY_UPDATED - COMPANY_DELETED - CUSTOMER_CREATED - CUSTOMER_UPDATED - CUSTOMER_DELETED - CUSTOMER_CONTACT_CREATED - CUSTOMER_CONTACT_UPDATED - CUSTOMER_CONTACT_DELETED - CUSTOMER_INVOICE_CREATED - CUSTOMER_PAYMENT_CREATED - DOCUMENT_UPLOADED - QUOTE_CREATED - QUOTE_LOST - QUOTE_QUOTED - QUOTE_REQUESTED - QUOTE_WON - SHIPMENT_BOOKED - SHIPMENT_CANCELED - SHIPMENT_CHECK_CALL - SHIPMENT_CREATED - SHIPMENT_DELETED - SHIPMENT_DELIVERED - SHIPMENT_DISPATCHED - SHIPMENT_DRAFT - SHIPMENT_IN_TRANSIT - SHIPMENT_LOADING - SHIPMENT_NEXT_CHECK_CALL_DUE - SHIPMENT_NEXT_CHECK_CALL_OVERDUE - SHIPMENT_OPEN - SHIPMENT_PICK_UP_NEAR_NOT_BOOKED - SHIPMENT_PICK_UP_NEAR_NOT_DISPATCHED - SHIPMENT_RATE_CON_EXPIRED - SHIPMENT_RATE_CON_NOT_SIGNED - SHIPMENT_RATE_CON_SIGNED - SHIPMENT_TENDER_PENDING - SHIPMENT_TENDER_REJECTED - SHIPMENT_UNLOADING - VENDOR_CREATED - VENDOR_UPDATED - VENDOR_DELETED - VENDOR_CONTACT_CREATED - VENDOR_CONTACT_UPDATED - VENDOR_CONTACT_DELETED - VENDOR_INVOICE_CREATED - VENDOR_PAYMENT_CREATED - VENDOR_PAYMENT_METHOD_CREATED - VENDOR_PAYMENT_METHOD_UPDATED - VENDOR_PAYMENT_METHOD_DELETED - LOCATION_CREATED - LOCATION_UPDATED - LOCATION_DELETED - LOCATION_CONTACT_CREATED - LOCATION_CONTACT_UPDATED - LOCATION_CONTACT_DELETED WebhookPayload: type: object required: - event - timestamp - data discriminator: propertyName: event mapping: CUSTOMER_CREATED: '#/components/schemas/CustomerChangedPayload' CUSTOMER_UPDATED: '#/components/schemas/CustomerChangedPayload' CUSTOMER_DELETED: '#/components/schemas/CustomerChangedPayload' COMPANY_CREATED: '#/components/schemas/CompanyChangedPayload' COMPANY_UPDATED: '#/components/schemas/CompanyChangedPayload' COMPANY_DELETED: '#/components/schemas/CompanyChangedPayload' CUSTOMER_CONTACT_CREATED: '#/components/schemas/CustomerContactChangedPayload' CUSTOMER_CONTACT_UPDATED: '#/components/schemas/CustomerContactChangedPayload' CUSTOMER_CONTACT_DELETED: '#/components/schemas/CustomerContactChangedPayload' CARRIER_CONTACT_CREATED: '#/components/schemas/CarrierContactChangedPayload' CARRIER_CONTACT_UPDATED: '#/components/schemas/CarrierContactChangedPayload' CARRIER_CONTACT_DELETED: '#/components/schemas/CarrierContactChangedPayload' CARRIER_CREATED: '#/components/schemas/CarrierChangedPayload' CARRIER_UPDATED: '#/components/schemas/CarrierChangedPayload' CARRIER_DELETED: '#/components/schemas/CarrierChangedPayload' CARRIER_ACTIVATED: '#/components/schemas/CarrierChangedPayload' CARRIER_DEACTIVATED: '#/components/schemas/CarrierChangedPayload' CARRIER_FACTOR_CREATED: '#/components/schemas/CarrierFactorChangedPayload' CARRIER_FACTOR_UPDATED: '#/components/schemas/CarrierFactorChangedPayload' CARRIER_FACTOR_DELETED: '#/components/schemas/CarrierFactorChangedPayload' CARRIER_PAYMENT_METHOD_CREATED: '#/components/schemas/CarrierPaymentMethodChangedPayload' CARRIER_PAYMENT_METHOD_UPDATED: '#/components/schemas/CarrierPaymentMethodChangedPayload' CARRIER_PAYMENT_METHOD_DELETED: '#/components/schemas/CarrierPaymentMethodChangedPayload' VENDOR_CREATED: '#/components/schemas/VendorChangedPayload' VENDOR_UPDATED: '#/components/schemas/VendorChangedPayload' VENDOR_DELETED: '#/components/schemas/VendorChangedPayload' VENDOR_CONTACT_CREATED: '#/components/schemas/VendorContactChangedPayload' VENDOR_CONTACT_UPDATED: '#/components/schemas/VendorContactChangedPayload' VENDOR_CONTACT_DELETED: '#/components/schemas/VendorContactChangedPayload' VENDOR_PAYMENT_METHOD_CREATED: '#/components/schemas/VendorPaymentMethodChangedPayload' VENDOR_PAYMENT_METHOD_UPDATED: '#/components/schemas/VendorPaymentMethodChangedPayload' VENDOR_PAYMENT_METHOD_DELETED: '#/components/schemas/VendorPaymentMethodChangedPayload' LOCATION_CREATED: '#/components/schemas/LocationChangedPayload' LOCATION_UPDATED: '#/components/schemas/LocationChangedPayload' LOCATION_DELETED: '#/components/schemas/LocationChangedPayload' LOCATION_CONTACT_CREATED: '#/components/schemas/LocationContactChangedPayload' LOCATION_CONTACT_UPDATED: '#/components/schemas/LocationContactChangedPayload' LOCATION_CONTACT_DELETED: '#/components/schemas/LocationContactChangedPayload' SHIPMENT_DELIVERED: '#/components/schemas/ShipmentDeliveredPayload' properties: event: $ref: '#/components/schemas/WebhookEvent' timestamp: type: string format: date-time description: ISO 8601 timestamp when the event occurred example: '2025-01-15T14:30:00Z' data: type: object description: Event-specific data. Structure varies by event type. additionalProperties: true diff: type: array description: | Array of changes made during an UPDATE operation using json-diff-ts. Only present for UPDATE events. Null for CREATE and DELETE events. Each change follows the IChange interface from json-diff-ts library. items: $ref: '#/components/schemas/DiffChange' nullable: true CustomerChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CUSTOMER_CREATED - CUSTOMER_UPDATED - CUSTOMER_DELETED data: $ref: '#/components/schemas/Customer' CompanyChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - COMPANY_CREATED - COMPANY_UPDATED - COMPANY_DELETED data: $ref: '#/components/schemas/Company' CustomerContactChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CUSTOMER_CONTACT_CREATED - CUSTOMER_CONTACT_UPDATED - CUSTOMER_CONTACT_DELETED data: $ref: '#/components/schemas/CustomerContact' CarrierChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CARRIER_CREATED - CARRIER_UPDATED - CARRIER_DELETED data: $ref: '#/components/schemas/Carrier' VendorChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - VENDOR_CREATED - VENDOR_UPDATED - VENDOR_DELETED data: $ref: '#/components/schemas/Vendor' VendorContactChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - VENDOR_CONTACT_CREATED - VENDOR_CONTACT_UPDATED - VENDOR_CONTACT_DELETED data: $ref: '#/components/schemas/VendorContact' ShipmentDeliveredPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - SHIPMENT_DELIVERED data: type: object required: - id - friendlyId properties: id: type: string format: uuid description: Shipment UUID example: 660e8400-e29b-41d4-a716-446655440000 friendlyId: type: string description: Human-readable shipment ID example: SHP-12345 key: type: string description: Your system's reference ID for this shipment (if set) example: ERP-SHIP-789 nullable: true CarrierPaymentMethodReference: type: object description: | Carrier payment method reference for embedding in Carrier responses. Identical to CarrierPaymentMethod but excludes the carrier and carrierId fields to avoid circular references. required: - id - paymentRecipientType - paymentMethodType - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique carrier payment method identifier example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference identifier example: CARRIER-PM-001 nullable: true paymentRecipientType: $ref: '#/components/schemas/PaymentRecipientType' description: Who receives the payment (DIRECT or FACTOR) paymentMethodType: $ref: '#/components/schemas/PaymentMethodType' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@carrier.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method example: Carrier Payments LLC nullable: true username: type: string description: Username for payment platforms example: carrier_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Carrier Transport Inc nullable: true accountNumber: type: string description: Bank account number (masked in responses) example: '****1234' nullable: true abaAch: type: string description: ABA/ACH routing number example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code example: USD nullable: true carrierFactor: description: Factoring company reference (when paymentRecipientType is FACTOR) $ref: '#/components/schemas/CarrierFactorReference' nullable: true paymentTerm: description: Payment terms $ref: '#/components/schemas/PaymentTermReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the payment method was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the payment method was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the payment method was soft deleted example: null nullable: true deletedBy: readOnly: true description: User who deleted this payment method $ref: '#/components/schemas/UserReference' nullable: true CarrierContactReference: type: object description: | Carrier contact reference for embedding in Carrier responses. Identical to CarrierContact but excludes the carrier and carrierId fields to avoid circular references. required: - id - name - contactInfo - createdAt properties: object: type: string enum: - CARRIER_CONTACT readOnly: true description: Object type identifier example: CARRIER_CONTACT id: type: string format: uuid readOnly: true description: Unique contact identifier example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CARRIER-CONTACT-001 nullable: true name: type: string description: Contact person's name example: Jane Dispatcher contactInfo: allOf: - $ref: '#/components/schemas/ContactInfo' description: Contact information details (email, phone, title) contactTypes: type: array items: $ref: '#/components/schemas/CarrierContactType' description: Types/roles this contact serves example: - DISPATCH - AFTER_HOURS nullable: true invitedUser: readOnly: true description: User account invited/created for this contact $ref: '#/components/schemas/UserReference' nullable: true deletedBy: readOnly: true description: User who deleted this contact $ref: '#/components/schemas/UserReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted example: null nullable: true AgentCarrier: allOf: - $ref: '#/components/schemas/CarrierBase' - type: object description: Agent (interline/partner agent) carrier required: - type properties: type: type: string enum: - AGENT description: Carrier type discriminator example: AGENT AgentCarrierInput: allOf: - $ref: '#/components/schemas/CarrierInputBase' - type: object description: Input for creating an agent carrier required: - type properties: type: type: string enum: - AGENT description: Carrier type discriminator (must be AGENT) example: AGENT AgentCarrierPatch: allOf: - $ref: '#/components/schemas/CarrierPatchBase' - type: object description: Partial update for agent carrier properties: type: type: string enum: - AGENT description: Carrier type discriminator (optional - only needed if changing type) example: AGENT UUIDSearchCriteria: type: object required: - operator description: Search criteria for UUID fields properties: operator: type: string enum: - EQUALS - NOT_EQUALS - ONE_OF - NOT_ONE_OF - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `ONE_OF`: Matches any UUID in array - `NOT_ONE_OF`: Does not match any UUID in array - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null values: type: array items: type: string format: uuid description: Array of UUIDs for ONE_OF or NOT_ONE_OF operators example: - 550e8400-e29b-41d4-a716-446655440000 - 550e8400-e29b-41d4-a716-446655440001 example: operator: EQUALS values: - 550e8400-e29b-41d4-a716-446655440000 KeywordSearchCriteria: type: object required: - operator description: Search criteria for keyword fields (exact match, no partial matching) properties: operator: type: string enum: - EQUALS - NOT_EQUALS - ONE_OF - NOT_ONE_OF - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `ONE_OF`: Matches any value in array - `NOT_ONE_OF`: Does not match any value in array - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null values: type: array items: type: string description: Array of values for ONE_OF or NOT_ONE_OF operators example: - ACTIVE - PENDING example: operator: ONE_OF values: - ACTIVE - PENDING TextSearchCriteria: type: object required: - operator description: Search criteria for text fields (supports wildcards and partial matching) properties: operator: type: string enum: - EQUALS - NOT_EQUALS - STARTS_WITH - ENDS_WITH - INCLUDES - ONE_OF - NOT_ONE_OF - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `STARTS_WITH`: Begins with prefix - `ENDS_WITH`: Ends with suffix - `INCLUDES`: Contains substring - `ONE_OF`: Matches any value in array - `NOT_ONE_OF`: Does not match any value in array - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null values: type: array items: type: string description: Array of values for ONE_OF or NOT_ONE_OF operators example: - value1 - value2 example: operator: INCLUDES values: - search term IntSearchCriteria: type: object required: - operator description: Search criteria for integer fields properties: operator: type: string enum: - EQUALS - NOT_EQUALS - GREATER_THAN - LESS_THAN - BETWEEN - NOT_BETWEEN - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `GREATER_THAN`: Greater than value - `LESS_THAN`: Less than value - `BETWEEN`: Between min and max (inclusive) - `NOT_BETWEEN`: Not between min and max - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null value: type: integer description: Single value for EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN min: type: integer description: Minimum value for BETWEEN or NOT_BETWEEN max: type: integer description: Maximum value for BETWEEN or NOT_BETWEEN example: operator: BETWEEN min: 10 max: 100 FloatSearchCriteria: type: object required: - operator description: Search criteria for float/decimal fields properties: operator: type: string enum: - EQUALS - NOT_EQUALS - GREATER_THAN - LESS_THAN - BETWEEN - NOT_BETWEEN - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `GREATER_THAN`: Greater than value - `LESS_THAN`: Less than value - `BETWEEN`: Between min and max (inclusive) - `NOT_BETWEEN`: Not between min and max - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null value: type: number format: float description: Single value for EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN min: type: number format: float description: Minimum value for BETWEEN or NOT_BETWEEN max: type: number format: float description: Maximum value for BETWEEN or NOT_BETWEEN example: operator: GREATER_THAN value: 1000.5 RelativeTimeUnit: type: string enum: - YEAR - MONTH - WEEK - DAY - HOUR - MINUTE - SECOND description: | Time unit for relative time calculations: - `YEAR`: Years - `MONTH`: Months - `WEEK`: Weeks - `DAY`: Days - `HOUR`: Hours - `MINUTE`: Minutes - `SECOND`: Seconds DatetimeSearchCriteria: type: object required: - operator description: | Search criteria for datetime fields. Supports both absolute datetime values and relative time expressions. properties: operator: type: string enum: - EQUALS - NOT_EQUALS - BEFORE - AFTER - BETWEEN - NOT_BETWEEN - EXISTS - DOES_NOT_EXIST description: | Search operator: - `EQUALS`: Exact match - `NOT_EQUALS`: Not equal to - `BEFORE`: Before datetime - `AFTER`: After datetime - `BETWEEN`: Between min and max (inclusive) - `NOT_BETWEEN`: Not between min and max - `EXISTS`: Field has a value (not null) - `DOES_NOT_EXIST`: Field is null value: type: string format: date-time description: Absolute datetime for EQUALS, NOT_EQUALS example: '2025-01-15T10:00:00Z' min: type: string format: date-time description: Minimum datetime for BETWEEN or NOT_BETWEEN example: '2025-01-01T00:00:00Z' max: type: string format: date-time description: Maximum datetime for BETWEEN or NOT_BETWEEN example: '2025-12-31T23:59:59Z' valueRelative: type: integer description: | Relative time from now (negative for past, positive for future). Example: -7 with WEEK unit means 7 weeks ago. valueRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' minRelative: type: integer description: Relative time for min boundary minRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' maxRelative: type: integer description: Relative time for max boundary maxRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' example: operator: AFTER value: '2025-01-01T00:00:00Z' SearchPaginationInput: type: object description: Pagination options for search requests properties: pageNumber: type: integer minimum: 1 default: 1 description: Page number (1-based) example: 1 pageSize: type: integer minimum: 1 maximum: 250 default: 50 description: Number of results per page (max 250) example: 50 example: pageNumber: 1 pageSize: 50 SearchSortOption: type: object required: - field - order description: Sort option for search results properties: field: type: string description: Field name to sort by (must be an indexed field) example: createdAt order: type: string enum: - asc - desc description: Sort direction (ascending or descending) example: desc example: field: createdAt order: desc SearchPaginationInfo: type: object required: - pageNumber - pageSize - totalPages description: Pagination information for search results properties: pageNumber: type: integer description: Current page number example: 1 pageSize: type: integer description: Number of results returned on this page example: 50 totalPages: type: integer description: Total number of pages available example: 25 example: pageNumber: 1 pageSize: 50 totalPages: 25 ShowNotes: type: string enum: - ALL - SPLIT description: | Controls whether external notes are shown on all documents or split from carrier-facing notes. - `ALL`: Use external notes on customer-facing and carrier-facing documents - `SPLIT`: Use external notes on customer-facing documents and carrier notes on carrier-facing documents CustomerContactReference: type: object description: | Customer contact reference for embedding in Customer responses. Identical to CustomerContact but excludes the customer and customerId fields to avoid circular references. required: - id - name - isPrimary - contactInfo - createdAt properties: object: type: string enum: - CUSTOMER_CONTACT readOnly: true description: Object type identifier example: CUSTOMER_CONTACT id: type: string format: uuid readOnly: true description: Unique contact identifier example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-CONTACT-JOHN-001 nullable: true name: type: string description: Contact person's name example: John Smith contactInfo: allOf: - $ref: '#/components/schemas/ContactInfo' description: Contact information details (email, phone, title) phoneExtension: type: string description: Phone extension specific to this contact role example: '1234' nullable: true isPrimary: type: boolean description: Whether this is the primary contact example: true contactTypes: type: array items: $ref: '#/components/schemas/CustomerContactType' description: Types/roles this contact serves example: - BILLING - ACCOUNT_MANAGER nullable: true notifications: type: array items: $ref: '#/components/schemas/CustomerContactNotificationType' description: Shipment notification types example: - SHIPMENT_PICKED_UP - SHIPMENT_DELIVERED nullable: true invitedUser: readOnly: true description: User account invited/created for this contact $ref: '#/components/schemas/UserReference' nullable: true deletedBy: readOnly: true description: User who deleted this contact $ref: '#/components/schemas/UserReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted example: null nullable: true DateSearchCriteria: type: object required: - operator description: | Search criteria for date fields (no time component). Supports both absolute date values and relative time expressions. properties: operator: type: string enum: - EQUALS - NOT_EQUALS - BEFORE - AFTER - BETWEEN - NOT_BETWEEN - EXISTS - DOES_NOT_EXIST description: Search operator (same as DatetimeSearchCriteria) value: type: string format: date description: Absolute date for EQUALS, NOT_EQUALS example: '2025-01-15' min: type: string format: date description: Minimum date for BETWEEN or NOT_BETWEEN example: '2025-01-01' max: type: string format: date description: Maximum date for BETWEEN or NOT_BETWEEN example: '2025-12-31' valueRelative: type: integer description: Relative time from now valueRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' minRelative: type: integer minRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' maxRelative: type: integer maxRelativeUnit: $ref: '#/components/schemas/RelativeTimeUnit' example: operator: BETWEEN min: '2025-01-01' max: '2025-01-31' LocationAddressInput: allOf: - $ref: '#/components/schemas/AddressInput' - type: object required: - state - zipCode description: | Address for a customer location. Same shape as AddressInput, but `state` and `zipCode` are required (location addresses always carry them). BooleanSearchCriteria: type: object required: - operator description: Search criteria for boolean fields properties: operator: type: string enum: - 'TRUE' - 'FALSE' description: | Search operator: - `TRUE`: Field is true - `FALSE`: Field is false example: operator: 'TRUE' EquipmentCategory: type: object required: - id - name properties: id: type: string format: uuid description: Category id (use as the `categoryId` list filter) name: type: string description: Category display name example: Van EquipmentGroup: type: object required: - id - name properties: id: type: string format: uuid description: Group id (use as the `groupId` list filter) name: type: string description: Top-level group display name example: Trailer EquipmentSubcategory: type: object required: - id - name properties: id: type: string format: uuid description: Subcategory id (use as the `subcategoryId` list filter) name: type: string description: Subcategory display name Equipment: type: object required: - id - name properties: id: type: string format: uuid description: Equipment id (referenced by order/load equipment arrays) name: type: string description: Display name (e.g., "Van 53'") example: Van 53' category: description: Equipment category $ref: '#/components/schemas/EquipmentCategory' nullable: true group: description: Top-level equipment group $ref: '#/components/schemas/EquipmentGroup' nullable: true subcategory: description: Equipment subcategory $ref: '#/components/schemas/EquipmentSubcategory' nullable: true ChargeCode: type: object required: - id - code - name - description properties: id: type: integer description: Charge code id (referenced by charge `chargeCodeId` fields) example: 1 code: type: string description: Short accounting code example: LH name: type: string description: Display name example: Linehaul description: type: string description: Full description example: Linehaul charges SpecialRequirementType: type: string enum: - EQUIPMENT - DRIVER - FREIGHT - SHIPPER_LOCATION description: | What the requirement applies to. - `EQUIPMENT`: Equipment accessories (e.g., tarps, straps) - `DRIVER`: Driver services (e.g., team service, TWIC) - `FREIGHT`: Freight handling characteristics - `SHIPPER_LOCATION`: Location constraints SpecialRequirement: type: object required: - id - name - type properties: id: type: string format: uuid description: Special-requirement id (referenced by order/load specialRequirements arrays) name: type: string description: Display name (e.g., "Tarps") example: Tarps type: $ref: '#/components/schemas/SpecialRequirementType' UserReference-2: type: object description: | User reference for embedding in Team responses. Identical to User but excludes the teams array to avoid circular references. required: - id - email - status - roles - createdAt - updatedAt properties: object: type: string enum: - USER readOnly: true description: Object type identifier example: USER id: type: string format: uuid readOnly: true description: Unique user identifier example: 550e8400-e29b-41d4-a716-446655440000 email: type: string format: email description: User's email address example: john.doe@example.com name: type: string description: User's full name example: John Doe nullable: true phone: type: string description: User's phone number example: +1-555-123-4567 nullable: true phoneExt: type: string description: Phone extension example: '123' nullable: true status: $ref: '#/components/schemas/UserStatus' roles: type: array description: User's roles within the organization items: $ref: '#/components/schemas/UserRole' example: - CUSTOMER_REP - ADMIN key: type: string maxLength: 512 description: Client-defined reference identifier for this user example: ERP-USER-12345 nullable: true datUsername: type: string description: DAT (Load Board) integration username example: johndoe_dat nullable: true mcpUsername: type: string description: MyCarrierPortal integration username example: johndoe_mcp nullable: true avatarId: type: string format: uuid description: Profile avatar document ID example: 7c9e6679-7425-40de-944b-e07fc1f90ae7 nullable: true createdAt: type: string format: date-time readOnly: true description: Timestamp when user was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when user was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when user was soft-deleted (null if active) example: null nullable: true TeamReference: type: object description: | Team reference for embedding in User responses. Identical to Team but excludes the users array to avoid circular references. required: - id - name - createdAt - updatedAt properties: object: type: string enum: - TEAM readOnly: true description: Object type identifier example: TEAM id: type: string format: uuid readOnly: true description: Unique team identifier example: 123e4567-e89b-12d3-a456-426614174000 name: type: string description: Team name example: Sales Team - West Coast key: type: string maxLength: 512 description: Client-defined reference identifier for this team example: ERP-TEAM-WEST nullable: true createdAt: type: string format: date-time readOnly: true description: Timestamp when team was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: Timestamp when team was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: Timestamp when team was soft-deleted (null if active) example: null nullable: true Currency-2: type: string description: Currency code enum: - ARS - AUD - BRL - CAD - CNY - EUR - GBP - IDR - INR - JPY - KRW - MXN - RUB - SAR - TRY - USD - ZAR CurrencyFilter: type: object description: Filter for currency enum field properties: equalTo: $ref: '#/components/schemas/Currency-2' description: Exact match notEqualTo: $ref: '#/components/schemas/Currency-2' description: Not equal to in: type: array items: $ref: '#/components/schemas/Currency-2' description: Matches any value in the list notIn: type: array items: $ref: '#/components/schemas/Currency-2' description: Does not match any value in the list isNull: type: boolean description: Field is null (true) or not null (false) PaymentMethodType-2: type: string description: Payment method type enum: - ACH_WIRE - ZELLE - VENMO - ACH - CHECK - WIRE - CAD_EFT - TRIUMPH_PAY - COMCHECK - EFS - ECHECK example: ACH VendorPaymentMethodReference: type: object description: | Vendor payment method reference for embedding in Vendor responses. Identical to VendorPaymentMethod but excludes the vendor and vendorId fields to avoid circular references. required: - id - paymentMethodType - createdAt - updatedAt properties: id: type: string format: uuid readOnly: true description: Unique vendor payment method identifier example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference identifier example: VENDOR-PM-001 nullable: true paymentMethodType: $ref: '#/components/schemas/PaymentMethodType-2' description: How payment is made status: type: string description: Payment method status example: ACTIVE nullable: true isPreferred: type: boolean description: Whether this is the preferred payment method example: true nullable: true email: type: string format: email description: Email address for payment notifications example: payments@vendor.com nullable: true phone: type: string description: Phone number for payment contact example: +1-555-123-4567 nullable: true companyName: type: string description: Company name for this payment method example: Vendor Payments LLC nullable: true username: type: string description: Username for payment platforms example: vendor_payments nullable: true bankName: type: string description: Bank name example: Chase Bank nullable: true bankAddress: type: string description: Bank address example: 123 Bank Street, Dallas, TX 75201 nullable: true accountName: type: string description: Bank account holder name example: Vendor Services Inc nullable: true accountNumber: type: string description: Bank account number (masked in responses) example: '****1234' nullable: true abaAch: type: string description: ABA/ACH routing number example: '021000021' nullable: true wire: type: string description: Wire transfer routing number example: '026009593' nullable: true swiftCode: type: string description: SWIFT/BIC code example: CHASUS33 nullable: true eftInstitution: type: string description: EFT institution number (Canadian banking) example: '001' nullable: true eftTransit: type: string description: EFT transit number (Canadian banking) example: '00010' nullable: true clabe: type: string description: CLABE number (Mexican banking) example: '012180001234567897' nullable: true currency: type: string description: Preferred currency code example: USD nullable: true paymentTerm: description: Payment terms $ref: '#/components/schemas/PaymentTermReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the payment method was created example: '2025-01-15T10:00:00Z' updatedAt: type: string format: date-time readOnly: true description: When the payment method was last updated example: '2025-01-15T14:30:00Z' deletedAt: type: string format: date-time readOnly: true description: When the payment method was soft deleted example: null nullable: true deletedBy: readOnly: true description: User who deleted this payment method $ref: '#/components/schemas/UserReference' nullable: true VendorContactReference: type: object description: | Vendor contact reference for embedding in Vendor responses. Identical to VendorContact but excludes the vendor and vendorId fields to avoid circular references. required: - id - createdAt properties: object: type: string enum: - VENDOR_CONTACT readOnly: true description: Object type identifier example: VENDOR_CONTACT id: type: string format: uuid readOnly: true description: Unique contact identifier example: 550e8400-e29b-41d4-a716-446655440000 key: type: string maxLength: 512 description: Client-defined reference identifier example: ERP-VENDOR-CONTACT-001 nullable: true email: type: string format: email description: Contact email address example: john.smith@abcwarehouse.com nullable: true phone: type: string description: Contact phone number example: +1-555-123-4567 nullable: true role: type: string description: Contact role or title (deprecated - use roles array) example: Billing Manager nullable: true roles: type: array items: $ref: '#/components/schemas/VendorContactRole' description: Types/roles this contact serves example: - BILLING - AGENT nullable: true deletedBy: readOnly: true description: User who deleted this contact $ref: '#/components/schemas/UserReference' nullable: true createdAt: type: string format: date-time readOnly: true description: When the contact was created example: '2025-01-15T10:00:00Z' deletedAt: type: string format: date-time readOnly: true description: When the contact was soft deleted example: null nullable: true PaymentMethodTypeFilter-2: type: object description: Filter for payment method type properties: equalTo: $ref: '#/components/schemas/PaymentMethodType-2' notEqualTo: $ref: '#/components/schemas/PaymentMethodType-2' in: type: array items: $ref: '#/components/schemas/PaymentMethodType-2' notIn: type: array items: $ref: '#/components/schemas/PaymentMethodType-2' ShipmentStatus: type: string enum: - DRAFT - TENDER_PENDING - ON_HOLD - PLANNING - SELECTED - BOOKED - DISPATCHED - LOADING - PICKED_UP - IN_TRANSIT - UNLOADING - ARRIVED_AT_DELIVERY_TERMINAL - OUT_FOR_DELIVERY - RECOVERED - DELIVERED - CANCELED - TENDER_REJECTED - CONSOLIDATED description: | Current status of the shipment. Lifecycle stages: - `DRAFT`: Shipment is being created, not yet ready for processing - `TENDER_PENDING`: Awaiting carrier tender acceptance - `TENDER_REJECTED`: Carrier rejected the tender - `ON_HOLD`: Shipment is temporarily paused - `PLANNING`: Shipment is being planned/scheduled - `SELECTED`: Carrier has been selected - `BOOKED`: Carrier has confirmed the booking - `DISPATCHED`: Shipment has been dispatched to carrier In-transit stages: - `LOADING`: Freight is being loaded at pickup - `PICKED_UP`: Freight has been picked up - `IN_TRANSIT`: Shipment is in transit - `UNLOADING`: Freight is being unloaded at delivery - `ARRIVED_AT_DELIVERY_TERMINAL`: Arrived at delivery terminal (LTL) - `OUT_FOR_DELIVERY`: Out for final delivery - `RECOVERED`: Shipment has been recovered Final stages: - `DELIVERED`: Shipment has been delivered - `CANCELED`: Shipment has been canceled - `CONSOLIDATED`: Merged into a consolidated shipment DocumentEntityType: type: string enum: - ORDER - LOAD - SHIPMENT - CARRIER - CUSTOMER - VENDOR description: | Entity kind for entity-scoped document filtering. - `ORDER`: Customer-side documents attached to an order - `LOAD`: Carrier-side documents attached to a load's carrier assignments - `SHIPMENT`: Everything on the shipment — order and load documents combined - `CARRIER`: Documents on a carrier profile - `CUSTOMER`: Documents on a customer - `VENDOR`: Documents on a vendor DocumentTypeFilter: type: object properties: equalTo: $ref: '#/components/schemas/DocumentType' notEqualTo: $ref: '#/components/schemas/DocumentType' in: type: array items: $ref: '#/components/schemas/DocumentType' notIn: type: array items: $ref: '#/components/schemas/DocumentType' description: Filter for document type field DocumentStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/DocumentStatus' notEqualTo: $ref: '#/components/schemas/DocumentStatus' in: type: array items: $ref: '#/components/schemas/DocumentStatus' notIn: type: array items: $ref: '#/components/schemas/DocumentStatus' description: Filter for document status field QuoteStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/QuoteStatus' notEqualTo: $ref: '#/components/schemas/QuoteStatus' in: type: array items: $ref: '#/components/schemas/QuoteStatus' notIn: type: array items: $ref: '#/components/schemas/QuoteStatus' QuoteSideFilter: type: object properties: equalTo: $ref: '#/components/schemas/QuoteSide' notEqualTo: $ref: '#/components/schemas/QuoteSide' in: type: array items: $ref: '#/components/schemas/QuoteSide' OrderSummary: type: object properties: id: type: string format: uuid key: type: string nullable: true mode: $ref: '#/components/schemas/TransportMode' origin: type: object properties: city: type: string stateProvince: type: string postalCode: type: string nullable: true destination: type: object properties: city: type: string stateProvince: type: string postalCode: type: string nullable: true pickUpDate: type: string format: date nullable: true deliveryDate: type: string format: date nullable: true equipment: type: array items: type: string weight: type: number nullable: true mileage: type: number nullable: true description: Summary of order details (embedded in Quote response) ShipmentSearchCriteria: type: object description: | Search criteria for filtering shipments. Note: Only active (non-deleted) shipments are searchable. properties: id: $ref: '#/components/schemas/UUIDSearchCriteria' friendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' status: $ref: '#/components/schemas/KeywordSearchCriteria' description: Shipment status (PENDING, BOOKED, IN_TRANSIT, DELIVERED, CANCELED, etc.) orderStatus: $ref: '#/components/schemas/KeywordSearchCriteria' description: AR (accounts receivable) status loadStatuses: $ref: '#/components/schemas/KeywordSearchCriteria' description: AP (accounts payable) statuses for carriers/vendors mode: $ref: '#/components/schemas/KeywordSearchCriteria' description: Transportation mode (TL, LTL, AIR, OCEAN, RAIL) tonu: $ref: '#/components/schemas/BooleanSearchCriteria' description: Truck Order Not Used flag pickUp: $ref: '#/components/schemas/TextSearchCriteria' description: Origin city and state pickUpCity: $ref: '#/components/schemas/TextSearchCriteria' pickUpState: $ref: '#/components/schemas/KeywordSearchCriteria' pickUpZipCode: $ref: '#/components/schemas/KeywordSearchCriteria' pickUpCountry: $ref: '#/components/schemas/KeywordSearchCriteria' dropOff: $ref: '#/components/schemas/TextSearchCriteria' description: Destination city and state dropOffCity: $ref: '#/components/schemas/TextSearchCriteria' dropOffState: $ref: '#/components/schemas/KeywordSearchCriteria' dropOffZipCode: $ref: '#/components/schemas/KeywordSearchCriteria' dropOffCountry: $ref: '#/components/schemas/KeywordSearchCriteria' pickUpStartDatetime: $ref: '#/components/schemas/DatetimeSearchCriteria' description: Scheduled pickup datetime dropOffStartDatetime: $ref: '#/components/schemas/DatetimeSearchCriteria' description: Scheduled delivery datetime bookedAt: $ref: '#/components/schemas/DatetimeSearchCriteria' description: When carrier was booked shipperId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Customer ID shipperName: $ref: '#/components/schemas/TextSearchCriteria' description: Customer name carrierIds: $ref: '#/components/schemas/UUIDSearchCriteria' description: Carrier IDs carrierNames: $ref: '#/components/schemas/TextSearchCriteria' description: Carrier names primaryRepId: $ref: '#/components/schemas/UUIDSearchCriteria' primaryRepName: $ref: '#/components/schemas/TextSearchCriteria' bookingRepIds: $ref: '#/components/schemas/UUIDSearchCriteria' bookingRepNames: $ref: '#/components/schemas/TextSearchCriteria' groupId: $ref: '#/components/schemas/UUIDSearchCriteria' description: Team ID groupName: $ref: '#/components/schemas/TextSearchCriteria' description: Team name equipmentType: $ref: '#/components/schemas/KeywordSearchCriteria' weight: $ref: '#/components/schemas/FloatSearchCriteria' totalMiles: $ref: '#/components/schemas/FloatSearchCriteria' revenue: $ref: '#/components/schemas/FloatSearchCriteria' cost: $ref: '#/components/schemas/FloatSearchCriteria' profit: $ref: '#/components/schemas/FloatSearchCriteria' description: Gross profit profitMargin: $ref: '#/components/schemas/FloatSearchCriteria' referenceValues: $ref: '#/components/schemas/TextSearchCriteria' description: Reference values (PO, BOL, customer ref, etc.) customerRef: $ref: '#/components/schemas/KeywordSearchCriteria' bol: $ref: '#/components/schemas/KeywordSearchCriteria' po: $ref: '#/components/schemas/KeywordSearchCriteria' quoteId: $ref: '#/components/schemas/UUIDSearchCriteria' quoteFriendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' arInvoiceId: $ref: '#/components/schemas/UUIDSearchCriteria' arInvoiceFriendlyId: $ref: '#/components/schemas/KeywordSearchCriteria' apInvoiceIds: $ref: '#/components/schemas/UUIDSearchCriteria' apInvoiceFriendlyIds: $ref: '#/components/schemas/KeywordSearchCriteria' createdAt: $ref: '#/components/schemas/DatetimeSearchCriteria' orderCreatedAt: $ref: '#/components/schemas/DatetimeSearchCriteria' ShipmentSearchRequest: type: object description: Request body for searching shipments properties: criteria: $ref: '#/components/schemas/ShipmentSearchCriteria' description: Search criteria to filter shipments pagination: $ref: '#/components/schemas/SearchPaginationInput' sort: type: array items: $ref: '#/components/schemas/SearchSortOption' maxItems: 3 description: Sort options for the search results savedSearch: $ref: '#/components/schemas/SavedSearchLookup' description: Optional saved search to load preferences from format: type: string enum: - flat - full default: flat description: | Response format: - flat: Returns only indexed fields (default, faster) - full: Returns complete shipment objects ShipmentSearchRow: type: object description: | Flattened shipment data from the search index. Pickup location arrays are ordered by ascending stop sequence. Drop-off location arrays are ordered by descending stop sequence, with the final destination first. For a side with multiple stops, its location arrays use matching stop indexes and empty strings preserve missing values. For a side with one stop, an individual missing field is omitted instead of returned as an array containing an empty string, so sibling arrays can be omitted independently. properties: object: type: string enum: - SHIPMENT_SEARCH_ROW description: Object type identifier id: type: string format: uuid friendlyId: type: string example: SHP-0001 status: type: string orderStatus: type: string nullable: true mode: type: string nullable: true tonu: type: boolean nullable: true pickUp: type: array items: type: string description: Origin city and state values for all pickup stops nullable: true pickUpCity: type: array items: type: string nullable: true pickUpState: type: array items: type: string nullable: true pickUpZipCode: type: array items: type: string nullable: true pickUpCountry: type: array items: type: string nullable: true dropOff: type: array items: type: string description: Destination city and state values for all drop-off stops nullable: true dropOffCity: type: array items: type: string nullable: true dropOffState: type: array items: type: string nullable: true dropOffZipCode: type: array items: type: string nullable: true dropOffCountry: type: array items: type: string nullable: true pickUpStartDatetime: type: string format: date-time nullable: true dropOffStartDatetime: type: string format: date-time nullable: true bookedAt: type: string format: date-time nullable: true shipperId: type: string format: uuid shipperName: type: string carrierIds: type: array items: type: string format: uuid carrierNames: type: array items: type: string primaryRepId: type: string format: uuid nullable: true primaryRepName: type: string nullable: true groupId: type: string format: uuid nullable: true groupName: type: string nullable: true equipmentType: type: array items: type: string weight: type: number nullable: true totalMiles: type: number stopsCount: type: integer revenue: type: number cost: type: number profit: type: number nullable: true profitMargin: type: number nullable: true referenceValues: type: array items: type: string createdAt: type: string format: date-time orderCreatedAt: type: string format: date-time required: - object - id - friendlyId - status - shipperId - shipperName - createdAt OrderReference: type: object properties: id: type: string format: uuid type: type: string description: Reference type (e.g., BOL_NUMBER) value: type: string description: Reference value LoadCarrierSummary: type: object properties: id: type: string format: uuid carrier: $ref: '#/components/schemas/CarrierReference' status: type: string enum: - ACTIVE - TONU - BOUNCED bookedAt: type: string format: date-time nullable: true dispatchedAt: type: string format: date-time nullable: true removedAt: type: string format: date-time description: | When this carrier was removed from the load (bounce/TONU). Removed carriers stay in the array as history, but their charges are NOT included in the load's `totalCost`. nullable: true totalCost: type: number nullable: true LoadSummary: type: object properties: id: type: string format: uuid friendlyId: type: string description: Human-readable load ID (e.g., "LD-12345") key: type: string description: Client-defined reference identifier for this load nullable: true status: $ref: '#/components/schemas/ShipmentLifecycleStatus' mode: $ref: '#/components/schemas/TransportMode' carriers: type: array items: $ref: '#/components/schemas/LoadCarrierSummary' description: Flattened carriers array totalCost: type: number nullable: true ServiceSummary: type: object properties: id: type: string format: uuid key: type: string nullable: true vendor: $ref: '#/components/schemas/VendorReference' status: type: string enum: - ACTIVE - AWAITING_INVOICE - INVOICE_IN_REVIEW - APPROVED_TO_PAY - PAID - CANCELED cost: type: number nullable: true ShipmentSearchResponse: type: object description: Response for shipment search requests required: - data - pagination - totalResults properties: data: type: array description: Search results - either flat rows or full shipment objects based on format parameter items: oneOf: - $ref: '#/components/schemas/ShipmentSearchRow' - $ref: '#/components/schemas/Shipment' discriminator: propertyName: object mapping: SHIPMENT_SEARCH_ROW: '#/components/schemas/ShipmentSearchRow' SHIPMENT: '#/components/schemas/Shipment' pagination: $ref: '#/components/schemas/SearchPaginationInfo' totalResults: type: integer description: Total number of matching results minimum: 0 ShipmentStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/ShipmentLifecycleStatus' notEqualTo: $ref: '#/components/schemas/ShipmentLifecycleStatus' in: type: array items: $ref: '#/components/schemas/ShipmentLifecycleStatus' notIn: type: array items: $ref: '#/components/schemas/ShipmentLifecycleStatus' LoadStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/LoadStatus' notEqualTo: $ref: '#/components/schemas/LoadStatus' in: type: array items: $ref: '#/components/schemas/LoadStatus' notIn: type: array items: $ref: '#/components/schemas/LoadStatus' LoadStop: type: object properties: id: type: string format: uuid orderStopId: type: string format: uuid description: Reference to the order stop sequence: type: integer type: type: string enum: - PICKUP - DELIVERY address: allOf: - $ref: '#/components/schemas/Address' description: | Full address from the stop's linked location. Absent when the stop has no linked shipper location. scheduledArrival: type: string format: date-time nullable: true actualArrival: type: string format: date-time nullable: true actualDeparture: type: string format: date-time nullable: true LoadCarrierCharge: type: object properties: id: type: string format: uuid chargeCodeId: type: integer description: Charge code id. Resolve code/name via the reference-data charge-codes endpoint. nullable: true description: type: string nullable: true amount: type: number description: Extended line total (rate × quantity) quantity: type: number default: 1 rate: type: number description: Unit rate for one quantity of this charge nullable: true AddCarrierResponse: type: object required: - loadId - loadCarrierId properties: loadId: type: string format: uuid loadCarrierId: type: string format: uuid description: The new load carrier ID loadCarrier: $ref: '#/components/schemas/LoadCarrier' RebookLoadResponse: type: object required: - originalLoadId - newLoadId properties: originalLoadId: type: string format: uuid newLoadId: type: string format: uuid newLoadKey: type: string nullable: true LoadCarrierRemovalReason: type: string enum: - CAN_NO_LONGER_TAKE_LOAD - LOAD_GIVEN_BACK - RATE_CON_REJECTED - CUSTOMER_NOT_READY_FOR_PU - CONSIGNEE_NOT_READY_FOR_DEL - FORGOT_TO_BOUNCE_CARRIER - OTHER description: | Reason for removing a carrier from a load. Whether the removal counts as a bounce or a TONU is the removal type, tracked separately. ServiceStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/ServiceStatus' notEqualTo: $ref: '#/components/schemas/ServiceStatus' in: type: array items: $ref: '#/components/schemas/ServiceStatus' notIn: type: array items: $ref: '#/components/schemas/ServiceStatus' ServiceCharge: type: object properties: id: type: string format: uuid chargeCode: $ref: '#/components/schemas/ResourceReference' description: type: string nullable: true amount: type: number quantity: type: number default: 1 InvoiceStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/InvoiceStatus' notEqualTo: $ref: '#/components/schemas/InvoiceStatus' in: type: array items: $ref: '#/components/schemas/InvoiceStatus' notIn: type: array items: $ref: '#/components/schemas/InvoiceStatus' PaymentMethodType-3: type: string enum: - ACH_WIRE - ZELLE - VENMO - CHECK - EFT_DIRECT_DEPOSIT - E_TRANSFER - CREDIT_CARD description: | Payment method type. - `ACH_WIRE`: ACH or wire transfer - `ZELLE`: Zelle payment - `VENMO`: Venmo payment - `CHECK`: Paper check - `EFT_DIRECT_DEPOSIT`: EFT direct deposit - `E_TRANSFER`: Electronic transfer - `CREDIT_CARD`: Credit card payment PaymentMethodTypeFilter-3: type: object properties: equalTo: $ref: '#/components/schemas/PaymentMethodType-3' notEqualTo: $ref: '#/components/schemas/PaymentMethodType-3' in: type: array items: $ref: '#/components/schemas/PaymentMethodType-3' CreditMemoStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/CreditMemoStatus' notEqualTo: $ref: '#/components/schemas/CreditMemoStatus' in: type: array items: $ref: '#/components/schemas/CreditMemoStatus' BillStatusFilter: type: object properties: equalTo: $ref: '#/components/schemas/BillStatus' notEqualTo: $ref: '#/components/schemas/BillStatus' in: type: array items: $ref: '#/components/schemas/BillStatus' notIn: type: array items: $ref: '#/components/schemas/BillStatus' BillEntityTypeFilter: type: object properties: equalTo: $ref: '#/components/schemas/BillEntityType' in: type: array items: $ref: '#/components/schemas/BillEntityType' BillPaymentMethodTypeFilter: type: object properties: equalTo: $ref: '#/components/schemas/BillPaymentMethodType' in: type: array items: $ref: '#/components/schemas/BillPaymentMethodType' CarrierFactorReference-2: type: object properties: id: type: string format: uuid companyName: type: string bankName: type: string nullable: true BillPaymentApplicationPatch: type: object properties: id: type: string format: uuid description: Existing application ID (for update) billId: type: string format: uuid description: Bill ID (for new applications) amount: type: number minimum: 0.01 delete: type: boolean description: Set to true to remove this application CarrierContactChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CARRIER_CONTACT_CREATED - CARRIER_CONTACT_UPDATED - CARRIER_CONTACT_DELETED data: $ref: '#/components/schemas/CarrierContact' CarrierFactorChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CARRIER_FACTOR_CREATED - CARRIER_FACTOR_UPDATED - CARRIER_FACTOR_DELETED data: $ref: '#/components/schemas/CarrierFactor' CarrierPaymentMethodChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - CARRIER_PAYMENT_METHOD_CREATED - CARRIER_PAYMENT_METHOD_UPDATED - CARRIER_PAYMENT_METHOD_DELETED data: $ref: '#/components/schemas/CarrierPaymentMethod' VendorPaymentMethodChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - VENDOR_PAYMENT_METHOD_CREATED - VENDOR_PAYMENT_METHOD_UPDATED - VENDOR_PAYMENT_METHOD_DELETED data: $ref: '#/components/schemas/VendorPaymentMethod' LocationChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - LOCATION_CREATED - LOCATION_UPDATED - LOCATION_DELETED data: $ref: '#/components/schemas/Location' LocationContactChangedPayload: allOf: - $ref: '#/components/schemas/WebhookPayload' - type: object properties: event: type: string enum: - LOCATION_CONTACT_CREATED - LOCATION_CONTACT_UPDATED - LOCATION_CONTACT_DELETED data: $ref: '#/components/schemas/LocationContact' DiffOperation: type: string description: The type of diff operation from json-diff-ts enum: - REMOVE - ADD - UPDATE DiffChange: type: object description: | Represents a single change from json-diff-ts IChange interface. For nested object changes, the changes array will contain child changes. required: - type - key properties: type: $ref: '#/components/schemas/DiffOperation' key: type: string description: The property name that changed example: status embeddedKey: type: string description: Optional key used when comparing array elements by identifier example: id value: description: | The new value being set. - For ADD: The value being added - For UPDATE: The new value replacing the old one - For REMOVE: Not present example: INACTIVE oldValue: description: | The previous value (only present for UPDATE operations). example: ACTIVE changes: type: array description: Nested changes for complex objects items: $ref: '#/components/schemas/DiffChange' WebhookDelivery: type: object description: The top-level webhook delivery payload containing one or more events required: - sentAt - events properties: sentAt: type: string format: date-time description: ISO 8601 timestamp when the webhook was sent from MVMNT example: '2025-01-15T14:30:00Z' events: type: array description: Array of webhook events (typically contains a single event) minItems: 1 items: $ref: '#/components/schemas/WebhookPayload' securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT description: OAuth 2.0 access token obtained via client credentials flow