{"openapi":"3.0.1","info":{"title":"Oway Shipper API","description":"Shipper integration API for requesting quotes, creating shipments, tracking, and retrieving documents.","contact":{"name":"Oway Support","email":"support@oway.io"},"version":"1.0.0"},"externalDocs":{"description":"Oway API Developer Portal","url":"https://oway.readme.io"},"servers":[{"url":"https://api.oway.io","description":"Production"},{"url":"https://api.sandbox.oway.io","description":"Sandbox Environment"}],"security":[{"bearerAuth":[],"apiKey":[]}],"tags":[{"name":"Shipper API","description":"Shipper integration endpoints for quotes and shipments.\n\n**Authentication & Authorization Required:**\n\nAll endpoints require BOTH credentials:\n1. **Bearer Token** (`authorization: Bearer {token}`) - Proves identity, requires `shipper` scope\n2. **API Key** (`x-oway-api-key: oway_sk_...`) - Determines which company's resources you can access\n\nThe API key is tied to your shipper company and automatically scopes all operations to that company's data.\nSee the Authentication section above for details on obtaining credentials.\n"}],"paths":{"/v1/shipper/shipment/{orderNumber}/confirm":{"put":{"tags":["Shipper API"],"summary":"Confirm a shipment by order number","description":"Confirms an existing shipment using its order number (PRO number).\nMoves the shipment from INITIALIZED to CONFIRMED state.\n\n**Prerequisites:**\n- The order must be in INITIALIZED state\n- The order must have an associated quote\n\n**Validation Requirements:**\n\nThe following fields are validated during confirmation. If any are missing or invalid,\nthe shipment will remain in INITIALIZED state.\n\n*Address Fields (required on BOTH pickup and delivery addresses):*\n- `name` - Location/company name\n- `address1` - Street address\n- `zipCode` - ZIP code\n- `contactPerson` - Contact name\n- `phoneNumber` - Contact phone (E.164 format, e.g., \"+15551234567\")\n- `openTime` - Opening time in HH:mm format (defaults to \"10:00\")\n- `closeTime` - Closing time in HH:mm format (defaults to \"16:00\")\n\n*Order Fields:*\n- `description` - Must not be empty\n- `totalPalletCount` - Must be between 1 and 51\n- `totalPoundsWeight` - Must be between 1 and 2,500 lbs per pallet\n\n*Order Component Fields (per component):*\n- `palletCount` - Must be at least 1\n- `poundsWeight` - Must be between 1 and 2,500 lbs per pallet\n- `palletDimensions` - Must be valid dimensions within limits (subject to change, these are configurable):\n  - Standard: max 60x52x94 inches (LxWxH) - pallets exceeding these are charged as oversized\n  - Oversized maximum: 95x95x96 inches - no pallet can exceed this\n  - With liftgate: max 62x62x94 inches\n\n*Component Totals:*\n- Sum of component `palletCount` must equal order `totalPalletCount`\n- Sum of component `poundsWeight` must equal order `totalPoundsWeight`\n","operationId":"confirmShipment","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"}],"responses":{"200":{"description":"Shipment confirmed successfully. Verify the response contains `orderStatus: CONFIRMED` to ensure confirmation succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment"}}}},"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: orderNumber is required, order is not in INITIALIZED state, or is missing a quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Shipment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment/{orderNumber}/cancel":{"put":{"tags":["Shipper API"],"summary":"Cancel a shipment by order number","description":"Cancels an existing shipment using its order number (PRO number). Shipments can only be cancelled when they are in a cancellable state (e.g., before pickup).","operationId":"cancelShipment","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"}],"responses":{"400":{"description":"Invalid request: orderNumber is required, or order cannot be cancelled in its current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Shipment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Shipment cancelled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment":{"post":{"tags":["Shipper API"],"summary":"Create a new shipment","description":"Creates a new shipment order. Optionally reference a previously generated quote. The shipment must be confirmed after creation.\n\n**Note:** The `companyId` is automatically extracted from your API key.\nYou do not need to provide this value in the request body.\n\nFor M2M (machine-to-machine) integrations, no user context is required.\n","operationId":"createShipment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShipmentRequest"}}},"required":true},"responses":{"422":{"description":"Unprocessable Entity. Possible reasons:\n\n- **Location Not Serviceable** (`reason: no_coverage`) — the lane is not within Oway's active coverage area.\n- **Request Not Permitted** (`reason: account_restriction`) — the requested truck type or accessorial is not enabled for your account. Contact your Oway representative to update your available options.\n- **Daily Trip Limit Reached** (`reason: daily_trip_limit`) — your account has reached its maximum shipments for the requested pickup date. You can still place orders for other dates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: validation error, quote mismatch, or expired quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Shipment created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden: missing/invalid API key, user not in company, or quote not owned by company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/quote":{"post":{"tags":["Shipper API"],"summary":"Request a shipping quote","description":"Generates a price quote for a shipment based on origin, destination, and cargo details. The quote is valid for 2 days.\n\n**Note:** The `companyId` is automatically extracted from your API key.\nYou do not need to provide this value in the request body.\n\nFor M2M (machine-to-machine) integrations, no user context is required.\n","operationId":"requestQuote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"422":{"description":"Unprocessable Entity. Possible reasons:\n\n- **Location Not Serviceable** (`reason: no_coverage`) — the lane is not within Oway's active coverage area.\n- **Request Not Permitted** (`reason: account_restriction`) — the requested truck type or accessorial is not enabled for your account. Contact your Oway representative to update your available options.\n- **Daily Trip Limit Reached** (`reason: daily_trip_limit`) — your account has reached its maximum shipments for the requested pickup date. You can still place orders for other dates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Quote generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden: missing/invalid API key, or user does not belong to the authorized company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment/{orderNumber}":{"get":{"tags":["Shipper API"],"summary":"Get a shipment by order number","description":"Retrieves a shipment by its order number (PRO number). The order number is a 5-character alphanumeric code (e.g., ZKYQ5) that uniquely identifies the shipment.","operationId":"getShipment","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"}],"responses":{"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Shipment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: orderNumber is required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Shipment retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment/{orderNumber}/tracking":{"get":{"tags":["Shipper API"],"summary":"Track a shipment by order number","description":"Retrieves tracking information for a shipment by its order number (PRO number). Returns status and estimated/actual pickup and delivery dates.","operationId":"trackShipment","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"}],"responses":{"200":{"description":"Tracking information retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tracking"}}}},"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Shipment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: orderNumber is required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment/{orderNumber}/invoice":{"get":{"tags":["Shipper API"],"summary":"Get itemized invoice for a delivered shipment","description":"Retrieves the itemized invoice for a delivered shipment.\nThe invoice includes all charges (base freight, accessorials) and line items.\n\n**Note:** This endpoint is only available for shipments in DELIVERED state.\nInvoices are finalized when a shipment is delivered.\n","operationId":"getInvoice","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"}],"responses":{"200":{"description":"Invoice retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceResponse"}}}},"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"400":{"description":"Invalid request: orderNumber is required, or shipment is not in DELIVERED state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Shipment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/shipment/{orderNumber}/document/{documentType}":{"get":{"tags":["Shipper API"],"summary":"Get a shipment document by order number","description":"Retrieves a download link for a shipment document using the order number (PRO number). Supported document types: BILL_OF_LADING, INVOICE, SHIPPING_LABEL, POD.","operationId":"getDocument","parameters":[{"name":"orderNumber","in":"path","description":"Order number (5-character alphanumeric code, commonly called PRO number)","required":true,"schema":{"type":"string"},"example":"ZKYQ5"},{"name":"documentType","in":"path","description":"Type of document to retrieve","required":true,"schema":{"type":"string","enum":["BILL_OF_LADING","INVOICE","SHIPPING_LABEL","POD"]}}],"responses":{"400":{"description":"Invalid request: orderNumber and documentType are required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden: missing/invalid API key, or shipment does not belong to your company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Document URL retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponse"}}}},"404":{"description":"Shipment or document not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/shipper/quote/{quoteId}":{"get":{"tags":["Shipper API"],"summary":"Get a quote by ID","description":"Retrieves an existing quote by its unique identifier. Quotes are valid for 2 days from creation.","operationId":"getQuote","parameters":[{"name":"quoteId","in":"path","description":"Unique quote ID","required":true,"schema":{"type":"string"}}],"responses":{"400":{"description":"Invalid request: quote ID format is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"200":{"description":"Quote retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"404":{"description":"Quote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized: missing or invalid Bearer token (authentication failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden: missing, invalid, or expired API key (authorization failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}},"components":{"schemas":{"Shipment":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the order","example":"67b6c5fcfbf1be6b24127646"},"companyId":{"type":"string","description":"Company ID that owns this order","example":"67c0dfa95bff090747660465"},"userId":{"type":"string","description":"User ID who created this order","example":"679410f5b074882a64b9ea7f"},"orderNumber":{"type":"string","description":"Human-readable PRO number for the shipment (5-character alphanumeric)","example":"ZKYQ5"},"orderStatus":{"type":"string","description":"Current shipment status in the order lifecycle","example":"CONFIRMED","enum":["INITIALIZED","CONFIRMED","ACCEPTED","ASSIGNED","PICKED_UP","IN_TRANSIT","DELIVERED","CANCELLED"],"x-enumDescriptions":{"CANCELLED":"Shipment cancelled","DELIVERED":"Shipment delivered to destination","ACCEPTED":"Carrier has accepted the shipment","INITIALIZED":"Shipment created but not yet confirmed for pickup","CONFIRMED":"Shipment confirmed and awaiting carrier assignment","IN_TRANSIT":"Freight in transit (alias for PICKED_UP)","ASSIGNED":"Driver assigned and scheduled for pickup","PICKED_UP":"Freight picked up and in transit"}},"totalPriceInCents":{"type":"integer","description":"Total price of the order in cents (USD)","format":"int32","example":125000},"createdAt":{"type":"string","description":"Time when the order was created (ISO 8601 format)","format":"date-time","example":"2025-02-20T17:31:10.43Z"},"updatedAt":{"type":"string","description":"Time when the order was last updated (ISO 8601 format)","format":"date-time","example":"2025-02-27T22:51:49.865Z"}},"description":"Shipment/Order details"},"ProblemDetail":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type","example":"https://api.oway.io/errors/location-not-serviceable"},"title":{"type":"string","description":"A short, human-readable summary of the problem type","example":"Bad Request"},"status":{"type":"integer","description":"The HTTP status code","format":"int32","example":400},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem","example":"pickupAddress.zipCode must be a 5-digit ZIP code"},"reason":{"type":"string","description":"A machine-readable reason code for programmatic handling","example":"pickup_not_covered"},"violations":{"type":"array","description":"Per-field validation failures when a request is rejected for one or more invalid fields. Present only on validation-style errors.","items":{"$ref":"#/components/schemas/Violation"}}},"description":"RFC 9457 Problem Details error response"},"Violation":{"type":"object","properties":{"field":{"type":"string","description":"Field path that failed validation","example":"orderComponents[0].dimensions"},"reason":{"type":"string","description":"Human-readable reason the field is invalid","example":"Component dimensions of 77x71x86 are invalid (pallets must be less than 95x95x96, and either length or width may exceed 60 but not both)"}},"description":"A single field-level validation failure."},"Address":{"required":["address1","city","contactPerson","name","phoneNumber","state","zipCode"],"type":"object","properties":{"name":{"type":"string","description":"Name of the location or business","example":"Fairgrounds Distribution Center"},"address1":{"type":"string","description":"Primary street address","example":"1531 Junipero Avenue"},"address2":{"type":"string","description":"Secondary address line (suite, unit, etc.)","example":"Dock 5"},"city":{"type":"string","description":"City name","example":"Long Beach"},"state":{"pattern":"[A-Z]{2}","type":"string","description":"Two-letter state abbreviation","example":"CA"},"zipCode":{"pattern":"\\d{5}","type":"string","description":"5-digit ZIP code","example":"90804"},"phoneNumber":{"pattern":"^\\+[1-9]\\d{1,14}$","type":"string","description":"Contact phone number in E.164 format","example":"+18087857650"},"contactPerson":{"type":"string","description":"Name of the contact person at this location","example":"Mike Johnson"},"openTime":{"pattern":"^([01]?[0-9]|2[0-3]):[0-5][0-9]$","type":"string","description":"Opening time for the location in 24-hour format (HH:mm). Defaults to 10:00 if not provided.","example":"10:00"},"closeTime":{"pattern":"^([01]?[0-9]|2[0-3]):[0-5][0-9]$","type":"string","description":"Closing time for the location in 24-hour format (HH:mm). Defaults to 16:00 if not provided.","example":"16:00"},"notes":{"type":"string","description":"Additional notes or instructions for the driver","example":"Dock 3, enter from back of building"},"liftgateRequired":{"type":"boolean","description":"Whether a liftgate is required at this location","example":false},"limitedAccess":{"type":"boolean","description":"Whether this is a limited access location (residential, construction site, etc.)","example":false},"appointmentRequired":{"type":"boolean","description":"Whether an appointment is required for pickup/delivery","example":true},"callAheadRequired":{"type":"boolean","description":"Whether a call-ahead notification is required before pickup/delivery. When true, the carrier will call the contact person before arriving at the location.","example":true}},"description":"Address information for pickup or delivery locations"},"CreateShipmentRequest":{"required":["deliveryAddress","description","orderComponents","pickupAddress"],"type":"object","properties":{"quoteId":{"type":"string","description":"Optional ID of a previously generated quote.","example":"507f1f77bcf86cd799439013"},"pickupAddress":{"$ref":"#/components/schemas/Address"},"deliveryAddress":{"$ref":"#/components/schemas/Address"},"orderComponents":{"type":"array","description":"List of cargo components in the shipment","items":{"$ref":"#/components/schemas/OrderComponent"}},"description":{"type":"string","description":"Description of the shipment contents","example":"Electronics - fragile"},"poNumber":{"type":"string","description":"Purchase order number for reference","example":"PO-2024-12345"},"refNumber":{"type":"string","description":"Additional reference number","example":"REF-ABC-123"},"requiredPickupDate":{"type":"string","description":"Required pickup date (ISO 8601 format)","format":"date-time","example":"2024-12-24T08:00:00Z"},"requiredDeliveryBy":{"type":"string","description":"Required delivery by date (ISO 8601 format)","format":"date-time","example":"2024-12-26T17:00:00Z"}},"description":"Request to create a new shipment"},"Dimensions":{"required":["height","length","width"],"type":"object","properties":{"length":{"type":"integer","description":"Length in inches","format":"int32","example":48},"width":{"type":"integer","description":"Width in inches","format":"int32","example":48},"height":{"type":"integer","description":"Height in inches","format":"int32","example":72}},"description":"Pallet dimensions in inches"},"OrderComponent":{"required":["palletCount","palletDimensions","poundsWeight"],"type":"object","properties":{"palletCount":{"type":"integer","description":"Number of pallets in this component","format":"int32","example":2},"poundsWeight":{"type":"integer","description":"Weight per pallet in pounds","format":"int32","example":500},"palletDimensions":{"type":"array","description":"Pallet dimensions as [height, length, width] in inches","example":[72,48,48],"deprecated":true,"items":{"type":"integer","description":"Pallet dimensions as [height, length, width] in inches","format":"int32","deprecated":true}},"dimensions":{"$ref":"#/components/schemas/Dimensions"}},"description":"A cargo component (pallet group) in a shipment"},"QuoteRequest":{"required":["deliveryAddress","orderComponents","pickupAddress"],"type":"object","properties":{"pickupAddress":{"$ref":"#/components/schemas/Address"},"deliveryAddress":{"$ref":"#/components/schemas/Address"},"orderComponents":{"type":"array","description":"List of pallets or freight pieces.","items":{"$ref":"#/components/schemas/OrderComponent"}},"requiredPickupDate":{"type":"string","description":"Required pickup date (ISO 8601).","format":"date-time","example":"2026-04-01T08:00:00Z"}},"description":"Request to generate a shipping quote. Quotes are valid for 2 days from creation."},"QuoteResponse":{"type":"object","properties":{"id":{"type":"string","description":"Unique quote identifier","example":"507f1f77bcf86cd799439013"},"quotedPriceInCents":{"type":"integer","description":"Total quoted price in cents (USD)","format":"int32","example":125000},"quoteExpirationTime":{"type":"string","description":"When this quote expires (ISO 8601 format). Quotes are valid for 2 days.","format":"date-time","example":"2024-12-20T15:30:00Z"},"transitDays":{"type":"integer","description":"Number of business days to deliver the shipment after pickup. Pickup day is excluded; weekends are not counted. May be null when the ETA cannot be computed.","format":"int32","nullable":true,"example":2},"estimatedDeliveryDate":{"type":"string","description":"Estimated delivery date and time (ISO 8601 format, UTC). May be null when the ETA cannot be computed.","format":"date-time","nullable":true,"example":"2024-12-22T15:30:00Z"}},"description":"Response containing a shipping quote"},"Tracking":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the order","example":"507f1f77bcf86cd799439011"},"orderNumber":{"type":"string","description":"Human-readable PRO number for the shipment (5-character alphanumeric)","example":"ZKYQ5"},"orderStatus":{"type":"string","description":"Current shipment status in the order lifecycle","example":"PICKED_UP","enum":["INITIALIZED","CONFIRMED","ACCEPTED","ASSIGNED","PICKED_UP","IN_TRANSIT","DELIVERED","CANCELLED"],"x-enumDescriptions":{"CANCELLED":"Shipment cancelled","DELIVERED":"Shipment delivered to destination","ACCEPTED":"Carrier has accepted the shipment","INITIALIZED":"Shipment created but not yet confirmed for pickup","CONFIRMED":"Shipment confirmed and awaiting carrier assignment","IN_TRANSIT":"Freight in transit (alias for PICKED_UP)","ASSIGNED":"Driver assigned and scheduled for pickup","PICKED_UP":"Freight picked up and in transit"}},"actualPickupDate":{"type":"string","description":"Actual pickup date/time (ISO 8601 format)","format":"date-time","example":"2024-12-23T10:30:00Z"},"actualDeliveryDate":{"type":"string","description":"Actual delivery date/time (ISO 8601 format)","format":"date-time","example":"2024-12-25T14:00:00Z"},"estimatedPickupDate":{"type":"string","description":"Estimated pickup date/time (ISO 8601 format)","format":"date-time","example":"2024-12-23T09:00:00Z"},"estimatedDeliveryDate":{"type":"string","description":"Estimated delivery date/time (ISO 8601 format)","format":"date-time","example":"2024-12-25T12:00:00Z"}},"description":"Shipment tracking information"},"InvoiceCharge":{"type":"object","properties":{"chargeType":{"type":"string","description":"Type of charge","example":"BASE_FREIGHT"},"description":{"type":"string","description":"Human-readable description of the charge","example":"Base Freight"},"amountInCents":{"type":"integer","description":"Amount in cents (USD)","format":"int32","example":100000}},"description":"A charge on an invoice"},"InvoiceLineItem":{"type":"object","properties":{"description":{"type":"string","description":"Description of the item","example":"General Freight"},"freightClass":{"type":"string","description":"Freight class","example":"85"},"weight":{"type":"integer","description":"Weight in pounds","format":"int32","example":500},"quantity":{"type":"integer","description":"Number of pieces/pallets","format":"int32","example":2},"packageType":{"type":"string","description":"Package type","example":"PLT"}},"description":"A line item on an invoice"},"InvoiceResponse":{"type":"object","properties":{"orderId":{"type":"string","description":"Order ID","example":"67b6c5fcfbf1be6b24127646"},"orderNumber":{"type":"string","description":"Human-readable order number (PRO number)","example":"ZKYQ5"},"invoiceDate":{"type":"string","description":"Invoice date (typically same as delivery date)","format":"date-time","example":"2024-12-20T15:30:00Z"},"shipDate":{"type":"string","description":"Ship date (when the shipment was picked up)","format":"date-time","example":"2024-12-18T09:00:00Z"},"deliveryDate":{"type":"string","description":"Delivery date (when the shipment was delivered)","format":"date-time","example":"2024-12-20T15:30:00Z"},"poNumber":{"type":"string","description":"Purchase order number (if provided)","example":"PO-12345"},"refNumber":{"type":"string","description":"Reference number (BOL number)","example":"BOL-67890"},"lineItems":{"type":"array","description":"Line items representing the shipped goods","items":{"$ref":"#/components/schemas/InvoiceLineItem"}},"charges":{"type":"array","description":"Itemized charges and fees","items":{"$ref":"#/components/schemas/InvoiceCharge"}},"totalChargesInCents":{"type":"integer","description":"Total of all charges in cents (USD)","format":"int32","example":125000},"totalWeight":{"type":"integer","description":"Total weight of the shipment in pounds","format":"int32","example":1500},"totalPieces":{"type":"integer","description":"Total number of pieces/pallets","format":"int32","example":4},"shipper":{"$ref":"#/components/schemas/Address"},"consignee":{"$ref":"#/components/schemas/Address"},"billTo":{"$ref":"#/components/schemas/Address"}},"description":"Itemized invoice for a delivered shipment"},"DocumentResponse":{"type":"object","properties":{"filename":{"type":"string","description":"Name of the document file","example":"bol-ZKYQ5.pdf"},"fileType":{"type":"string","description":"MIME type of the document","example":"application/pdf"},"downloadLink":{"type":"string","description":"Pre-signed download URL (valid for limited time)","example":"https://s3.amazonaws.com/..."}},"description":"Response containing a document download link"}},"securitySchemes":{"apiKey":{"type":"apiKey","description":"**Authorization** - API key that determines which company's resources you can access.\n\nEach API key is tied to a **single company** in Oway. Use the appropriate key type:\n\n| Key Type | Format | Use For |\n|----------|--------|---------|\n| Shipper | `oway_sk_xxx...` | Shipper API (`/v1/shipper/**`) |\n| Carrier | `oway_ck_xxx...` | Carrier API (`/v1/carrier/**`) |\n\nGenerate keys in your Oway portal (Settings → API Keys).\n\n**Required** alongside Bearer token for external API access.","name":"x-oway-api-key","in":"header","x-default":"oway_sk_your_api_key_here"},"bearerAuth":{"type":"http","description":"**Authentication** - Bearer token that proves your identity.\n\nObtain from `/v1/auth/token` endpoint. Tokens are valid for 24 hours.\n\nRequired scopes:\n- `shipper` for Shipper API\n- `carrier` for Carrier API\n- `dev` or `prod` for environment access\n\n**Required** alongside API key for external API access.","scheme":"bearer","bearerFormat":"JWT","x-default":"your_bearer_token_here"}}},"x-readme":{"explorer-enabled":true,"headers":[{"value":"Bearer your_bearer_token_here","key":"authorization"},{"value":"oway_sk_your_api_key_here","key":"x-oway-api-key"}],"samples-languages":["go","typescript","java","php","python"]}}