---
title: "One supplier whole"
method: GET
path: "/api/v1/inventory/suppliers/{supplier_id}"
tags: ["suppliers"]
---

# One supplier whole

`GET /api/v1/inventory/suppliers/{supplier_id}`

## Request

- Base URL: `https://api.app.tightly.io`
- URL: `https://api.app.tightly.io/api/v1/inventory/suppliers/{supplier_id}`
- Auth: HTTP bearer

One supplier, whole: identity and address, currency, minimum order value, payment terms in days, the resolved lead time and its source, every contact with the primary one named separately, the email domains that route this supplier's mail, the OTIF, on-time and in-full rates, and two views of its warehouses.

`location_lead_times` is one entry per active warehouse carrying the RESOLVED lead time, the supplier × warehouse override if one is set, else the organisation default, with `source` saying which answered. `lanes` is the same warehouses stated whole: the lane's own override (`lead_time` null means no override), the container it names, what the ladder resolved to, `basis` naming the rung that answered (`lane`, `supplier`, `organisation`, or null for no container on file), the forwarder's quote per container in cents, and the inland leg's road limit in kg. Both lists come out of one statement, so they cannot disagree about a warehouse.

`payment_terms_days` null means nobody has recorded terms, which is read as no lag rather than as zero. `container_type_id` on the supplier is the middle rung: null means "use the organisation default", which is not the same as no container.

An id this organisation does not have is refused 404. get_supplier_overview is the door when only the five scorecard figures are wanted.

Scope: `suppliers:read`.

## Path parameters

- `supplier_id` string, required

## Headers

- `Tightly-Version` string

## Response `200`

The supplier's record: terms, contacts, domains, the delivery rates, and the warehouses as both resolved lead times and whole lanes.

- GetSupplierDetailsResponse
  - `data` union
    - SupplierDetailsWithContacts
      - `address1` string, nullable
      - `address2` string, nullable
      - `average_lead_time` union
        - InventoryCardItem
          - `info` string, nullable
          - `key` string, required
          - `unit` string, required
          - `value` unknown
        - object, nullable
      - `brands` SupplierBrandRef[]
        - `brand_id` string, required
        - `name` string, required
        - `owned` boolean
      - `city` string, nullable
      - `contacts` ContactPayload[]
        - `city` string, nullable
        - `country` string, nullable
        - `department` string, nullable
        - `description` string, nullable
        - `email` string, nullable
        - `id` string, required
        - `is_primary_contact` boolean, nullable
        - `name` string, nullable
        - `phone` string, nullable
        - `preferred_contact_method` string, nullable
        - `role` string, nullable
        - `supplier_id` string, nullable
        - `supplier_name` string, nullable
      - `container_type_id` integer, nullable
      - `country` string, nullable
      - `currency` string, nullable
      - `domains` string[], nullable
      - `edi` union
        - SupplierEdi
          - `account_number` string, nullable
          - `trading_partner_id` string, nullable
          - `vendor_number` string, nullable
        - object, nullable
      - `id` string, required
      - `in_full` number, nullable
      - `integrations` object, nullable
      - `is_archived` boolean, nullable
      - `kind` string, nullable
      - `lanes` SupplierLane[], nullable
        - `basis` string, nullable
        - `container_name` string, nullable
        - `container_type_id` integer, nullable
        - `freight_per_container_cents` integer, nullable
        - `internal_cbm` number, nullable
        - `lead_time` integer, nullable
        - `lead_time_source` string, nullable
        - `location_id` string, required
        - `location_name` string, nullable
        - `pallet_positions` integer, nullable
        - `payload_kg` integer, nullable
        - `resolved_container_type_id` integer, nullable
        - `road_limit_kg` integer, nullable
        - `usable_pct` number, nullable
      - `lead_time` integer, nullable
      - `lead_time_source` string, nullable
      - `location_lead_times` SupplierLocationLeadTime[], nullable
        - `lead_time` integer, nullable
        - `location_id` string, required
        - `location_name` string, nullable
        - `source` string, nullable
      - `min_order_value` integer, nullable
      - `name` string, required
      - `on_time` number, nullable
      - `otif_score` number, nullable
      - `payment_terms_days` integer, nullable
      - `postal_code` string, nullable
      - `primary_contact` union
        - ContactPayload
          - `city` string, nullable
          - `country` string, nullable
          - `department` string, nullable
          - `description` string, nullable
          - `email` string, nullable
          - `id` string, required
          - `is_primary_contact` boolean, nullable
          - `name` string, nullable
          - `phone` string, nullable
          - `preferred_contact_method` string, nullable
          - `role` string, nullable
          - `supplier_id` string, nullable
          - `supplier_name` string, nullable
        - object, nullable
      - `province` string, nullable
    - object, nullable
  - `message` ApiMessage
    - `desc` string
    - `service` string
    - `severity` 'SUCCESS' | 'INFO' | 'ERROR' | 'WARNING'

## Other responses

- `401`: No usable key: malformed, unknown, revoked, expired or stopped. One refusal covers all five, telling a caller which is which maps the surface for them. A request with no Authorization header at all is refused 400 before any key is looked for.
- `403`: The key may not reach this operation. `scope_missing` when the key does not hold Suppliers; `ip_not_allowed` when the caller's address is outside the key's allowlist. There is no `organization_mismatch` on this resource: no supplier or contact route names an organisation in its path, so there is nothing for a key to disagree with.
- `404`: No supplier of this organisation has that id.
- `429`: The key has spent its allowance for this minute. 600 reads and 120 writes a minute, counted per key, refused calls included. `Retry-After` says how long to wait.
- `503`: The database is briefly out of reach, which is what a failover or a full connection pool looks like from outside. Wait the seconds `Retry-After` names and send the request again. A read is safe to repeat. A write is not, because the connection was lost in the middle of it, so read the object back before sending it a second time. Branch on the status rather than on `code`, which is `POSTGRES_UNAVAILABLE` from one of the two seams that raise this and `SERVICE_UNAVAILABLE` from the other.

---

[API](https://skmtc.dev/tightly/apis/tightly-api.md) · [All operations](https://skmtc.dev/tightly/apis/tightly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tightly/apis/tightly-api/revisions/199f7eb35afb?raw)
