openapi: 3.0.3 info: title: 'directorybackend API Documentation' description: '' version: 1.0.0 servers: - url: 'https://staging.me-fie.co.uk' tags: - name: Endpoints description: '' paths: /api/login: post: summary: '' operationId: postApiLogin description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/register: post: summary: '' operationId: postApiRegister description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: first_name: type: string description: 'Must be at least 3 characters. Must not be greater than 255 characters.' example: b last_name: type: string description: 'Must be at least 3 characters. Must not be greater than 255 characters.' example: 'n' email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com country_code: type: string description: 'Must not be greater than 10 characters.' example: vdljni phone: type: string description: 'Must not be greater than 30 characters.' example: k password: type: string description: 'Must be at least 8 characters.' example: 'wmi/#iw/k' required: - first_name - last_name - email - country_code - phone - password security: [] /api/logout: post: summary: '' operationId: postApiLogout description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/update_user: patch: summary: '' operationId: patchApiUpdate_user description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: first_name: type: string description: 'Must be at least 2 characters. Must not be greater than 255 characters.' example: b last_name: type: string description: 'Must be at least 2 characters. Must not be greater than 255 characters.' example: 'n' email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com country_code: type: string description: 'Must not be greater than 10 characters.' example: vdljni phone: type: string description: 'Must not be greater than 30 characters.' example: k avatar: type: string format: binary description: 'Must be a file. Must not be greater than 2048 kilobytes.' security: [] /api/delete_account: delete: summary: '' operationId: deleteApiDelete_account description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: password: type: string description: '' example: architecto required: - password security: [] /api/auth/google/redirect: get: summary: '' operationId: getApiAuthGoogleRedirect description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/auth/google/callback: get: summary: '' operationId: getApiAuthGoogleCallback description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/all_users: get: summary: '' operationId: getApiAll_users description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/users/{id}': get: summary: '' operationId: getApiUsersId description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the user.' example: architecto required: true schema: type: string '/api/users/{user}/make_admin': patch: summary: '' operationId: patchApiUsersUserMake_admin description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user description: 'The user.' example: architecto required: true schema: type: string '/api/users/{user}/make_vendor': patch: summary: '' operationId: patchApiUsersUserMake_vendor description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user description: 'The user.' example: architecto required: true schema: type: string '/api/users/{user}/make_user': patch: summary: '' operationId: patchApiUsersUserMake_user description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user description: 'The user.' example: architecto required: true schema: type: string '/api/users/{user}/make_listing_agent': patch: summary: '' operationId: patchApiUsersUserMake_listing_agent description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user description: 'The user.' example: architecto required: true schema: type: string '/api/users/{user}/remove_listing_agent': post: summary: '' operationId: postApiUsersUserRemove_listing_agent description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user description: 'The user.' example: architecto required: true schema: type: string /api/user: get: summary: '' operationId: getApiUser description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/change_password: put: summary: '' operationId: putApiChange_password description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/reset_mail: post: summary: '' operationId: postApiReset_mail description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/reset_password: post: summary: '' operationId: postApiReset_password description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/verify_user: post: summary: '' operationId: postApiVerify_user description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/verify_email: post: summary: '' operationId: postApiVerify_email description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/resend_otp: post: summary: '' operationId: postApiResend_otp description: '' parameters: [] responses: { } tags: - Endpoints security: [] '/api/users/{user_id}/suspend': post: summary: 'Suspend a user' operationId: suspendAUser description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: 'Must not be greater than 500 characters.' example: b duration: type: string description: '' example: 30_days enum: - 1_day - 7_days - 30_days - permanent nullable: true custom_date: type: string description: 'Must be a valid date. Must be a date after now.' example: '2052-09-28' nullable: true required: - reason security: [] parameters: - in: path name: user_id description: 'The ID of the user.' example: 1 required: true schema: type: integer '/api/users/{user_id}/unsuspend': post: summary: 'Unsuspend a user' operationId: unsuspendAUser description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: user_id description: 'The ID of the user.' example: 1 required: true schema: type: integer '/api/listing/{listing}/opening_hours': get: summary: '' operationId: getApiListingListingOpening_hours description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiListingListingOpening_hours description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: architecto required: true schema: type: string '/api/opening_hours/{opening_hour_slug}': put: summary: '' operationId: putApiOpening_hoursOpening_hour_slug description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: day_of_week: type: string description: '' example: Monday enum: - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday open_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' close_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' security: [] delete: summary: '' operationId: deleteApiOpening_hoursOpening_hour_slug description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: opening_hour_slug description: 'The slug of the opening hour.' example: architecto required: true schema: type: string /api/categories: get: summary: 'Public taxonomy — active main/sub categories only (legacy tags excluded per PRD §14), cached.' operationId: publicTaxonomyActiveMainsubCategoriesOnlylegacyTagsExcludedPerPRD14Cached description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiCategories description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b type: type: string description: '' example: mainCategory enum: - mainCategory - subCategory parent_slug: type: string description: 'The slug of an existing record in the categories table.' example: architecto nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true is_top_category: type: boolean description: '' example: false featured_image: type: string format: binary description: 'This field is required when is_top_category is true. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true required: - name - type security: [] /api/admin/categories: get: summary: "Admin taxonomy — active and archived main/sub categories, with live\nimpact counts and permitted actions. Legacy tags are not shown as\neditable categories here (PRD §18.2). Never cached." operationId: adminTaxonomyActiveAndArchivedMainsubCategoriesWithLiveImpactCountsAndPermittedActionsLegacyTagsAreNotShownAsEditableCategoriesHerePRD182NeverCached description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/categories/{category_slug}': put: summary: '' operationId: putApiCategoriesCategory_slug description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true is_top_category: type: boolean description: '' example: false featured_image: type: string format: binary description: 'Must be an image. Must not be greater than 2048 kilobytes.' nullable: true security: [] delete: summary: '' operationId: deleteApiCategoriesCategory_slug description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: category_slug description: 'The slug of the category.' example: active-life required: true schema: type: string '/api/categories/{category_slug}/archive': patch: summary: '' operationId: patchApiCategoriesCategory_slugArchive description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: category_slug description: 'The slug of the category.' example: active-life required: true schema: type: string '/api/categories/{category_slug}/merge': post: summary: '' operationId: postApiCategoriesCategory_slugMerge description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: replacement_category_id: type: integer description: 'The id of an existing record in the categories table.' example: 16 required: - replacement_category_id security: [] parameters: - in: path name: category_slug description: 'The slug of the category.' example: active-life required: true schema: type: string /api/categories_with_listings: get: summary: '' operationId: getApiCategories_with_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/countries_dropdown: get: summary: '' operationId: getApiCountries_dropdown description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/country_context: get: summary: '' operationId: getApiCountry_context description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/business_categories: get: summary: '' operationId: getApiBusiness_categories description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/community_categories: get: summary: '' operationId: getApiCommunity_categories description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/event_categories: get: summary: '' operationId: getApiEvent_categories description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/approved_listings: get: summary: '' operationId: getApiApproved_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/listing/{listing_slug}/show': get: summary: '' operationId: getApiListingListing_slugShow description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/social-preview': get: summary: "Lightweight public metadata for social sharing previews (Open Graph /\nTwitter cards) — deliberately separate from show() so building a\nsocial preview never inflates the listing's view count and crawlers\ndon't need to fetch the full listing payload (media, categories,\nratings, events, etc.) just to build four strings." operationId: lightweightPublicMetadataForSocialSharingPreviewsOpenGraphTwitterCardsDeliberatelySeparateFromShowSoBuildingASocialPreviewNeverInflatesTheListingsViewCountAndCrawlersDontNeedToFetchTheFullListingPayloadmediaCategoriesRatingsEventsEtcJustToBuildFourStrings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/listing/profile: post: summary: '' operationId: postApiListingProfile description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b bio: type: string description: 'Must not be greater than 65535 characters.' example: 'n' nullable: true primary_country_code: type: string description: 'This field is required when primary_phone is present. Must be at least 1 character.' example: gzmiyvdljnikhway nullable: true primary_phone: type: string description: '' example: architecto nullable: true secondary_country_code: type: string description: 'This field is required when secondary_phone is present. Must be at least 1 character.' example: ngzmiyvdljnikhwa nullable: true secondary_phone: type: string description: '' example: architecto nullable: true email: type: string description: 'Must be a valid email address.' example: zbailey@example.net nullable: true category_ids: type: array description: 'The id of an existing record in the categories table.' example: null items: type: string website: type: string description: '' example: architecto nullable: true business_reg_num: type: string description: '' example: architecto nullable: true registration_country: type: string description: 'This field is required when registration_authority is present. Must be 2 characters.' example: ng nullable: true registration_authority: type: string description: 'This field is required when registration_country is present. Must not be greater than 255 characters.' example: z nullable: true type: type: string description: '' example: event enum: - business - event - community business_hours_mode: type: string description: '' example: contact_for_hours enum: - scheduled - always_open - appointment_only - contact_for_hours nullable: true community_location_scope: type: string description: '' example: online enum: - physical - online - hybrid - global nullable: true duplicate_assessment_id: type: integer description: 'The id of an existing record in the duplicate_check_attempts table.' example: 16 nullable: true duplicate_explanation: type: string description: 'Must not be greater than 2000 characters.' example: 'n' nullable: true required: - name - type security: [] '/api/listing/{listing_slug}/address': put: summary: '' operationId: putApiListingListing_slugAddress description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: address: type: string description: '' example: architecto country: type: string description: '' example: architecto city: type: string description: '' example: architecto nullable: true google_plus_code: type: string description: '' example: architecto nullable: true latitude: type: number description: 'Must be between -90 and 90.' example: -89 nullable: true longitude: type: number description: 'Must be between -180 and 180.' example: -180 nullable: true required: - address - country security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/listing/my_listings: get: summary: 'Return paginated listings owned by the authenticated user.' operationId: returnPaginatedListingsOwnedByTheAuthenticatedUser description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/listing/{listing_slug}/update': patch: summary: '' operationId: patchApiListingListing_slugUpdate description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b bio: type: string description: 'Must not be greater than 65535 characters.' example: 'n' primary_country_code: type: string description: 'This field is required when primary_phone is present. Must be at least 1 character.' example: gzmiyvdljnikhway nullable: true primary_phone: type: string description: 'This field is required when primary_country_code is present.' example: architecto nullable: true secondary_country_code: type: string description: 'Must be at least 1 character.' example: ngzmiyvdljnikhwa nullable: true secondary_phone: type: string description: '' example: architecto nullable: true email: type: string description: 'Must be a valid email address.' example: zbailey@example.net nullable: true category_ids: type: array description: 'The id of an existing record in the categories table.' example: null items: type: string website: type: string description: '' example: architecto nullable: true business_reg_num: type: string description: '' example: architecto nullable: true registration_country: type: string description: 'This field is required when registration_authority is present. Must be 2 characters.' example: ng nullable: true registration_authority: type: string description: 'This field is required when registration_country is present. Must not be greater than 255 characters.' example: z nullable: true business_hours_mode: type: string description: '' example: scheduled enum: - scheduled - always_open - appointment_only - contact_for_hours nullable: true community_location_scope: type: string description: '' example: hybrid enum: - physical - online - hybrid - global nullable: true security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}': delete: summary: '' operationId: deleteApiListingListing_slug description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: reason: type: string description: 'Must not be greater than 1000 characters.' example: b nullable: true security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/discard_draft': post: summary: '' operationId: postApiListingListingDiscard_draft description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/revisions': post: summary: '' operationId: postApiListingListingRevisions description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/open_revision': get: summary: '' operationId: getApiListingListingOpen_revision description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/opening_hours/immediate_change': post: summary: '' operationId: postApiListingListingOpening_hoursImmediate_change description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/revisions/{revision}': get: summary: '' operationId: getApiRevisionsRevision description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] patch: summary: '' operationId: patchApiRevisionsRevision description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: 'The revision.' example: architecto required: true schema: type: string '/api/revisions/{revision}/submit': post: summary: '' operationId: postApiRevisionsRevisionSubmit description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: 'The revision.' example: architecto required: true schema: type: string '/api/revisions/{revision}/resubmit': post: summary: '' operationId: postApiRevisionsRevisionResubmit description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: 'The revision.' example: architecto required: true schema: type: string '/api/listing/{listing_slug}/media': post: summary: '' operationId: postApiListingListing_slugMedia description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: media: type: array description: 'Must be a file. Must not be greater than 5120 kilobytes.' items: type: string format: binary sort_orders: type: array description: 'Must be at least 0. Must not be greater than 3.' example: - 1 items: type: integer sort_order: type: array description: 'Must be at least 0. Must not be greater than 3.' example: - 1 items: type: integer required: - media security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/media_update': post: summary: '' operationId: postApiListingListing_slugMedia_update description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: media_id: type: integer description: '' example: 16 media: type: string format: binary description: 'Must be a file. Must not be greater than 5120 kilobytes.' sort_order: type: integer description: 'Must be at least 0. Must not be greater than 3.' example: 1 nullable: true required: - media_id - media security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/notifications: get: summary: '' operationId: getApiNotifications description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/notifications/mark-all-read: post: summary: '' operationId: postApiNotificationsMarkAllRead description: '' parameters: [] responses: { } tags: - Endpoints security: [] '/api/notifications/{notification}/read': patch: summary: '' operationId: patchApiNotificationsNotificationRead description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: notification description: 'The notification.' example: architecto required: true schema: type: string '/api/listing/{listing}/submit': post: summary: '' operationId: postApiListingListingSubmit description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/experience': patch: summary: '' operationId: patchApiListingListingExperience description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/form_progress': patch: summary: '' operationId: patchApiListingListingForm_progress description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/resubmit': post: summary: '' operationId: postApiListingListingResubmit description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/status_history': get: summary: '' operationId: getApiListingListingStatus_history description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/update_status': patch: summary: '' operationId: patchApiListingListingUpdate_status description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/media_revisions': post: summary: '' operationId: postApiListingListingMedia_revisions description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/media_revisions/{revision}': get: summary: '' operationId: getApiMedia_revisionsRevision description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/items': post: summary: '' operationId: postApiMedia_revisionsRevisionItems description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/items/{item}/upload': post: summary: '' operationId: postApiMedia_revisionsRevisionItemsItemUpload description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string - in: path name: item description: 'The item.' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/items/{item}/confirm': post: summary: '' operationId: postApiMedia_revisionsRevisionItemsItemConfirm description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string - in: path name: item description: 'The item.' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/desired_state': patch: summary: '' operationId: patchApiMedia_revisionsRevisionDesired_state description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/commit': post: summary: '' operationId: postApiMedia_revisionsRevisionCommit description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string '/api/media_revisions/{revision}/cancel': post: summary: '' operationId: postApiMedia_revisionsRevisionCancel description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: '' example: architecto required: true schema: type: string '/api/listing/{listing}/eventDetails': post: summary: '' operationId: postApiListingListingEventDetails description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: event_start_date: type: string description: 'Must be a valid date.' example: '2026-09-04T20:26:38' event_end_date: type: string description: 'Must be a valid date. Must be a date after or equal to event_start_date.' example: '2052-09-27' event_start_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' event_end_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' event_venue: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true event_venue_address: type: string description: 'Must not be greater than 500 characters.' example: g nullable: true event_city: type: string description: 'Must not be greater than 255 characters.' example: z nullable: true event_country: type: string description: 'Must not be greater than 255 characters.' example: m nullable: true event_type: type: string description: '' example: 1_day enum: - 1_day - 2_days - multi_days nullable: true event_location: type: string description: '' example: hybrid enum: - in_person - online - hybrid nullable: true event_price: type: number description: 'Must be at least 0.' example: 8 nullable: true event_currency: type: string description: 'Must be 3 characters.' example: yvd nullable: true event_ticket_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true event_online_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true summary: type: string description: 'Must not be greater than 1000 characters.' example: r nullable: true timezone: type: string description: 'Must be a valid time zone, such as Africa/Accra.' example: Indian/Mahe is_all_day: type: boolean description: '' example: true online_access_policy: type: string description: '' example: sent_after_registration enum: - public_link - sent_after_registration - shared_later nullable: true online_access_instructions: type: string description: 'Must not be greater than 2000 characters.' example: i nullable: true attendance_type: type: string description: '' example: free_registration_required enum: - free_no_registration - free_registration_required - paid nullable: true registration_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://fritsch.com/autem-et-consequatur-aut-dolores-enim-non-facere-tempora' nullable: true admission_availability: type: string description: '' example: sold_out enum: - available - coming_soon - closed - sold_out nullable: true pricing_mode: type: string description: '' example: multiple enum: - fixed - multiple - varies nullable: true purchase_method: type: string description: '' example: external_url enum: - external_url - pay_at_venue - contact_organizer nullable: true purchase_instructions: type: string description: 'Must not be greater than 1000 characters.' example: t nullable: true ticket_provider: type: string description: 'Must not be greater than 255 characters.' example: u nullable: true ticket_release_at: type: string description: 'Must be a valid date.' example: '2026-09-04T20:26:38' nullable: true ticket_availability_message: type: string description: 'Must not be greater than 1000 characters.' example: j nullable: true latitude: type: number description: 'Must be between -90 and 90.' example: -90 nullable: true longitude: type: number description: 'Must be between -180 and 180.' example: -179 nullable: true required: - event_start_date - event_end_date - event_start_time - event_end_time - timezone security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/event/{event_slug}/update': patch: summary: 'Update the specified event details.' operationId: updateTheSpecifiedEventDetails description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: event_start_date: type: string description: 'Must be a valid date.' example: '2026-09-04T20:26:38' event_end_date: type: string description: 'Must be a valid date. Must be a date after or equal to event_start_date.' example: '2052-09-27' event_start_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' nullable: true event_end_time: type: string description: 'Must be a valid date in the format H:i.' example: '20:26' nullable: true event_venue: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true event_venue_address: type: string description: 'Must not be greater than 500 characters.' example: g nullable: true event_city: type: string description: 'Must not be greater than 255 characters.' example: z nullable: true event_country: type: string description: 'Must not be greater than 255 characters.' example: m nullable: true event_type: type: string description: '' example: multi_days enum: - 1_day - 2_days - multi_days nullable: true event_location: type: string description: '' example: online enum: - in_person - online - hybrid nullable: true event_price: type: number description: 'Must be at least 0.' example: 8 nullable: true event_currency: type: string description: 'Must be 3 characters.' example: yvd nullable: true event_ticket_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'https://gaylord.com/modi-deserunt-aut-ab-provident-perspiciatis.html' nullable: true event_online_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://www.cruickshank.com/adipisci-quidem-nostrum-qui-commodi-incidunt-iure' nullable: true summary: type: string description: 'Must not be greater than 1000 characters.' example: r nullable: true timezone: type: string description: 'Must be a valid time zone, such as Africa/Accra.' example: Indian/Mahe nullable: true is_all_day: type: boolean description: '' example: true online_access_policy: type: string description: '' example: sent_after_registration enum: - public_link - sent_after_registration - shared_later nullable: true online_access_instructions: type: string description: 'Must not be greater than 2000 characters.' example: i nullable: true attendance_type: type: string description: '' example: paid enum: - free_no_registration - free_registration_required - paid nullable: true registration_url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://fritsch.com/autem-et-consequatur-aut-dolores-enim-non-facere-tempora' nullable: true admission_availability: type: string description: '' example: closed enum: - available - coming_soon - closed - sold_out nullable: true pricing_mode: type: string description: '' example: multiple enum: - fixed - multiple - varies nullable: true purchase_method: type: string description: '' example: pay_at_venue enum: - external_url - pay_at_venue - contact_organizer nullable: true purchase_instructions: type: string description: 'Must not be greater than 1000 characters.' example: t nullable: true ticket_provider: type: string description: 'Must not be greater than 255 characters.' example: u nullable: true ticket_release_at: type: string description: 'Must be a valid date.' example: '2026-09-04T20:26:38' nullable: true ticket_availability_message: type: string description: 'Must not be greater than 1000 characters.' example: j nullable: true latitude: type: number description: 'Must be between -90 and 90.' example: -90 nullable: true longitude: type: number description: 'Must be between -180 and 180.' example: -179 nullable: true security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string - in: path name: event_slug description: 'The slug of the event.' example: 5F04D4Aq required: true schema: type: string '/api/event/{event_slug}': delete: summary: 'Remove the specified event details.' operationId: removeTheSpecifiedEventDetails description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: event_slug description: 'The slug of the event.' example: 5F04D4Aq required: true schema: type: string '/api/listing/{listing_slug}/event/{event_slug}/ticket-types': get: summary: "List all ticket types (including inactive ones) for the owner's editor." operationId: listAllTicketTypesincludingInactiveOnesForTheOwnersEditor description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiListingListing_slugEventEvent_slugTicketTypes description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 100 characters.' example: b description: type: string description: 'Must not be greater than 500 characters.' example: 'Et animi quos velit et fugiat.' nullable: true price: type: number description: 'Must be at least 0.' example: 42 required: - name - price security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string - in: path name: event_slug description: 'The slug of the event.' example: 5F04D4Aq required: true schema: type: string '/api/ticket-types/{ticketType_slug}': put: summary: '' operationId: putApiTicketTypesTicketType_slug description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 100 characters.' example: b description: type: string description: 'Must not be greater than 500 characters.' example: 'Et animi quos velit et fugiat.' nullable: true price: type: number description: 'Must be at least 0.' example: 42 sort_order: type: integer description: 'Must be at least 0.' example: 37 is_active: type: boolean description: '' example: false security: [] delete: summary: "Soft-deactivate — ticket types are never hard-deleted so a listing that\nhas already been reviewed/approved doesn't silently lose ticket-type\nhistory when an organizer edits it." operationId: softDeactivateTicketTypesAreNeverHardDeletedSoAListingThatHasAlreadyBeenReviewedapprovedDoesntSilentlyLoseTicketTypeHistoryWhenAnOrganizerEditsIt description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: ticketType_slug description: 'The slug of the ticketType.' example: architecto required: true schema: type: string /api/businesses: get: summary: '' operationId: getApiBusinesses description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/communities: get: summary: '' operationId: getApiCommunities description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/events: get: summary: '' operationId: getApiEvents description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/discover_events: get: summary: '' operationId: getApiDiscover_events description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/all_listings: get: summary: '' operationId: getApiAdminAll_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/approved_listings: get: summary: '' operationId: getApiAdminApproved_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/drafted_listings: get: summary: '' operationId: getApiAdminDrafted_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/rejected_listings: get: summary: '' operationId: getApiAdminRejected_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/pending_listings: get: summary: '' operationId: getApiAdminPending_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/suspended_listings: get: summary: '' operationId: getApiAdminSuspended_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/archived_listings: get: summary: '' operationId: getApiAdminArchived_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/admin/listings/{listingSlug}': get: summary: '' operationId: getApiAdminListingsListingSlug description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listingSlug description: '' example: gina-s required: true schema: type: string '/api/admin/listings/{listingSlug}/restore': patch: summary: '' operationId: patchApiAdminListingsListingSlugRestore description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listingSlug description: '' example: gina-s required: true schema: type: string /api/admin/search: get: summary: '' operationId: getApiAdminSearch description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/listings_by_geolocation: get: summary: '' operationId: getApiListings_by_geolocation description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/category_landing: get: summary: '' operationId: getApiCategory_landing description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/top_listings_by_category_and_geolocation: get: summary: '' operationId: getApiTop_listings_by_category_and_geolocation description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/all_listings_by_category_and_geolocation: get: summary: '' operationId: getApiAll_listings_by_category_and_geolocation description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/top_listings_by_country_and_category: get: summary: '' operationId: getApiTop_listings_by_country_and_category description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/all_listings_by_country_and_category: get: summary: '' operationId: getApiAll_listings_by_country_and_category description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/search: get: summary: '' operationId: getApiSearch description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/listing/{listing}/claim_eligibility': get: summary: '' operationId: getApiListingListingClaim_eligibility description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string /api/my_claims: get: summary: '' operationId: getApiMy_claims description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/claims/{claimCase}': get: summary: '' operationId: getApiClaimsClaimCase description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/claims/{claimCase}/evidence/{evidence}/signed_url': get: summary: '' operationId: getApiClaimsClaimCaseEvidenceEvidenceSigned_url description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string - in: path name: evidence description: 'The evidence.' example: architecto required: true schema: type: string '/api/listing/{listing}/claims/email': post: summary: '' operationId: postApiListingListingClaimsEmail description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/claims/email/resend': post: summary: '' operationId: postApiListingListingClaimsEmailResend description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/claims/email/verify': post: summary: '' operationId: postApiListingListingClaimsEmailVerify description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/claims/document': post: summary: '' operationId: postApiListingListingClaimsDocument description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/claims/{claimCase}/evidence': post: summary: '' operationId: postApiClaimsClaimCaseEvidence description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/claims/{claimCase}/withdraw': post: summary: '' operationId: postApiClaimsClaimCaseWithdraw description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/listing/{listing}/claim_by_email': post: summary: '' operationId: postApiListingListingClaim_by_email description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/verify_claim_by_email': post: summary: '' operationId: postApiListingListingVerify_claim_by_email description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/claim': post: summary: '' operationId: postApiListingListingClaim description: '' parameters: [] responses: { } tags: - Endpoints deprecated: true security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/new_listing_mail': post: summary: 'Compatibility alias for the V1 submission URL.' operationId: compatibilityAliasForTheV1SubmissionURL description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: admin_past_event_override: type: boolean description: '' example: true security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/admin/claims: get: summary: '' operationId: getApiAdminClaims description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/admin/claims/{claimCase}': get: summary: '' operationId: getApiAdminClaimsClaimCase description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/admin/claims/{claimCase}/approve': patch: summary: '' operationId: patchApiAdminClaimsClaimCaseApprove description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/admin/claims/{claimCase}/reject': patch: summary: '' operationId: patchApiAdminClaimsClaimCaseReject description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/admin/claims/{claimCase}/request_evidence': patch: summary: '' operationId: patchApiAdminClaimsClaimCaseRequest_evidence description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string '/api/admin/claims/{claimCase}/evidence/{evidence}/signed_url': get: summary: '' operationId: getApiAdminClaimsClaimCaseEvidenceEvidenceSigned_url description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: claimCase description: '' example: architecto required: true schema: type: string - in: path name: evidence description: 'The evidence.' example: architecto required: true schema: type: string /api/claims: get: summary: '' operationId: getApiClaims description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/admin/listings/{listing_slug}/stewardship/assign': post: summary: '' operationId: postApiAdminListingsListing_slugStewardshipAssign description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: agent_id: type: integer description: 'The id of an existing record in the users table.' example: 16 required: - agent_id security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/admin/listings/{listing_slug}/stewardship/reassign': post: summary: '' operationId: postApiAdminListingsListing_slugStewardshipReassign description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: agent_id: type: integer description: 'The id of an existing record in the users table.' example: 16 required: - agent_id security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/admin/listings/{listing_slug}/stewardship/end': post: summary: '' operationId: postApiAdminListingsListing_slugStewardshipEnd description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/admin/stewardship/unassigned_queue: get: summary: '' operationId: getApiAdminStewardshipUnassigned_queue description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: 'Must not be greater than 100 characters.' example: b nullable: true page: type: integer description: 'Must be at least 1.' example: 22 per_page: type: integer description: 'Must be at least 1. Must not be greater than 50.' example: 7 security: [] /api/admin/stewardship/eligible_agents: get: summary: '' operationId: getApiAdminStewardshipEligible_agents description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/revisions: get: summary: '' operationId: getApiAdminRevisions description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: 'Must not be greater than 100 characters.' example: b nullable: true page: type: integer description: 'Must be at least 1.' example: 22 per_page: type: integer description: 'Must be at least 1. Must not be greater than 50.' example: 7 security: [] '/api/admin/revisions/{revision}/decision': patch: summary: '' operationId: patchApiAdminRevisionsRevisionDecision description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: revision description: 'The revision.' example: architecto required: true schema: type: string /api/admin/diagnostics/user_id_invariant: get: summary: '' operationId: getApiAdminDiagnosticsUser_id_invariant description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/admin/duplicate_assessments/{assessment}/resolve': patch: summary: '' operationId: patchApiAdminDuplicate_assessmentsAssessmentResolve description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: assessment description: '' example: architecto required: true schema: type: string /api/admin/duplicate_assessments: get: summary: '' operationId: getApiAdminDuplicate_assessments description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: 'Must not be greater than 100 characters.' example: b nullable: true page: type: integer description: 'Must be at least 1.' example: 22 per_page: type: integer description: 'Must be at least 1. Must not be greater than 50.' example: 7 security: [] /api/agent/listings/duplicate_preflight: post: summary: '' operationId: postApiAgentListingsDuplicate_preflight description: '' parameters: [] responses: { } tags: - Endpoints security: [] /api/agent/listings: get: summary: '' operationId: getApiAgentListings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/agent/metrics: get: summary: '' operationId: getApiAgentMetrics description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/agent/owned_listings: get: summary: '' operationId: getApiAgentOwned_listings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/listing/{listing}/management': get: summary: '' operationId: getApiListingListingManagement description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/verify_listing': post: summary: '' operationId: postApiListingListingVerify_listing description: '' parameters: [] responses: { } tags: - Endpoints security: [] put: summary: '' operationId: putApiListingListingVerify_listing description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/resend_otp': post: summary: '' operationId: postApiListingListingResend_otp description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing}/socials': get: summary: '' operationId: getApiListingListingSocials description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiListingListingSocials description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: facebook: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: b nullable: true twitter: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: 'n' nullable: true whatsapp: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: g nullable: true instagram: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: z nullable: true tiktok: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: m nullable: true youtube: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: i nullable: true security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/socials/{social_slug}': put: summary: '' operationId: putApiListingListing_slugSocialsSocial_slug description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: facebook: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: b nullable: true twitter: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: 'n' nullable: true instagram: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: g nullable: true whatsapp: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: z nullable: true tiktok: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: m nullable: true youtube: type: string description: 'Must be a valid URL. Must not be greater than 255 characters.' example: i nullable: true security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string - in: path name: social_slug description: 'The slug of the social.' example: aM7kz5gK required: true schema: type: string '/api/listing/socials/{social_slug}': delete: summary: '' operationId: deleteApiListingSocialsSocial_slug description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: social_slug description: 'The slug of the social.' example: aM7kz5gK required: true schema: type: string '/api/listing/{listing_slug}/sources': get: summary: '' operationId: getApiListingListing_slugSources description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiListingListing_slugSources description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: url: type: string description: 'Must not be greater than 4096 characters.' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' source_type: type: string description: '' example: official_social enum: - official_website - official_social - government_registry - reputable_directory - ticket_platform - news_source - other is_primary: type: boolean description: '' example: true position: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 5 required: - url - source_type - is_primary security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/sources/{source_id}': patch: summary: '' operationId: patchApiListingListing_slugSourcesSource_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: url: type: string description: 'Must not be greater than 4096 characters.' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' source_type: type: string description: '' example: news_source enum: - official_website - official_social - government_registry - reputable_directory - ticket_platform - news_source - other position: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 5 security: [] delete: summary: '' operationId: deleteApiListingListing_slugSourcesSource_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string - in: path name: source_id description: 'The ID of the source.' example: 1 required: true schema: type: integer '/api/listing/{listing_slug}/internal_notes': get: summary: '' operationId: getApiListingListing_slugInternal_notes description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiListingListing_slugInternal_notes description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: body: type: string description: 'Must not be greater than 10000 characters.' example: b required: - body security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/listing/{listing_slug}/internal_notes/{note_id}': patch: summary: '' operationId: patchApiListingListing_slugInternal_notesNote_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: body: type: string description: 'Must not be greater than 10000 characters.' example: b required: - body security: [] delete: summary: '' operationId: deleteApiListingListing_slugInternal_notesNote_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string - in: path name: note_id description: 'The ID of the note.' example: 1 required: true schema: type: integer '/api/admin/internal_notes/{note_id}/legal_hold': patch: summary: '' operationId: patchApiAdminInternal_notesNote_idLegal_hold description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: legal_hold: type: boolean description: '' example: false required: - legal_hold security: [] parameters: - in: path name: note_id description: 'The ID of the note.' example: 1 required: true schema: type: integer '/api/listings/{listing}/services': get: summary: 'List services belonging to a specific listing.' operationId: listServicesBelongingToASpecificListing description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: 'Create a service, attaching an already-uploaded S3 image by key.' operationId: createAServiceAttachingAnAlreadyUploadedS3ImageByKey description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true image_key: type: string description: '' example: architecto nullable: true required: - name security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/listings/{listing}/services/presign': post: summary: 'Generate a presigned S3 URL for direct client-side upload.' operationId: generateAPresignedS3URLForDirectClientSideUpload description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: filename: type: string description: '' example: architecto mime_type: type: string description: '' example: image/gif enum: - image/jpeg - image/png - image/gif - image/webp size: type: string description: '' example: null required: - filename - mime_type security: [] parameters: - in: path name: listing description: 'The listing.' example: gina-s required: true schema: type: string '/api/services/{service_slug}': put: summary: 'Update a service, optionally swapping its image via an already-uploaded S3 key.' operationId: updateAServiceOptionallySwappingItsImageViaAnAlreadyUploadedS3Key description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true image_key: type: string description: '' example: architecto nullable: true security: [] delete: summary: '' operationId: deleteApiServicesService_slug description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: service_slug description: 'The slug of the service.' example: personal-shopper required: true schema: type: string '/api/listing/{listing_slug}/ratings': get: summary: 'Visible ratings for a single listing — public listing page.' operationId: visibleRatingsForASingleListingPublicListingPage description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/ratings: get: summary: 'All ratings for admin moderation dashboard — visible and hidden.' operationId: allRatingsForAdminModerationDashboardVisibleAndHidden description: 'Route is guarded by admin middleware so only admins reach this.' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/my_ratings: get: summary: "The authenticated user's own ratings." operationId: theAuthenticatedUsersOwnRatings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/rating/{rating_slug}': get: summary: 'A single rating by slug — admin detail page.' operationId: aSingleRatingBySlugAdminDetailPage description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] delete: summary: 'Delete a rating — owner or admin only.' operationId: deleteARatingOwnerOrAdminOnly description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: rating_slug description: 'The slug of the rating.' example: jIApEeRZ required: true schema: type: string '/api/listing/{listing_slug}/rating': post: summary: 'Submit a new rating.' operationId: submitANewRating description: 'Rules: authenticated, not own listing, max 3 active per listing, max 3 per day globally.' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: rating: type: integer description: 'Must be at least 1. Must not be greater than 5.' example: 1 comment: type: string description: 'Must be at least 20 characters. Must not be greater than 500 characters.' example: 'n' required: - rating - comment security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string '/api/rating/{rating_slug}/reply': post: summary: 'Vendor posts a single reply to a review on their listing.' operationId: vendorPostsASingleReplyToAReviewOnTheirListing description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: vendor_reply: type: string description: 'Must be at least 1 character. Must not be greater than 500 characters.' example: b required: - vendor_reply security: [] parameters: - in: path name: rating_slug description: 'The slug of the rating.' example: jIApEeRZ required: true schema: type: string /api/vendor/reviews: get: summary: 'All ratings across every listing owned by the authenticated vendor.' operationId: allRatingsAcrossEveryListingOwnedByTheAuthenticatedVendor description: 'Includes soft-deleted reviews for historical/performance record.' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/rating/{rating_slug}/hide': patch: summary: 'Admin hides a review and its reply from the public.' operationId: adminHidesAReviewAndItsReplyFromThePublic description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: moderation_reason: type: string description: 'Must not be greater than 500 characters.' example: b nullable: true security: [] parameters: - in: path name: rating_slug description: 'The slug of the rating.' example: jIApEeRZ required: true schema: type: string '/api/rating/{rating_slug}/unhide': patch: summary: 'Admin restores a previously hidden review.' operationId: adminRestoresAPreviouslyHiddenReview description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: rating_slug description: 'The slug of the rating.' example: jIApEeRZ required: true schema: type: string /api/vendor_ratings: get: summary: '' operationId: getApiVendor_ratings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/listings/{listing_slug}/bookmark/toggle': post: summary: 'Toggle bookmark for a listing.' operationId: toggleBookmarkForAListing description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/my_bookmarks: get: summary: "Get user's bookmarked listings." operationId: getUsersBookmarkedListings description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/bookmark/{bookmark}': delete: summary: 'Remove a bookmark.' operationId: removeABookmark description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: bookmark description: 'The bookmark.' example: architecto required: true schema: type: string '/api/listing/{listing_slug}/views': get: summary: 'Get view statistics for a listing (shows both authenticated and guest views)' operationId: getViewStatisticsForAListingshowsBothAuthenticatedAndGuestViews description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: listing_slug description: 'The slug of the listing.' example: gina-s required: true schema: type: string /api/curated_collections: get: summary: 'Public index — returns published, non-expired collections, optionally filtered by country.' operationId: publicIndexReturnsPublishedNonExpiredCollectionsOptionallyFilteredByCountry description: 'Caches per-country for 30 minutes.' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: '' operationId: postApiCurated_collections description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b subtitle: type: string description: '' example: architecto nullable: true country: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true sort_order: type: integer description: 'Must be at least 0.' example: 84 is_published: type: boolean description: '' example: true expires_at: type: string description: 'Must be a valid date. Must be a date after now.' example: '2052-09-28' nullable: true required: - title - sort_order security: [] /api/curated_collections/listing-search: get: summary: 'Search approved listings for the admin collection picker.' operationId: searchApprovedListingsForTheAdminCollectionPicker description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/curated_collections/{collection_id}': get: summary: '' operationId: getApiCurated_collectionsCollection_id description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] put: summary: '' operationId: putApiCurated_collectionsCollection_id description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b subtitle: type: string description: '' example: architecto nullable: true country: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true sort_order: type: integer description: 'Must be at least 0.' example: 84 is_published: type: boolean description: '' example: false expires_at: type: string description: 'Must be a valid date.' example: '2026-09-04T20:26:39' nullable: true security: [] delete: summary: '' operationId: deleteApiCurated_collectionsCollection_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: collection_id description: 'The ID of the collection.' example: 16 required: true schema: type: integer '/api/curated_collections/{collection_id}/items': post: summary: '' operationId: postApiCurated_collectionsCollection_idItems description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: listing_id: type: integer description: 'The id of an existing record in the listings table.' example: 16 required: - listing_id security: [] parameters: - in: path name: collection_id description: 'The ID of the collection.' example: 16 required: true schema: type: integer '/api/curated_collections/{collection_id}/items/{item_id}': delete: summary: '' operationId: deleteApiCurated_collectionsCollection_idItemsItem_id description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: collection_id description: 'The ID of the collection.' example: 16 required: true schema: type: integer - in: path name: item_id description: 'The ID of the item.' example: 16 required: true schema: type: integer '/api/curated_collections/{collection_id}/items/reorder': patch: summary: '' operationId: patchApiCurated_collectionsCollection_idItemsReorder description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: id: type: integer description: 'The id of an existing record in the collection_items table.' example: 16 sort_order: type: integer description: 'Must be at least 0.' example: 39 required: - id - sort_order required: - items security: [] parameters: - in: path name: collection_id description: 'The ID of the collection.' example: 16 required: true schema: type: integer /api/admin/curated_collections: get: summary: 'Admin index — returns all collections regardless of published state.' operationId: adminIndexReturnsAllCollectionsRegardlessOfPublishedState description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/blogs: get: summary: 'Display a listing of blogs.' operationId: displayAListingOfBlogs description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: 'Store a newly created blog.' operationId: storeANewlyCreatedBlog description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b content: type: string description: '' example: architecto excerpt: type: string description: 'Must not be greater than 500 characters.' example: 'n' nullable: true featured_image: type: string format: binary description: 'Must be an image. Must not be greater than 5120 kilobytes.' nullable: true category_id: type: string description: 'The id of an existing record in the blog_categories table.' example: null nullable: true tags: type: array description: 'Must not be greater than 50 characters.' example: - g items: type: string status: type: string description: '' example: published enum: - draft - published meta_data: type: object description: '' example: null properties: { } nullable: true is_featured: type: boolean description: '' example: false allow_comments: type: boolean description: '' example: true images: type: array description: 'Must be an image. Must not be greater than 5120 kilobytes.' items: type: string format: binary nullable: true required: - title - content - status security: [] /api/blogs/search: get: summary: 'Search blogs.' operationId: searchBlogs description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/blogs/stats: get: summary: 'Get blog statistics.' operationId: getBlogStatistics description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] '/api/blogs/{slug}': get: summary: 'Display the specified blog.' operationId: displayTheSpecifiedBlog description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: slug description: 'The slug of the blog.' example: architecto required: true schema: type: string /api/blog-categories: get: summary: 'Display all categories.' operationId: displayAllCategories description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: 'Store a new category.' operationId: storeANewCategory description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true featured_image: type: string format: binary description: 'Must be an image. Must not be greater than 2048 kilobytes.' nullable: true is_active: type: boolean description: '' example: false sort_order: type: integer description: '' example: 16 meta_data: type: object description: '' example: null properties: { } nullable: true required: - name security: [] '/api/blog-categories/{slug}': get: summary: 'Display category with its blogs.' operationId: displayCategoryWithItsBlogs description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] parameters: - in: path name: slug description: 'The slug of the blog category.' example: architecto required: true schema: type: string '/api/blogs/{blog_id}/comments': get: summary: 'Get comments for a blog.' operationId: getCommentsForABlog description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: 'Store a new comment.' operationId: storeANewComment description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 2000 characters.' example: b parent_id: type: string description: 'The id of an existing record in the blog_comments table.' example: null nullable: true required: - comment security: [] parameters: - in: path name: blog_id description: 'The ID of the blog.' example: 16 required: true schema: type: integer '/api/blogs/{blog_id}': put: summary: 'Update the specified blog.' operationId: updateTheSpecifiedBlog description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b content: type: string description: '' example: architecto excerpt: type: string description: 'Must not be greater than 500 characters.' example: 'n' nullable: true featured_image: type: string format: binary description: 'Must be an image. Must not be greater than 5120 kilobytes.' nullable: true category_id: type: string description: 'The id of an existing record in the blog_categories table.' example: null nullable: true tags: type: array description: 'Must not be greater than 50 characters.' example: - g items: type: string status: type: string description: '' example: archived enum: - draft - published - archived meta_data: type: object description: '' example: null properties: { } nullable: true is_featured: type: boolean description: '' example: false allow_comments: type: boolean description: '' example: true images: type: array description: 'Must be an image. Must not be greater than 5120 kilobytes.' items: type: string format: binary nullable: true security: [] delete: summary: 'Remove the specified blog.' operationId: removeTheSpecifiedBlog description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: blog_id description: 'The ID of the blog.' example: 16 required: true schema: type: integer '/api/blogs/{blog_id}/like': post: summary: 'Like/unlike a blog.' operationId: likeunlikeABlog description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: blog_id description: 'The ID of the blog.' example: 16 required: true schema: type: integer '/api/blog-categories/{category_id}': put: summary: 'Update category.' operationId: updateCategory description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: multipart/form-data: schema: type: object properties: name: type: string description: '' example: null description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true featured_image: type: string format: binary description: 'Must be an image. Must not be greater than 2048 kilobytes.' nullable: true is_active: type: boolean description: '' example: false sort_order: type: integer description: '' example: 16 meta_data: type: object description: '' example: null properties: { } nullable: true security: [] delete: summary: 'Delete category.' operationId: deleteCategory description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: category_id description: 'The ID of the category.' example: 16 required: true schema: type: integer '/api/blog-comments/{comment_id}': put: summary: 'Update a comment.' operationId: updateAComment description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 2000 characters.' example: b required: - comment security: [] delete: summary: 'Delete a comment.' operationId: deleteAComment description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: comment_id description: 'The ID of the comment.' example: 16 required: true schema: type: integer '/api/blog-comments/{comment_id}/like': post: summary: 'Like a comment.' operationId: likeAComment description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: comment_id description: 'The ID of the comment.' example: 16 required: true schema: type: integer '/api/blog-comments/{comment_id}/moderate': post: summary: 'Moderate comment (admin only).' operationId: moderateCommentadminOnly description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: status: type: string description: '' example: spam enum: - approved - spam required: - status security: [] parameters: - in: path name: comment_id description: 'The ID of the comment.' example: 16 required: true schema: type: integer /api/faqs: get: summary: 'Public Page: List only visible FAQs' operationId: publicPageListOnlyVisibleFAQs description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/admin/faqs: get: summary: 'Admin Dashboard: List all FAQs (visible and hidden)' operationId: adminDashboardListAllFAQsvisibleAndHidden description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] post: summary: 'Create a new FAQ' operationId: createANewFAQ description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: question: type: string description: 'Must not be greater than 255 characters.' example: b answer: type: string description: '' example: architecto required: - question - answer security: [] '/api/admin/faqs/{faq_slug}': put: summary: 'Update an existing FAQ' operationId: updateAnExistingFAQ description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: question: type: string description: 'Must not be greater than 255 characters.' example: b answer: type: string description: '' example: architecto security: [] delete: summary: 'Permanently Delete an FAQ' operationId: permanentlyDeleteAnFAQ description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: faq_slug description: 'The slug of the faq.' example: what-is-the-mefie-directory required: true schema: type: string '/api/admin/faqs/{faq_slug}/toggle-status': patch: summary: 'Toggle Visibility (Hide / Show)' operationId: toggleVisibilityHideShow description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: faq_slug description: 'The slug of the faq.' example: what-is-the-mefie-directory required: true schema: type: string