Developers

It should arrive where your team already works.

Weft is a reader, an API and a set of connectors. Readings can land in your PLM, your quality system or your data warehouse without anyone opening our interface.

Overview

Three ways in.

API

REST, token authenticated

Create styles, submit declarations, fetch readings and pull the full evidence record for any style. JSON in, JSON out, versioned endpoints and predictable errors.

Events

Webhooks on state change

Subscribe to readings, mismatches, holds and returned lab results. Signed payloads, retries with backoff, and a replay window when something on your side falls over.

Connectors

Systems you already run

Maintained connectors for common PLM and PIM platforms, plus scheduled file exchange over SFTP for the systems that still prefer it.

Shape of the data

A reading is a measurement, not a verdict.

Every reading carries its uncertainty, the number of samples behind it and the confidence the model assigns. Nothing is flattened into a grade, because a grade cannot be audited.

GET /v1/styles/4412/readings/latest

{
  "style": "4412",
  "measured_at": "2026-07-14T09:22:11Z",
  "samples": 3,
  "composition": [
    { "fibre": "cotton",    "pct": 62, "margin": 2 },
    { "fibre": "polyester", "pct": 36, "margin": 2 },
    { "fibre": "elastane",  "pct": 2,  "margin": 1 }
  ],
  "confidence": "high",
  "declared": [
    { "fibre": "cotton", "pct": 100, "source": "care_label" }
  ],
  "status": "mismatch",       // agrees | mismatch | inconclusive
  "hold": true,
  "lab_request": "lr_8814"
}

Events

Wire the exception into your own workflow.

Most teams never look at our dashboard after the first month. A mismatch becomes a ticket, a Slack message or a hold in the system they already trust, and Weft stays out of the way.

  • reading.created

    A new measurement was taken and matched against the declaration on file.

  • style.mismatched

    A measurement disagreed with the declaration beyond your tolerance. Includes both, and the delta.

  • style.inconclusive

    Confidence fell below your threshold. No claim is made either way.

  • lab_result.returned

    A laboratory confirmation came back and was written to the style record.

Webhook payload

# POST to your endpoint, signed with your secret
{
  "event": "style.mismatched",
  "id": "evt_01J9K2",
  "style": "4412",
  "supplier": "sup_2210",
  "delta": [
    { "fibre": "polyester",
      "declared": 0, "measured": 36 }
  ],
  "owner": "quality.emea",
  "link": "https://app.weft.co/s/4412"
}

Verify the signature

const expected = crypto
  .createHmac("sha256", process.env.WEFT_SECRET)
  .update(rawBody)
  .digest("hex");

if (!crypto.timingSafeEqual(
      Buffer.from(expected),
      Buffer.from(req.headers["weft-signature"])
    )) return res.sendStatus(400);

Practicalities

The details engineers ask about first.

Sandbox

A full test environment with synthetic readings, including mismatches and inconclusive results, so you can build the unhappy paths properly.

Versioning

Endpoints are versioned in the path. Breaking changes ship as a new version with a published deprecation window.

Rate limits

Generous per-token limits with clear headers. Bulk exports run asynchronously rather than timing out.

Offline reads

Readers queue locally when a site loses connectivity and reconcile on reconnect. Factory floors are not always kind to networks.

Want the full reference?

Ask for sandbox access and the API documentation. We will send credentials and a sample dataset rather than a brochure.

Translation-safe data

An API should make overclaiming harder, not easier.

The schema separates observed values, source claims, confirmations and permitted summaries so a downstream interface can retain the limits of the evidence.

GET /v1/material-records/WF-2026-004412
{{
  "observed": {{
    "composition": [
      {{"fibre":"cotton","pct":62,"moe":2}},
      {{"fibre":"polyester","pct":36,"moe":2}}
    ]
  }},
  "claimed": {{"cotton_pct":100}},
  "conclusion": {{
    "type":"mismatch",
    "supported_statement":"Synthetic blend detected",
    "not_supported":["chemical exposure","diagnosis"]
  }}
}}
Observed

What the instrument returned

Values, uncertainty, sample location and instrument context.

Claimed

What another source asserted

Documents and declarations remain attributable to their origin.

Concluded

What the combined evidence permits

Supported language and explicitly unsupported language travel together.