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.
Developers
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
API
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
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
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
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
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.
A new measurement was taken and matched against the declaration on file.
A measurement disagreed with the declaration beyond your tolerance. Includes both, and the delta.
Confidence fell below your threshold. No claim is made either way.
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
A full test environment with synthetic readings, including mismatches and inconclusive results, so you can build the unhappy paths properly.
Endpoints are versioned in the path. Breaking changes ship as a new version with a published deprecation window.
Generous per-token limits with clear headers. Bulk exports run asynchronously rather than timing out.
Readers queue locally when a site loses connectivity and reconcile on reconnect. Factory floors are not always kind to networks.
Ask for sandbox access and the API documentation. We will send credentials and a sample dataset rather than a brochure.
Translation-safe data
The schema separates observed values, source claims, confirmations and permitted summaries so a downstream interface can retain the limits of the evidence.
{{
"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"]
}}
}}Values, uncertainty, sample location and instrument context.
Documents and declarations remain attributable to their origin.
Supported language and explicitly unsupported language travel together.