openapi: 3.2.0 info: title: CoworkingView Properties API version: 1.0.0 description: 'Read API for the CoworkingView catalogue plus the lead write path. Within a major version this contract is APPEND-ONLY: fields are added, never removed or retyped, because clients include mobile builds that cannot be recalled. A breaking change means /v2, with /v1 kept alive for at least two app releases.' servers: - url: https://api.coworkingview.com description: Production - url: http://localhost:4000 description: Local development tags: - name: Properties paths: /v1/properties: get: operationId: listProperties summary: Paginated listing cards for the Explore sheet description: List coworking spaces and private offices as compact cards. Filter by locale (required), city, zone, workspace type, amenities, operator, capacity and price. Paginated. Prices are the operator-published figures in each space's own currency. No API key. tags: - Properties parameters: - name: locale in: query required: true schema: type: string enum: - en - de - es - name: page in: query required: false schema: default: 1 type: integer exclusiveMinimum: 0 maximum: 500 - name: pageSize in: query required: false schema: default: 20 type: integer exclusiveMinimum: 0 maximum: 50 - name: seed in: query required: false schema: type: integer minimum: 0 maximum: 2147483647 description: 'Seed for sortBy=random. Required to paginate a random list: reuse the seed returned in meta.seed on every following page, or results repeat and skip.' - name: country in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: city in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: zone in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: operator in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: pricingOptionType in: query required: false schema: type: string enum: - private_office - exclusive_bereich - fix_desk - flex_desk - day_pass - meeting_room - virtual_office - event_space - membership - name: amenities in: query required: false schema: type: string description: Comma-separated amenity slugs, e.g. wifi,coffee,parking (max 20) - name: minCapacity in: query required: false schema: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 - name: minPrice in: query required: false schema: type: number minimum: 0 - name: maxPrice in: query required: false schema: type: number minimum: 0 - name: currency in: query required: false schema: type: string enum: - EUR - GBP - USD - CHF - VES - AED - name: sortBy in: query required: false schema: default: random type: string enum: - random - date-desc - date-asc - distance - price-asc - rating-desc - name: lat in: query required: false schema: type: number minimum: -90 maximum: 90 - name: lng in: query required: false schema: type: number minimum: -180 maximum: 180 - name: radiusMeters in: query required: false schema: type: number exclusiveMinimum: 0 maximum: 200000 - name: bbox in: query required: false schema: type: string description: Viewport as "west,south,east,north" in WGS84 degrees, e.g. 13.2,52.4,13.6,52.6 responses: '200': description: Success content: application/json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: data: type: array items: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ title: type: string countryCode: type: string minLength: 2 maxLength: 2 city: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string required: - slug - name additionalProperties: false zone: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string required: - slug - name additionalProperties: false operator: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string logo: type: object properties: url: type: string format: uri width: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 height: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 alt: type: string thumbHash: type: string required: - url - width - height - alt additionalProperties: false required: - slug - name additionalProperties: false coordinates: type: object properties: lat: type: number minimum: -90 maximum: 90 lng: type: number minimum: -180 maximum: 180 required: - lat - lng additionalProperties: false fromPrice: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false fromBillingPeriod: type: string enum: - month - day - hour - week - year - once rating: type: object properties: score: type: number minimum: 0 maximum: 5 count: type: integer minimum: 0 maximum: 9007199254740991 required: - score - count additionalProperties: false featured: type: boolean updatedAt: description: When the underlying CMS record was last updated. Use as a price-freshness signal; absent for rows with no tracked update time. type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ excerpt: type: string images: type: array items: type: object properties: url: type: string format: uri width: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 height: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 alt: type: string thumbHash: type: string required: - url - width - height - alt additionalProperties: false amenities: type: array items: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9_-]+$ capacity: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 marketPosition: type: object properties: verdict: type: string enum: - below - around - above median: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false sampleSize: type: integer minimum: 0 maximum: 9007199254740991 required: - verdict - median - sampleSize additionalProperties: false distanceMeters: type: number minimum: 0 required: - slug - title - featured - images - amenities additionalProperties: false meta: type: object properties: contractVersion: type: string pagination: type: object properties: page: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 pageSize: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 total: type: integer minimum: 0 maximum: 9007199254740991 pageCount: type: integer minimum: 0 maximum: 9007199254740991 required: - page - pageSize - total - pageCount additionalProperties: false truncated: type: boolean seed: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - contractVersion - pagination additionalProperties: false required: - data - meta additionalProperties: false '400': description: VALIDATION_FAILED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '429': description: RATE_LIMITED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '500': description: INTERNAL_ERROR content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '502': description: UPSTREAM_UNAVAILABLE content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false x-cache: maxAge: 300 staleWhileRevalidate: 3600 /v1/properties/map: get: operationId: mapProperties summary: Lightweight projection of the whole matching set, for map markers description: Same filters as listProperties, but returns a lightweight lat/lng projection of every matching space for map pins. Prefer this when you only need coordinates and a title. No API key. tags: - Properties parameters: - name: locale in: query required: true schema: type: string enum: - en - de - es - name: page in: query required: false schema: default: 1 type: integer exclusiveMinimum: 0 maximum: 500 - name: pageSize in: query required: false schema: default: 20 type: integer exclusiveMinimum: 0 maximum: 50 - name: seed in: query required: false schema: type: integer minimum: 0 maximum: 2147483647 description: 'Seed for sortBy=random. Required to paginate a random list: reuse the seed returned in meta.seed on every following page, or results repeat and skip.' - name: country in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: city in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: zone in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: operator in: query required: false schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: pricingOptionType in: query required: false schema: type: string enum: - private_office - exclusive_bereich - fix_desk - flex_desk - day_pass - meeting_room - virtual_office - event_space - membership - name: amenities in: query required: false schema: type: string description: Comma-separated amenity slugs, e.g. wifi,coffee,parking (max 20) - name: minCapacity in: query required: false schema: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 - name: minPrice in: query required: false schema: type: number minimum: 0 - name: maxPrice in: query required: false schema: type: number minimum: 0 - name: currency in: query required: false schema: type: string enum: - EUR - GBP - USD - CHF - VES - AED - name: sortBy in: query required: false schema: default: random type: string enum: - random - date-desc - date-asc - distance - price-asc - rating-desc - name: lat in: query required: false schema: type: number minimum: -90 maximum: 90 - name: lng in: query required: false schema: type: number minimum: -180 maximum: 180 - name: radiusMeters in: query required: false schema: type: number exclusiveMinimum: 0 maximum: 200000 - name: bbox in: query required: false schema: type: string description: Viewport as "west,south,east,north" in WGS84 degrees, e.g. 13.2,52.4,13.6,52.6 responses: '200': description: Success content: application/json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: data: type: array items: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ title: type: string coordinates: type: object properties: lat: type: number minimum: -90 maximum: 90 lng: type: number minimum: -180 maximum: 180 required: - lat - lng additionalProperties: false fromPrice: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false fromBillingPeriod: type: string enum: - month - day - hour - week - year - once featured: type: boolean image: type: object properties: url: type: string format: uri width: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 height: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 alt: type: string thumbHash: type: string required: - url - width - height - alt additionalProperties: false required: - slug - title - coordinates - featured additionalProperties: false meta: type: object properties: contractVersion: type: string pagination: type: object properties: page: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 pageSize: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 total: type: integer minimum: 0 maximum: 9007199254740991 pageCount: type: integer minimum: 0 maximum: 9007199254740991 required: - page - pageSize - total - pageCount additionalProperties: false truncated: type: boolean seed: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - contractVersion - pagination additionalProperties: false required: - data - meta additionalProperties: false '400': description: VALIDATION_FAILED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '429': description: RATE_LIMITED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '500': description: INTERNAL_ERROR content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '502': description: UPSTREAM_UNAVAILABLE content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false x-cache: maxAge: 300 staleWhileRevalidate: 3600 /v1/properties/{slug}: get: operationId: propertyDetail summary: Full property detail description: 'Full detail for one space: address, published prices by workspace type, amenities, capacity and operator. `slug` is the catalogue slug from listProperties or searchSuggest. Returns 404 when the slug does not exist. No API key.' tags: - Properties parameters: - name: slug in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ - name: locale in: query required: true schema: type: string enum: - en - de - es responses: '200': description: Success content: application/json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: data: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ title: type: string countryCode: type: string minLength: 2 maxLength: 2 city: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string required: - slug - name additionalProperties: false zone: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string required: - slug - name additionalProperties: false operator: type: object properties: slug: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9-]+$ name: type: string logo: type: object properties: url: type: string format: uri width: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 height: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 alt: type: string thumbHash: type: string required: - url - width - height - alt additionalProperties: false required: - slug - name additionalProperties: false coordinates: type: object properties: lat: type: number minimum: -90 maximum: 90 lng: type: number minimum: -180 maximum: 180 required: - lat - lng additionalProperties: false fromPrice: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false fromBillingPeriod: type: string enum: - month - day - hour - week - year - once rating: type: object properties: score: type: number minimum: 0 maximum: 5 count: type: integer minimum: 0 maximum: 9007199254740991 required: - score - count additionalProperties: false featured: type: boolean updatedAt: description: When the underlying CMS record was last updated. Use as a price-freshness signal; absent for rows with no tracked update time. type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ description: type: string address: type: string images: type: array items: type: object properties: url: type: string format: uri width: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 height: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 alt: type: string thumbHash: type: string required: - url - width - height - alt additionalProperties: false amenities: type: array items: type: string minLength: 1 maxLength: 200 pattern: ^[a-z0-9_-]+$ capacity: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 pricingOptions: type: array items: type: object properties: optionType: type: string enum: - private_office - exclusive_bereich - fix_desk - flex_desk - day_pass - meeting_room - virtual_office - event_space - membership title: type: string price: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false priceOnRequest: type: boolean billingPeriod: type: string enum: - month - day - hour - week - year - once minCapacity: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 maxCapacity: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 required: - optionType - title - priceOnRequest - billingPeriod additionalProperties: false marketPosition: type: object properties: verdict: type: string enum: - below - around - above median: type: object properties: amount: type: number minimum: 0 currency: type: string enum: - EUR - GBP - USD - CHF - VES - AED required: - amount - currency additionalProperties: false sampleSize: type: integer minimum: 0 maximum: 9007199254740991 required: - verdict - median - sampleSize additionalProperties: false webUrl: type: string format: uri required: - slug - title - featured - description - address - images - amenities - pricingOptions - webUrl additionalProperties: false meta: type: object properties: contractVersion: type: string pagination: type: object properties: page: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 pageSize: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 total: type: integer minimum: 0 maximum: 9007199254740991 pageCount: type: integer minimum: 0 maximum: 9007199254740991 required: - page - pageSize - total - pageCount additionalProperties: false truncated: type: boolean seed: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - contractVersion additionalProperties: false required: - data - meta additionalProperties: false '400': description: VALIDATION_FAILED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '404': description: NOT_FOUND content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '429': description: RATE_LIMITED content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '500': description: INTERNAL_ERROR content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false '502': description: UPSTREAM_UNAVAILABLE content: application/problem+json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: type: type: string title: type: string status: type: integer minimum: 400 maximum: 599 detail: type: string code: type: string enum: - VALIDATION_FAILED - NOT_FOUND - RATE_LIMITED - CHALLENGE_FAILED - UPSTREAM_UNAVAILABLE - INTERNAL_ERROR - CLIENT_TOO_OLD - IDEMPOTENCY_KEY_CONFLICT errors: type: array items: type: object properties: path: type: string message: type: string required: - path - message additionalProperties: false traceId: type: string required: - type - title - status - code additionalProperties: false x-cache: maxAge: 300 staleWhileRevalidate: 3600