---
title: "Offer a buyer cannot sign against — x402 defect class unsignable-offer"
description: "Offer a buyer cannot sign against (unsignable-offer), an x402 defect class: Every accepts entry carries the fields a client needs to construct a payment, as strings. Detectable by an unpaid probe. A buyer reaches the signing step and has nothing to sign. Indistinguishable, from the seller's logs, from nobody wanting the goods."
canonical: "https://scvd.store/defects/unsignable-offer"
url: "https://scvd.store/defects/unsignable-offer"
term_code: "unsignable-offer"
defined_in: "https://scvd.store/defects"
data: "https://scvd.store/defects.json"
vocabulary_version: "22"
license: "https://creativecommons.org/licenses/by/4.0/"
---

# Offer a buyer cannot sign against

`unsignable-offer` — an x402 defect class.

**Asserts:** Every accepts entry carries the fields a client needs to construct a payment, as strings.

**Costs:** A buyer reaches the signing step and has nothing to sign. Indistinguishable, from the seller's logs, from nobody wanting the goods.

**Detectable:** unpaid — a free probe can see it

**Falsified by:** Every accepts entry carrying the published required fields at the stated moment.

**How an operator clears it:** Fill every accepts entry with the v2-required fields, as strings, and regenerate the offer from your server's own config rather than hand-editing JSON. The free preflight names the missing field.

**What a buyer does:** Do not sign: a missing required field means your client has nothing to construct, and any library that proceeds anyway is filling the gap with a default you did not choose. Read the preflight's named missing field and wait for a challenge that carries it.

**Our signal:** `accepts`

---

Vocabulary v22, CC BY 4.0. Every class: https://scvd.store/defects. Machine-readable, with falsifiers and cross-instrument mappings: https://scvd.store/defects.json.

A class describes a property of one endpoint at one moment and never accumulates into a judgment on an operator.
