Alchem HTTP API and webhooks
Read and create bookings and clients, get specialists’ free time and business events. The salon issues the key itself — with the permissions and rate limit you need.
https://rest.business.eywa.uz/partner/v1curl "https://rest.business.eywa.uz/partner/v1/availability?staff_id=<staff_id>&service_ids=<service_id>&date=2026-10-01" \ -H "Authorization: Bearer alk_…"
How access works
The salon sets the key, permissions and limit — you get exactly what you were given.
The salon issues the key
In Settings → Integrations → API keys: name, permissions, branches and expiry. The key is shown once — it never appears in responses or logs. Revoke it any time.
Authorization header
Every request carries an Authorization: Bearer header with the key. No key or a revoked key — a 401 response.
Rate limit
From 10 to 1200 requests per minute per key, 300 by default. Over the limit — a 429 with a Retry-After header.
Key permissions
A key sees only what it’s allowed to — and never more than the staff member who issued it can do right now. Client contacts are a separate permission.
Standard errors
Errors come as application/problem+json (RFC 9457): a code, a readable message and the request path.
Time, money, lists
Time is RFC 3339 with the branch time zone offset, money is in minor units. Lists are paginated: limit up to 100, then follow next_cursor.
Key permissions
Write access to a section includes reading it; client contacts are only granted explicitly.
- Business and branches
business:read - Services and categories
services:read - Specialists and staff
staff:read - Specialists’ free time
availability:read - Bookings: read
appointments:read - Bookings: create, reschedule, change status, delete
appointments:write - Clients: read without contacts
clients:read - Client contacts: phone and email
clients:read_contact - Clients: create
clients:write - Eywa Connect call log
calls:read
Endpoints
All paths are relative to the base URL https://rest.business.eywa.uz/partner/v1. On the right — the permission the key needs.
- GET
/meThe key: business, permissions, branches and limit - POST
/revokeRevoke the key used for the request - GET
/businessBusinessbusiness:read - GET
/locationsBranchesbusiness:read - GET
/servicesServices; filter by branch and categoryservices:read - GET
/service-categoriesService categoriesservices:read - GET
/staffSpecialists; filter by branch and servicestaff:read - GET
/availabilityA specialist’s free time for a dayavailability:read - GET
/appointmentsBookings for a period, changed after a date, by specialist or clientappointments:read - GET
/appointments/{id}A single bookingappointments:read - POST
/appointmentsCreate a booking — for a new or existing clientappointments:write - PATCH
/appointments/{id}Reschedule a booking, change its status or commentappointments:write - DELETE
/appointments/{id}Delete a bookingappointments:write - GET
/clientsClients; search by phoneclients:read - GET
/clients/{id}A single clientclients:read - POST
/clientsAdd a clientclients:write - GET
/callsEywa Connect calls for a periodcalls:read - GET
/references/countriesCountries reference - GET
/references/business-typesBusiness types reference - POST
/app/callbackA partner app confirms the installationapp key - POST
/app/redirectWhere to send the user after setting up the appapp key
Request examples
curl -X POST "https://rest.business.eywa.uz/partner/v1/appointments" \
-H "Authorization: Bearer alk_…" \
-H "Content-Type: application/json" \
-d '{
"staff_id": "<staff_id>",
"service_ids": ["<service_id>"],
"starts_at": "2026-10-01T10:00:00+05:00",
"client": { "name": "Dilnoza", "phone": "+998901234567" },
"comment": "…",
"api_id": "order-1042"
}'{
"object": "availability",
"date": "2026-10-01",
"time_zone": "Asia/Tashkent",
"staff_id": "<staff_id>",
"location_id": "<location_id>",
"is_working_day": true,
"duration_minutes": 60,
"step_minutes": 15,
"slots": [
{ "starts_at": "2026-10-01T10:00:00+05:00", "ends_at": "2026-10-01T11:00:00+05:00" },
{ "starts_at": "2026-10-01T10:15:00+05:00", "ends_at": "2026-10-01T11:15:00+05:00" }
]
}Webhooks
The salon subscribes your URL to events in Settings → Integrations → Webhooks — for the whole business or selected branches.
What you receive
A POST with JSON: event, delivered_at, business_id and data — the entity itself. Headers X-Eywa-Event and X-Eywa-Delivery-Id.
Signature
If the subscription has a secret, X-Eywa-Signature holds the hex HMAC-SHA256 of the request body. You can add your own headers too.
Retries
A 2xx response means delivered. Otherwise we retry after 5, 15, 60 and 60 minutes — up to five attempts in total; we wait 15 seconds for a response. The delivery log and manual retry are in settings.
- Bookings
appointment.createdappointment.updatedappointment.cancelledappointment.completedappointment.deleted - Clients
client.createdclient.updatedclient.deleted - Services
service.createdservice.updatedservice.deleted - Service categories
service_category.createdservice_category.updatedservice_category.deleted - Staff
staff.createdstaff.updatedstaff.deleted - Schedule
schedule.updated - Branches
location.createdlocation.updatedlocation.deleted - Products
good.createdgood.updatedgood.deleted - Inventory operations
goods_operation.salegoods_operation.receiptgoods_operation.consumablegoods_operation.stolengoods_operation.movegoods_operation.other - Finance operations
finance_operation.createdfinance_operation.updatedfinance_operation.deleted
Building an app for many salons?
Instead of a key from every salon — an app in the Alchem catalog: a salon grants access in one click, and you manage installations through the partner API.
Try Alchem in your own salon
7 days free, every feature included. Or look around the demo salon first — no sign-up.