Mashhour

Mashhour API

One REST API for the customer app, the merchant app and the control panel.

All systems operational Version 0.0.1 · 1ba70f7 Base URL https://mashhour-api.dev-moltaqa.cloud

API reference (Swagger)

Every endpoint with its request, responses and errors. Try requests right in the browser.

Open docs

Postman collection

Download and import. Sign-in requests save the token, so the rest are authenticated.

Download

OpenAPI 3 document

For code generators and API clients (Dart, Swift, Kotlin, TypeScript…).

Get JSON

Health

MySQL up 1.8 ms·Redis up 0.7 ms

View JSON

Request logs

Recent requests with their body, response, SQL and timing. Look up a failing call by its X-Request-Id.

Open logs

Background jobs

Queued and scheduled jobs (file cleanup now; expiry and notifications later), with failures and retries.

Open board
Foundation stage (M0). The namespaces below are mounted; sign-in, profiles, ads and browsing arrive with the mobile core (M1).

Base paths

PathUsed bySigns in withToken
/v1/customerCustomer app (customers and guests)coming soonMobile number + SMS codemh_cus_…
/v1/merchantMerchant app (stores)coming soonUsername + passwordmh_mer_…
/v1/adminControl panelcoming soonMobile number + passwordmh_adm_…

Send the token as Authorization: Bearer <token>. A token only works in its own app's path. Guests call public routes without one.

Uploading files

A form that takes files is sent as one multipart/form-data request: its fields as text and each file in a named part (for example images and video when creating an ad). Forms without files are JSON. The file type is read from its bytes; each kind has its own types and size limit (ad images 5 MB, ad videos 100 MB). Private files (commercial registration, work document) come back as signed links that expire. The first forms arrive with M1.

Conventions

Language

Send Accept-Language: ar or en (or ?lang=). Arabic is the default; a signed-in account's saved language is used when the request names none.

Errors

Always { code, message, details?, requestId }. Branch on code; show message. details lists field problems with their own message.

Request IDs

Every response has an X-Request-Id header. Include it when reporting a problem.

Mobile numbers

Saudi numbers as typed (05…, 5…, +9665…, Arabic digits too); responses use +9665….

Dates

Times are ISO 8601 in UTC, for example 2026-10-07T09:30:00.000Z.

Lists

App lists scroll with { items, nextCursor }; control panel tables page with { items, page, limit, total }.

Error codes

All 57 codes with their HTTP status and English message
CodeStatusMessage
VALIDATION_FAILED400The request data is invalid
INVALID_JSON400The request body could not be read
UNAUTHORIZED401Please log in to complete this action.
FORBIDDEN403You don't have permission to do this
ACCOUNT_DISABLED403This user is disabled. Please contact the administration.
NOT_FOUND404The requested item was not found
CONFLICT409The request conflicts with existing data
PAYLOAD_TOO_LARGE413The request is larger than allowed
TOO_MANY_REQUESTS429Too many requests, please try again shortly
MOBILE_NOT_REGISTERED404No account is registered with this number. Please make sure the mobile number is correct.
MOBILE_ALREADY_REGISTERED409The mobile number is already registered, please check the number.
MOBILE_UNCHANGED400The new number is the same as your current number.
EMAIL_ALREADY_REGISTERED409The email address is already registered.
USERNAME_TAKEN409This username is already in use. Please choose another one.
CR_ALREADY_REGISTERED409The commercial registration number is already in use.
INVALID_CREDENTIALS401The username or password is incorrect.
ACCOUNT_UNDER_REVIEW403Your account is still under review. You can log in once it is approved.
ACCOUNT_REJECTED403Your account was not approved.
PASSWORD_INCORRECT400The current password is incorrect.
PASSWORD_UNCHANGED400The new password must be different from the current one.
RESET_TOKEN_INVALID400This password reset link is no longer valid. Please request a new code.
CITY_NOT_AVAILABLE400This city is not available. Please choose another.
CATEGORY_NOT_AVAILABLE400This category is not available. Please choose another category.
CATEGORY_NAME_TAKEN409A category with this name already exists. Please enter a different name.
CATEGORY_HAS_ADS409This category has ads, so it cannot be deleted. Deactivate it instead.
OTP_INVALID400The verification code is incorrect.
OTP_EXPIRED400The verification code is invalid or expired. Please request a new one.
OTP_TOO_MANY_ATTEMPTS429Too many incorrect attempts. Please request a new code.
OTP_RESEND_TOO_SOON429You can request a new code in {seconds} seconds.
VERIFICATION_INVALID400This verification is no longer valid. Please request a new code.
SMS_SEND_FAILED503The verification code could not be sent. Please try again.
FILE_REQUIRED400No file was attached.
FILE_TOO_LARGE413File size exceeds the allowed limit ({maxMb} MB).
FILE_TYPE_NOT_ALLOWED415Unsupported file type. Allowed: {allowed}
FILE_NOT_AVAILABLE400This file can't be used. Please upload it again.
PACKAGE_NOT_AVAILABLE400This package is not available. Please choose another package.
PACKAGE_NAME_TAKEN409An active package already has this name. Please enter a different name.
PACKAGE_IN_USE409Merchants have subscribed to this package, so it cannot be deleted. Deactivate it instead.
CONTACT_MESSAGE_REPLIED409This message has already been replied to.
SUBSCRIPTION_ALREADY_ACTIVE409You already have an active subscription. You can subscribe to a new package when it ends.
INSUFFICIENT_BALANCE402Your wallet balance is insufficient. Top up your wallet and try again.
ROLE_NAME_TAKEN409A role with this name already exists. Please enter another name.
ROLE_IN_USE409The role cannot be deleted because it is associated with a system administrator.
SYSTEM_ROLE_LOCKED409The Super Admin role can’t be changed.
SELF_CHANGE_NOT_ALLOWED403You can’t change your own role or account.
ROLE_NOT_AVAILABLE400This role is not available. Please choose another role.
SUPER_ADMIN_ROLE_RESERVED409The Super Admin role can’t be given to another administrator.
SUPER_ADMIN_PROTECTED403Super Admin accounts can’t be changed by other administrators.
AD_NOT_AVAILABLE404This ad is no longer available.
MERCHANT_NOT_AVAILABLE404This store is no longer available.
ALREADY_REPORTED409You have already reported this ad; we are reviewing it.
AD_STATUS_INVALID409This can't be done to the ad in its current status.
MERCHANT_REVIEW_INVALID409This request has already been reviewed.
REPORT_ALREADY_REVIEWED409This report has already been reviewed.
AD_FEE_REQUIRED402Publishing this ad costs {fee} SAR. Pay from your wallet or by card, or subscribe to a package.
IDEMPOTENCY_KEY_REUSED409This Idempotency-Key was already used for a different request.
INTERNAL_ERROR500Something went wrong, please try again