Skip to content
Ezaz Developers

API reference

Every operation of the partner API 1.3.0, generated at build time from the contract the API serves.

Operation and field descriptions come from the contract, in English.

Court booking, court details, reviews and safety reports for partner apps. OAuth 2.0 client credentials. Webhooks (reservation.created, reservation.cancelled, reservation.no_show, reservation.completed, reservation.checked_in, review.replied, safety_report.resolved; ignore types you don't know) are signed with HMAC-SHA256: Ezaz-Signature: t=<unix>,v1=<hex of HMAC(secret, t + '.' + body)>; reject anything older than 5 minutes and dedupe on the event id. Errors are RFC 9457 problem details with a stable code.

Authentication

post/partner/oauth/token

Client credentials: a 10-minute access token for the partner API

Authenticate with HTTP Basic (client_secret_basic, preferred) or with client_id and client_secret in the form (client_secret_post). The token lasts 10 minutes (expires_in); ask for a new one when it ends, there is no refresh token. Answers are never cached. Who: any partner app Ezaz registered and hasn't suspended. Errors: 400 invalid_request, unsupported_grant_type or invalid_scope; 401 invalid_client: unknown client, wrong secret or suspended.

Scope
None: this is how you get a token
operationId
partnerToken

Parameters

Parameters of partnerToken
NameInTypeRequiredDescription
AuthorizationheaderstringNo
Basic base64(client_id:client_secret), for client_secret_basic

Request body

Content type: application/x-www-form-urlencoded

Fields of partnerToken
NameTypeRequiredDescription
client_idstringNo
Your client id (kp_…), with client_secret_post only
client_secretstringNo
Your client secret (ks_…), with client_secret_post only
grant_type"client_credentials"Yes
Always client_credentials
scopestringNo
Scopes to ask for, separated by spaces; omit for all you were granted
Example
client_id=kp_your_client_id&client_secret=ks_your_client_secret&grant_type=client_credentials&scope=venues%3Aread%20availability%3Aread

Responses

200 The token · application/json · PartnerToken

Example
{
  "access_token": "eyJhbGciOiJIUzI1NiJ9…",
  "expires_in": 600,
  "scope": "venues:read availability:read",
  "token_type": "Bearer"
}

Errors

Errors of partnerToken
StatusDescriptionContent type
400
invalid_request, unsupported_grant_type or invalid_scope
application/jsonPartnerTokenError
401
invalid_client: unknown client, wrong secret or suspended
application/jsonPartnerTokenError

Venues and courts

get/partner/v1/venues

List the venues that let you sell their courts

Active venues that granted you, with their address, area, contact phone, cancellation cutoff and active courts. Page with after (the previous page's nextCursor) until nextCursor is null; a page can be shorter than limit without being the last. Scopes: venues:read (the token needs every one). Errors: 400 VALIDATION_FAILED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 429 PARTNER_RATE_LIMITED.

Scope
venues:read
operationId
partnerListVenues

Parameters

Parameters of partnerListVenues
NameInTypeRequiredDescription
afterquerystring (uuid)No
The nextCursor of the previous page; omit for the first
limitqueryinteger (int32)No
Page sizemin 1 · max 100 · default 50

Responses

200 OK · application/json · PartnerVenuePage

Example
{
  "items": [
    {
      "address": {
        "ar": "string",
        "en": "string"
      },
      "area": {
        "code": "new-cairo",
        "name": {
          "ar": "string",
          "en": "string"
        }
      },
      "cancellationHours": 24,
      "contactPhone": "+201001234567",
      "courts": [
        {
          "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
          "environment": "string",
          "kind": "string",
          "name": {
            "ar": "string",
            "en": "string"
          }
        }
      ],
      "latitude": 30.0074,
      "longitude": 31.4913,
      "name": {
        "ar": "string",
        "en": "string"
      },
      "photoUrls": [
        "string"
      ],
      "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
    }
  ],
  "nextCursor": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerListVenues
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

get/partner/v1/venues/{venueId}/availability

Get free slots and prices on a Cairo date

Every active court's free slots of the given length (60, 90 or 120 minutes) starting on the half hour on that Cairo date, inside the venue's opening hours, with the list price of each. Slots are UTC instants; daylight saving is handled (a skipped hour has no slots). Scopes: availability:read (the token needs every one). Errors: 400 VALIDATION_FAILED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
availability:read
operationId
partnerAvailability

Parameters

Parameters of partnerAvailability
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue
datequerystring (date)Yes
A Cairo date (YYYY-MM-DD)
minutesqueryinteger (int32)No
Session length: 60, 90 or 120default 60

Responses

200 OK · application/json · array of CourtSlots

Example
[
  {
    "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "slots": [
      {
        "end": "2026-10-10T17:00:00Z",
        "price": {
          "amount": 120000,
          "currency": "EGP"
        },
        "start": "2026-10-10T17:00:00Z"
      }
    ]
  }
]

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerAvailability
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

get/partner/v1/venues/{venueId}/courts

List a venue's courts with their facts

The venue's active courts: facts (surface, walls, lighting, size, dates), public photos, the rating from published reviews (from 3 reviews) and the safety summary (open issues only, never the reports). Scopes: venues:read (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
venues:read
operationId
partnerListCourts

Parameters

Parameters of partnerListCourts
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue

Responses

200 OK · application/json · array of CourtDetail

Example
[
  {
    "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "environment": "string",
    "kind": "string",
    "lastRenovatedOn": "2026-10-10",
    "latestReviews": [
      {
        "authorName": "Omar H.",
        "cleanliness": 1,
        "comment": "Great glass and new turf.",
        "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
        "createdAt": "2026-10-10T17:00:00Z",
        "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
        "lighting": 1,
        "overall": 1,
        "repliedAt": "2026-10-10T17:00:00Z",
        "reply": "Thanks, see you again!",
        "surface": 1
      }
    ],
    "lighting": "string",
    "name": {
      "ar": "string",
      "en": "string"
    },
    "openedOn": "2026-10-10",
    "photoUrls": [
      "string"
    ],
    "rating": {
      "average": 4.5,
      "cleanliness": 1.5,
      "count": 12,
      "lighting": 1.5,
      "surface": 1.5
    },
    "renovationNote": "string",
    "safety": {
      "lastResolvedOn": "2026-10-10",
      "openIssues": 1
    },
    "size": "string",
    "surface": "string",
    "turfBrand": "string",
    "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "walls": "string"
  }
]

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerListCourts
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

get/partner/v1/venues/{venueId}/courts/{courtId}

Get one court with its newest reviews

One active court as in the list, plus its newest published reviews. Scopes: venues:read (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND, COURT_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
venues:read
operationId
partnerGetCourt

Parameters

Parameters of partnerGetCourt
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue
courtIdpathstring (uuid)Yes
The court

Responses

200 OK · application/json · CourtDetail

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "environment": "string",
  "kind": "string",
  "lastRenovatedOn": "2026-10-10",
  "latestReviews": [
    {
      "authorName": "Omar H.",
      "cleanliness": 1,
      "comment": "Great glass and new turf.",
      "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
      "createdAt": "2026-10-10T17:00:00Z",
      "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
      "lighting": 1,
      "overall": 1,
      "repliedAt": "2026-10-10T17:00:00Z",
      "reply": "Thanks, see you again!",
      "surface": 1
    }
  ],
  "lighting": "string",
  "name": {
    "ar": "string",
    "en": "string"
  },
  "openedOn": "2026-10-10",
  "photoUrls": [
    "string"
  ],
  "rating": {
    "average": 4.5,
    "cleanliness": 1.5,
    "count": 12,
    "lighting": 1.5,
    "surface": 1.5
  },
  "renovationNote": "string",
  "safety": {
    "lastResolvedOn": "2026-10-10",
    "openIssues": 1
  },
  "size": "string",
  "surface": "string",
  "turfBrand": "string",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "walls": "string"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerGetCourt
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND, COURT_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

get/partner/v1/venues/{venueId}/courts/{courtId}/reviews

List a court's published reviews

Published reviews of the court, newest first. Continue with before and beforeId set from the last item's createdAt and id. Hidden reviews never show. Scopes: venues:read (the token needs every one). Errors: 400 VALIDATION_FAILED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND, COURT_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
venues:read
operationId
partnerListCourtReviews

Parameters

Parameters of partnerListCourtReviews
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue
courtIdpathstring (uuid)Yes
The court
beforequerystring (date-time)No
Continue after the item created at this instant (from the previous page)
beforeIdquerystring (uuid)No
And with this id (ties)
limitqueryinteger (int32)No
Page sizemin 1 · max 50 · default 20

Responses

200 OK · application/json · array of Review

Example
[
  {
    "authorName": "Omar H.",
    "cleanliness": 1,
    "comment": "Great glass and new turf.",
    "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "createdAt": "2026-10-10T17:00:00Z",
    "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "lighting": 1,
    "overall": 1,
    "repliedAt": "2026-10-10T17:00:00Z",
    "reply": "Thanks, see you again!",
    "surface": 1
  }
]

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerListCourtReviews
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND, COURT_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/venues/{venueId}/player-passes

Get a player's packages and memberships at a venue

The packages (minutes left, expiry) and memberships (discount) the player holds at the venue, found by the phone you verified, sent in the body so it never lands in a URL or a log. Lookups are capped per partner app: 60 a minute and 3,000 a day. Scopes: passes:read (the token needs every one). Errors: 400 VALIDATION_FAILED, PHONE_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND; 429 PARTNER_RATE_LIMITED, PARTNER_PASS_LOOKUPS_LIMITED.

Scope
passes:read
operationId
partnerPlayerPasses

Parameters

Parameters of partnerPlayerPasses
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue

Request body

Content type: application/json · PlayerLookupRequest

Example
{
  "phone": "+201001234567"
}

Responses

200 OK · application/json · PlayerPasses

Example
{
  "memberships": [
    {
      "discountBps": 1000,
      "endsAt": "2026-10-10T17:00:00Z",
      "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
      "name": {
        "ar": "string",
        "en": "string"
      },
      "startsAt": "2026-10-10T17:00:00Z"
    }
  ],
  "packages": [
    {
      "expiresAt": "2026-10-10T17:00:00Z",
      "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
      "minutesLeft": 1,
      "minutesTotal": 1,
      "name": {
        "ar": "string",
        "en": "string"
      }
    }
  ]
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerPlayerPasses
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budget; or PARTNER_PASS_LOOKUPS_LIMITED (60 a minute and 3,000 a day per partner app)Retry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/venues/{venueId}/quote

Quote a slot for your player

What the slot costs your player: the list price and, when their phone holds a membership at the venue, the member price, which is what they pay however it is paid, prepaid to you or at the venue (ADR 0015). Quote right before booking with PREPAID_BY_PARTNER so you collect the right amount. The phone goes in the body, never the URL. Scopes: availability:read, passes:read (the token needs every one). Errors: 400 VALIDATION_FAILED, PHONE_INVALID, COURT_SLOT_NOT_BOOKABLE; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND, COURT_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scopes (the token needs all of them)
availability:readpasses:read
operationId
partnerQuote

Parameters

Parameters of partnerQuote
NameInTypeRequiredDescription
venueIdpathstring (uuid)Yes
The venue

Request body

Content type: application/json · QuoteRequest

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "minutes": 90,
  "phone": "+201001234567",
  "start": "2026-10-10T17:00:00Z"
}

Responses

200 OK · application/json · Quote

Example
{
  "charge": {
    "amount": 120000,
    "currency": "EGP"
  },
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "discountBps": 1000,
  "end": "2026-10-10T17:00:00Z",
  "price": {
    "amount": 120000,
    "currency": "EGP"
  },
  "start": "2026-10-10T17:00:00Z"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerQuote
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID, COURT_SLOT_NOT_BOOKABLE (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND, COURT_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Reservations

get/partner/v1/reservations

List your reservations in a period

Your reservations overlapping [from, to), at most 31 days and 500 reservations, by start; other partners' and the desk's never show. Scopes: reservations:read (the token needs every one). Errors: 400 VALIDATION_FAILED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 429 PARTNER_RATE_LIMITED.

Scope
reservations:read
operationId
partnerListReservations

Parameters

Parameters of partnerListReservations
NameInTypeRequiredDescription
fromquerystring (date-time)Yes
Start of the period, an instant in UTC; reservations overlapping [from, to)
toquerystring (date-time)Yes
End of the period, at most 31 days after from

Responses

200 OK · application/json · array of Reservation

Example
[
  {
    "cancelReason": "string",
    "cancelledAt": "2026-10-10T17:00:00Z",
    "charge": {
      "amount": 120000,
      "currency": "EGP"
    },
    "checkedInAt": "2026-10-10T17:00:00Z",
    "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "createdAt": "2026-10-10T17:00:00Z",
    "customer": {
      "name": "Omar Hassan",
      "phone": "+201001234567"
    },
    "end": "2026-10-10T17:00:00Z",
    "externalRef": "kb_8f2c41",
    "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "payment": {
      "collected": {
        "amount": 120000,
        "currency": "EGP"
      },
      "method": "PAY_AT_VENUE",
      "packageCreditId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
    },
    "price": {
      "amount": 120000,
      "currency": "EGP"
    },
    "start": "2026-10-10T17:00:00Z",
    "status": "CONFIRMED",
    "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
  }
]

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerListReservations
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/reservations

Book a court for your player

Confirmed at once, or COURT_TAKEN when the court is booked then (the database refuses double bookings). Pay at the venue (the desk collects the charge), prepaid by you (you collected; you owe the venue the charge on your statement) or with the player's package (customer.phoneVerified must be true; its minutes are taken now and come back on cancellation). The venue's desk sees the player's name and phone. Sessions are 60, 90 or 120 minutes from a half hour, inside opening hours, up to 30 days ahead. Scopes: reservations:write (the token needs every one). Idempotent: send a unique Idempotency-Key (yours alone, up to 80 characters); a retry with the same key returns the first result instead of creating another. Errors: 400 VALIDATION_FAILED, PHONE_INVALID, COURT_INVALID, COURT_SLOT_NOT_BOOKABLE, COURT_PAYMENT_INVALID, PARTNER_PHONE_NOT_VERIFIED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND, COURT_NOT_FOUND; 409 COURT_TAKEN, EXTERNAL_REF_IN_USE, VENUE_NOT_TAKING_BOOKINGS, COURT_PASS_NOT_USABLE, COURT_RESERVATION_STATE_INVALID; 429 PARTNER_RATE_LIMITED.

Scope
reservations:write
operationId
partnerBook

Needs an Idempotency-Key header

Parameters

Parameters of partnerBook
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes
Your unique key for this create (up to 80 characters); a retry with the same key returns the first result

Request body

Content type: application/json · PartnerBookingRequest

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "customer": {
    "name": "Omar Hassan",
    "phone": "+201001234567",
    "phoneVerified": true
  },
  "externalRef": "kb_8f2c41",
  "minutes": 90,
  "payment": {
    "collected": {
      "amount": 120000,
      "currency": "EGP"
    },
    "method": "PAY_AT_VENUE",
    "packageCreditId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
  },
  "start": "2026-10-10T17:00:00Z",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Responses

201 Created · application/json · Reservation

Example
{
  "cancelReason": "string",
  "cancelledAt": "2026-10-10T17:00:00Z",
  "charge": {
    "amount": 120000,
    "currency": "EGP"
  },
  "checkedInAt": "2026-10-10T17:00:00Z",
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "createdAt": "2026-10-10T17:00:00Z",
  "customer": {
    "name": "Omar Hassan",
    "phone": "+201001234567"
  },
  "end": "2026-10-10T17:00:00Z",
  "externalRef": "kb_8f2c41",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "payment": {
    "collected": {
      "amount": 120000,
      "currency": "EGP"
    },
    "method": "PAY_AT_VENUE",
    "packageCreditId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
  },
  "price": {
    "amount": 120000,
    "currency": "EGP"
  },
  "start": "2026-10-10T17:00:00Z",
  "status": "CONFIRMED",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerBook
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID, COURT_INVALID, COURT_SLOT_NOT_BOOKABLE, COURT_PAYMENT_INVALID, PARTNER_PHONE_NOT_VERIFIED (a package payment without customer.phoneVerified true) (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND, COURT_NOT_FOUND
application/problem+jsonProblem
409application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

get/partner/v1/reservations/{reservationId}

Get one of your reservations

One reservation you made, with its status, price, charge and payment; another partner's is a 404. Scopes: reservations:read (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 COURT_RESERVATION_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
reservations:read
operationId
partnerGetReservation

Parameters

Parameters of partnerGetReservation
NameInTypeRequiredDescription
reservationIdpathstring (uuid)Yes
The reservation

Responses

200 OK · application/json · Reservation

Example
{
  "cancelReason": "string",
  "cancelledAt": "2026-10-10T17:00:00Z",
  "charge": {
    "amount": 120000,
    "currency": "EGP"
  },
  "checkedInAt": "2026-10-10T17:00:00Z",
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "createdAt": "2026-10-10T17:00:00Z",
  "customer": {
    "name": "Omar Hassan",
    "phone": "+201001234567"
  },
  "end": "2026-10-10T17:00:00Z",
  "externalRef": "kb_8f2c41",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "payment": {
    "collected": {
      "amount": 120000,
      "currency": "EGP"
    },
    "method": "PAY_AT_VENUE",
    "packageCreditId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
  },
  "price": {
    "amount": 120000,
    "currency": "EGP"
  },
  "start": "2026-10-10T17:00:00Z",
  "status": "CONFIRMED",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerGetReservation
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): COURT_RESERVATION_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/reservations/{reservationId}/cancel

Cancel one of your reservations

Free of charge until the venue's cancellation cutoff (Venue.cancellationHours before the start) and before the player checks in; after that only the venue can cancel. Package minutes come back, and the venue's owner is told. A reservation that is no longer confirmed can't be cancelled again. Scopes: reservations:write (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 COURT_RESERVATION_NOT_FOUND; 409 COURT_RESERVATION_NOT_CANCELLABLE; 429 PARTNER_RATE_LIMITED.

Scope
reservations:write
operationId
partnerCancelReservation

Parameters

Parameters of partnerCancelReservation
NameInTypeRequiredDescription
reservationIdpathstring (uuid)Yes
The reservation

Responses

200 OK · application/json · Reservation

Example
{
  "cancelReason": "string",
  "cancelledAt": "2026-10-10T17:00:00Z",
  "charge": {
    "amount": 120000,
    "currency": "EGP"
  },
  "checkedInAt": "2026-10-10T17:00:00Z",
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "createdAt": "2026-10-10T17:00:00Z",
  "customer": {
    "name": "Omar Hassan",
    "phone": "+201001234567"
  },
  "end": "2026-10-10T17:00:00Z",
  "externalRef": "kb_8f2c41",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "payment": {
    "collected": {
      "amount": 120000,
      "currency": "EGP"
    },
    "method": "PAY_AT_VENUE",
    "packageCreditId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
  },
  "price": {
    "amount": 120000,
    "currency": "EGP"
  },
  "start": "2026-10-10T17:00:00Z",
  "status": "CONFIRMED",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerCancelReservation
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): COURT_RESERVATION_NOT_FOUND
application/problem+jsonProblem
409application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Reviews

get/partner/v1/reservations/{reservationId}/review

Get the review of your reservation

The review your player wrote for a reservation you made, with the venue owner's reply when there is one. Scopes: reservations:read (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 COURT_RESERVATION_NOT_FOUND, COURT_REVIEW_NOT_FOUND; 429 PARTNER_RATE_LIMITED.

Scope
reservations:read
operationId
partnerGetReservationReview

Parameters

Parameters of partnerGetReservationReview
NameInTypeRequiredDescription
reservationIdpathstring (uuid)Yes
The reservation

Responses

200 OK · application/json · PartnerReview

Example
{
  "authorName": "Omar H.",
  "comment": "Great glass and new turf.",
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "createdAt": "2026-10-10T17:00:00Z",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "repliedAt": "2026-10-10T17:00:00Z",
  "reply": "Thanks, see you again!",
  "reservationId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "scores": {
    "cleanliness": 1,
    "lighting": 1,
    "overall": 1,
    "surface": 1
  },
  "status": "string",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerGetReservationReview
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): COURT_RESERVATION_NOT_FOUND, COURT_REVIEW_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/reservations/{reservationId}/review

Review a reservation for your player

Your player's stars and words about the court of a reservation you made, once it was played (completed, or confirmed past its end), within 14 days of its end, once. Published at once; sending the same review again returns it, a different one is COURT_REVIEW_EXISTS. You get review.replied when the owner answers. Scopes: reviews:write (the token needs every one). Errors: 400 VALIDATION_FAILED, COURT_REVIEW_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 COURT_RESERVATION_NOT_FOUND; 409 COURT_REVIEW_NOT_ALLOWED, COURT_REVIEW_EXISTS; 429 PARTNER_RATE_LIMITED.

Scope
reviews:write
operationId
partnerReviewReservation

Parameters

Parameters of partnerReviewReservation
NameInTypeRequiredDescription
reservationIdpathstring (uuid)Yes
The reservation

Request body

Content type: application/json · PartnerReviewRequest

Example
{
  "cleanliness": 1,
  "comment": "Great glass and new turf.",
  "lighting": 1,
  "overall": 1,
  "surface": 1
}

Responses

201 Created · application/json · PartnerReview

Example
{
  "authorName": "Omar H.",
  "comment": "Great glass and new turf.",
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "createdAt": "2026-10-10T17:00:00Z",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "repliedAt": "2026-10-10T17:00:00Z",
  "reply": "Thanks, see you again!",
  "reservationId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "scores": {
    "cleanliness": 1,
    "lighting": 1,
    "overall": 1,
    "surface": 1
  },
  "status": "string",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerReviewReservation
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, COURT_REVIEW_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): COURT_RESERVATION_NOT_FOUND
application/problem+jsonProblem
409application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Safety reports

post/partner/v1/player-safety-reports

List a player's safety reports through you

The reports your player filed through you, newest first, found by the phone you verified (in the body, never the URL). Continue with before and beforeId from the last item. Scopes: safety_reports:read (the token needs every one). Errors: 400 VALIDATION_FAILED, PHONE_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 429 PARTNER_RATE_LIMITED.

Scope
safety_reports:read
operationId
partnerPlayerSafetyReports

Request body

Content type: application/json · PlayerReportsRequest

Example
{
  "before": "2026-10-10T17:00:00Z",
  "beforeId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "limit": 1,
  "phone": "+201001234567"
}

Responses

200 OK · application/json · array of PartnerSafetyReport

Example
[
  {
    "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "courtName": {
      "ar": "string",
      "en": "string"
    },
    "createdAt": "2026-10-10T17:00:00Z",
    "description": "A glass panel by the door is loose.",
    "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "occurredAt": "2026-10-10T17:00:00Z",
    "photoUrls": [
      "string"
    ],
    "resolutionNote": "string",
    "resolvedAt": "2026-10-10T17:00:00Z",
    "status": "string",
    "type": "string",
    "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
    "venueName": {
      "ar": "string",
      "en": "string"
    }
  }
]

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerPlayerSafetyReports
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/safety-reports

File a safety report for your player

Your player reports a safety problem on a court (a slippery surface, broken glass, an injury); the venue is told at once and never learns who reported. No medical details or names of the injured. At most 5 a day per player through you. You get safety_report.resolved when the venue fixes it. Scopes: safety_reports:write (the token needs every one). Idempotent: send a unique Idempotency-Key (yours alone, up to 80 characters); a retry with the same key returns the first result instead of creating another. Errors: 400 VALIDATION_FAILED, PHONE_INVALID, SAFETY_REPORT_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 VENUE_NOT_FOUND, COURT_NOT_FOUND; 429 PARTNER_RATE_LIMITED, TOO_MANY_SAFETY_REPORTS.

Scope
safety_reports:write
operationId
partnerFileSafetyReport

Needs an Idempotency-Key header

Parameters

Parameters of partnerFileSafetyReport
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes
Your unique key for this create (up to 80 characters); a retry with the same key returns the first result

Request body

Content type: application/json · PartnerSafetyReportRequest

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "description": "A glass panel by the door is loose.",
  "occurredAt": "2026-10-10T17:00:00Z",
  "phone": "+201001234567",
  "type": "INJURY",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31"
}

Responses

201 Created · application/json · PartnerSafetyReport

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "courtName": {
    "ar": "string",
    "en": "string"
  },
  "createdAt": "2026-10-10T17:00:00Z",
  "description": "A glass panel by the door is loose.",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "occurredAt": "2026-10-10T17:00:00Z",
  "photoUrls": [
    "string"
  ],
  "resolutionNote": "string",
  "resolvedAt": "2026-10-10T17:00:00Z",
  "status": "string",
  "type": "string",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "venueName": {
    "ar": "string",
    "en": "string"
  }
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerFileSafetyReport
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID, SAFETY_REPORT_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): VENUE_NOT_FOUND, COURT_NOT_FOUND
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budget; or TOO_MANY_SAFETY_REPORTS (5 a day per player)Retry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

post/partner/v1/safety-reports/{reportId}/photos

Add a photo to a safety report

A photo of the problem while the report is open: JPEG, PNG or WebP up to 5 MB, at most 3 per report. Stored in the private bucket without its metadata (location, camera) and shown only through links that expire. Scopes: safety_reports:write (the token needs every one). Errors: 400 FILE_REJECTED; 401 UNAUTHENTICATED; 403 FORBIDDEN; 404 SAFETY_REPORT_NOT_FOUND; 409 SAFETY_REPORT_STATE_INVALID; 429 PARTNER_RATE_LIMITED.

Scope
safety_reports:write
operationId
partnerAddSafetyReportPhoto

Parameters

Parameters of partnerAddSafetyReportPhoto
NameInTypeRequiredDescription
reportIdpathstring (uuid)Yes
The safety report

Request body

Content type: multipart/form-data

Fields of partnerAddSafetyReportPhoto
NameTypeRequiredDescription
filestring (binary)Yes
Example
--boundary
Content-Disposition: form-data; name="file"; filename="court.jpg"
Content-Type: image/jpeg

<file bytes>

Responses

200 OK · application/json · PartnerSafetyReport

Example
{
  "courtId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "courtName": {
    "ar": "string",
    "en": "string"
  },
  "createdAt": "2026-10-10T17:00:00Z",
  "description": "A glass panel by the door is loose.",
  "id": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "occurredAt": "2026-10-10T17:00:00Z",
  "photoUrls": [
    "string"
  ],
  "resolutionNote": "string",
  "resolvedAt": "2026-10-10T17:00:00Z",
  "status": "string",
  "type": "string",
  "venueId": "3f6c1a52-8d4e-4b7a-9c2f-5e1d0a9b7c31",
  "venueName": {
    "ar": "string",
    "en": "string"
  }
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerAddSafetyReportPhoto
StatusDescriptionContent type
400
The request is invalid: FILE_REJECTED
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
404
Not found, or not yours to see (the same answer): SAFETY_REPORT_NOT_FOUND
application/problem+jsonProblem
409
Conflict: SAFETY_REPORT_STATE_INVALID (resolved, or 3 photos already)
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Player data

post/partner/v1/players/erasure

Forward a player's erasure request

For a player who asked you to delete their data (PDPL, ADR 0014): your reservations lose their name and phone, your reviews lose their words (the stars stay), your safety reports are unlinked from them. Only what came through you; amounts stay for the statements. Idempotent: zeros once done. Refused while one of your bookings for them is still to come. Scopes: players:erase (the token needs every one). Errors: 400 VALIDATION_FAILED, PHONE_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 409 CUSTOMER_HAS_OPEN_COMMITMENTS; 429 PARTNER_RATE_LIMITED.

Scope
players:erase
operationId
partnerErasePlayer

Request body

Content type: application/json · PlayerErasureRequest

Example
{
  "phone": "+201001234567"
}

Responses

200 OK · application/json · PlayerErasureResponse

Example
{
  "reservations": 1,
  "reviews": 1,
  "safetyReports": 1
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerErasePlayer
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PHONE_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
409
Conflict: CUSTOMER_HAS_OPEN_COMMITMENTS (one of your bookings for the player is still to come)
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Webhook

Ezaz posts these events to the URL you set here. Getting started explains each one, the payload and how to check its signature:

  • reservation.created
  • reservation.checked_in
  • reservation.cancelled
  • reservation.no_show
  • reservation.completed
  • review.replied
  • safety_report.resolved

Ignore event types you don't know, and still answer them with 2xx so they aren't retried: new types come in minor versions, as reservation.checked_in did in 1.2.0.

get/partner/v1/webhook

Get your webhook

Where your events are posted; the secret is not shown again (set the webhook to get a new one). Scopes: webhooks:manage (the token needs every one). Errors: 401 UNAUTHENTICATED; 403 FORBIDDEN; 429 PARTNER_RATE_LIMITED.

Scope
webhooks:manage
operationId
partnerGetWebhook

Responses

200 OK · application/json · PartnerWebhookResponse

Example
{
  "secret": "whsec_…",
  "url": "https://partner.example/ezaz/webhooks"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerGetWebhook
StatusDescriptionContent type
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

put/partner/v1/webhook

Set or remove your webhook

Events (reservation changes, review replies, resolved safety reports) are posted to this public https URL, signed with HMAC-SHA256 in Ezaz-Signature, and retried for a day. Setting it returns a new signing secret; null removes it. Scopes: webhooks:manage (the token needs every one). Errors: 400 VALIDATION_FAILED, PARTNER_WEBHOOK_URL_INVALID; 401 UNAUTHENTICATED; 403 FORBIDDEN; 429 PARTNER_RATE_LIMITED.

Scope
webhooks:manage
operationId
partnerSetWebhook

Request body

Content type: application/json · PartnerWebhookRequest

Example
{
  "url": "https://partner.example/ezaz/webhooks"
}

Responses

200 OK · application/json · PartnerWebhookResponse

Example
{
  "secret": "whsec_…",
  "url": "https://partner.example/ezaz/webhooks"
}

Errors

Problem details (application/problem+json) with a stable code. Each code is explained under Errors, in Arabic and English.

Errors of partnerSetWebhook
StatusDescriptionContent type
400
The request is invalid: VALIDATION_FAILED, PARTNER_WEBHOOK_URL_INVALID (with errors per field)
application/problem+jsonProblem
401
UNAUTHENTICATED: no token, an expired or invalid one, or a suspended partner
application/problem+jsonProblem
403
FORBIDDEN: the token lacks a scope this operation needs
application/problem+jsonProblem
429
PARTNER_RATE_LIMITED: over your per-minute budgetRetry-After (integer (int32)): Seconds until the budget resets
application/problem+jsonProblem

Schemas

Area

An Egyptian area

Fields of Area
NameTypeRequiredDescription
codestringNo
Stable area code, e.g. NEW_CAIRO
nameLocalizedTextNo
The area's name

Court

A court in a venue list

Fields of Court
NameTypeRequiredDescription
courtIdstring (uuid)No
The court
environmentstringNo
INDOOR, OUTDOOR or COVERED (outdoor under a roof)
kindstringNo
INDOOR or OUTDOOR
nameLocalizedTextNo
Name in Arabic and English (either may be missing)

CourtDetail

A court as players see it; facts are null when the venue hasn't said

Fields of CourtDetail
NameTypeRequiredDescription
courtIdstring (uuid)No
The court
environmentstringNo
INDOOR, OUTDOOR or COVERED (outdoor under a roof)
kindstringNo
INDOOR or OUTDOOR
lastRenovatedOnstring (date)No
When it was last renovated (Cairo date)
latestReviewsarray of ReviewNo
Newest published reviews, on a single court only; null in lists
lightingstringNo
LED, HALOGEN or NONE; null when not said
nameLocalizedTextNo
Name in Arabic and English (either may be missing)
openedOnstring (date)No
When the court opened (Cairo date)
photoUrlsarray of stringNo
Public photo URLs, oldest first
ratingRatingNo
The average of published reviews, from 3 reviews
renovationNotestringNo
What the renovation was
safetySafetyNo
Open safety issues and when the venue last resolved one; never the reports
sizestringNo
STANDARD_DOUBLES or SINGLES; null when not said
surfacestringNo
ARTIFICIAL_GRASS_SAND_FILLED, ARTIFICIAL_GRASS_NON_SAND, TEXTILE, CONCRETE_ACRYLIC or OTHER; null when not said
turfBrandstringNo
The grass or turf brand or model
venueIdstring (uuid)No
The venue
wallsstringNo
GLASS_PANORAMIC, GLASS_STANDARD, MESH_ONLY or CONCRETE_WALLS; null when not said

CourtSlots

One court's free slots

Fields of CourtSlots
NameTypeRequiredDescription
courtIdstring (uuid)No
The court
slotsarray of SlotNo
Free slots of the requested length, by start

Customer

Your player on a reservation

Fields of Customer
NameTypeRequiredDescription
namestringNo
The player's name as you sent it
phonestringNo
The player's phone as you verified it (E.164)

LocalizedText

Text in Arabic and English

Fields of LocalizedText
NameTypeRequiredDescription
arstringNo
Arabic text
enstringNo
English text

Money

An amount in integer piasters

Fields of Money
NameTypeRequiredDescription
amountinteger (int64)No
Integer piasters (1 EGP = 100 piasters); never a fraction
currency"EGP"No
Always EGP

PartnerBookingRequest

A booking for your player

Fields of PartnerBookingRequest
NameTypeRequiredDescription
courtIdstring (uuid)Yes
The court
customerPartnerCustomerRequestYes
Your player: name and verified phone; the venue's desk sees both
externalRefstringNo
Your own reference (e.g. your booking id), echoed back and in webhooks; at most one live reservation per referencemaxLength 80
minutesinteger (int32)Yes
Session length: 60, 90 or 120
paymentPartnerPaymentRequestYes
Who collects the charge
startstring (date-time)Yes
Start, an instant in UTC (ISO-8601)
venueIdstring (uuid)Yes
The venue

PartnerCustomerRequest

Your player: name and the phone you verified

Fields of PartnerCustomerRequest
NameTypeRequiredDescription
namestringYes
The player's name, shown to the venue's deskmaxLength 120
phonestringYes
The player's mobile as you verified it, E.164 or any common Egyptian format; it goes in bodies only, never in URLsmaxLength 20
phoneVerifiedbooleanNo
Your attestation that the player proved this phone to you (for example with a one-time code). Required true to pay with a package (PACKAGE); recorded with the booking

PartnerPaymentRequest

How the booking is paid

Fields of PartnerPaymentRequest
NameTypeRequiredDescription
collectedMoneyNo
What you collected from the player (PREPAID_BY_PARTNER only); informational
method"PAY_AT_VENUE" | "PREPAID_BY_PARTNER" | "PACKAGE"Yes
PAY_AT_VENUE (the desk collects), PREPAID_BY_PARTNER (you collected and owe the venue the charge) or PACKAGE (the player's package minutes pay)
packageCreditIdstring (uuid)No
The player's package at the venue that pays (PACKAGE only), from player-passes

PartnerReview

A review of a reservation you made

Fields of PartnerReview
NameTypeRequiredDescription
authorNamestringNo
First name and last initial ("Mona A."), never the full name or phone
commentstringNo
The player's words, up to 500 characters
courtIdstring (uuid)No
The court
createdAtstring (date-time)No
When it was created (UTC)
idstring (uuid)No
Stable identifier
repliedAtstring (date-time)No
When the venue replied (UTC)
replystringNo
The venue owner's one public reply
reservationIdstring (uuid)No
The reservation
scoresScoresNo
The stars given
statusstringNo
PUBLISHED or HIDDEN (by Ezaz support)
venueIdstring (uuid)No
The venue

PartnerReviewRequest

Your player's stars and words

Fields of PartnerReviewRequest
NameTypeRequiredDescription
cleanlinessinteger (int32)No
Stars for the cleanliness, 1 to 5; null when not ratedmin 1 · max 5
commentstringNo
Optional, up to 500 charactersmaxLength 500
lightinginteger (int32)No
Stars for the lighting, 1 to 5; null when not ratedmin 1 · max 5
overallinteger (int32)Yes
Overall stars, 1 to 5min 1 · max 5
surfaceinteger (int32)No
Stars for the surface, 1 to 5; null when not ratedmin 1 · max 5

PartnerSafetyReport

A safety report your player filed

Fields of PartnerSafetyReport
NameTypeRequiredDescription
courtIdstring (uuid)No
The court
courtNameLocalizedTextNo
The court's name
createdAtstring (date-time)No
When it was created (UTC)
descriptionstringNo
What is wrong with the court, as the player wrote it
idstring (uuid)No
Stable identifier
occurredAtstring (date-time)No
When it happened (UTC)
photoUrlsarray of stringNo
Signed photo links, valid for 10 minutes
resolutionNotestringNo
How the venue fixed it
resolvedAtstring (date-time)No
When the venue resolved it (UTC)
statusstringNo
OPEN, or RESOLVED by the venue
typestringNo
INJURY, SLIPPERY_SURFACE, BROKEN_GLASS_OR_NET, LIGHTING or OTHER
venueIdstring (uuid)No
The venue
venueNameLocalizedTextNo
The venue's name

PartnerSafetyReportRequest

A safety problem on a court, without medical details or names

Fields of PartnerSafetyReportRequest
NameTypeRequiredDescription
courtIdstring (uuid)Yes
The court
descriptionstringYes
What is wrong with the court, in up to 500 characters. Don't include medical details, diagnoses or names of anyone injured.maxLength 500
occurredAtstring (date-time)Yes
When it happened, within the last 30 days (UTC)
phonestringYes
The player's mobile as you verified it; the venue never learns who reportedmaxLength 20
type"INJURY" | "SLIPPERY_SURFACE" | "BROKEN_GLASS_OR_NET" | "LIGHTING" | "OTHER"Yes
INJURY, SLIPPERY_SURFACE, BROKEN_GLASS_OR_NET, LIGHTING or OTHER
venueIdstring (uuid)Yes
The venue

PartnerToken

An access token (RFC 6749 §5.1)

Fields of PartnerToken
NameTypeRequiredDescription
access_tokenstringYes
Send as Authorization: Bearer <token>
expires_ininteger (int32)Yes
Seconds it stays valid (600)
scopestringYes
The scopes it carries, separated by spaces
token_type"Bearer"Yes
Always Bearer

PartnerTokenError

A token error (RFC 6749 §5.2)

Fields of PartnerTokenError
NameTypeRequiredDescription
error"invalid_request" | "unsupported_grant_type" | "invalid_scope" | "invalid_client"Yes
What went wrong

PartnerVenuePage

A page of venues that granted you

Fields of PartnerVenuePage
NameTypeRequiredDescription
itemsarray of VenueNo
This page
nextCursorstring (uuid)No
Pass as `after` for the next page; null on the last page

PartnerWebhookRequest

Where to post your events

Fields of PartnerWebhookRequest
NameTypeRequiredDescription
urlstringNo
A public https URL; null removes the webhookmaxLength 500

PartnerWebhookResponse

Your webhook

Fields of PartnerWebhookResponse
NameTypeRequiredDescription
secretstringNo
The signing secret (whsec_…), shown when the URL is set; check Ezaz-Signature with it
urlstringNo
Where events are posted; null when none

Payment

How a reservation is paid

Fields of Payment
NameTypeRequiredDescription
collectedMoneyNo
What you collected from the player (PREPAID_BY_PARTNER only); informational
method"PAY_AT_VENUE" | "PREPAID_BY_PARTNER" | "PACKAGE"No
PAY_AT_VENUE (the desk collects), PREPAID_BY_PARTNER (you collected and owe the venue the charge) or PACKAGE (the player's package minutes pay)
packageCreditIdstring (uuid)No
The player's package at the venue that pays (PACKAGE only), from player-passes

PlayerErasureRequest

The player whose data to erase

Fields of PlayerErasureRequest
NameTypeRequiredDescription
phonestringYes
The player's mobile as you verified it, E.164 or any common Egyptian format; it goes in bodies only, never in URLsmaxLength 32

PlayerErasureResponse

What lost the player's data this time; zeros when already done

Fields of PlayerErasureResponse
NameTypeRequiredDescription
reservationsinteger (int32)No
Your reservations that lost the player's name and phone
reviewsinteger (int32)No
Your reviews that lost the player's words (stars stay)
safetyReportsinteger (int32)No
Your safety reports unlinked from the player

PlayerLookupRequest

The player, by the phone you verified

Fields of PlayerLookupRequest
NameTypeRequiredDescription
phonestringYes
The player's mobile as you verified it, E.164 or any common Egyptian format; it goes in bodies only, never in URLsmaxLength 20

PlayerMembership

A membership the player holds at the venue

Fields of PlayerMembership
NameTypeRequiredDescription
discountBpsinteger (int32)No
The discount on court prices, in basis points (2000 = 20 %)
endsAtstring (date-time)No
When it ends (UTC)
idstring (uuid)No
The membership
nameLocalizedTextNo
Name in Arabic and English (either may be missing)
startsAtstring (date-time)No
When it starts (UTC)

PlayerPackage

A package of court minutes the player holds at the venue

Fields of PlayerPackage
NameTypeRequiredDescription
expiresAtstring (date-time)No
When it expires (UTC); a session must start before
idstring (uuid)No
Pass as packageCreditId to pay a reservation with it
minutesLeftinteger (int32)No
Court minutes left
minutesTotalinteger (int32)No
Court minutes bought
nameLocalizedTextNo
Name in Arabic and English (either may be missing)

PlayerPasses

A player's packages and memberships at a venue

Fields of PlayerPasses
NameTypeRequiredDescription
membershipsarray of PlayerMembershipNo
The player's memberships at the venue, newest first
packagesarray of PlayerPackageNo
The player's packages at the venue, newest first

PlayerReportsRequest

The player, and where the page continues

Fields of PlayerReportsRequest
NameTypeRequiredDescription
beforestring (date-time)No
Continue after the item created at this instant (from the previous page)
beforeIdstring (uuid)No
And with this id (ties)
limitinteger (int32)No
Page size, 1 to 50 (default 20)min 1 · max 50
phonestringYes
The player's mobile as you verified it, E.164 or any common Egyptian format; it goes in bodies only, never in URLsmaxLength 20

Problem

RFC 9457 problem details. Branch on code, which is stable; show detail, which is localized and may change

Fields of Problem
NameTypeRequiredDescription
codestringYes
Stable error code to branch on
detailstringNo
What happened, in the Accept-Language (ar or en), for people
errorsarray of objectNo
Per field, for VALIDATION_FAILED only
errors[].fieldstringNo
The field, as named in the request
errors[].messagestringNo
What is wrong with it, in the Accept-Language (ar or en)
instancestringNo
The request path
statusinteger (int32)Yes
The HTTP status
titlestringNo
The HTTP status's reason phrase
typestringNo
A URI naming the problem: urn:ezaz:problem: and the code

Quote

What a slot costs your player

Fields of Quote
NameTypeRequiredDescription
chargeMoneyNo
What the player pays, prepaid or at the venue: the member price, or the price
courtIdstring (uuid)No
The court
discountBpsinteger (int32)No
The player's membership discount in basis points; 0 without one
endstring (date-time)No
End, an instant in UTC (ISO-8601)
priceMoneyNo
The venue's list price for the session
startstring (date-time)No
Start, an instant in UTC (ISO-8601)

QuoteRequest

A slot and your player's phone

Fields of QuoteRequest
NameTypeRequiredDescription
courtIdstring (uuid)Yes
The court
minutesinteger (int32)Yes
Session length: 60, 90 or 120min 30 · max 1440
phonestringYes
The player's mobile as you verified it, E.164 or any common Egyptian format; it goes in bodies only, never in URLsmaxLength 32
startstring (date-time)Yes
Start, an instant in UTC (ISO-8601)

Rating

A court's rating from published reviews

Fields of Rating
NameTypeRequiredDescription
averagenumber (double)No
Overall stars to one decimal; null until there are 3 reviews
cleanlinessnumber (double)No
Average cleanliness stars; null until 3 reviews rated it
countinteger (int32)No
Published reviews
lightingnumber (double)No
Average lighting stars; null until 3 reviews rated it
surfacenumber (double)No
Average surface stars; null until 3 reviews rated it

Reservation

A court reservation you made

Fields of Reservation
NameTypeRequiredDescription
cancelReasonstringNo
PARTNER when you cancelled, otherwise the venue's reason
cancelledAtstring (date-time)No
When it was cancelled (UTC)
chargeMoneyNo
What the venue is owed: the list price less the player's membership discount at the venue (whoever collects it), zero when a package pays
checkedInAtstring (date-time)No
When the venue's desk checked the player in (UTC); null until they arrive
courtIdstring (uuid)No
The court
createdAtstring (date-time)No
When it was created (UTC)
customerCustomerNo
Your player; null once their data was erased
endstring (date-time)No
End, an instant in UTC (ISO-8601)
externalRefstringNo
Your own reference (e.g. your booking id), echoed back and in webhooks; at most one live reservation per reference
idstring (uuid)No
Stable identifier
paymentPaymentNo
Who collects the charge
priceMoneyNo
The venue's list price for the session
startstring (date-time)No
Start, an instant in UTC (ISO-8601)
status"CONFIRMED" | "CANCELLED" | "COMPLETED" | "NO_SHOW"No
CONFIRMED, CANCELLED, COMPLETED or NO_SHOW
venueIdstring (uuid)No
The venue

Review

A published review

Fields of Review
NameTypeRequiredDescription
authorNamestringNo
First name and last initial ("Mona A."), never the full name or phone
cleanlinessinteger (int32)No
Stars for the cleanliness, 1 to 5; null when not rated
commentstringNo
The player's words, up to 500 characters
courtIdstring (uuid)No
The court
createdAtstring (date-time)No
When it was created (UTC)
idstring (uuid)No
Stable identifier
lightinginteger (int32)No
Stars for the lighting, 1 to 5; null when not rated
overallinteger (int32)No
Overall stars, 1 to 5
repliedAtstring (date-time)No
When the venue replied (UTC)
replystringNo
The venue owner's one public reply
surfaceinteger (int32)No
Stars for the surface, 1 to 5; null when not rated

Safety

A court's safety summary; never the reports

Fields of Safety
NameTypeRequiredDescription
lastResolvedOnstring (date)No
The Cairo date the venue last resolved one; null if never
openIssuesinteger (int32)No
Safety reports on the court the venue hasn't resolved yet

Scores

The stars of a review

Fields of Scores
NameTypeRequiredDescription
cleanlinessinteger (int32)No
Stars for the cleanliness, 1 to 5; null when not rated
lightinginteger (int32)No
Stars for the lighting, 1 to 5; null when not rated
overallinteger (int32)No
Overall stars, 1 to 5
surfaceinteger (int32)No
Stars for the surface, 1 to 5; null when not rated

Slot

A free slot and its price

Fields of Slot
NameTypeRequiredDescription
endstring (date-time)No
End, an instant in UTC (ISO-8601)
priceMoneyNo
The venue's list price for the session
startstring (date-time)No
Start, an instant in UTC (ISO-8601)

Venue

A venue that lets you sell its courts

Fields of Venue
NameTypeRequiredDescription
addressLocalizedTextNo
Street address in Arabic and English
areaAreaNo
The area the venue is in
cancellationHoursinteger (int32)No
Players cancel free of charge until this many hours before the start
contactPhonestringNo
The venue's public number (E.164)
courtsarray of CourtNo
The venue's active courts
latitudenumber (double)No
Map location; null when not pinned
longitudenumber (double)No
Map location; null when not pinned
nameLocalizedTextNo
Name in Arabic and English (either may be missing)
photoUrlsarray of stringNo
Public photo URLs, oldest first
venueIdstring (uuid)No
The venue