{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"Lit Circle Events API","version":"1.0.0","summary":"Subject-scoped Public Event snapshots and Event Source submissions.","description":"This is a server-to-server API. Never put a bearer credential in browser JavaScript. Within v1, changes are additive and consumers must ignore unknown fields. Removing a field, changing its type or meaning, or changing Event eligibility requires a new major version. A superseded version with real consumers remains available for at least 90 days and announces retirement with Deprecation, Sunset, and Link headers plus manager notices.","contact":{"name":"Lit Circle support","url":"https://litcircle.org/contact"}},"servers":[{"url":"https://litcircle.org","description":"Production"}],"tags":[{"name":"Events","description":"Authoritative, bookstore- or literary-organization-scoped Event Feed Snapshots. Successful list responses replace the consumer's previous set for the requested window."}],"paths":{"/api/v1/events":{"get":{"operationId":"listBookstoreEvents","tags":["Events"],"summary":"Get an authoritative Event Feed Snapshot","description":"Returns all matching Public Events associated with the credential's bookstore or literary organization for the resolved Event Feed Window. Events are selected by interval overlap; custom `from` and `to` values must be supplied together, `from` is inclusive, and `to` is exclusive. The response is unpaginated and never silently truncated.","security":[{"bookstoreBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"description":"Inclusive ISO-8601 instant. `from` and `to` must be supplied together; omit both to use the default window beginning at request time.","schema":{"type":"string","format":"date-time"},"example":"2026-01-01T00:00:00Z"},{"name":"to","in":"query","required":false,"description":"Exclusive ISO-8601 instant. `from` and `to` must be supplied together; omit both to use the default window ending one year after request time.","schema":{"type":"string","format":"date-time"},"example":"2026-12-31T00:00:00Z"},{"name":"If-None-Match","in":"header","required":false,"description":"A prior ETag. An unchanged snapshot returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"A complete Event Feed Snapshot containing at most 500 Events.","headers":{"Cache-Control":{"description":"Private five-minute caching guidance for successful representations.","schema":{"type":"string","const":"private, max-age=300, must-revalidate"}},"ETag":{"description":"A validator for conditional polling with If-None-Match.","schema":{"type":"string"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsResponse"}}}},"304":{"description":"The Event Feed Snapshot has not changed. The response has no body.","headers":{"ETag":{"description":"A validator for conditional polling with If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Private five-minute caching guidance for successful representations.","schema":{"type":"string","const":"private, max-age=300, must-revalidate"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}}},"400":{"description":"A query parameter is malformed.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"One or more request parameters are invalid.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The collection supports GET and POST.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"schema":{"type":"string","const":"GET, POST"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET and POST requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"422":{"description":"The Event Feed Window is invalid or exceeds 366 days, or more than 500 Events match it. Narrow the window and retry.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidWindow":{"value":{"error":{"code":"invalid_window","message":"The requested window may not exceed 366 days.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":{"field":"to"}}}},"snapshotTooLarge":{"value":{"error":{"code":"snapshot_too_large","message":"More than 500 events match this window. Request a narrower window.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":{"maximum":500}}}}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}},"post":{"operationId":"createSourceManagedEvent","tags":["Events"],"summary":"Submit one new source-managed Event snapshot","description":"Creates one Event for the active Event Source. Identical retries are unchanged; changed reuse of an External Event ID conflicts and must continue with PUT.","security":[{"bookstoreBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventWriteInput"}}}},"responses":{"200":{"description":"An identical retry was accepted as unchanged.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventWriteResponse"}}}},"201":{"description":"The source-managed Event and provenance were created atomically.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}},"Location":{"description":"The API member URL retained for PUT.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventWriteResponse"}}}},"400":{"description":"The JSON body is malformed.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"The request body must be valid JSON.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The collection supports GET and POST.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"schema":{"type":"string","const":"GET, POST"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET and POST requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"409":{"description":"Returns source_not_configured when no source is active, external_event_exists for changed identity reuse, or potential_duplicate for a title/start match.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}},"Location":{"description":"The existing API member URL when the conflict is external_event_exists.","schema":{"type":"string","pattern":"^/api/v1/events/"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The strict Event Submission failed validation.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_failed","message":"The Event Submission failed validation.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}}},"/api/v1/events/{eventId}":{"get":{"operationId":"getBookstoreEvent","tags":["Events"],"summary":"Get one associated Public Event","description":"Returns the same complete Event representation as the list endpoint. Missing, hidden, and out-of-scope Events all return the same 404 response.","security":[{"bookstoreBearer":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"description":"The public Event ID.","schema":{"type":"string","minLength":1}},{"name":"If-None-Match","in":"header","required":false,"description":"A prior ETag. An unchanged Event returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"The associated Public Event.","headers":{"Cache-Control":{"description":"Private five-minute caching guidance for successful representations.","schema":{"type":"string","const":"private, max-age=300, must-revalidate"}},"ETag":{"description":"A validator for conditional polling with If-None-Match.","schema":{"type":"string"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"304":{"description":"The Event representation has not changed. The response has no body.","headers":{"ETag":{"description":"A validator for conditional polling with If-None-Match.","schema":{"type":"string"}},"Cache-Control":{"description":"Private five-minute caching guidance for successful representations.","schema":{"type":"string","const":"private, max-age=300, must-revalidate"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"404":{"description":"The Event is missing, not Public, or unrelated to the authenticated API subject.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"Event not found.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The member supports GET, PUT, and DELETE.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"schema":{"type":"string","const":"GET, PUT, DELETE"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET, PUT, and DELETE requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}},"put":{"operationId":"replaceSourceManagedEvent","tags":["Events"],"summary":"Replace one source-managed Event snapshot","description":"Completely replaces the source-managed field set for an Event linked to the authenticated bookstore or literary organization's active source. Lit Circle-owned workflow and enrichment survive.","security":[{"bookstoreBearer":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventWriteInput"}}}},"responses":{"200":{"description":"The snapshot was updated or was an identical retry.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventWriteResponse"}}}},"400":{"description":"The JSON body is malformed.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"The request body must be valid JSON.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"404":{"description":"The Event is missing or outside the active source's write scope.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"Event not found.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The member supports GET, PUT, and DELETE.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"schema":{"type":"string","const":"GET, PUT, DELETE"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET, PUT, and DELETE requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"409":{"description":"The submission is older or differs at the same source update time.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"stale_submission","message":"A newer or different same-time Event Submission has already been accepted.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"422":{"description":"The strict Event Submission failed validation.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_failed","message":"The Event Submission failed validation.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}},"delete":{"operationId":"deleteSourceManagedEvent","tags":["Events"],"summary":"Delete one API-created Event","description":"Permanently deletes an Event only when it has Event Source provenance and belongs to the authenticated bookstore or literary organization. Manual, cross-subject, and missing Events all return the same 404 response.","security":[{"bookstoreBearer":[]}],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"204":{"description":"The API-created Event was permanently deleted. The response has no body.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"404":{"description":"The Event is missing, was not created through the API, or belongs to another subject.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"Event not found.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The member supports GET, PUT, and DELETE.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"schema":{"type":"string","const":"GET, PUT, DELETE"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET, PUT, and DELETE requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}}},"/api/v1/event-types":{"get":{"operationId":"listAcceptedEventTypes","tags":["Taxonomy"],"summary":"List current Event Type labels accepted by writes","security":[{"bookstoreBearer":[]}],"responses":{"200":{"description":"Current labels.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxonomyResponse"}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The endpoint only accepts GET requests.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"description":"The supported HTTP method.","schema":{"type":"string","const":"GET"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}}},"/api/v1/genres":{"get":{"operationId":"listAcceptedGenres","tags":["Taxonomy"],"summary":"List current Genre labels accepted by writes","security":[{"bookstoreBearer":[]}],"responses":{"200":{"description":"Current labels.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxonomyResponse"}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The endpoint only accepts GET requests.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"description":"The supported HTTP method.","schema":{"type":"string","const":"GET"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}}},"/api/v1/neighborhoods":{"get":{"operationId":"listAvailableNeighborhoods","tags":["Taxonomy"],"summary":"List Neighborhoods in the authenticated subject's Area","security":[{"bookstoreBearer":[]}],"responses":{"200":{"description":"Neighborhood IDs accepted by off-site Event writes.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeighborhoodsResponse"}}}},"401":{"description":"The bearer credential is missing, malformed, revoked, or invalid.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"WWW-Authenticate":{"description":"Bearer authentication challenge.","schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unauthorized","message":"A valid bearer credential is required.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"403":{"description":"The credential is valid but API access is paused or its bookstore or literary organization is archived.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"forbidden","message":"API access is not enabled for this bookstore or literary organization.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"405":{"description":"The endpoint only accepts GET requests.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Allow":{"description":"The supported HTTP method.","schema":{"type":"string","const":"GET"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"This endpoint only supports GET requests.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"429":{"description":"The API subject exceeded 120 requests in the current one-minute window.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}},"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"type":"integer","minimum":1}},"RateLimit-Limit":{"description":"The API subject-wide request limit for the current window.","schema":{"type":"integer","const":120}},"RateLimit-Remaining":{"description":"Requests remaining for the authenticated API subject in the current window.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current API subject rate-limit window resets.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limited","message":"Too many requests. Retry after the indicated delay.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"500":{"description":"An unexpected failure occurred. The request ID can be shared with support.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"An unexpected error occurred.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}},"503":{"description":"A required service is temporarily unavailable.","headers":{"Cache-Control":{"description":"Error responses are never cached.","schema":{"type":"string","const":"no-store"}},"Vary":{"description":"Prevents a cache from sharing responses between bearer credentials.","schema":{"type":"string","const":"Authorization"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"unavailable","message":"The events API is temporarily unavailable.","requestId":"req_01JZ8X9WZFF8Y8QXJYV6K4J8KC","details":null}}}}}}}}},"components":{"securitySchemes":{"bookstoreBearer":{"type":"http","scheme":"bearer","bearerFormat":"opaque lc_live_ credential","description":"An opaque API bearer issued directly to a bookstore or through OAuth to a bookstore or literary organization. Keep it in server-side secret storage and send it only in the Authorization header."}},"schemas":{"WriteInstant":{"type":"string","description":"Instant with an explicit UTC offset. Accepts RFC 3339 (`Z` or `±HH:MM`) and the colonless `±HHMM` spelling.","anyOf":[{"type":"string","format":"date-time"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?[+-]\\d{4}$"}]},"TaxonomyResponse":{"type":"object","additionalProperties":false,"required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"string","minLength":1},"uniqueItems":true},"meta":{"type":"object","additionalProperties":false,"required":["requestId"],"properties":{"requestId":{"type":"string"}}}}},"NeighborhoodsResponse":{"type":"object","additionalProperties":false,"required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"meta":{"type":"object","additionalProperties":false,"required":["requestId","generatedAt"],"properties":{"requestId":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"}}}}},"EventWriteInput":{"type":"object","additionalProperties":false,"required":["externalEventId","sourceUpdatedAt","sourceState","title","schedule","eventTypes","ageRating","admission"],"properties":{"externalEventId":{"type":"string","minLength":1,"maxLength":200},"sourceUpdatedAt":{"$ref":"#/components/schemas/WriteInstant"},"sourceState":{"type":"string","enum":["scheduled","cancelled"]},"sourceUrl":{"anyOf":[{"type":"string","format":"uri","pattern":"^https?://"},{"type":"null"}]},"title":{"type":"string","minLength":1,"maxLength":240},"description":{"anyOf":[{"type":"object","additionalProperties":false,"required":["markdown"],"properties":{"markdown":{"type":"string","pattern":"^(?![\\s\\S]*<\\/?[A-Za-z][^>]*>)[\\s\\S]*$"},"text":{"type":"string"}}},{"type":"null"}]},"schedule":{"type":"object","additionalProperties":false,"required":["startsAt"],"properties":{"startsAt":{"$ref":"#/components/schemas/WriteInstant"},"endsAt":{"anyOf":[{"$ref":"#/components/schemas/WriteInstant"},{"type":"null"}]},"timeZone":{"type":"string","minLength":1}}},"eventTypes":{"type":"array","minItems":1,"maxItems":3,"uniqueItems":true,"items":{"type":"string","minLength":1}},"genres":{"type":"array","maxItems":3,"uniqueItems":true,"items":{"type":"string","minLength":1}},"ageRating":{"type":"string","enum":["allAges","kids","teens","adults"]},"venue":{"description":"Bookstore subjects may omit venue to use the bookstore or explicitly choose bookstore, offsite, or virtual. Literary organization subjects must supply an offsite or virtual venue.","oneOf":[{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"kind":{"const":"bookstore","description":"Available only when the authenticated API subject is a bookstore."}}},{"type":"object","additionalProperties":false,"required":["kind","name","address"],"properties":{"kind":{"const":"offsite"},"name":{"type":"string","minLength":1},"address":{"type":"object","additionalProperties":false,"required":["street","city","region","postalCode"],"properties":{"street":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"region":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"neighborhoodId":{"anyOf":[{"type":"string"},{"type":"null"}]}}}}},{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"kind":{"const":"virtual"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"joinUrl":{"anyOf":[{"type":"string","format":"uri","pattern":"^https://"},{"type":"null"}]}}}]},"admission":{"type":"object","additionalProperties":false,"required":["isFree"],"properties":{"isFree":{"type":"boolean"},"priceText":{"anyOf":[{"type":"string"},{"type":"null"}]},"ticketIncludesBook":{"type":"boolean"},"registration":{"type":"object","additionalProperties":false,"required":["required"],"properties":{"required":{"type":"boolean"},"url":{"anyOf":[{"type":"string","format":"uri","pattern":"^https?://"},{"type":"null"}]}}},"ticketUrl":{"anyOf":[{"type":"string","format":"uri","pattern":"^https?://"},{"type":"null"}]}}},"image":{"anyOf":[{"type":"object","additionalProperties":false,"required":["alt","originalUrl"],"properties":{"alt":{"type":"string","minLength":1},"originalUrl":{"type":"string","format":"uri","pattern":"^https://"},"cardUrl":{"type":"string","format":"uri"},"listingUrl":{"type":"string","format":"uri"}}},{"type":"null"}]}}},"EventWriteResponse":{"type":"object","additionalProperties":false,"required":["data","meta"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["id","externalEventId","result","workflowStatus","sourceState","sourceUpdatedAt","canonicalUrl"],"properties":{"id":{"type":"string"},"externalEventId":{"type":"string"},"result":{"type":"string","enum":["created","updated","unchanged"]},"workflowStatus":{"type":"string","enum":["draft","pending_approval","changes_requested","published","cancelled","completed","archived"]},"sourceState":{"type":"string","enum":["scheduled","cancelled"]},"sourceUpdatedAt":{"type":"string","format":"date-time"},"canonicalUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},"meta":{"type":"object","additionalProperties":false,"required":["requestId"],"properties":{"requestId":{"type":"string"}}}}},"EventsResponse":{"type":"object","additionalProperties":false,"required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"meta":{"$ref":"#/components/schemas/EventsMeta"}}},"EventResponse":{"type":"object","additionalProperties":false,"required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Event"},"meta":{"$ref":"#/components/schemas/EventMeta"}}},"EventsMeta":{"type":"object","additionalProperties":false,"required":["requestId","generatedAt","subject","provider","window","count"],"properties":{"requestId":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"},"bookstore":{"$ref":"#/components/schemas/BookstoreIdentity"},"subject":{"$ref":"#/components/schemas/ApiSubjectIdentity"},"provider":{"$ref":"#/components/schemas/Provider"},"window":{"type":"object","additionalProperties":false,"required":["from","to"],"properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"count":{"type":"integer","minimum":0,"maximum":500}}},"EventMeta":{"type":"object","additionalProperties":false,"required":["requestId","generatedAt","subject","provider","window","count"],"properties":{"requestId":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"},"bookstore":{"$ref":"#/components/schemas/BookstoreIdentity"},"subject":{"$ref":"#/components/schemas/ApiSubjectIdentity"},"provider":{"$ref":"#/components/schemas/Provider"},"window":{"type":"null"},"count":{"type":"null"}}},"BookstoreIdentity":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"ApiSubjectIdentity":{"type":"object","additionalProperties":false,"required":["id","name","type"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["bookstore","literaryOrganization"]}}},"Provider":{"type":"object","additionalProperties":false,"required":["name","url"],"properties":{"name":{"type":"string","const":"Lit Circle"},"url":{"type":"string","format":"uri"}}},"Event":{"type":"object","additionalProperties":false,"required":["id","seriesId","title","description","schedule","eventTypes","genres","ageRating","bookstoreRelationships","presenters","venue","people","books","admission","image","canonicalUrl","updatedAt"],"properties":{"id":{"type":"string"},"seriesId":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"type":"string"},"description":{"anyOf":[{"$ref":"#/components/schemas/Description"},{"type":"null"}]},"schedule":{"$ref":"#/components/schemas/Schedule"},"eventTypes":{"type":"array","items":{"type":"string"}},"genres":{"type":"array","items":{"type":"string"}},"ageRating":{"type":"string","enum":["allAges","kids","teens","adults"]},"bookstoreRelationships":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["venue","primaryPresenter","presentedWithPartner"]}},"presenters":{"$ref":"#/components/schemas/Presenters"},"venue":{"$ref":"#/components/schemas/Venue"},"people":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"books":{"type":"array","items":{"$ref":"#/components/schemas/Book"}},"admission":{"$ref":"#/components/schemas/Admission"},"image":{"anyOf":[{"$ref":"#/components/schemas/EventImage"},{"type":"null"}]},"canonicalUrl":{"type":"string","format":"uri"},"updatedAt":{"type":"string","format":"date-time"}}},"Description":{"type":"object","additionalProperties":false,"required":["markdown","text"],"properties":{"markdown":{"type":"string"},"text":{"type":"string"}}},"Schedule":{"type":"object","additionalProperties":false,"required":["startsAt","endsAt","timeZone"],"properties":{"startsAt":{"type":"string","format":"date-time"},"endsAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"timeZone":{"type":"string","description":"The Event's intended IANA timezone.","example":"America/Chicago"}}},"Presenters":{"type":"object","additionalProperties":false,"required":["primary","presentedWith"],"properties":{"primary":{"$ref":"#/components/schemas/Presenter"},"presentedWith":{"type":"array","items":{"$ref":"#/components/schemas/Presenter"}}}},"Presenter":{"type":"object","additionalProperties":false,"required":["id","type","name","canonicalUrl"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bookstore","literaryOrganization"]},"name":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"}}},"Venue":{"type":"object","additionalProperties":false,"required":["kind","name","description","address","mapsUrl","joinUrl"],"properties":{"kind":{"type":"string","enum":["bookstore","offsite","virtual"]},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"anyOf":[{"$ref":"#/components/schemas/Address"},{"type":"null"}]},"mapsUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"joinUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},"Address":{"type":"object","additionalProperties":false,"required":["street","city","region","postalCode","neighborhood"],"properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"region":{"anyOf":[{"type":"string"},{"type":"null"}]},"postalCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"neighborhood":{"anyOf":[{"$ref":"#/components/schemas/Neighborhood"},{"type":"null"}]}}},"Neighborhood":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"Person":{"type":"object","additionalProperties":false,"required":["id","role","position","name","bio","image"],"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string","enum":["author","presenter"]},"position":{"type":"integer","minimum":0},"name":{"type":"string"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"$ref":"#/components/schemas/PersonImage"},{"type":"null"}]}}},"PersonImage":{"type":"object","additionalProperties":false,"required":["alt","originalUrl","cardUrl"],"properties":{"alt":{"type":"string"},"originalUrl":{"type":"string","format":"uri"},"cardUrl":{"type":"string","format":"uri"}}},"Book":{"type":"object","additionalProperties":false,"required":["id","role","position","title","subtitle","authors","description","isbn10","isbn13","publisher","publishedDate","cover","purchaseOptions"],"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string","enum":["featured","additional"]},"position":{"type":"integer","minimum":0},"title":{"type":"string"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"authors":{"type":"array","items":{"type":"string"}},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"isbn10":{"anyOf":[{"type":"string"},{"type":"null"}]},"isbn13":{"anyOf":[{"type":"string"},{"type":"null"}]},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}]},"publishedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"cover":{"anyOf":[{"$ref":"#/components/schemas/BookCover"},{"type":"null"}]},"purchaseOptions":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseOption"}}}},"BookCover":{"type":"object","additionalProperties":false,"required":["alt","originalUrl","coverUrl"],"properties":{"alt":{"type":"string"},"originalUrl":{"type":"string","format":"uri"},"coverUrl":{"type":"string","format":"uri"}}},"PurchaseOption":{"type":"object","additionalProperties":false,"required":["provider","label","url"],"properties":{"provider":{"type":"string","enum":["store","bookshop","libro"]},"label":{"type":"string"},"url":{"type":"string","format":"uri"}}},"Admission":{"type":"object","additionalProperties":false,"required":["isFree","priceText","ticketIncludesBook","registration","ticketUrl"],"properties":{"isFree":{"type":"boolean"},"priceText":{"anyOf":[{"type":"string"},{"type":"null"}]},"ticketIncludesBook":{"type":"boolean"},"registration":{"$ref":"#/components/schemas/Registration"},"ticketUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},"Registration":{"type":"object","additionalProperties":false,"required":["required","provider","url"],"properties":{"required":{"type":"boolean"},"provider":{"anyOf":[{"type":"string","enum":["litCircle","external"]},{"type":"null"}]},"url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},"EventImage":{"type":"object","additionalProperties":false,"required":["alt","originalUrl","cardUrl","listingUrl"],"properties":{"alt":{"type":"string"},"originalUrl":{"type":"string","format":"uri"},"cardUrl":{"type":"string","format":"uri"},"listingUrl":{"type":"string","format":"uri"}}},"ErrorResponse":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message","requestId","details"],"properties":{"code":{"type":"string","enum":["invalid_request","unauthorized","forbidden","not_found","source_not_configured","external_event_exists","potential_duplicate","stale_submission","validation_failed","invalid_window","snapshot_too_large","rate_limited","internal_error","unavailable"]},"message":{"type":"string"},"requestId":{"type":"string"},"details":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"array","items":{"type":"object","additionalProperties":false,"required":["path","message"],"properties":{"path":{"type":"string"},"message":{"type":"string"}}}},{"type":"null"}]}}}}}}}}