community.gifthood.listing
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "An offer or request for a free item, discoverable by approximate location.",
"key": "tid",
"record": {
"properties": {
"category": {
"description": "Optional single-level category for opt-out feed filtering. Additive-only enum (values may be inserted, never removed or renamed); unknown or missing values index as 'other'. Never used for proximity or safety logic.",
"enum": [
"furniture",
"kitchen",
"clothing",
"baby",
"books",
"instruments",
"electronics",
"tools",
"garden",
"health",
"pets",
"hobbies",
"food",
"animals",
"service",
"office",
"other"
],
"type": "string"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"description": {
"description": "Required free text describing the item being offered or requested.",
"maxGraphemes": 1500,
"maxLength": 3000,
"minGraphemes": 1,
"minLength": 1,
"type": "string"
},
"facets": {
"description": "Annotations over `description` (mentions, links) keyed by UTF-8 byte range. Reuses app.bsky.richtext.facet for atmosphere-wide interop. Author-asserted at compose time; clients MUST treat them as display hints, re-validate ranges, and never trust a facet URI over the visible text. Addresses and phone numbers are deliberately NOT faceted here — those affordances are private-message-only.",
"items": {
"ref": "app.bsky.richtext.facet",
"type": "ref"
},
"type": "array"
},
"geohash": {
"description": "Approximate location as a geohash, precision 6 (~1.2km cell). This is a privacy floor: indexers MUST truncate any finer-precision value to 6 characters before indexing or display.",
"maxLength": 6,
"minLength": 1,
"type": "string"
},
"imageAlts": {
"description": "Alt text for images, parallel to the images array by index.",
"items": {
"maxGraphemes": 1000,
"type": "string"
},
"maxLength": 4,
"type": "array"
},
"images": {
"description": "Up to 4 images of the item, stored as blobs in the poster's repo.",
"items": {
"accept": [
"image/jpeg",
"image/png",
"image/webp"
],
"maxSize": 1000000,
"type": "blob"
},
"maxLength": 4,
"type": "array"
},
"intent": {
"description": "Whether the poster is giving away an item or looking for one.",
"enum": [
"offer",
"request"
],
"type": "string"
},
"labels": {
"description": "Self-labels set by the author. Used to flag mature/adult content (e.g. the global 'sexual' value), which the AppView gates behind an opt-in.",
"refs": [
"com.atproto.label.defs#selfLabels"
],
"type": "union"
},
"langs": {
"description": "Language(s) the content is written in, as BCP-47 language tags. Author-asserted; clients default from the composer's locale.",
"items": {
"format": "language",
"type": "string"
},
"maxLength": 3,
"type": "array"
},
"locationName": {
"description": "Optional human-readable area name. App-populated via reverse geocoding of the geohash cell. Display only; MUST NOT be used for proximity matching or filtering.",
"maxGraphemes": 100,
"maxLength": 300,
"type": "string"
},
"mode": {
"description": "How the item changes hands. 'gift' (the default when absent) transfers ownership; 'lend' expects the item back — the listing behaves as a standing offer and each exchange gains a return leg (see exchange.returnedAt). Readers MUST treat unknown or missing values as 'gift'.",
"enum": [
"gift",
"lend"
],
"type": "string"
},
"paused": {
"description": "Owner-set temporary unavailability (using the item themselves, away for a while). AppViews hide paused listings from feeds but keep the detail view reachable with interest disabled. Absent means active. Orthogonal to status; 'gone' still wins.",
"type": "boolean"
},
"standing": {
"description": "Standing (renewing) offer: the owner can run exchange chains with multiple neighbors over time. Absent or false means the listing is exhausted by a single exchange. AppViews keep a standing listing available while chains run; only the owner's manual 'gone' ends it.",
"type": "boolean"
},
"status": {
"description": "Current availability. Clients should treat a missing value as 'available'.",
"enum": [
"available",
"pending",
"gone"
],
"type": "string"
},
"title": {
"description": "Required short title for the item being offered or requested.",
"maxGraphemes": 100,
"maxLength": 200,
"minGraphemes": 1,
"minLength": 1,
"type": "string"
}
},
"required": [
"title",
"intent",
"description",
"geohash",
"createdAt"
],
"type": "object"
},
"type": "record"
}
},
"id": "community.gifthood.listing",
"lexicon": 1
}
Metadata
- DID
-
did:plc:7prvtl4j6wsfmkrfrnwknuxj - CID
-
bafyreibsln4ltai4ueunkgd3ivlek5ius7ugf64n6mm357wttk2xxdeuji - Indexed At
- 2026-07-20 06:01 UTC
- AT-URI
-
at://did:plc:7prvtl4j6wsfmkrfrnwknuxj/com.atproto.lexicon.schema/community.gifthood.listing
Version History (6 versions)
Referenced Schemas (2)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
An offer or request for a free item, discoverable by approximate location.
-
camera.swap.listing record
A piece of camera gear the author is offering for swap, lend, or gift. Lives in the author's own repo.
-
One row of the viewer's activity feed: an outgoing interest the viewer raised on someone's listing, an incoming raised hand on the viewer's own listing, or a neighbor who followed the viewer (carries 'followers' instead…