{"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 30 minutes before request time. That earlier start applies to start-only events. Events with an end time overlap until the request time, and the default end is clamped so the interval does not exceed 366 days.","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}}}}},"502":{"description":"Book lookup failed; no changes were saved.","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":"unavailable","message":"Book lookup is unavailable. Try again.","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 omitted enrichment survive. Explicit people/books arrays replace their collection after catalog-first resolution.","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}}}}},"502":{"description":"Book lookup failed; no changes were saved.","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":"unavailable","message":"Book lookup is unavailable. Try again.","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":{"people":{"type":"array","maxItems":8,"description":"Event participants. Omission preserves enrichment; an explicit array replaces it. Reuse saved IDs or uniquely matching names; new names create name-only profiles. A merged-away person ID resolves to the kept person. Book authorship does not imply participation. Authors, including co-authors, appear under Featured Authors; send moderators and interviewers as presenter, shown as In Conversation With (one) or Presenters (several).","items":{"type":"object","additionalProperties":false,"required":["role"],"anyOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"name":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["author","presenter"]}}}},"books":{"type":"array","maxItems":8,"minContains":0,"maxContains":1,"contains":{"type":"object","required":["role"],"properties":{"role":{"const":"featured"}}},"description":"At most one featured book. Omission preserves enrichment; an explicit array replaces it. Resolve saved ID, ISBN, or exact title first, then look up missing books. Ambiguous titles require an ISBN or saved ID. Existing catalog metadata is never overwritten.","items":{"type":"object","additionalProperties":false,"required":["role"],"anyOf":[{"required":["id"]},{"required":["isbn"]},{"required":["title"]}],"properties":{"id":{"type":"string","minLength":1,"maxLength":200},"isbn":{"type":"string","minLength":1,"maxLength":200},"title":{"type":"string","minLength":1,"maxLength":150},"role":{"type":"string","enum":["featured","additional"]}}}},"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"}]},"maxPriceText":{"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","warnings"],"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"}]},"warnings":{"type":"array","description":"Problems the write skipped instead of rejecting, such as a book that matched no edition or several. Empty on an unchanged retry.","items":{"type":"object","additionalProperties":false,"required":["path","code","message"],"properties":{"path":{"type":"string"},"code":{"type":"string","enum":["book_not_matched","book_ambiguous"]},"message":{"type":"string"}}}}}},"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"},"familyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"ApiSubjectIdentity":{"type":"object","additionalProperties":false,"required":["id","name","type"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"familyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}]},"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","stops","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","stop"]},"description":"How the authorizing bookstore is connected to the Event. `stop` means the bookstore is one of the stops of a multi-stop Event."},"presenters":{"$ref":"#/components/schemas/Presenters"},"stops":{"type":"array","items":{"$ref":"#/components/schemas/Stop"},"description":"The active Bookstores and Lit Orgs a participant visits during a multi-stop Event, in any order. Empty for every other Event. Check it for your own organization to tell whether you are a stop."},"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","familyName","locationName","canonicalUrl"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bookstore","literaryOrganization"]},"name":{"type":"string"},"familyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}]},"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","multiStop"],"description":"`multiStop` Events have no single venue: `name` counts the stops, `address` and `mapsUrl` are null, and the places are listed in `stops`."},"name":{"type":"string"},"familyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}]},"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"}]}}},"Stop":{"type":"object","additionalProperties":false,"required":["id","type","name","note","address","mapsUrl","canonicalUrl"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bookstore","literaryOrganization"]},"name":{"type":"string"},"note":{"anyOf":[{"type":"string","description":"Short public note from the Event's author, such as \"Closed Mondays\"."},{"type":"null"}]},"address":{"anyOf":[{"$ref":"#/components/schemas/Address"},{"type":"null"}]},"mapsUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"canonicalUrl":{"type":"string","format":"uri"}}},"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"}]}}}}}}}}