A platform integrates many kinds of providers, not only carriers. It may use an address validation service, a parcel insurer, or a 3PL it sends orders to. Before this chapter, the spec handled only carriers generically (chapter 09). This chapter lifts that machinery into a reusable layer: every provider is an integration, connected through the same app and connection objects, and spoken to through a typed interface. The interfaces are open-ended. trade (classification and landed cost providers, chapter 13) and notifications (recipient messaging) follow the same pattern, and future interfaces register in the same catalog. Every interface is a subset of this spec. A provider that implements an interface’s endpoints, and publishes /.well-known/shipping-configuration listing it in interfaces, can be connected federated: no adapter code, the same discovery, OAuth and dynamic registration as federated carriers (chapter 09 §6). Providers with proprietary APIs are reached through implementer-maintained adapters behind the same objects.

1. Integration catalog

The integration object generalizes the carrier object (chapter 09 §1). Carriers are integrations whose interfaces include lsp, and GET /v1/carriers remains as the filtered view GET /v1/integrations?interface=lsp.
Endpoints: GET /v1/integrations?interface=…&kind=…&country=…, GET /v1/integrations/{id}, and createIntegration (GraphQL Interface mutation) with { "federated": { "configuration": "https://…" } } to onboard a federated provider of any interface.

2. Apps and connections, generalized

  • app (chapter 09 §4) is the generic OAuth 2.1 + OIDC client wrapper for any integration. app.carrier becomes app.integration, and app.interfaces lists the interfaces it may be used for. Dynamic client registration, secret rotation, platform visibility and the connect-session flow are unchanged.
  • connection (chapter 09 §3) gains integration and interfaces. For carriers, carrier remains as an alias of integration. A connection with several interfaces (a carrier that also validates addresses) is one account at one provider, not two connections.
  • Defaults per interface. account.settings.default_connections is { "address_validation": "conn_addr1", "insurance": "conn_ins1" }. Any API that needs an interface and is not given a connection uses the default.
  • Connect sessions work for any integration: POST /v1/connect_sessions with { "integration": "addrcheck" }.

3. Interface lsp: carriers and 3PLs

The lsp interface is the core of this spec. Connections to carriers, networks and fleets behave as described in chapters 02–07 and 09. 3PL connections. A connection whose integration has kind: "3pl", and whose interfaces.lsp descriptor has injection: true, makes the platform an injecting party to that 3PL (chapter 18):
  • Purchasing a shipment with carrier_configs: { "acme_3pl": { "service": "acme_3pl_ground" } } sends it to the 3PL as an injected shipment, with label_mode: "label_required" or "pre_labeled" per the connection config. The platform’s shipment mirrors the 3PL’s injection.status and tracking.
  • POST /v1/asns through the connection (Shipping-Connection: conn_3pl header) announces inbound freight to the 3PL’s facility.
  • The 3PL’s receiving outcomes, discrepancies and tracking return through webhooks or federated inbound events.

4. Interface address_validation

Platform API

  • validate_addresses: true on rates, shipments and pickups calls this interface through the default connection, and stores the result in address.validation (chapter 01 §1).
  • Batches go through a job: POST /v1/jobs with type: "address_validation.batch" (chapter 27).
  • Privacy. Validation requests send only the address, plus contact data when a feature needs it. Results are retained for 30 days unless they are attached to a shipment.

5. Interface insurance

Parcel coverage from third-party insurers, alongside the carrier’s own declared value (the standardized insurance feature, chapter 01 §6.1). A shipment uses one or the other: buying a coverage removes a carrier insurance option from the purchase, with a warning in messages[].

Quotes

Quotes fan out across insurance connections, with partial failures in errors[], the same model as rates.

Coverages

  • status is pending, active, expired, cancelled, or claimed.
  • The shipment records it in purchase.coverage, and the certificate is appended to shipment.documents[] with type: "insurance_certificate".
  • Coverage can be bought in the same call as the label: purchase: { rate, coverage: { quote: "iq_…" } }.

Claims

  • status is submitted, under_review, information_requested, approved, denied, paid, or withdrawn. resolution holds { amount, paid_at, reason }.
  • Evidence can cite data network records and attestations (chapter 23): signed scans, condition excursions, the consignee’s damage attestation. Insurers verify custody without asking anyone for screenshots.

6. Building a provider

To offer an interface to every implementer of the spec, a provider:
  1. Implements that interface’s endpoints exactly as specified (the OpenAPI operations tagged with the interface).
  2. Publishes /.well-known/shipping-configuration with "interfaces": { "<name>": <descriptor> }.
  3. Runs OAuth 2.1 + OIDC with dynamic client registration (chapter 00 §3.2).
  4. Passes the interface’s conformance suite (chapter 11 §4).

7. Events

integration.created, integration.updated, address_validation.completed, insurance_quote.created, coverage.created, coverage.activated, coverage.cancelled, coverage.expired, claim.submitted, claim.updated, claim.approved, claim.denied, claim.paid.