service88 عملية

Service API

Service marketplace — bookings, providers, service types, and scheduling.

Queries

QUERY

adminServiceOrder

#

The service job behind an order, for the admin console. Addressed by **order** id rather than request id because that is what the console has: service jobs are listed through adminListOrders, which returns OrderEntity rows, and nothing exposed the way back to the request they were created from. requests.order_id has been written by selectOffer since orders existed and find_by_order_id has been on the repo since the cross-vertical cancellation flow needed it — only the read was missing. Returns null for an order with no service request behind it: an order of another kind, or one whose request was hard-deleted. That is a legitimate answer for a console that lists orders by kind and can be pointed at any id, not an error worth raising. Separate from serviceRequest(id:), which is scoped to the customer who raised the request and the providers bidding on it, and redacts the address for a provider who has not paid to unlock it. An admin is neither of those parties, so that query answers NotFound for them.

الوسائط

  • orderId!
يُرجع
QUERY

adminServiceQuestions

#

Every question on a service, for the console's question builder. Named adminServiceQuestions, not serviceQuestions, because BrowseQuery already owns that name. Two resolvers declaring the same field on a MergedObject do not conflict loudly — one simply wins the merge, and the browse one did, so this query has been unreachable since it was written and the console had no way to read a *disabled* question or an isEnabled flag at all. The difference is not only the flag. BrowseQuestionResponse is the customer's view of a question; this returns the whole row, which is what an editor needs.

الوسائط

  • serviceId!
  • includeDisabledBoolean
يُرجع[!]!
QUERY

availableRequests

#

Open leads I can bid on. serviceId narrows the board to one of my services. Omit it for the union across everything I offer — the provider home feed wants that, and used to fake it with one query per service stitched together on the client, which skewed paging whenever one of them failed.

الوسائط

  • serviceId
  • pagination
يُرجع!
QUERY

browseCategories

#

Browse active service categories.

الوسائط

  • parentId
يُرجع[!]!
QUERY

browseServices

#

Browse active services in a category.

الوسائط

  • categoryId!
يُرجع[!]!
QUERY

creditPackages

#

Packages a provider can buy right now.

يُرجع[!]!
QUERY

myCreditBalance

#

How many credits I have left.

يُرجع!
QUERY

myCreditTransactions

#

My credit history, newest first.

الوسائط

  • limitInt!

    افتراضي

    20
  • offsetInt!

    افتراضي

    0
يُرجع[!]!
QUERY

myOfferForRequest

#

My own response to one request — a quote, a call request, or a request for more information — or null if I have not responded. A provider's job screen needs their own offer beside the request: its status picks the primary action, and startedAt is what separates a booked job from one under way. Nothing addressed it by request, so the client paged myOffers looking for a match and stopped after three pages — past which a busy provider's own bid simply disappeared.

الوسائط

  • requestId!
يُرجع
QUERY

myOffers

#

List my submitted offers. Takes pagination and returns page_info like every other list on the platform. It used to take bare limit/offset and return a plain array, which left the client with no total and no way to know whether another page existed.

الوسائط

  • status
  • pagination
يُرجع!
QUERY

myProviderDayCounts

#

Jobs per day for the signed-in provider, for the home week strip. Days with no jobs are absent rather than returned as zero — the client knows which dates it asked for.

الوسائط

  • from!
  • to!
يُرجع[!]!
QUERY

myProviderEarningsChart

#

The signed-in provider's earnings chart.

الوسائط

  • timeframe!
يُرجع!
QUERY

myProviderProfile

#

Get my provider profile.

يُرجع
QUERY

myProviderServices

#

The services I offer, including any I have paused.

يُرجع[!]!
QUERY

myServiceRequests

#

List my service requests.

الوسائط

  • status
  • pagination
يُرجع!
QUERY

mySkippedRequests

#

Leads I dismissed with skipRequest, newest dismissal first. availableRequests filters these out, so the Skipped tab had no source at all and could only show what the current session happened to remember. unskipRequest puts one back on the board.

الوسائط

  • pagination
يُرجع!
QUERY

pendingServiceProviders

#

List providers pending approval.

الوسائط

  • pagination
يُرجع!
QUERY

predefinedInfoQuestions

#

Questions a provider can ask about jobs for this service, so the app can render the checklist rather than a blank box.

الوسائط

  • serviceId!
يُرجع[!]!
QUERY

requestInfoRequests

#

Every question asked about one request, oldest first. Readable by the customer who raised the request and by any provider who has responded to it. The provider's ask screen used to keep a session-local list that emptied on every reopen; the customer had no list at all.

الوسائط

  • requestId!
يُرجع[!]!
QUERY

requestOffers

#

List offers for a service request (customer only). Bids on a request, ordered by sort. Defaults to RECOMMENDED, which uses the same scorer Quick Match uses — so the list the customer sees and the choice made on their behalf cannot disagree.

الوسائط

  • requestId!
  • sort
يُرجع[!]!
QUERY

rootServiceCategories

#

List root-level service categories (no parent).

الوسائط

  • includeInactiveBoolean
  • pagination
يُرجع!
QUERY

searchServices

#

Search live services by name or description, across every category. browse_services is category-scoped, so a customer could only find a trade by knowing which category it sits under. A query shorter than two characters returns nothing rather than most of the catalogue.

الوسائط

  • queryString!
  • limitInt
يُرجع[!]!
QUERY

service

#

Get a service by ID.

الوسائط

  • id!
يُرجع
QUERY

serviceCategories

#

List service categories with pagination.

الوسائط

  • parentId
  • includeInactiveBoolean
  • pagination
يُرجع!
QUERY

serviceCategory

#

Get a service category by ID.

الوسائط

  • id!
يُرجع
QUERY

serviceCreditPackages

#

Every package, including retired ones. Admin view.

يُرجع[!]!
QUERY

serviceCreditSettings

#

This workspace's credit policy. Returns the defaults when none has been configured.

يُرجع!
QUERY

serviceMarketplaceHealth

#

Service health check query.

يُرجعString!
QUERY

servicePriceAdjustments

#

Every extended-fee request on a job, newest first. Includes the refused and withdrawn ones on purpose: they are the record of what was asked for, and a customer looking at a job they argued about should be able to see the argument. Readable by the job's customer and by the provider who holds it.

الوسائط

  • requestId!
يُرجع[!]!
QUERY

serviceProvider

#

Get a service provider by ID.

الوسائط

  • id!
يُرجع
QUERY

serviceProviderCountNear

#

How many providers offer this service within reach of this location. Separate from the list so the header count does not pay to build and sort rows the screen never renders.

الوسائط

  • serviceId!
  • latitudeFloat!
  • longitudeFloat!
يُرجعInt!
QUERY

serviceProviders

#

List service providers with pagination and filters.

الوسائط

  • status
  • searchString
  • pagination
يُرجع!
QUERY

serviceProvidersNear

#

Providers who offer this service and can reach this location, nearest first.

الوسائط

  • serviceId!
  • latitudeFloat!
  • longitudeFloat!
  • limitInt
يُرجع[!]!
QUERY

serviceQuestion

#

Get a service question by ID.

الوسائط

  • id!
يُرجع
QUERY

serviceQuestions

#

Get questions for a service (for request form).

الوسائط

  • serviceId!
يُرجع[!]!
QUERY

serviceRequest

#

One service request, by id. Readable by the customer who raised it and by a provider who has responded to it or can still bid on it; the address stays redacted for a provider who has neither unlocked the lead nor won the job. Both apps needed this and neither had it: the customer's detail screen was paging through myServiceRequests looking for one id, and the provider's job detail could not be rendered at all once a job left the open lead board.

الوسائط

  • id!
يُرجع!
QUERY

servicesByCategory

#

List services by category with pagination.

الوسائط

  • categoryId!
  • includeInactiveBoolean
  • pagination
يُرجع!
QUERY

serviceStats

#

Headline numbers for a service's detail screen.

الوسائط

  • serviceId!
يُرجع!

Mutations

MUTATION

approveServiceProvider

#

Approve a service provider (set status to Active).

الوسائط

  • input!
يُرجع!
MUTATION

askForInformation

#

Ask the customer for what you need before quoting.

الوسائط

  • input!
يُرجع[!]!
MUTATION

cancelServiceFee

#

Take back a fee request the customer has not answered yet.

الوسائط

  • adjustmentId!
يُرجع!
MUTATION

cancelServiceRequest

#

Cancel a service request.

الوسائط

  • requestId!
يُرجع!
MUTATION

confirmCompletion

#

Customer confirms completion.

الوسائط

  • requestId!
يُرجع!
MUTATION

confirmServiceCreditPurchase

#

Finish a purchase that needed 3DS. Safe to call more than once.

الوسائط

  • purchaseId!
يُرجع!
MUTATION

confirmServicePayment3ds

#

Finish a card payment the customer had to authenticate (3DS). payServiceRequest hands back a client secret when the bank wants a challenge and leaves the job awaiting payment. This is what the client calls once the challenge is done — without it the customer authenticated and the booking stayed unpaid for ever. Safe to call twice: a payment already captured returns the job as it stands rather than charging again.

الوسائط

  • input!
يُرجع!
MUTATION

createPushProvider

#

Create a push provider (FCM). Platform-owned providers require a platform admin; tenant-owned providers are scoped to the caller's tenant.

الوسائط

  • input!
يُرجع!
MUTATION

createService

#

Create a new service.

الوسائط

  • input!
يُرجع!
MUTATION

createServiceCategory

#

Create a new service category.

الوسائط

  • input!
يُرجع!
MUTATION

createServiceCreditPackage

#

الوسائط

  • input!
يُرجع!
MUTATION

createServiceQuestion

#

Create a new service question.

الوسائط

  • input!
يُرجع!
MUTATION

createServiceRequest

#

Create a new service request.

الوسائط

  • input!
يُرجع!
MUTATION

decideServiceFee

#

The customer's answer. Approving is the only thing that moves a job's total after the customer has been shown it, so it is deliberately a separate call from reading the request — and it is idempotent: the second answer is refused rather than applied.

الوسائط

  • adjustmentId!
  • approvedBoolean!
يُرجع!
MUTATION

deletePushProvider

#

Delete a push provider.

الوسائط

  • idString!
يُرجعBoolean!
MUTATION

deleteService

#

Delete a service (soft delete).

الوسائط

  • id!
يُرجعBoolean!
MUTATION

deleteServiceCategory

#

Delete a service category (soft delete).

الوسائط

  • id!
يُرجعBoolean!
MUTATION

deleteServiceCreditPackage

#

Retire a package. Past purchases keep referencing it.

الوسائط

  • id!
يُرجعBoolean!
MUTATION

deleteServiceQuestion

#

Delete a service question.

الوسائط

  • id!
يُرجعBoolean!
MUTATION

generateServiceQuestionTemplate

#

Ask the tenant's default LLM for a starter set of intake questions for a new service category. The admin reviews, edits, and accepts; this mutation does NOT persist the questions. Admin-only. Requires the tenant to have serviceQuestionGenEnabled turned on under Settings → AI Features and at least one configured AI provider with a remaining monthly budget.

الوسائط

  • input!
يُرجع!
MUTATION

markServiceComplete

#

Provider marks a service as complete.

الوسائط

  • requestId!
  • completionNotesString
يُرجع!
MUTATION

payServiceRequest

#

Pay for an accepted job.

الوسائط

  • input!
يُرجع!
MUTATION

proposeServiceFee

#

Ask the customer to agree to an extended fee on a job in progress. One at a time per job: a second request while the first is unanswered is refused, because the customer would otherwise be agreeing to one of two live figures.

الوسائط

  • input!
يُرجع!
MUTATION

purchaseServiceCreditPackage

#

Buy a credit package.

الوسائط

  • input!
يُرجع!
MUTATION

raiseDispute

#

Customer raises a dispute.

الوسائط

  • requestId!
  • reasonString!
يُرجع!
MUTATION

recordServiceCashPayment

#

Provider confirms cash changed hands. Cash-only — card and wallet settle through the PSP.

الوسائط

  • requestId!
يُرجع!
MUTATION

registerAsProvider

#

Register as a service provider.

الوسائط

  • input!
يُرجع!
MUTATION

reorderServiceQuestions

#

Reorder service questions.

الوسائط

  • input!
يُرجعBoolean!
MUTATION

respondToInformationRequest

#

Answer one of a provider's questions.

الوسائط

  • infoRequestId!
  • responseString!
يُرجع!
MUTATION

selectOffer

#

Select an offer for a service request. Select an offer for a service request. couponCode is optional and forgiving: a code that is invalid, expired, not applicable or under its minimum is ignored and the booking goes through at full price. Refusing the whole selection over a coupon would strand a customer who has already chosen and a provider who has already paid a credit to be chosen.

الوسائط

  • offerId!
  • couponCodeString
يُرجع!
MUTATION

serviceMarketplacePing

#

Service health check mutation.

يُرجعString!
MUTATION

setDefaultPushProvider

#

Set a push provider as the default within its owner scope.

الوسائط

  • idString!
يُرجعBoolean!
MUTATION

setMyProviderAvailability

#

Turn "Available to take jobs" on or off.

الوسائط

  • onlineBoolean!
يُرجع!
MUTATION

setMyProviderServices

#

Replace the services you offer. Services you leave out are paused, not deleted, so their completed-job count and rating survive.

الوسائط

  • input[!]!
يُرجع[!]!
MUTATION

skipRequest

#

"Not Interested" — dismiss a lead so it stops appearing in your list. Idempotent; call unskipRequest to bring it back.

الوسائط

  • requestId!
  • reasonString
يُرجعBoolean!
MUTATION

startServiceJob

#

Provider marks the job as started. Records started_at on the accepted offer, which is what distinguishes a booked job from one under way.

الوسائط

  • requestId!
يُرجع!
MUTATION

submitOffer

#

Submit an offer on a service request.

الوسائط

  • input!
يُرجع!
MUTATION

suspendServiceProvider

#

Suspend a service provider.

الوسائط

  • input!
يُرجع!
MUTATION

testPushProvider

#

Test a push provider. Without device_token it just verifies the credentials authenticate with Google; with a device_token it sends a real test notification to that device for an end-to-end check.

الوسائط

  • idString!
  • deviceTokenString
يُرجع!
MUTATION

unlockRequest

#

Spend credits to see a lead's address, photos and contact details before quoting for it. Safe to call more than once — an already-open lead is not charged again.

الوسائط

  • requestId!
يُرجع!
MUTATION

unskipRequest

#

Undo a dismissal.

الوسائط

  • requestId!
يُرجعBoolean!
MUTATION

unsuspendServiceProvider

#

Unsuspend a service provider (set status back to Active).

الوسائط

  • providerId!
يُرجع!
MUTATION

updateMyProviderProfile

#

Update provider profile.

الوسائط

  • input!
يُرجع!
MUTATION

updatePushProvider

#

Update a push provider's name, credentials, or metadata.

الوسائط

  • input!
يُرجع!
MUTATION

updateService

#

Update an existing service.

الوسائط

  • input!
يُرجع!
MUTATION

updateServiceCategory

#

Update an existing service category.

الوسائط

  • input!
يُرجع!
MUTATION

updateServiceCreditPackage

#

الوسائط

  • input!
يُرجع!
MUTATION

updateServiceCreditSettings

#

Change the credit policy. Omitted fields keep their current value.

الوسائط

  • input!
يُرجع!
MUTATION

updateServiceQuestion

#

Update an existing service question.

الوسائط

  • input!
يُرجع!
MUTATION

withdrawOffer

#

Take back a bid the customer has not chosen yet. The credit it cost is **not** refunded: unlocking a lead reveals the address and contact details, and a refunded withdrawal would make "bid, read the lead, withdraw" a free way to browse the board. An accepted offer cannot be withdrawn — that is a booked job with an order behind it, and leaving one goes through cancellation.

الوسائط

  • offerId!
يُرجع!