openapi: 3.0.3 info: title: WM Customer API description: >- Documented, partner/customer-gated REST API published by WM (formerly Waste Management, Inc.) at https://api.wm.com/. Exposes account-level service, billing, and support data - service and pickup information, live status/ETA, routing and hauling materials, pricing, invoices and balance, communication preferences, contacts, cases, tickets, and account activity notes. There is no self-serve signup: WM issues a ClientId and JSON Web Token (JWT) to approved commercial/enterprise customers and integration partners on request to apiaccess@wm.com. Endpoint paths, parameters, and response fields below are transcribed from WM's published API documentation; fields not disclosed in that documentation are left as an open JSON object rather than invented. version: '1.0' contact: name: WM API Access email: apiaccess@wm.com url: https://api.wm.com/ license: name: Proprietary - partner/customer use per WM terms servers: - url: https://api.wm.com/v1 description: Production - url: https://apitest.wm.com/v1 description: Test security: - bearerAuth: [] tags: - name: Services description: Account services, schedule, status, and ETA. - name: Service Operations & Materials description: Routing and hauling material information. - name: Service Pricing description: Base rates and invoice fees. - name: Invoices & Balance description: Invoice history and account balance. - name: Profiles & Preferences description: Account profile settings and communication preferences. - name: Contacts description: Billing and service contacts on an account. - name: Cases & Tickets description: Service cases and pickup tickets. - name: Activities description: Notes, email, and issue activity on an account. paths: /customers/{customerId}/services: get: operationId: listServices tags: [Services] summary: List services description: >- Retrieve detailed information on the services associated with an account, including service names, material streams, container volumes, and pricing structures, plus the status of services scheduled for today. parameters: - $ref: '#/components/parameters/CustomerId' - name: line_of_business in: query required: false description: Filter by line of business. schema: type: string enum: [RESIDENTIAL, COMMERCIAL, ROLLOFF] responses: '200': description: Services for the account. content: application/json: schema: type: object properties: request_tracking_id: type: string services: type: array items: $ref: '#/components/schemas/Service' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/plan: get: operationId: getServicePlan tags: [Services] summary: List planned services description: Obtain service execution details for today's scheduled services. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Today's planned service execution details. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/stats: get: operationId: getServiceStats tags: [Services] summary: List service statistics description: >- Access the status and details of completed services - whether a scheduled service has not yet occurred, completed successfully, or had a problem. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Completed-service status and details. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/next-pickup: get: operationId: getNextPickup tags: [Services] summary: List next pickup description: View the next scheduled pickup date for the account's services. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Next scheduled pickup information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/{serviceId}/eta: get: operationId: getServiceEta tags: [Services] summary: Get service ETA description: Retrieve the estimated truck arrival time (ETA) for a service in progress today. parameters: - $ref: '#/components/parameters/CustomerId' - name: serviceId in: path required: true description: Unique service identifier. schema: type: string responses: '200': description: Estimated arrival time for the service. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/operations: get: operationId: listServiceOperations tags: [Service Operations & Materials] summary: List service operations description: Obtain routing information for the account's services, including the day of week serviced. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Routing/operations information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/materials: get: operationId: listServiceMaterials tags: [Service Operations & Materials] summary: List service materials description: Access hauling material information for all of the account's services. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Hauling material information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/prices: get: operationId: listServicePrices tags: [Service Pricing] summary: List service prices description: Retrieve the base monthly rates for the account's services. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Service pricing information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/services/prices/invoice-fees: get: operationId: listInvoiceFees tags: [Service Pricing] summary: List invoice fees description: Retrieve invoice fee information associated with the account's services. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Invoice fee information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/invoices: get: operationId: listInvoices tags: [Invoices & Balance] summary: List invoices description: Retrieve invoice history for the account - invoice id, date, amount, payment information, and remaining balance. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Invoice history. content: application/json: schema: type: object properties: currency: type: string invoices: type: array items: $ref: '#/components/schemas/Invoice' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/invoices/{invoiceId}: get: operationId: getInvoice tags: [Invoices & Balance] summary: Get invoice details description: Retrieve details for a single invoice. parameters: - $ref: '#/components/parameters/CustomerId' - name: invoiceId in: path required: true schema: type: string responses: '200': description: Invoice detail. content: application/json: schema: $ref: '#/components/schemas/Invoice' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/balance: get: operationId: getBalance tags: [Invoices & Balance] summary: Get account balance description: >- Retrieve the balance due on the account, broken out by Current, 30/60/90/120-day, and Future aging buckets, plus the total balance, last payment amount, and last payment date. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Account balance. content: application/json: schema: type: object properties: currency: type: string last_payment_amount: type: number last_payment_date: type: string format: date balances: type: array items: type: object properties: type: type: string enum: [Current, 30Day, 60Day, 90Day, 120Day, Future, Total] date: type: string format: date amount: type: number '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/profiles: get: operationId: getProfile tags: [Profiles & Preferences] summary: Get customer profile description: >- Retrieve paperless billing and automatic payment settings, and WM.com login status, established during account creation or updated through the WM portal. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Profile settings. content: application/json: schema: type: object properties: profiles: type: array items: $ref: '#/components/schemas/Profile' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/communication-preferences: get: operationId: getCommunicationPreferences tags: [Profiles & Preferences] summary: List communication preferences description: Retrieve all communication preferences set on the account. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Communication preferences. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' put: operationId: updateCommunicationPreferences tags: [Profiles & Preferences] summary: Update communication preferences description: Update one or more communication preferences on the account. parameters: - $ref: '#/components/parameters/CustomerId' requestBody: required: true content: application/json: schema: type: object additionalProperties: true responses: '200': description: Updated communication preferences. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /preferences/categories: get: operationId: listPreferenceCategories tags: [Profiles & Preferences] summary: List preference categories description: List the published communication preference categories available to set on an account. responses: '200': description: Preference categories. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/contacts: get: operationId: listContacts tags: [Contacts] summary: List contacts description: Retrieve service and billing address and contact information on file for the account. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Contact information. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/contacts/billing: get: operationId: getBillingContact tags: [Contacts] summary: Show billing contact description: Retrieve the billing contact - name, work phone, mobile phone, fax, email, and address - on file for the account. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Billing contact. content: application/json: schema: $ref: '#/components/schemas/Contact' '401': $ref: '#/components/responses/Unauthorized' put: operationId: updateBillingContact tags: [Contacts] summary: Update billing contact description: Update the billing contact details on file for the account. parameters: - $ref: '#/components/parameters/CustomerId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Contact' responses: '200': description: Updated billing contact. content: application/json: schema: $ref: '#/components/schemas/Contact' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/contacts/service: put: operationId: updateServiceContact tags: [Contacts] summary: Update service contact description: Update the service contact details on file for the account. parameters: - $ref: '#/components/parameters/CustomerId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Contact' responses: '200': description: Updated service contact. content: application/json: schema: $ref: '#/components/schemas/Contact' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/cases: get: operationId: listCases tags: [Cases & Tickets] summary: List cases description: List service cases on the account - id, description, category, request date/time, and status. parameters: - $ref: '#/components/parameters/CustomerId' responses: '200': description: Cases on the account. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/cases/{caseId}: get: operationId: getCase tags: [Cases & Tickets] summary: Show case details description: Retrieve details for a single case. parameters: - $ref: '#/components/parameters/CustomerId' - name: caseId in: path required: true schema: type: string responses: '200': description: Case detail. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/tickets: get: operationId: listTickets tags: [Cases & Tickets] summary: List tickets description: >- Retrieve a summary of tickets created on the account - such as missed-pickup or extra-pickup requests - within an optional date range. parameters: - $ref: '#/components/parameters/CustomerId' - $ref: '#/components/parameters/FromDate' - $ref: '#/components/parameters/ToDate' responses: '200': description: Tickets on the account. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/tickets/{ticketId}: get: operationId: getTicket tags: [Cases & Tickets] summary: Show ticket details description: Retrieve details for a single ticket, including disposal tickets. parameters: - $ref: '#/components/parameters/CustomerId' - name: ticketId in: path required: true schema: type: string responses: '200': description: Ticket detail. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/activities/notes: get: operationId: listNotes tags: [Activities] summary: List notes description: >- Retrieve special instructions on how to service the account, and notes about the account, created by support agents or during setup, within an optional date range. parameters: - $ref: '#/components/parameters/CustomerId' - $ref: '#/components/parameters/FromDate' - $ref: '#/components/parameters/ToDate' responses: '200': description: Account notes. content: application/json: schema: type: object properties: request_tracking_id: type: string activities: type: array items: type: object properties: note_info: type: object properties: comment: type: string created_date: type: string format: date-time audit_info: type: object properties: created_date: type: string format: date-time created_by: type: string '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/activities/email: get: operationId: listEmailActivity tags: [Activities] summary: List emails description: >- Retrieve email communication sent from the WM portal - system generated or sent by a CSR agent - within an optional date range. parameters: - $ref: '#/components/parameters/CustomerId' - $ref: '#/components/parameters/FromDate' - $ref: '#/components/parameters/ToDate' responses: '200': description: Email activity. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' /customers/{customerId}/activities/issues: get: operationId: listIssues tags: [Activities] summary: List issues description: Retrieve requests/issues created against the account through the WM portal, within an optional date range. parameters: - $ref: '#/components/parameters/CustomerId' - $ref: '#/components/parameters/FromDate' - $ref: '#/components/parameters/ToDate' responses: '200': description: Issue activity. content: application/json: schema: $ref: '#/components/schemas/GenericAccountResponse' '401': $ref: '#/components/responses/Unauthorized' components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: >- WM issues a JSON Web Token (JWT) and a ClientId to approved partners/customers. Send the token in the Authorization header and the ClientId in the ClientId header on every request. parameters: CustomerId: name: customerId in: path required: true description: Unique customer account identifier. schema: type: integer FromDate: name: fromDate in: query required: false description: Start date, yyyy-MM-dd. schema: type: string format: date ToDate: name: toDate in: query required: false description: End date, yyyy-MM-dd. schema: type: string format: date headers: RequestTrackingId: description: Unique identifier for the request, echoed back in the response. schema: type: string responses: Unauthorized: description: Missing or invalid Authorization/ClientId. content: application/json: schema: type: object properties: message: type: string schemas: GenericAccountResponse: type: object description: >- WM's published documentation does not disclose full response field detail for this resource; the response is a JSON object scoped to the requesting customer account. properties: request_tracking_id: type: string additionalProperties: true Service: type: object properties: id: type: string status: type: string occurs: type: string taxable: type: boolean type_code: type: string enterprise_catalog: type: object properties: name: type: string description: type: string category: type: string subcategory: type: string line_of_business: type: string material: type: object properties: code: type: string name: type: string special_handling: type: boolean manifest: type: boolean equipment: type: object properties: name: type: string description: type: string volume: type: number unit_of_measure: type: string container_count: type: integer pricing: type: object properties: base_monthly_cost: type: number disposal_rate_type: type: string disposal_rate_amount: type: number currency_code: type: string Invoice: type: object properties: id: type: string date: type: string format: date amount: type: number payment_info: type: object additionalProperties: true balance_amount: type: number Profile: type: object properties: id: type: string paperless_invoice: type: boolean auto_pay: type: boolean logon_status: type: string first_name: type: string last_name: type: string email: type: string last_login_date: type: string format: date-time Contact: type: object properties: name: type: string first_name: type: string last_name: type: string work_phone: type: string mobile_phone: type: string fax: type: string email: type: string address: type: object additionalProperties: true