# Introduction ## What is Bronjoy? Bronjoy is a multi-tenant appointment booking platform that helps service businesses manage their scheduling, staff, and client relationships. Each organization on Bronjoy gets its own workspace with independent configuration. ## Core Concepts ### Organizations An organization represents a business on Bronjoy — a salon, clinic, consulting firm, or any service provider. Each organization has its own: - **Services** — what the business offers (haircut, consultation, massage, etc.) - **Staff members** — who provides the services, with individual schedules - **Locations** — physical or virtual locations where services happen - **Clients** — the customer base, with booking history and preferences ### Appointments The central entity. An appointment links a **client** to a **service** provided by a **staff member** at a specific **time** and **location**. Appointments flow through statuses: `Pending` → `Confirmed` → `Completed` (or `Cancelled` / `NoShow`). ### Availability & Slots Staff members define their working hours through **schedules**. The slot calculator considers: - Staff schedule and breaks - Existing appointments - Service duration and buffer times - Organization-level settings (advance booking limits, slot intervals) ### Payments Organizations can require payment at booking time. Bronjoy integrates with **Stripe** for payment processing, supporting full payments and deposits via Checkout Sessions. ## Architecture Bronjoy is a REST API with two apps built on top of it: - **Provider Dashboard** — where organization owners and staff manage their business - **Client App** — where customers discover businesses and book appointments Both apps talk to the same public API described in these docs, so anything they can do, your own integration can do too. The API is fully documented with an OpenAPI specification — check the [API Reference](https://docs.bronjoy.com/api-reference) for every endpoint. ## Next Steps - [Quickstart Guide](https://docs.bronjoy.com/en/getting-started/quickstart) — Make your first authenticated API request - [Authentication](https://docs.bronjoy.com/en/getting-started/authentication) — API tokens and auth flows - [Organization Setup](https://docs.bronjoy.com/en/guides/organization-setup) — Complete setup checklist for new owners - [Booking Flow](https://docs.bronjoy.com/en/guides/booking-flow) — Understand the booking process - [MCP Integration](https://docs.bronjoy.com/en/integrations/mcp) — Connect AI clients to your organization - [API Reference](https://docs.bronjoy.com/api-reference) — Explore all endpoints # Quickstart ## Base URL All examples in these docs use: ```text https://api.bronjoy.com/api ``` ## 1. Create an account If you don't have a Bronjoy business account yet, register one: ```bash POST https://api.bronjoy.com/api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` Verify the email code you receive, and the response gives you a Bearer token. Full details in [Authentication](https://docs.bronjoy.com/en/getting-started/authentication). ## 2. Create an organization A user can own or join one or more organizations. Create one: ```bash POST https://api.bronjoy.com/api/org/organizations Authorization: Bearer your-token Content-Type: application/json ``` ```json { "business_name": "Downtown Barbershop", "slug": "downtown-barbershop" } ``` `slug` is your booking page handle (`bronjoy.com/downtown-barbershop`) — pick something short and unique. The response includes the organization `id` — you'll need it for every request below. ## 3. Set your organization context Every request under `/api/org/...` needs to know which organization you're operating on. Send it as a header on every request: ```bash X-Organization-ID: 1 ``` ## 4. Make your first request Check your setup checklist: ```bash GET https://api.bronjoy.com/api/org/setup-status Authorization: Bearer your-token X-Organization-ID: 1 ``` Or list your services (empty until you create one — see [Organization Setup](https://docs.bronjoy.com/en/guides/organization-setup)): ```bash GET https://api.bronjoy.com/api/org/services Authorization: Bearer your-token X-Organization-ID: 1 ``` ## Next steps - [Authentication](https://docs.bronjoy.com/en/getting-started/authentication) — full auth flows for staff and clients, and how to mint scoped API tokens - [Organization Setup](https://docs.bronjoy.com/en/guides/organization-setup) — complete setup checklist so your business can take bookings - [Booking Flow](https://docs.bronjoy.com/en/guides/booking-flow) — how a client books an appointment end-to-end - [MCP Integration](https://docs.bronjoy.com/en/integrations/mcp) — connect an AI client to your organization - [API Reference](https://docs.bronjoy.com/api-reference) — every endpoint, request, and response shape # Authentication ## Overview Bronjoy uses **Laravel Sanctum** for API authentication. All protected endpoints require a Bearer token in the `Authorization` header. ```bash Authorization: Bearer your-token-here ``` > Every `/api/org/...` example in these docs also needs the `X-Organization-ID` header described below — it's omitted from individual snippets for brevity. ## User Types Bronjoy has two distinct user types with separate authentication flows: | Type | Who | Auth Route Prefix | | ---------- | ------------------------------------- | ---------------------- | | **Staff** | Organization owners and staff members | `/api/org/auth/...` | | **Client** | End customers booking appointments | `/api/client/auth/...` | ## Staff Authentication ### Register ```bash POST /api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` A verification code is sent to the email. Verify it: ```bash POST /api/org/auth/verify Content-Type: application/json ``` ```json { "email": "jane@example.com", "code": "123456" } ``` Response includes the Bearer token: ```json { "token": "1|abc123...", "user": { "id": 1, "name": "Jane Smith", "email": "jane@example.com" } } ``` ### Login ```bash POST /api/org/auth/login Content-Type: application/json ``` ```json { "email": "jane@example.com", "password": "secret" } ``` ### Logout ```bash POST /api/auth/logout Authorization: Bearer your-token-here ``` This revokes the current token. ## Client Authentication Clients authenticate via phone or email OTP — no passwords. ### Phone (OTP) ```bash POST /api/client/auth/phone/request Content-Type: application/json ``` ```json { "phone": "+998901234567" } ``` ```bash POST /api/client/auth/phone/verify Content-Type: application/json ``` ```json { "phone": "+998901234567", "code": "1234" } ``` ### Email (OTP) ```bash POST /api/client/auth/email/request Content-Type: application/json ``` ```json { "email": "client@example.com" } ``` ```bash POST /api/client/auth/email/verify Content-Type: application/json ``` ```json { "email": "client@example.com", "code": "123456" } ``` Both flows return a `token` field in the response. ## Organization Context Most `/api/org/...` endpoints require an organization context, since a staff account can belong to more than one organization. Send the organization ID on every request as a header: ```bash X-Organization-ID: 1 ``` Requests to `/api/org/...` without this header return `400 Bad Request`. Requests to an organization you don't have access to return `403 Forbidden`. ## Personal API Tokens You can issue named, scoped API tokens for programmatic access — useful for scripts, integrations, and MCP clients. ### Create a token ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "My Integration", "expires_in_days": 90 } ``` Response: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Tokens are shown only once. Store them securely — they cannot be retrieved again. The generated token is scoped to the specific organization with the `mcp:organization:{id}` ability and expires after 90 days by default (max 365 days). ## Get Current User ```bash GET /api/auth/me Authorization: Bearer your-token-here ``` Returns the authenticated user's profile. # Booking Flow ## Overview The booking flow in Bronjoy follows a multi-step process: the client selects a service, picks a staff member and time slot, provides their details, optionally pays, and receives a confirmation. ## Step 1: Select a Service The client browses available services for an organization's public booking page. ```bash GET /api/booking/{slug}/services ``` Each service has a name, duration, price, and which staff members can provide it. No authentication needed — this is the public booking page endpoint. ## Step 2: Check Availability Once a service is selected, fetch available time slots for a given date. ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-03-25 ``` Or a whole date range at once: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-03-25&end_date=2026-03-31 ``` The slot calculator considers: - Staff working hours and breaks - Existing bookings - Service duration + buffer time - Organization advance booking limits Returns an array of available time slots with the assigned staff member. ## Step 3: Create the Appointment Submit the booking with the chosen slot. This works for both guests and signed-in clients — Bronjoy identifies the client from the auth token if one is present, or from the contact details in the body if not. ```bash POST /api/client/booking/{slug} Content-Type: application/json ``` ```json { "service_id": 1, "staff_id": 3, "start_time": "2026-03-25T10:00:00Z", "notes": "First visit", "name": "Maria Garcia", "phone": "+998901234567" } ``` `name` and either `phone` or `email` are required for guest bookings; they're ignored if the request carries a client Bearer token instead. The appointment is created in `Pending` status. ## Step 4: Payment (if required) If the organization requires payment, a Stripe Checkout Session is created automatically. The client is redirected to Stripe to complete payment. ```bash POST /api/client/payments/appointments/{appointment}/pay Authorization: Bearer client-token ``` After successful payment, the appointment moves to `Confirmed` status. See [Payments](https://docs.bronjoy.com/en/guides/payments) for the full flow. ## Step 5: Confirmation The client receives a confirmation with appointment details. Notifications are sent via: - Database notification (visible in the app) - Telegram (if the client has connected their account) ## Status Flow ```text Pending → Confirmed → Completed ↓ ↓ Cancelled Cancelled ↓ NoShow ``` - **Pending** — awaiting confirmation or payment - **Confirmed** — payment received or manually confirmed by staff - **Completed** — service was delivered - **Cancelled** — cancelled by client or staff - **NoShow** — client didn't show up # Organization Setup ## Overview After registering and creating your organization, you need to complete a setup checklist before clients can book. This guide walks you through each step in the recommended order. Check your current setup status at any time: ```bash GET /api/org/setup-status Authorization: Bearer your-token ``` ## Step 1: Organization Profile Your profile is the public-facing page that clients see when they discover your business. Fill it in completely — this directly affects trust and conversion. ```bash GET /api/org/organization-profile PUT /api/org/organization-profile ``` **Recommended fields to fill:** | Field | Why it matters | | --------------- | ----------------------------------------------------- | | `name` | Displayed everywhere — use your real business name | | `description` | Tell clients what you do. 2–4 sentences is ideal | | `category` | Helps clients find you in search | | `address` | Required if you have a physical location | | `phone` | Clients want to call before booking | | `website` | Builds credibility | | `logo` | Shown in search results and the booking page | | `cover_image` | First impression on your profile page | | `working_hours` | Shown on the profile so clients know when you're open | **Tips:** - Write a description that focuses on client benefits, not just service names - Use a high-quality square logo (at least 200×200px) - Fill in all social links you actively use ### Publishing your profile Your profile starts as a **draft** — invisible to the public. Once it's ready: ```bash POST /api/org/organization-profile/toggle-publish Authorization: Bearer your-token ``` ## Step 2: Branches (Locations) If you have one or more physical locations, create them as branches. ```bash POST /api/org/branches Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Main Branch", "address": "123 Main St, Tashkent", "phone": "+998901234567" } ``` Even if you only have one location, create it — appointments are linked to branches. ## Step 3: Services Services are what clients book. Create at least one service to get started. ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Haircut", "description": "Classic haircut with styling", "duration": 60, "price": 50000, "category_id": 1, "buffer_time": 10 } ``` **Key fields:** | Field | Description | | ------------------ | ------------------------------------------------- | | `duration` | Service duration in minutes | | `price` | Price in the smallest currency unit (e.g., tiyin) | | `buffer_time` | Gap added after the appointment (cleanup time) | | `prepay_required` | Whether payment is required at booking | | `prepay_amount` | Fixed deposit amount if prepay is required | | `max_advance_days` | How far ahead clients can book this service | **Tips:** - Set `buffer_time` realistically — it prevents back-to-back bookings without breathing room - Group related services under the same category - If a service takes different durations for different staff, create separate variants ## Step 4: Staff Members Add your team. Each staff member gets their own schedule and can be assigned to specific services. See [Staff Management](https://docs.bronjoy.com/en/guides/staff-management) for the full guide. ## Step 5: Schedule & Availability Each staff member needs a working schedule before slots appear. Until a schedule is set, no slots are generated. See [Services & Scheduling](https://docs.bronjoy.com/en/guides/services-scheduling) for the full guide. ## Step 6: Settings Configure organization-level behavior: ```bash GET /api/org/settings PUT /api/org/settings ``` **Important settings:** | Setting | Description | Recommendation | | -------------------------- | ------------------------------------------- | ----------------------------------------------- | | `booking_lead_time` | Minimum hours before a slot can be booked | Set to 1–2 hours to avoid last-minute surprises | | `max_advance_booking_days` | How many days ahead clients can book | 30–60 days is standard | | `appointment_auto_confirm` | Auto-confirm new bookings | Enable if you don't need manual approval | | `allow_guest_booking` | Allow booking without client account | Enable for lower friction | | `slot_interval` | Minutes between slot start times | Match to your service duration | | `cancellation_hours` | Hours before appointment clients can cancel | 24–48 hours is typical | ## Step 7: Payment Settings (optional) If you want to collect payments at booking time, turn it on and set your deposit/refund policy — no Stripe account needed on your end. See [Stripe](https://docs.bronjoy.com/en/integrations/stripe) for setup instructions. ## Step 8: Notification Settings Configure which notifications are sent to clients and staff: ```bash GET /api/org/notification-settings PUT /api/org/notification-settings ``` **Recommended notifications to enable:** - Appointment confirmation (client) - Appointment reminder (client) — typically 24h and 1h before - New appointment notification (staff) - Cancellation notification (both) ## Invite Code Share your organization invite code with staff so they can join your workspace: ```bash POST /api/org/invite-code/generate Authorization: Bearer your-token ``` Staff use this code when registering or joining from an existing account. ## Dashboard Once set up, monitor your business from the dashboard: ```bash GET /api/org/dashboard Authorization: Bearer your-token ``` Returns metrics for today's appointments, upcoming bookings, revenue, and recent activity. # Staff Management ## Overview Staff members are the people in your organization who provide services to clients. Each staff member: - Has their own schedule and availability - Can be assigned to specific services - Has a role (owner or staff) - Has their own public profile page on the booking site ## Inviting Staff ### Generate an invite code ```bash POST /api/org/invite-code/generate Authorization: Bearer your-owner-token ``` Share the returned code with the person you're inviting. They use it to join your organization. ### Invite by email You can also invite directly by email: ```bash POST /api/org/auth/invite Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "email": "newstaff@example.com" } ``` ### Joining via invite code The invitee registers or logs in, then submits a join request: ```bash POST /api/org/join-requests Authorization: Bearer their-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` As an owner, approve or reject pending join requests: ```bash GET /api/org/join-requests # list pending requests POST /api/org/join-requests/{joinRequest}/approve # approve POST /api/org/join-requests/{joinRequest}/reject # reject ``` ## Managing Staff ### List staff ```bash GET /api/org/staff Authorization: Bearer your-token ``` ### Create a staff member directly (owner only) If you want to create a staff account without the invite flow: ```bash POST /api/org/staff Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "email": "alex@example.com", "phone": "+998901234567", "role": "staff", "bio": "Experienced barber with 5 years of experience", "position": "Senior Stylist" } ``` ### Update a staff member ```bash PUT /api/org/staff/{staff} Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "position": "Lead Stylist", "bio": "Updated bio" } ``` ### Activate / Deactivate Deactivating a staff member removes them from the booking flow — clients can't book with them, but existing appointments are preserved. ```bash POST /api/org/staff/{staff}/activate POST /api/org/staff/{staff}/deactivate ``` **When to deactivate:** when a staff member goes on leave or leaves the company. Don't delete — deactivate to keep appointment history intact. ## Staff Roles | Role | Capabilities | | ------- | ------------------------------------------------------------------------------- | | `owner` | Full access: manage staff, settings, billing, payment credentials, invite codes | | `staff` | Manage appointments and their own availability; view-only on most org settings | Roles are set per-organization — a person can be an owner in one org and staff in another. ## Assigning Services to Staff Each staff member must be assigned to the services they can provide. Without an assignment, they won't appear in the booking flow for that service. ```bash # View current service assignments GET /api/org/staff/{staff}/services # Assign services (replaces existing assignments) POST /api/org/staff/{staff}/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "service_ids": [1, 2, 3] } ``` Alternatively, assign staff from the service side: ```bash POST /api/org/services/{service}/staff Content-Type: application/json ``` ```json { "staff_ids": [1, 2] } ``` **Tip:** When you add a new service, immediately assign it to the relevant staff members — otherwise it won't show up as bookable. ## Staff Availability Each staff member needs a schedule for slots to be generated. Manage schedules under the schedule endpoints (see [Services & Scheduling](https://docs.bronjoy.com/en/guides/services-scheduling)). You can view a staff member's computed availability: ```bash GET /api/org/staff/{staff}/availability ``` ## Staff Profiles Each staff member has a public profile page visible to clients. Encourage staff to fill in: - **Photo** — essential for trust - **Bio** — briefly describe expertise and experience - **Position** — their role/title at the business Clients can filter by staff member when booking, so a complete profile increases bookings. ## Batch Operations Update or remove multiple staff members at once: ```bash POST /api/org/staff/batch-update Content-Type: application/json ``` ```json { "ids": [2, 3], "data": { "is_active": false } } ``` ```bash POST /api/org/staff/batch-destroy Content-Type: application/json ``` ```json { "ids": [4, 5] } ``` > Use batch-destroy with caution — it's permanent. Prefer deactivation when you want to preserve history. # Services & Scheduling ## Services Services are the bookable offerings of your organization. Each service has its own duration, pricing, and which staff can provide it. ### Creating a service ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Deep Tissue Massage", "description": "60-minute full-body deep tissue massage", "duration": 60, "price": 150000, "category_id": 2, "buffer_time": 15, "color": "#6366f1" } ``` **Field reference:** | Field | Type | Description | | ------------------ | ------- | ------------------------------------------------- | | `name` | string | Service name shown to clients | | `description` | string | Short description (1–3 sentences) | | `duration` | integer | Duration in minutes | | `price` | integer | Price in smallest currency unit | | `category_id` | integer | Category grouping (optional) | | `buffer_time` | integer | Post-appointment gap in minutes (cleanup, travel) | | `color` | string | Hex color for calendar display | | `prepay_required` | boolean | Require payment at booking | | `prepay_amount` | integer | Fixed deposit amount (if prepay\_required) | | `max_advance_days` | integer | How many days ahead this service can be booked | | `min_lead_hours` | integer | Minimum hours required before booking | | `is_active` | boolean | Whether service is visible and bookable | ### Service categories Group services into categories for better organization on your booking page: ```bash GET /api/org/services/categories ``` Categories are shared across your organization and help clients navigate your service menu. ### Tips for services - **Duration accuracy** — Underestimate and you create gaps; overestimate and you lose slots. Time yourself. - **Buffer time** — Always add a buffer for room turnover, notes, or preparation. Even 5–10 minutes prevents rushed sessions. - **Pricing** — Set the price clients will pay. If you use deposits, set `prepay_amount` to the deposit and `prepay_required: true`. - **Colors** — Assign different colors to service categories — it makes the staff calendar much easier to read. ## Schedules A schedule defines when a staff member is available to take appointments. Until a schedule is set, no slots are generated for that staff member. ### Create a schedule entry ```bash POST /api/org/schedule Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" } ``` `day_of_week`: `0` = Sunday, `1` = Monday, ..., `6` = Saturday. ### View a schedule ```bash GET /api/org/schedule?staff_id=1 ``` ### Update a schedule entry ```bash PUT /api/org/schedule/{id} Content-Type: application/json ``` ```json { "start_time": "10:00", "end_time": "19:00" } ``` ### Delete a schedule entry ```bash DELETE /api/org/schedule/{id} ``` ### Full week example A typical Monday–Friday 9–6 schedule for staff member #1: ```json [ { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 2, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 3, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 4, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 5, "start_time": "09:00", "end_time": "18:00" } ] ``` ## Availability Exceptions Exceptions override the regular schedule for specific dates — useful for holidays, days off, or special hours. ### Create an exception ```bash POST /api/org/availability/exceptions Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "date": "2026-05-01", "is_day_off": true, "reason": "National holiday" } ``` For a partial day (different hours): ```json { "staff_id": 1, "date": "2026-12-31", "is_day_off": false, "start_time": "09:00", "end_time": "14:00", "reason": "New Year's Eve — half day" } ``` ### List exceptions ```bash GET /api/org/availability/exceptions?staff_id=1 ``` **Tips:** - Create recurring exceptions for all known holidays at the start of the year - If a staff member is sick, create a same-day exception with `is_day_off: true` — existing appointments are preserved and can be rescheduled - Exceptions take precedence over the regular schedule for their specific date ## How Slots Are Calculated The slot calculator considers: 1. **Staff schedule** — when they work (day, start, end times) 2. **Availability exceptions** — overrides for specific dates 3. **Existing appointments** — booked slots are blocked 4. **Service duration** — slot length matches the service 5. **Buffer time** — added after each appointment 6. **Organization settings** — advance booking limits, slot interval, lead time Slots are returned with a `start_time`, `end_time`, and the `staff_id` of the available staff member. ### Checking available slots Clients (and you, via API) can check slots: ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-04-01 ``` Or for a range: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-04-01&end_date=2026-04-07 ``` ## Viewing the Calendar The organization calendar shows all appointments across all staff: ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Returns appointments grouped by date, suitable for rendering a monthly/weekly calendar view. # Working with Appointments ## Overview Appointments are the core of Bronjoy. This guide covers the staff/owner perspective — creating, reviewing, updating, and managing appointments throughout their lifecycle. For the client-side booking flow, see [Booking Flow](https://docs.bronjoy.com/en/guides/booking-flow). ## Appointment Status Flow ```text Draft → Pending → Confirmed → Completed ↓ ↓ Cancelled NoShow ``` | Status | Meaning | | ----------- | ----------------------------------------------- | | `Pending` | Created, awaiting confirmation or payment | | `Confirmed` | Payment received or manually confirmed by staff | | `Completed` | Service delivered — set manually by staff | | `Cancelled` | Cancelled by client or staff | | `NoShow` | Client didn't show up | ## Creating Appointments (Staff) Staff can create appointments on behalf of clients: ```bash POST /api/org/appointments Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "branch_id": 1, "start_time": "2026-04-01T10:00:00Z", "notes": "Regular client, prefers extra pressure" } ``` **Tips:** - Always set `notes` for clients with specific preferences or medical considerations - If the client doesn't exist yet, create them first via `POST /api/org/clients` - Staff-created appointments start as `Confirmed` by default (bypassing payment) ## Listing Appointments ### All appointments ```bash GET /api/org/appointments Authorization: Bearer your-token ``` Filter by date range, status, or staff: ```bash GET /api/org/appointments?start_date=2026-04-01&end_date=2026-04-30&status=Confirmed&staff_id=3 ``` ### Pending appointments View appointments awaiting action (confirmation, payment): ```bash GET /api/org/appointments/pending ``` Review this list regularly — pending appointments that linger may mean payment issues or forgotten confirmations. ### Calendar view ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Returns a structured view suitable for calendar rendering. Use this endpoint to power your dashboard calendar. ## Updating an Appointment ```bash PUT /api/org/appointments/{appointment} Content-Type: application/json ``` ```json { "notes": "Updated preference: light pressure only", "staff_id": 4 } ``` You can update most fields on an appointment as long as it hasn't been completed or cancelled. ## Status Transitions ### Confirm an appointment Manually confirm a pending appointment (e.g., payment received offline): ```bash POST /api/org/appointments/{appointment}/submit ``` ### Cancel ```bash POST /api/org/appointments/{appointment}/cancel Content-Type: application/json ``` ```json { "reason": "Staff unavailable due to illness" } ``` When you cancel, the client receives a notification. If payment was collected, initiate a refund separately (see [Payments](https://docs.bronjoy.com/en/guides/payments)). ### Reschedule ```bash POST /api/org/appointments/{appointment}/reschedule Content-Type: application/json ``` ```json { "start_time": "2026-04-02T11:00:00Z", "staff_id": 3 } ``` The client is notified of the new time. ## Batch Operations Efficiently manage multiple appointments at once: ### Batch update ```bash POST /api/org/appointments/batch-update Content-Type: application/json ``` ```json { "ids": [101, 102, 103], "data": { "status": "Completed" } } ``` Useful for marking end-of-day appointments as completed. ### Batch delete ```bash POST /api/org/appointments/batch-destroy Content-Type: application/json ``` ```json { "ids": [104, 105] } ``` > Prefer cancellation over deletion. Deleted appointments don't appear in history or reports. ## Client Notes Attach internal notes to a client's profile — these are visible to staff but not clients: ```bash POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Allergic to certain hair dyes. Always check before service." } ``` Notes appear whenever viewing the client's appointment, helping staff prepare. ## Best Practices ### Daily workflow 1. **Morning** — Review today's appointments in the calendar view. Check for any `Pending` appointments that need confirmation. 2. **During the day** — Mark appointments as `Completed` after the service is delivered. 3. **End of day** — Use batch update to complete all remaining appointments from the day. ### Handling no-shows If a client doesn't show up, mark the appointment as `NoShow` rather than cancelling. This preserves your no-show data and helps you identify patterns. No-show appointments don't count as cancellations and won't trigger refund logic. ### Overbooking prevention The slot calculator prevents double-booking automatically. However: - If you manually create appointments, be careful with the `start_time` — it won't be checked against existing bookings in manual creation flows - Always check the calendar before creating a manual appointment at a specific time ### Last-minute cancellations Configure `cancellation_hours` in your settings to control how far in advance clients can cancel. After that window, clients can still request a cancellation, but staff must process it manually. ## Reports and Analytics ```bash GET /api/org/dashboard ``` The dashboard returns key metrics including: - Today's appointment count - Upcoming appointments this week - Revenue summary - Recent cancellations and no-shows For detailed transaction reports: ```bash GET /api/org/transactions GET /api/org/transactions/summary GET /api/org/transactions/export ``` # Client Management ## Overview Clients are the end customers who book appointments. Bronjoy maintains a client base per organization — the same person may be a client in multiple organizations with separate profiles. ## Creating Clients Clients are created automatically when they book their first appointment. You can also create them manually: ```bash POST /api/org/clients Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Maria Garcia", "phone": "+998901234567", "email": "maria@example.com", "notes": "New client, referred by Alex" } ``` ## Listing Clients ```bash GET /api/org/clients Authorization: Bearer your-token ``` Search and filter: ```bash GET /api/org/clients?search=maria&sort=last_appointment_at&direction=desc ``` ## Client Profile ```bash GET /api/org/clients/{client} ``` The client profile includes: - Contact information - Appointment statistics (total, completed, cancelled, no-show) - Last appointment date - Notes ## Appointment History View a client's full appointment history with your organization: ```bash GET /api/org/clients/{client}/history ``` Use this when: - A client calls to ask about a past appointment - You're checking a client's cancellation/no-show pattern - You want to understand a client's preferences ## Client Notes Internal notes are visible only to staff — clients never see them. Use notes to record: - Preferences and sensitivities ("prefers morning appointments") - Medical considerations ("allergic to latex") - Communication notes ("always call, never texts back") ```bash # Add a note POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Prefers stylist Alex. Very particular about fringe length." } ``` ```bash # View notes GET /api/org/clients/{client}/notes ``` ## Updating a Client ```bash PUT /api/org/clients/{client} Content-Type: application/json ``` ```json { "phone": "+998909876543", "email": "maria.garcia@example.com" } ``` ## Batch Operations ```bash POST /api/org/clients/batch-update Content-Type: application/json ``` ```json { "ids": [10, 11, 12], "data": { "is_vip": true } } ``` ## Reviews Clients leave a review after a completed appointment: ```bash GET /api/client/reviews/reviewable Authorization: Bearer client-token ``` ```bash POST /api/client/reviews Authorization: Bearer client-token Content-Type: application/json ``` ```json { "appointment_id": 101, "rating": 5, "comment": "Great service, will book again!" } ``` View and respond to client reviews (staff side): ```bash GET /api/org/reviews GET /api/org/reviews/stats GET /api/org/reviews/trend ``` Respond to a review: ```bash POST /api/org/reviews/{review}/reply Content-Type: application/json ``` ```json { "reply": "Thank you for your feedback! We're so glad you enjoyed the experience." } ``` **Tips:** - Respond to all reviews, especially negative ones — it shows professionalism - Keep responses short and personal - Don't argue with negative reviews; acknowledge and offer a remedy offline ## Best Practices - **Never delete clients** — deactivate them if needed. Deletion removes appointment history. - **Keep notes up to date** — stale notes are misleading. If something changes, update the note. - **Merge duplicates manually** — if a client books with different contact info, you may get duplicates. Identify them by name and consolidate via the update endpoint. - **Review the no-show list** — clients with repeated no-shows can be flagged. Consider requiring prepayment for known no-shows. # Payments ## Overview Bronjoy supports collecting payments when clients book appointments, processed through Stripe Checkout — clients are redirected to Stripe's hosted payment page, and Bronjoy handles the rest automatically via webhooks. You don't need your own Stripe account; you just enable payments and set your policy. For how to turn it on, see [Stripe Integration](https://docs.bronjoy.com/en/integrations/stripe). ## Payment Settings Each organization configures its own payment policy — whether payment is required, deposit vs. full payment, refund behavior, and reminders. ### View current settings ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ### Update your policy ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` See [Stripe Integration](https://docs.bronjoy.com/en/integrations/stripe) for the full field reference. ### Toggle payments on/off ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## How Payments Work ### At booking time When a client books a service that requires payment: 1. Client selects a service and time slot 2. Client submits the booking 3. Bronjoy creates the appointment in `Pending` status 4. A Stripe Checkout Session is created 5. Client is redirected to Stripe to pay 6. After payment, Stripe sends a webhook 7. Bronjoy confirms the appointment and records the transaction ### Payment types | Type | How it works | | ---------------- | ------------------------------------------------------------------------ | | **Full payment** | Client pays the full service price at booking | | **Deposit** | Client pays a fixed deposit; remaining balance is due at the appointment | Configure per-service: - `prepay_required: true` — enables payment at booking - `prepay_amount: 50000` — deposit amount (omit for full payment) ### Payment states | State | Meaning | | ----------- | -------------------------------------------- | | `Pending` | Payment initiated, waiting for client action | | `Completed` | Payment received | | `Cancelled` | Checkout session expired or payment failed | | `Refunded` | Payment refunded by staff | ## Managing Transactions ### View transactions ```bash GET /api/org/transactions Authorization: Bearer your-owner-token ``` Filter by date, status, or service: ```bash GET /api/org/transactions?start_date=2026-03-01&end_date=2026-03-31&status=completed ``` ### Transaction summary ```bash GET /api/org/transactions/summary ``` Returns totals for completed, refunded, and pending transactions in the given period. ### Export data ```bash GET /api/org/transactions/export?start_date=2026-03-01&end_date=2026-03-31 ``` ## Refunds Process a refund for a completed transaction: ```bash POST /api/org/payments/{transaction}/refund Authorization: Bearer your-owner-token ``` The refund is processed through Stripe. The transaction status changes to `Refunded` and the client is notified. ### When to refund - **Client cancels within policy** — if the cancellation window hasn't passed, refund the full amount - **Service not delivered** — refund proactively to maintain trust - **Partial dissatisfaction** — consider a partial refund (done directly in Stripe Dashboard) ## Payment from the Client Side Clients interact with payments through these endpoints: ```bash # Check if payment is required GET /api/client/payments/appointments/{appointment}/requirement # Initiate payment POST /api/client/payments/appointments/{appointment}/pay # View payment history GET /api/client/payments/appointments/{appointment}/transactions # Check transaction status GET /api/client/payments/transactions/{transaction} ``` ## Best Practices - **Test in Stripe test mode first** — use `pk_test_` / `sk_test_` keys until you're confident - **Set reasonable deposit amounts** — too high deters bookings; too low doesn't protect against no-shows. 20–50% of the service price is typical - **Enable payment only for high no-show services** — not every service needs prepayment. Enable it selectively for services where no-shows cost you time and money - **Review transactions weekly** — catch failed payments and expired sessions early - **Process refunds promptly** — delayed refunds cause chargebacks and damage trust - **Don't configure Click.uz or Payme.uz** — these payment providers are paused until legal entity registration is completed # Waitlist ## Overview When all slots for a service are booked, clients can join a waitlist. If an appointment is cancelled, the next person in line is offered the slot. Bronjoy manages the queue, offers, and expiration automatically. ## How It Works ```text Client joins waitlist ↓ [Waiting] ← position in queue ↓ Slot opens (cancellation) ↓ [Offered] ← time-limited offer ↙ ↘ [Booked] [Expired/Declined] ↓ Next person offered ``` ### Statuses | Status | Meaning | | ----------- | ------------------------------------------------- | | `Waiting` | In the queue, waiting for a slot | | `Offered` | Slot offered — client has a time window to accept | | `Booked` | Offer accepted, appointment created | | `Expired` | Client didn't respond before the offer expired | | `Cancelled` | Client or staff cancelled the entry | ## Staff Workflow ### View the waitlist ```bash GET /api/org/waitlist Authorization: Bearer your-token ``` Filter by service, status, or preferred date: ```bash GET /api/org/waitlist?service_id=1&status=Waiting&preferred_date_from=2026-04-01 ``` Search by client name, email, or phone: ```bash GET /api/org/waitlist?search=maria ``` ### Add a client to the waitlist ```bash POST /api/org/waitlist Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "preferred_date": "2026-04-01", "preferred_time_slot": "morning", "notes": "Only available before noon" } ``` `preferred_time_slot` options: `morning`, `afternoon`, `evening` ### Manually offer a slot When you know a slot is opening up: ```bash POST /api/org/waitlist/{waitlistEntry}/offer Authorization: Bearer your-token Content-Type: application/json ``` ```json { "start_time": "2026-04-01T10:00:00Z" } ``` The entry moves to `Offered` status. The client is notified and has a limited time window to accept (default: 2 hours). ### Cancel a waitlist entry ```bash POST /api/org/waitlist/{waitlistEntry}/cancel Authorization: Bearer your-token ``` ### View summary Get a count of entries by status: ```bash GET /api/org/waitlist/summary ``` ## Client Workflow Clients interact with the waitlist through the booking flow: ### Join the waitlist From the public booking page (works for guests and signed-in clients, same as booking): ```bash POST /api/client/booking/{slug}/waitlist Content-Type: application/json ``` ```json { "service_id": 1, "preferred_date": "2026-04-01", "preferred_time_slot": "afternoon", "name": "Maria Garcia", "phone": "+998901234567" } ``` ### View waitlist entries ```bash GET /api/client/waitlist Authorization: Bearer client-token ``` ### Accept an offer When a slot is offered: ```bash POST /api/client/waitlist/{waitlistEntry}/accept Authorization: Bearer client-token ``` This creates an appointment at the offered time. The waitlist entry moves to `Booked`. ### Decline an offer ```bash POST /api/client/waitlist/{waitlistEntry}/decline Authorization: Bearer client-token ``` The slot is offered to the next person in line. ### Cancel waiting ```bash POST /api/client/waitlist/{waitlistEntry}/cancel Authorization: Bearer client-token ``` ### Check queue length (public) No authentication needed — show on the booking page: ```bash GET /api/booking/{slug}/waitlist/count?service_id=1&date=2026-04-01 ``` ## Auto-Promotion When enabled, Bronjoy automatically offers slots to the next person in the queue when an appointment is cancelled. Enable in organization settings: | Setting | Description | Default | | --------------------------------- | ----------------------------------------- | ------- | | `waitlist_auto_promote` | Automatically offer slots on cancellation | `false` | | `waitlist_promotion_window_hours` | Hours before an offer expires | `2` | When auto-promote is on: 1. An appointment is cancelled 2. Bronjoy finds the next `Waiting` entry for that service/date 3. The slot is offered automatically 4. If the offer expires, the next person is offered ## Best Practices - **Enable auto-promotion** for popular services — it fills cancelled slots without staff intervention - **Set a reasonable promotion window** — 2 hours works for same-day; extend to 12–24 hours for advance bookings - **Monitor the waitlist summary** — a long waitlist for a service suggests you need more staff or time slots - **Add notes when offering slots** — include the specific time being offered so clients understand the offer - **Use preferred\_time\_of\_day** — it helps match clients to slots they'll actually accept, reducing decline rates # Referrals ## Overview Bronjoy has two distinct referral systems: | | Who | Reward | | ---------------------- | ------------------------------- | ----------------------------------------- | | **Business referrals** | One organization refers another | Both sides get free Avtopilot days | | **Ambassador program** | Any person refers businesses | Cash commission on what the business pays | ## Business Referrals Every organization gets a shareable referral code. When a business you refer signs up and books its first appointment, you both get free days of [Avtopilot](https://docs.bronjoy.com/en/for-owners/plans-and-billing). ### Get your referral link ```bash GET /api/org/referrals/stats Authorization: Bearer your-token X-Organization-ID: 1 ``` ```json { "data": { "referral_code": "ABC12345", "referral_link": "https://bronjoy.com/onboarding/create?ref=ABC12345", "reward_days": 30, "total_referred": 3, "completed": 2 } } ``` Share the link — anyone who creates their organization through it is attributed to you automatically. ### Track your referrals ```bash GET /api/org/referrals Authorization: Bearer your-token X-Organization-ID: 1 ``` Lists organizations you've referred and their status. ### Check who referred you ```bash GET /api/org/referrals/incoming ``` ### Get a new code If your code leaked somewhere you don't want it, regenerate it — the old code stops working: ```bash POST /api/org/referrals/regenerate-code Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` The reward is credited once the referred organization books its first appointment, not just on signup — this keeps the reward tied to businesses that actually go live. ## Ambassador Program Separately, any individual — not just business owners — can become a Bronjoy ambassador: refer businesses to sign up, and earn a recurring commission on their subscription payments for as long as they stay subscribed. ```bash GET /api/client/referral Authorization: Bearer client-token ``` Returns your ambassador referral code, shareable link, and earnings summary. From there: ```bash GET /api/client/referral/businesses # businesses you've referred GET /api/client/referral/commissions # your earnings ledger ``` Connecting a payout method and requesting a payout is supported in the API (`POST /api/client/referral/payout-methods`, `POST /api/client/referral/payouts`) — if you're setting this up, reach out to support first to confirm payouts are open in your region. # Stripe ## Overview Bronjoy processes card payments through Stripe Checkout on your behalf — there's no Stripe account for you to create or connect. You just turn payments on for your organization and set your policy: whether to require a deposit or full payment, and how refunds and reminders behave. ## Enabling Payments ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` | Field | Description | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | | `provider` | `stripe` (Click, Payme, and Uzum exist but are not yet open — see [Payments](https://docs.bronjoy.com/en/guides/payments)) | | `is_enabled` | Turn payment collection on or off for this organization | | `prepay_policy` | `none`, `partial` (deposit), or `full` | | `prepay_percentage` | Deposit percentage of the service price, required when `prepay_policy` is `partial` | | `refund_on_cancellation` | Automatically refund when a paid appointment is cancelled within the window | | `refund_deadline_hours` | How many hours before the appointment refunds are still automatic | | `auto_remind_unpaid` | Send a reminder for unpaid pending bookings | | `remind_after_minutes` | Delay before the first unpaid-booking reminder | Toggle it off without losing your configuration: ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## Per-Service Overrides Payment behavior can also be set per service — see [Services & Scheduling](https://docs.bronjoy.com/en/guides/services-scheduling) for `prepay_required` and `prepay_amount` on individual services. ## How It Works 1. Client books a service that requires payment 2. Bronjoy creates the appointment in `Pending` status 3. A Stripe Checkout Session is created for the required amount 4. Client is redirected to Stripe's hosted checkout page 5. Stripe notifies Bronjoy once payment completes 6. Bronjoy confirms the appointment and records the transaction See [Webhooks](https://docs.bronjoy.com/en/integrations/webhooks) for the event details, and [Payments](https://docs.bronjoy.com/en/guides/payments) for managing transactions and refunds day-to-day. # MCP Integration ## Overview Bronjoy speaks [MCP (Model Context Protocol)](https://modelcontextprotocol.io/){rel=""nofollow""}, so an AI assistant — Claude, ChatGPT, or anything else that talks MCP — can search for a business, answer questions about it, and book an appointment. There are **two servers**, for two different audiences: | | [Marketplace server](https://docs.bronjoy.com/#marketplace-server) | [Organization server](https://docs.bronjoy.com/#organization-server) | | ------------ | ------------------------------------------------------------------ | -------------------------------------------------------------------- | | **For** | Anyone. End users, developers, AI assistants | One organization's own assistant | | **Covers** | The whole public catalogue | A single organization | | **Auth** | None | Bearer token | | **Endpoint** | `https://api.bronjoy.com/api/mcp` | `https://api.bronjoy.com/api/mcp/organization/{id}` | | **Cost** | Free | Paid plan feature | If you are a person who wants to book a haircut through your assistant, you want the marketplace server. If you are a business that wants your own assistant to manage your calendar, you want the organization server. --- ## Marketplace server The public catalogue as an MCP server. No account, no token, no signup — it exposes exactly what the Bronjoy website already serves to any browser, plus the same verified booking path. ### Connect ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy https://api.bronjoy.com/api/mcp ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp" } } } ``` ```txt [Any MCP client] Transport: Streamable HTTP Endpoint: https://api.bronjoy.com/api/mcp Auth: none ``` :: That is the whole setup. Ask your assistant *"find me a barbershop in Tashkent"* and it will use the tools below. ### Tools Six tools, in the order a booking conversation uses them. #### search-venues Search the catalogue by keyword, city and category. Every other tool takes the `slug` this returns. | Parameter | Type | Required | Description | | --------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------ | | `query` | string | No | Free text — a business name, a service (`стрижка`, `haircut`), or a landmark. Matches across Latin and Cyrillic | | `city` | string | No | City slug or name — `tashkent`, `samarkand`, `Бухара` | | `category` | string | No | Category slug — `barber`, `dental`, `car-wash` | | `bookable_only` | boolean | No | Return only venues that take online bookings. Set this when the user wants to *book* rather than to be told about places | | `limit` | integer | No | 1–20, default 5 | ```json { "venues": [ { "name": "Britva Barbershop", "slug": "demo-barber", "url": "https://bronjoy.com/tashkent/barber/demo-barber", "city": "Tashkent", "district": "Юнусабадский район", "address": "проспект Амира Темура, 15", "specialty": "Men's haircuts and beard care", "rating": 4.9, "reviews": 7, "is_bookable": true, "next_available": "Tomorrow 09:00", "price_from": 50000, "has_phone": true } ], "returned": 1, "total_matches": 1 } ``` #### get-venue The full public profile of one venue: address, opening hours, services, amenities, payment methods, website, rating. The phone number comes back **masked** here. | Parameter | Type | Required | Description | | --------- | ------ | -------- | -------------------- | | `slug` | string | Yes | From `search-venues` | ```json { "name": "Britva Barbershop", "city": "Ташкент", "address": "проспект Амира Темура, 15", "is_bookable": true, "website": "https://britva.uz", "masked_phone": "+998 71 ***-**-70", "opening_hours": { "monday": { "open": "09:00", "close": "19:00" }, "saturday": { "open": "08:00", "close": "18:00" }, "sunday": { "open": null, "close": null } }, "service_tags": ["Haircuts", "Beard shaping", "Royal shave", "Styling"], "price_from": 50000, "price_to": 110000, "rating": "4.90", "reviews": 7, "booking": "Online booking is available — continue with check-availability." } ``` #### reveal-phone The venue's real phone number. Deliberately a separate call from `get-venue`, and rate limited to **10 per minute** — request it for a venue the user has actually chosen, never in bulk across search results. | Parameter | Type | Required | Description | | --------- | ------ | -------- | -------------------- | | `slug` | string | Yes | From `search-venues` | ```json { "name": "Britva Barbershop", "phone": "+998 71 200-70-70", "url": "https://bronjoy.com/tashkent/barber/demo-barber" } ``` #### check-availability Bookable services and open slots. Call it **without** `service_id` first to list the services and their prices, then again **with** one to get its slots. | Parameter | Type | Required | Description | | ------------ | ------- | -------- | ------------------------------------------ | | `slug` | string | Yes | From `search-venues` | | `date` | string | Yes | `YYYY-MM-DD`, today or up to 30 days ahead | | `service_id` | integer | No | Omit on the first call to list services | ```json { "date": "2026-09-10", "service": { "service_id": 1, "name": "Мужская стрижка", "duration_minutes": 30, "price": "80000.00", "currency": "UZS" }, "slots": [ { "start_time": "2026-09-10T09:00:00+05:00", "end_time": "2026-09-10T09:30:00+05:00", "staff_id": 1, "staff_name": "Азиз Рахимов" } ] } ``` `start_time` is exactly the value `book-appointment` expects. Do not round it or convert it. #### request-booking-code Sends a 6-digit code to the user's own email or phone. | Parameter | Type | Required | Description | | --------- | ------ | -------- | --------------------------------- | | `slug` | string | Yes | The venue being booked | | `email` | string | Either | The user's email | | `phone` | string | Either | The user's phone, `+998901234567` | ::warning **The assistant never receives the code.** It goes to the user's inbox or handset; the user reads it back. That is the point — it proves the contact belongs to the person booking, so a business does not get appointments from numbers nobody answers. :: The code lasts **5 minutes** and covers one booking. Sends are capped per sender and per recipient — do not loop. #### book-appointment Creates the appointment. | Parameter | Type | Required | Description | | ------------------- | ------- | -------- | ---------------------------------------------- | | `slug` | string | Yes | The venue | | `service_id` | integer | Yes | From `check-availability` | | `start_time` | string | Yes | The exact `start_time` from a slot | | `name` | string | Yes | The user's name, as the business should see it | | `verification_code` | string | Yes | The 6 digits the user read back | | `email` / `phone` | string | Either | The same contact the code was sent to | | `notes` | string | No | Max 500 characters | The booking is created as **pending** — the business still confirms it. Tell the user it is requested, not guaranteed. If the venue takes prepayment, the response carries a `payment_url` the user must open. ### The booking flow ```text 1. search-venues → bookable_only: true 2. check-availability → pick a service, then a slot 3. request-booking-code → code goes to the user, not to you 4. ask the user to read you the code 5. book-appointment → with that code ``` ### Two kinds of venue Every result carries `is_bookable`, and it decides what you can offer next: - **`is_bookable: true`** — set up for online booking. The flow above works. - **`is_bookable: false`** — a directory listing. Real address, real hours, often a service list and a phone number, but **no online booking**. Answer from that data and offer the phone number. ::caution Most of the catalogue is currently the second kind. An assistant that assumes everything is bookable will promise something Bronjoy cannot deliver — pass `bookable_only: true` when the user's intent is to book, and say plainly when a place has to be phoned. :: ### Reading the data - **Names, services and addresses are in Russian or Uzbek.** Do not translate an address the user has to show a taxi driver. - **Prices are in Uzbek som (UZS).** Many listings have no price. `от 300000 сум` means "from 300,000 UZS". - **Times are in the venue's local timezone**, and carry their offset. - **Ratings on search results come from the source directory**, not from Bronjoy reviews. ### Limits | Scope | Limit | | ---------------------- | -------------------------------------------- | | All requests | 30/minute per caller | | `reveal-phone` | 10/minute per caller | | `request-booking-code` | 10/hour per caller, plus a per-recipient cap | Exceeding a limit returns an error naming the seconds to wait. --- ## Organization server A private, per-organization server an owner connects their own assistant to. It manages **that organization's** calendar: services, slots, bookings and cancellations. It is a paid plan feature and requires a token. ### 1. Generate a token From the provider dashboard, or via the API: ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "Claude Desktop", "expires_in_days": 90 } ``` Response: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Save the token immediately — it is shown only once. ### 2. Connect your AI client ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy-org \ https://api.bronjoy.com/api/mcp/organization/1 \ --header "Authorization: Bearer 3|AbCdEf..." ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp/organization/1", "headers": { "Authorization": "Bearer 3|AbCdEf..." } } } } ``` ```txt [Any MCP client] Transport: Streamable HTTP Endpoint: https://api.bronjoy.com/api/mcp/organization/{id} Auth: Authorization: Bearer {token} ``` :: ### Tools #### list-services List all bookable services with prices and durations. Use this first to discover service IDs. **Parameters:** None ```json { "services": [ { "id": 1, "name": "Haircut", "description": "Classic haircut with styling", "duration_minutes": 30, "price": "25.00", "currency": "USD", "category": "Hair Services" } ], "total": 1 } ``` #### search-availability Find available time slots for a specific service and date. | Parameter | Type | Required | Description | | ------------ | ------- | -------- | ------------------------------------------ | | `service_id` | integer | Yes | Service ID (from `list-services`) | | `date` | string | Yes | `YYYY-MM-DD`, today or up to 30 days ahead | | `staff_id` | integer | No | Specific staff member | ```json { "date": "2026-03-26", "service": "Haircut", "timezone": "Asia/Tashkent", "available_times": ["09:00", "10:00", "14:30", "15:00"], "total_found": 10, "showing": 4, "note": "Times are in H:i format (24-hour) in the organization timezone." } ``` #### create-appointment Book an appointment for a client. | Parameter | Type | Required | Description | | -------------- | ------- | -------- | ------------------------------------------------ | | `client_name` | string | Yes | Client's full name (2–100 chars) | | `client_phone` | string | Yes | Phone in international format (`+998901234567`) | | `service_id` | integer | Yes | Service ID | | `date` | string | Yes | `YYYY-MM-DD` | | `time` | string | Yes | `HH:MM`, 24-hour | | `staff_id` | integer | No | Specific staff member (auto-assigned if omitted) | | `branch_id` | integer | No | Branch location | | `notes` | string | No | Max 500 chars | ```json { "success": true, "appointment_id": 123, "message": "Appointment booked for John Doe on 2026-03-26 at 14:30." } ``` #### check-appointment Look up existing appointments by phone number. | Parameter | Type | Required | Description | | ---------------- | ------- | -------- | ---------------------------------------------------- | | `client_phone` | string | Yes | Phone in international format | | `appointment_id` | integer | No | Specific appointment (shows all upcoming if omitted) | Returns a single appointment or up to 5 upcoming appointments for the phone number. #### cancel-appointment Cancel an existing appointment. The client's phone must match the booking. | Parameter | Type | Required | Description | | ---------------- | ------- | -------- | ---------------------- | | `appointment_id` | integer | Yes | Appointment ID | | `client_phone` | string | Yes | Must match the booking | | `reason` | string | No | Max 500 chars | ### Resources #### organization://profile The organization profile — services, staff, branches, timezone and currency. Lets an AI client understand the context without calling individual tools. ### Prompts #### booking-assistant A system prompt that sets up a booking conversation, with instructions for the recommended workflow. ### Recommended workflow ```text 1. list-services → Show what's available 2. search-availability → Find open slots for the chosen service 3. Confirm with user → Let the human pick a time 4. create-appointment → Book it ``` For cancellations: ```text 1. check-appointment → Find the appointment by phone 2. Confirm with user → Which one to cancel? 3. cancel-appointment → Cancel it ``` ### Limits | Scope | Limit | | ---------------- | ------------------- | | Per token | 60 requests/minute | | Per organization | 120 requests/minute | Exceeding limits returns `429 Too Many Requests`. ### Security - Each token is scoped to a **single organization** — it cannot reach another organization's data - Tokens expire after the configured number of days (default 90, max 365) - The server is **booking-only** — no internal management endpoints, financial data or staff settings - Phone numbers verify the client on check and cancel operations - All operations are logged for audit ### Troubleshooting | Issue | Solution | | ----------------------- | -------------------------------------------------------------------- | | `401 Unauthorized` | Token expired or invalid — generate a new one | | `403 Forbidden` | Token doesn't have access to this organization | | `429 Too Many Requests` | Rate limit exceeded — wait and retry | | `Feature not available` | MCP access is not enabled for this organization | | No slots returned | Staff schedules may not be set, or the service has no assigned staff | # Payment Webhooks ## Overview Bronjoy processes payments on your behalf (see [Stripe](https://docs.bronjoy.com/en/integrations/stripe)), so you never configure a webhook yourself — this page just explains what happens behind the scenes between a client paying and their appointment being confirmed. ## What happens when a payment completes 1. The payment provider notifies Bronjoy that the checkout succeeded, expired, or was refunded 2. The transaction record is updated to `Completed`, `Cancelled`, or `Refunded` 3. If the appointment was pending payment, it's automatically confirmed 4. The client and staff receive their confirmation/cancellation notifications This all happens within a second or two of the client completing checkout — no polling required. Track the result from your side via [transactions](https://docs.bronjoy.com/en/guides/payments#managing-transactions) or the appointment's status. ## Providers | Provider | Status | | ------------ | -------------------------------------------------------------------------------- | | **Stripe** | Live — see [Stripe Integration](https://docs.bronjoy.com/en/integrations/stripe) | | **Click.uz** | Paused until legal entity registration completes | | **Payme.uz** | Paused until legal entity registration completes | All amounts for Click and Payme are handled in UZS; Stripe amounts follow the currency configured on the transaction. # Google Calendar ## Overview Bronjoy integrates with Google Calendar to keep staff appointments in sync. Two sync modes are available: | Mode | Direction | How it works | | ------------------------ | -------------- | ------------------------------------------------------------------------------------- | | **Google Calendar sync** | Two-way | OAuth connection; pushes appointments to Google, pulls external events to block slots | | **iCal feed** | One-way (read) | Subscribe from any calendar app; read-only, auto-refreshes | ## Google Calendar Sync ### Connecting 1. Get the authorization URL: ```bash GET /api/org/calendar/auth-url?provider=google Authorization: Bearer your-token ``` :brReturns a Google OAuth consent URL. The staff member opens this in their browser. 2. After granting access, Google redirects back to Bronjoy. The connection is created automatically. 3. Verify the connection: ```bash GET /api/org/calendar/connections Authorization: Bearer your-token ``` ### Sync behavior Once connected, Bronjoy syncs in both directions: **Push (Bronjoy → Google):** - New appointments are created as Google Calendar events - Rescheduled appointments update the event - Cancelled appointments delete the event - Event description includes service name, client info, and notes **Pull (Google → Bronjoy):** - External events on the staff's calendar block availability slots - Pulled events are cached and refreshed periodically - All-day events are handled correctly (block the entire day) ### Toggle sync features Control what gets synced per connection: ```bash PATCH /api/org/calendar/connections/{connection}/toggle Authorization: Bearer your-token Content-Type: application/json ``` ```json { "push_enabled": true, "pull_enabled": true } ``` | Setting | What it does | | -------------- | ------------------------------------------------ | | `push_enabled` | Push Bronjoy appointments to Google Calendar | | `pull_enabled` | Pull Google events to block Bronjoy availability | | `sync_enabled` | Master toggle — disables all sync when false | ### Manual sync Trigger an immediate sync (useful after making changes in Google Calendar): ```bash POST /api/org/calendar/connections/{connection}/sync Authorization: Bearer your-token ``` ### Disconnecting ```bash DELETE /api/org/calendar/connections/{connection} Authorization: Bearer your-token ``` This revokes the OAuth token, removes cached events, and stops all sync. Existing Google Calendar events created by Bronjoy are **not deleted**. ## iCal Feed An iCal feed is a read-only URL that any calendar application can subscribe to. It shows the staff member's upcoming appointments. ### Get the feed URL ```bash GET /api/org/calendar/feed-url Authorization: Bearer your-token ``` Returns a URL like: ```text https://api.bronjoy.com/api/calendar/feed/abc123token.ics ``` ### Subscribe in your calendar app **Google Calendar:** 1. Open Google Calendar → Other calendars → From URL 2. Paste the feed URL 3. Google refreshes it automatically (usually every few hours) **Apple Calendar:** 1. File → New Calendar Subscription 2. Paste the feed URL **Outlook:** 1. Add Calendar → From Internet 2. Paste the feed URL ### Feed details - Contains upcoming appointments for the next 6 months - Excludes cancelled appointments - Each event includes: service name, client name, notes, location - Refreshes every 60 minutes (calendar app may vary) - Token-authenticated — no login required ### Download single appointment Clients can download a single appointment as an `.ics` file: ```bash GET /api/client/appointments/{appointment}/ics Authorization: Bearer client-token ``` Or get links to add to specific calendar apps: ```bash GET /api/client/appointments/{appointment}/calendar-links ``` Returns Google Calendar and Outlook deep-links. ## Best Practices - **Use Google Calendar sync** if staff actively manage their schedule in Google Calendar — it prevents double-bookings by pulling external events - **Use iCal feed** if staff just want a read-only view of their Bronjoy appointments in their preferred calendar app - **Enable pull sync** for staff who have personal events on their Google Calendar that should block booking slots - **Don't use both** Google Calendar sync and iCal feed for the same staff member — it creates duplicate events # Telegram ## Overview Bronjoy integrates with Telegram in three ways: 1. **Client Mini App** — clients book appointments through a Telegram Mini App 2. **Staff notifications** — staff receive booking notifications with action buttons 3. **Custom bots** — organizations can connect their own Telegram bot for white-label experience ## Client Telegram Flow Clients can authenticate and interact with Bronjoy through a Telegram Mini App. ### Authentication ```bash POST /api/client/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` The `init_data` comes from the [Telegram Mini App API](https://core.telegram.org/bots/webapps){rel=""nofollow""}. Bronjoy validates the HMAC-SHA256 signature and creates/links the client account. ### Appointment actions via inline buttons When a client receives a booking confirmation on Telegram, inline buttons allow direct actions: - **Cancel appointment** — sends a callback to `cancel_appointment:{id}` The bot processes the callback and confirms the cancellation in-chat. ## Staff Telegram Flow ### Authentication ```bash POST /api/org/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` ### Link/unlink Telegram account Staff with an existing account can link their Telegram: ```bash POST /api/org/telegram/link Authorization: Bearer your-token Content-Type: application/json ``` ```json { "init_data": "..." } ``` To unlink: ```bash POST /api/org/telegram/unlink Authorization: Bearer your-token ``` ### Staff notifications When a new appointment is created, staff receive a Telegram message with: - Client name and service details - Date and time - Inline buttons: **Confirm** / **Decline** Staff can approve or reject appointments directly from Telegram without opening the dashboard. ### Onboarding via Telegram New users can create or join an organization through Telegram: ```bash POST /api/org/telegram/create-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "My Salon", "category": "beauty" } ``` ```bash POST /api/org/telegram/join-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` ## Custom Telegram Bot (White-Label) Organizations can connect their own Telegram bot for a branded experience. Instead of the default Bronjoy bot, clients interact with the organization's bot. ### Connect a custom bot **Owner only.** Requires the `custom_telegram_bot` feature flag. ```bash POST /api/org/telegram-bot/connect Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "bot_token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" } ``` Bronjoy validates the token via the Telegram API, sets up the webhook, and configures a menu button linking to your Mini App. ### Check connection status ```bash GET /api/org/telegram-bot Authorization: Bearer your-owner-token ``` Returns bot info, webhook status, and any pending errors. ### Disconnect ```bash POST /api/org/telegram-bot/disconnect Authorization: Bearer your-owner-token ``` Removes the webhook and disconnects the custom bot. The default Bronjoy bot is used instead. ## Best Practices - **Connect a custom bot** if your brand identity matters — clients will see your bot name and avatar - **Set up the staff bot** early — it dramatically reduces response time to new bookings - **Encourage clients to use Telegram** for booking — it reduces friction compared to email/phone auth # What Bronjoy Is and What It Does for Your Business ## What Bronjoy is Bronjoy is an appointment-booking platform for service businesses — salons, barbershops, clinics, studios, and similar. It gives your business an online presence where customers can find you and book appointments themselves, and it gives you the tools to run the day-to-day: calendar, client list, schedule, payments, and reviews. ## What you get - **An online booking page** customers can reach by link or through Telegram, where they pick a service and time and book themselves — see [How Your Clients Book You Online](https://docs.bronjoy.com/en/for-owners/getting-clients-online). - **A calendar** of all appointments, kept in sync automatically as customers book, reschedule, or cancel. - **A client list** with each customer's contact details, booking history, and notes. - **Schedule management** — your weekly hours, days off, and special hours, which drive the bookable slots customers see. - **Automatic confirmations and reminders** to you and your customers (including via Telegram), which cut no-shows. - **Payments** — optionally take deposits or full payment at booking. - **Reviews** — collect customer reviews and reply to them. ## The business assistant Bronjoy includes an AI business assistant you can chat with (in the dashboard and on Telegram). It can do the work for you — book and manage appointments, look up and manage clients, set your schedule, manage services/staff/branches, answer questions about your revenue and performance, and explain how the product works. Just ask in plain language. # Setting Up Your Business for the First Time ## Setup order To start taking online bookings, set things up in this order. The assistant can do most of these steps for you — just ask. 1. **Add a branch (location).** This is where you work. A business needs at least one branch before customers can book. Tell the assistant the name and address. 2. **Add your services.** Each service needs a name, a price, and how long it takes (duration). These are exactly what customers see and choose on your booking page, so add the real ones (e.g. "Men's haircut — 30 min — 50,000"). 3. **Set your working schedule.** Define your weekly hours (e.g. Mon–Sat 09:00–19:00) and any days off. The booking page turns these hours into the open time slots customers can pick. No schedule means no bookable slots. 4. **Add staff (if you have a team).** Add each team member and which services they provide, so customers can book the right person. Skip this if you work solo. 5. **Publish your profile.** Fill in your business profile (name, description, photos) and switch it to **published**. This makes your booking page public and gives you a shareable link. ## After setup Once published, share your booking page link so customers can book — see [How Your Clients Book You Online](https://docs.bronjoy.com/en/for-owners/getting-clients-online). From then on, new bookings appear in your calendar automatically and you manage them from the dashboard or by asking the assistant. ## Tip If something on your booking page looks wrong or empty (no services, no available times), it's almost always one of the steps above missing — usually services or schedule, or the profile not being published yet. # How Your Clients Book You Online ## The short answer Once your business is set up and **published**, Bronjoy gives your customers their own online way to book you — they pick a service, see your real open time slots, choose a time, and confirm, all without calling or messaging you. You don't build anything; Bronjoy creates the booking experience for you. Your job is to set the business up, publish it, and **share the link**. There are two ways customers reach you: ## 1. Your public booking page (a web link) Every business gets its own booking page on the web at your Bronjoy address followed by your business handle — for example `bronjoy.com/your-handle`. Anyone with the link can open it in a browser and book; no app or account is needed to view it. You don't have to hunt for this address — just ask the assistant ("what's my booking link?") and it will give you your exact URL and tell you whether it's live yet. You can also find it in your dashboard: when your profile is **published**, a green **"Published"** badge appears in the top bar — click it to open your live booking page and copy the URL. **Where to put the link so customers use it:** - Your Instagram / Telegram / Facebook bio ("Book here 👇") - Your Google Maps / 2GIS business profile - WhatsApp/Telegram replies to booking requests - A QR code on the door, the counter, or a business card (generate one from the link) - Your website, if you have one ## 2. The Telegram booking app Customers can also book inside Telegram through the Bronjoy client booking Mini App at **t.me/bronjoy\_bot**. If you share a business-specific Telegram link, it opens straight into *your* booking flow. This is the most popular option for many customers because it lives right inside the chat they already use, and they get their confirmation and reminders in Telegram too. > Note: the Telegram booking app for **customers** is separate from the business assistant bot (that one is for you, the owner/staff). ## Before customers can book: you must be "live" If your booking page is empty or not reachable, it's almost always because the business isn't fully set up and published yet. To go live you need, at minimum: 1. **A branch (location)** — where you operate 2. **At least one service** — what customers can book, with a price and duration 3. **A working schedule** — your hours, so the page can show open slots 4. **A published profile** — flip your profile to *published* so the page goes public Until the profile is published, the booking page won't be public and there's no link to share. If any of these are missing, set them up first — then the "Published" badge (and your shareable link) appears. ## What happens after a customer books The appointment lands in your Bronjoy calendar automatically, and both you and the customer get a confirmation (and reminders). You can confirm, reschedule, or cancel from your dashboard or by asking the assistant. # Plans & Billing ## Plans | | Spark (free) | Avtopilot | | ----------------------------- | ------------ | -------------------- | | Online booking page | ✓ | ✓ | | Appointments, staff, schedule | ✓ | ✓ | | SMS notifications | ✓ | ✓ | | Branches | 1 | 1, plus paid add-ons | | AI business assistant | — | ✓ | | Online payments (Stripe) | — | ✓ | | Custom Telegram bot | — | ✓ | | Advanced analytics | — | ✓ | | Priority support | — | ✓ | | "Powered by Bronjoy" branding | shown | removed | Every business starts on **Spark** — it's free for as long as you want, with no card required. **Avtopilot** is a flat monthly subscription that unlocks the AI assistant, in-app payments, your own Telegram bot, and analytics. ## Extra Branches Need more than one location on Avtopilot? Add branches individually rather than upgrading to a bigger tier — each additional branch is a small monthly add-on billed alongside your subscription. ```bash POST /api/org/subscription/branches/add Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Remove one the same way: ```bash POST /api/org/subscription/branches/remove ``` ## AI Credits The AI assistant on Avtopilot comes with a daily included budget, shared across your whole team. If you run a busy shop and exhaust it, top up with a one-time credit pack rather than waiting for the next day's reset: ```bash POST /api/org/subscription/ai-credits/topup Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Credits never expire and are only drawn down once your daily included budget runs out. ## Managing Your Subscription ```bash GET /api/org/subscription Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Returns your current plan, usage, and renewal date. **Upgrade:** ```bash POST /api/org/subscription/checkout Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "tier": "avtopilot" } ``` Returns a Stripe Checkout URL — complete payment there to activate. **Cancel or resume:** ```bash POST /api/org/subscription/cancel POST /api/org/subscription/resume ``` Cancelling doesn't cut you off immediately — Avtopilot stays active until the end of the billing period you already paid for, then the organization drops back to Spark automatically. Resume any time before that date to keep your plan uninterrupted. All of the above is also available from the billing settings in your dashboard — the assistant can walk you through it too. # Claim Your Business ## Why a business might already be listed Bronjoy maps thousands of service businesses from public directories to make the marketplace useful from day one — so your business may already have a profile with your name, address, and category filled in, even if you never signed up. That profile is unclaimed until you verify you're actually the owner. This protects businesses from having their listing edited or claimed by someone else. ## How to claim it 1. Find your business on Bronjoy and open its profile 2. Start a claim request with your name, your role (owner, manager, employee, or representative), and a short message 3. Upload at least one supporting document — a state registration certificate, tax certificate, or business license. You can attach up to 5 files (PDF, JPG, PNG, or WEBP) ```bash POST /api/claims Authorization: Bearer your-token Content-Type: multipart/form-data ``` ```json { "organization_slug": "downtown-barbershop", "applicant_role": "owner", "applicant_name": "Jane Smith", "applicant_phone": "+998901234567", "message": "I'm the owner of this barbershop, registered in 2023. Documents attached.", "documents": [ { "file": "", "kind": "registration_cert" } ] } ``` `kind` is one of `registration_cert`, `tax_cert`, `license`, `lease`, `utility_bill`, or `other` — at least one document must be a registration certificate, tax certificate, or business license. We verify ownership with documents rather than a phone or email code — a text message to a number isn't proof you own the business. ## After you apply ```bash GET /api/claims GET /api/claims/{claimRequest} ``` Track your claim's status. If reviewers need more from you, add additional documents to the same request: ```bash POST /api/claims/{claimRequest}/documents ``` You can withdraw a claim you no longer want reviewed: ```bash POST /api/claims/{claimRequest}/withdraw ``` ## Once approved You become the owner of the organization — full access to the dashboard, staff, services, schedule, and settings. From there, follow [Setting Up Your Business for the First Time](https://docs.bronjoy.com/en/for-owners/first-time-setup) to get the details right and go live. # Введение ## Что такое Bronjoy? Bronjoy — это мультитенантная платформа онлайн-записи, которая помогает сервисным бизнесам управлять расписанием, сотрудниками и отношениями с клиентами. У каждой организации на Bronjoy — своё независимое рабочее пространство. ## Основные понятия ### Организации Организация — это бизнес на Bronjoy: салон, клиника, консалтинговая компания или любой другой поставщик услуг. У каждой организации есть свои: - **Услуги** — что предлагает бизнес (стрижка, консультация, массаж и т.д.) - **Сотрудники** — кто оказывает услуги, с индивидуальным расписанием - **Локации** — физические или виртуальные точки оказания услуг - **Клиенты** — база клиентов с историей записей и предпочтениями ### Записи Центральная сущность. Запись связывает **клиента** с **услугой**, которую оказывает **сотрудник**, в конкретное **время** и **место**. Запись проходит через статусы: `Pending` → `Confirmed` → `Completed` (или `Cancelled` / `NoShow`). ### Доступность и слоты Сотрудники задают рабочие часы через **расписания**. Калькулятор слотов учитывает: - Расписание и перерывы сотрудника - Существующие записи - Длительность услуги и буферное время - Настройки на уровне организации (лимит предварительной записи, интервал слотов) ### Платежи Организации могут требовать оплату при записи. Bronjoy интегрирован со **Stripe** для обработки платежей — поддерживаются полная оплата и депозиты через Checkout Sessions. ## Архитектура Bronjoy — это REST API, поверх которого построены два приложения: - **Панель управления** — где владельцы и сотрудники организации управляют бизнесом - **Клиентское приложение** — где клиенты находят бизнесы и записываются на приём Оба приложения используют один и тот же публичный API, описанный в этой документации, — всё, что умеют они, может делать и ваша собственная интеграция. API полностью задокументирован спецификацией OpenAPI — все эндпоинты смотрите в [API Reference](https://docs.bronjoy.com/api-reference). ## Дальнейшие шаги - [Быстрый старт](https://docs.bronjoy.com/ru/getting-started/quickstart) — сделайте первый авторизованный запрос к API - [Аутентификация](https://docs.bronjoy.com/ru/getting-started/authentication) — токены API и сценарии авторизации - [Настройка организации](https://docs.bronjoy.com/ru/guides/organization-setup) — полный чек-лист для новых владельцев - [Процесс записи](https://docs.bronjoy.com/ru/guides/booking-flow) — как устроена запись клиента - [Интеграция MCP](https://docs.bronjoy.com/ru/integrations/mcp) — подключение AI-клиентов к организации - [API Reference](https://docs.bronjoy.com/api-reference) — все доступные эндпоинты # Быстрый старт ## Базовый URL Все примеры в этой документации используют: ```text https://api.bronjoy.com/api ``` ## 1. Создайте аккаунт Если у вас ещё нет бизнес-аккаунта Bronjoy, зарегистрируйте его: ```bash POST https://api.bronjoy.com/api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` Подтвердите код, который придёт на почту, — в ответе вы получите Bearer-токен. Подробности в разделе [Аутентификация](https://docs.bronjoy.com/ru/getting-started/authentication). ## 2. Создайте организацию Пользователь может владеть одной или несколькими организациями либо состоять в них. Создайте организацию: ```bash POST https://api.bronjoy.com/api/org/organizations Authorization: Bearer your-token Content-Type: application/json ``` ```json { "business_name": "Downtown Barbershop", "slug": "downtown-barbershop" } ``` `slug` — это адрес вашей страницы записи (`bronjoy.com/downtown-barbershop`), выберите что-то короткое и уникальное. В ответе будет `id` организации — он понадобится для каждого запроса ниже. ## 3. Задайте контекст организации Каждому запросу к `/api/org/...` нужно знать, с какой организацией вы работаете. Передавайте её в заголовке каждого запроса: ```bash X-Organization-ID: 1 ``` ## 4. Сделайте первый запрос Проверьте чек-лист настройки: ```bash GET https://api.bronjoy.com/api/org/setup-status Authorization: Bearer your-token X-Organization-ID: 1 ``` Или получите список услуг (он будет пустым, пока вы не создадите первую, — см. [Настройка организации](https://docs.bronjoy.com/ru/guides/organization-setup)): ```bash GET https://api.bronjoy.com/api/org/services Authorization: Bearer your-token X-Organization-ID: 1 ``` ## Дальнейшие шаги - [Аутентификация](https://docs.bronjoy.com/ru/getting-started/authentication) — полные сценарии авторизации для сотрудников и клиентов, а также выпуск токенов API с ограниченными правами - [Настройка организации](https://docs.bronjoy.com/ru/guides/organization-setup) — полный чек-лист настройки, чтобы бизнес начал принимать записи - [Процесс записи](https://docs.bronjoy.com/ru/guides/booking-flow) — как клиент записывается от начала до конца - [Интеграция MCP](https://docs.bronjoy.com/ru/integrations/mcp) — подключение AI-клиента к вашей организации - [API Reference](https://docs.bronjoy.com/api-reference) — все эндпоинты, форматы запросов и ответов # Аутентификация ## Обзор Bronjoy использует **Laravel Sanctum** для аутентификации API. Все защищённые эндпоинты требуют Bearer-токен в заголовке `Authorization`. ```bash Authorization: Bearer your-token-here ``` > Каждому примеру с `/api/org/...` в этой документации также нужен заголовок `X-Organization-ID`, описанный ниже, — для краткости он опущен в отдельных фрагментах. ## Типы пользователей В Bronjoy есть два разных типа пользователей с отдельными сценариями аутентификации: | Тип | Кто это | Префикс маршрута авторизации | | ---------- | -------------------------------------- | ---------------------------- | | **Staff** | Владельцы организации и сотрудники | `/api/org/auth/...` | | **Client** | Конечные клиенты, которые записываются | `/api/client/auth/...` | ## Аутентификация сотрудников ### Регистрация ```bash POST /api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` На указанную почту отправляется код подтверждения. Подтвердите его: ```bash POST /api/org/auth/verify Content-Type: application/json ``` ```json { "email": "jane@example.com", "code": "123456" } ``` В ответе приходит Bearer-токен: ```json { "token": "1|abc123...", "user": { "id": 1, "name": "Jane Smith", "email": "jane@example.com" } } ``` ### Вход ```bash POST /api/org/auth/login Content-Type: application/json ``` ```json { "email": "jane@example.com", "password": "secret" } ``` ### Выход ```bash POST /api/auth/logout Authorization: Bearer your-token-here ``` Это отзывает текущий токен. ## Аутентификация клиентов Клиенты авторизуются по одноразовому коду (OTP) на телефон или email — без паролей. ### Телефон (OTP) ```bash POST /api/client/auth/phone/request Content-Type: application/json ``` ```json { "phone": "+998901234567" } ``` ```bash POST /api/client/auth/phone/verify Content-Type: application/json ``` ```json { "phone": "+998901234567", "code": "1234" } ``` ### Email (OTP) ```bash POST /api/client/auth/email/request Content-Type: application/json ``` ```json { "email": "client@example.com" } ``` ```bash POST /api/client/auth/email/verify Content-Type: application/json ``` ```json { "email": "client@example.com", "code": "123456" } ``` Оба сценария возвращают в ответе поле `token`. ## Контекст организации Большинству эндпоинтов `/api/org/...` нужен контекст организации, так как аккаунт сотрудника может принадлежать сразу нескольким организациям. Передавайте ID организации в заголовке каждого запроса: ```bash X-Organization-ID: 1 ``` Запросы к `/api/org/...` без этого заголовка возвращают `400 Bad Request`. Запросы к организации, к которой у вас нет доступа, возвращают `403 Forbidden`. ## Персональные токены API Вы можете выпускать именованные токены API с ограниченными правами для программного доступа — это удобно для скриптов, интеграций и MCP-клиентов. ### Создание токена ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "My Integration", "expires_in_days": 90 } ``` Ответ: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Токены показываются только один раз. Храните их надёжно — получить их повторно нельзя. Созданный токен привязан к конкретной организации через право `mcp:organization:{id}` и по умолчанию истекает через 90 дней (максимум — 365 дней). ## Получение текущего пользователя ```bash GET /api/auth/me Authorization: Bearer your-token-here ``` Возвращает профиль авторизованного пользователя. # Процесс записи ## Обзор Процесс записи в Bronjoy состоит из нескольких шагов: клиент выбирает услугу, выбирает сотрудника и слот времени, указывает свои данные, при необходимости оплачивает и получает подтверждение. ## Шаг 1. Выбор услуги Клиент просматривает доступные услуги на публичной странице записи организации. ```bash GET /api/booking/{slug}/services ``` У каждой услуги есть название, длительность, цена и список сотрудников, которые могут её оказать. Аутентификация не требуется — это эндпоинт публичной страницы записи. ## Шаг 2. Проверка доступности После выбора услуги запросите доступные слоты времени на нужную дату. ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-03-25 ``` Или сразу весь диапазон дат: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-03-25&end_date=2026-03-31 ``` Калькулятор слотов учитывает: - Рабочие часы и перерывы сотрудника - Существующие записи - Длительность услуги и буферное время - Лимиты предварительной записи организации Возвращает массив доступных слотов времени с назначенным сотрудником. ## Шаг 3. Создание записи Отправьте запись с выбранным слотом. Это работает и для гостей, и для авторизованных клиентов — Bronjoy определяет клиента по токену авторизации, если он передан, либо по контактным данным в теле запроса, если токена нет. ```bash POST /api/client/booking/{slug} Content-Type: application/json ``` ```json { "service_id": 1, "staff_id": 3, "start_time": "2026-03-25T10:00:00Z", "notes": "First visit", "name": "Maria Garcia", "phone": "+998901234567" } ``` Для гостевых записей обязательны `name` и `phone` либо `email`; они игнорируются, если запрос содержит Bearer-токен клиента. Запись создаётся в статусе `Pending`. ## Шаг 4. Оплата (если требуется) Если организация требует оплату, автоматически создаётся Stripe Checkout Session. Клиент перенаправляется в Stripe для завершения платежа. ```bash POST /api/client/payments/appointments/{appointment}/pay Authorization: Bearer client-token ``` После успешной оплаты запись переходит в статус `Confirmed`. Полный процесс описан в разделе [Платежи](https://docs.bronjoy.com/ru/guides/payments). ## Шаг 5. Подтверждение Клиент получает подтверждение с деталями записи. Уведомления отправляются через: - Уведомление в базе данных (видно в приложении) - Telegram (если клиент подключил свой аккаунт) ## Схема статусов ```text Pending → Confirmed → Completed ↓ ↓ Cancelled Cancelled ↓ NoShow ``` - **Pending** — ожидает подтверждения или оплаты - **Confirmed** — оплата получена или подтверждено сотрудником вручную - **Completed** — услуга оказана - **Cancelled** — отменено клиентом или сотрудником - **NoShow** — клиент не пришёл # Настройка организации ## Обзор После регистрации и создания организации нужно пройти чек-лист настройки, прежде чем клиенты смогут записываться. Это руководство проведёт вас по каждому шагу в рекомендуемом порядке. Проверить текущий статус настройки можно в любой момент: ```bash GET /api/org/setup-status Authorization: Bearer your-token ``` ## Шаг 1. Профиль организации Профиль — это публичная страница, которую видят клиенты, когда находят ваш бизнес. Заполните её полностью — это напрямую влияет на доверие и конверсию. ```bash GET /api/org/organization-profile PUT /api/org/organization-profile ``` **Рекомендуемые поля для заполнения:** | Поле | Почему это важно | | --------------- | ------------------------------------------------------------------- | | `name` | Отображается везде — используйте реальное название бизнеса | | `description` | Расскажите клиентам, чем вы занимаетесь. Оптимально 2–4 предложения | | `category` | Помогает клиентам найти вас в поиске | | `address` | Обязательно, если у вас есть физическая точка | | `phone` | Клиенты хотят позвонить перед записью | | `website` | Повышает доверие | | `logo` | Показывается в результатах поиска и на странице записи | | `cover_image` | Первое впечатление на странице профиля | | `working_hours` | Показывается в профиле, чтобы клиенты знали часы работы | **Советы:** - Пишите описание с упором на пользу для клиента, а не просто перечисляйте услуги - Используйте качественный квадратный логотип (минимум 200×200 px) - Заполните все ссылки на соцсети, которыми вы действительно пользуетесь ### Публикация профиля Профиль изначально находится в статусе **черновика** — он не виден публично. Когда всё готово: ```bash POST /api/org/organization-profile/toggle-publish Authorization: Bearer your-token ``` ## Шаг 2. Локации Если у вас одна или несколько физических точек, создайте их как локации. ```bash POST /api/org/branches Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Main Branch", "address": "123 Main St, Tashkent", "phone": "+998901234567" } ``` Даже если точка всего одна, создайте её — записи привязываются к локациям. ## Шаг 3. Услуги Услуги — это то, на что записываются клиенты. Создайте хотя бы одну услугу для начала. ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Haircut", "description": "Classic haircut with styling", "duration": 60, "price": 50000, "category_id": 1, "buffer_time": 10 } ``` **Ключевые поля:** | Поле | Описание | | ------------------ | ------------------------------------------------------------- | | `duration` | Длительность услуги в минутах | | `price` | Цена в минимальных единицах валюты (например, в тийинах) | | `buffer_time` | Промежуток после записи (время на уборку) | | `prepay_required` | Требуется ли оплата при записи | | `prepay_amount` | Фиксированная сумма депозита, если предоплата обязательна | | `max_advance_days` | За сколько дней вперёд клиенты могут записаться на эту услугу | **Советы:** - Задавайте `buffer_time` реалистично — он не даёт записям идти вплотную друг за другом - Группируйте связанные услуги в одну категорию - Если у разных сотрудников услуга занимает разное время, создайте отдельные варианты ## Шаг 4. Сотрудники Добавьте свою команду. У каждого сотрудника своё расписание, и его можно назначить на конкретные услуги. Полное руководство — в разделе [Управление сотрудниками](https://docs.bronjoy.com/ru/guides/staff-management). ## Шаг 5. Расписание и доступность Каждому сотруднику нужно рабочее расписание, иначе слоты не появятся. Пока расписание не задано, слоты не генерируются. Полное руководство — в разделе [Услуги и расписание](https://docs.bronjoy.com/ru/guides/services-scheduling). ## Шаг 6. Настройки Настройте поведение на уровне организации: ```bash GET /api/org/settings PUT /api/org/settings ``` **Важные настройки:** | Настройка | Описание | Рекомендация | | -------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- | | `booking_lead_time` | Минимум часов до слота, за которые его ещё можно забронировать | Поставьте 1–2 часа, чтобы избежать сюрпризов в последний момент | | `max_advance_booking_days` | За сколько дней вперёд клиенты могут записаться | Стандарт — 30–60 дней | | `appointment_auto_confirm` | Автоподтверждение новых записей | Включите, если ручное подтверждение не нужно | | `allow_guest_booking` | Разрешить запись без аккаунта клиента | Включите, чтобы снизить барьер | | `slot_interval` | Минуты между началами слотов | Подберите под длительность ваших услуг | | `cancellation_hours` | За сколько часов до записи клиент может отменить | Обычно 24–48 часов | ## Шаг 7. Настройки платежей (опционально) Если вы хотите принимать оплату при записи, включите её и задайте политику депозита и возвратов — собственный аккаунт Stripe вам не нужен. Инструкции по настройке — в разделе [Stripe](https://docs.bronjoy.com/ru/integrations/stripe). ## Шаг 8. Настройки уведомлений Настройте, какие уведомления отправляются клиентам и сотрудникам: ```bash GET /api/org/notification-settings PUT /api/org/notification-settings ``` **Рекомендуемые уведомления для включения:** - Подтверждение записи (клиенту) - Напоминание о записи (клиенту) — обычно за 24 часа и за 1 час - Уведомление о новой записи (сотруднику) - Уведомление об отмене (обоим) ## Код приглашения Поделитесь кодом приглашения организации с сотрудниками, чтобы они могли присоединиться к вашему рабочему пространству: ```bash POST /api/org/invite-code/generate Authorization: Bearer your-token ``` Сотрудники используют этот код при регистрации или при входе с уже существующего аккаунта. ## Панель управления После настройки следите за бизнесом через панель управления: ```bash GET /api/org/dashboard Authorization: Bearer your-token ``` Возвращает метрики по сегодняшним записям, предстоящим бронированиям, выручке и последней активности. # Управление сотрудниками ## Обзор Сотрудники — это люди в вашей организации, которые оказывают услуги клиентам. У каждого сотрудника: - Своё расписание и доступность - Возможность назначения на конкретные услуги - Роль (владелец или сотрудник) - Своя публичная страница профиля на сайте записи ## Приглашение сотрудников ### Сгенерировать код приглашения ```bash POST /api/org/invite-code/generate Authorization: Bearer your-owner-token ``` Отправьте полученный код человеку, которого приглашаете. Он использует его, чтобы присоединиться к вашей организации. ### Приглашение по email Можно также пригласить напрямую по email: ```bash POST /api/org/auth/invite Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "email": "newstaff@example.com" } ``` ### Присоединение по коду приглашения Приглашённый регистрируется или входит в аккаунт, затем отправляет запрос на присоединение: ```bash POST /api/org/join-requests Authorization: Bearer their-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` Как владелец, вы одобряете или отклоняете ожидающие запросы: ```bash GET /api/org/join-requests # список ожидающих запросов POST /api/org/join-requests/{joinRequest}/approve # одобрить POST /api/org/join-requests/{joinRequest}/reject # отклонить ``` ## Управление сотрудниками ### Список сотрудников ```bash GET /api/org/staff Authorization: Bearer your-token ``` ### Создать сотрудника напрямую (только владелец) Если вы хотите создать аккаунт сотрудника без процесса приглашения: ```bash POST /api/org/staff Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "email": "alex@example.com", "phone": "+998901234567", "role": "staff", "bio": "Experienced barber with 5 years of experience", "position": "Senior Stylist" } ``` ### Обновить данные сотрудника ```bash PUT /api/org/staff/{staff} Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "position": "Lead Stylist", "bio": "Updated bio" } ``` ### Активация и деактивация Деактивация убирает сотрудника из процесса записи — клиенты не могут записаться к нему, но существующие записи сохраняются. ```bash POST /api/org/staff/{staff}/activate POST /api/org/staff/{staff}/deactivate ``` **Когда деактивировать:** когда сотрудник уходит в отпуск или увольняется. Не удаляйте — деактивируйте, чтобы сохранить историю записей. ## Роли сотрудников | Роль | Возможности | | ------- | ---------------------------------------------------------------------------------------------------------- | | `owner` | Полный доступ: управление сотрудниками, настройками, биллингом, платёжными реквизитами, кодами приглашений | | `staff` | Управление записями и собственной доступностью; большинство настроек организации только для просмотра | Роли задаются для каждой организации отдельно — один и тот же человек может быть владельцем в одной организации и сотрудником в другой. ## Назначение услуг сотрудникам Каждого сотрудника нужно назначить на услуги, которые он может оказывать. Без назначения он не появится в процессе записи на эту услугу. ```bash # Посмотреть текущие назначения услуг GET /api/org/staff/{staff}/services # Назначить услуги (заменяет существующие назначения) POST /api/org/staff/{staff}/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "service_ids": [1, 2, 3] } ``` Либо назначьте сотрудников со стороны услуги: ```bash POST /api/org/services/{service}/staff Content-Type: application/json ``` ```json { "staff_ids": [1, 2] } ``` **Совет:** добавив новую услугу, сразу назначьте её нужным сотрудникам — иначе она не будет доступна для записи. ## Доступность сотрудников Каждому сотруднику нужно расписание, чтобы генерировались слоты. Управляйте расписаниями через соответствующие эндпоинты (см. [Услуги и расписание](https://docs.bronjoy.com/ru/guides/services-scheduling)). Рассчитанную доступность сотрудника можно посмотреть так: ```bash GET /api/org/staff/{staff}/availability ``` ## Профили сотрудников У каждого сотрудника есть публичная страница профиля, видимая клиентам. Попросите сотрудников заполнить: - **Фото** — критично для доверия - **Био** — кратко описать экспертизу и опыт - **Должность** — роль или позиция в бизнесе Клиенты могут фильтровать по сотруднику при записи, поэтому заполненный профиль увеличивает число записей. ## Массовые операции Обновить или удалить сразу нескольких сотрудников: ```bash POST /api/org/staff/batch-update Content-Type: application/json ``` ```json { "ids": [2, 3], "data": { "is_active": false } } ``` ```bash POST /api/org/staff/batch-destroy Content-Type: application/json ``` ```json { "ids": [4, 5] } ``` > Используйте batch-destroy с осторожностью — это необратимо. Если нужно сохранить историю, лучше деактивируйте. # Услуги и расписание ## Услуги Услуги — это то, на что можно записаться в вашей организации. У каждой услуги своя длительность, цена и список сотрудников, которые могут её оказать. ### Создание услуги ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Deep Tissue Massage", "description": "60-minute full-body deep tissue massage", "duration": 60, "price": 150000, "category_id": 2, "buffer_time": 15, "color": "#6366f1" } ``` **Справочник полей:** | Поле | Тип | Описание | | ------------------ | ------- | ----------------------------------------------------- | | `name` | string | Название услуги, которое видят клиенты | | `description` | string | Краткое описание (1–3 предложения) | | `duration` | integer | Длительность в минутах | | `price` | integer | Цена в минимальных единицах валюты | | `category_id` | integer | Категория для группировки (опционально) | | `buffer_time` | integer | Промежуток после записи в минутах (уборка, дорога) | | `color` | string | HEX-цвет для отображения в календаре | | `prepay_required` | boolean | Требовать оплату при записи | | `prepay_amount` | integer | Фиксированная сумма депозита (если prepay\_required) | | `max_advance_days` | integer | За сколько дней вперёд можно записаться на эту услугу | | `min_lead_hours` | integer | Минимум часов до записи | | `is_active` | boolean | Видна ли услуга и доступна ли для записи | ### Категории услуг Группируйте услуги по категориям, чтобы страница записи была лучше организована: ```bash GET /api/org/services/categories ``` Категории общие для всей организации и помогают клиентам ориентироваться в списке услуг. ### Советы по услугам - **Точность длительности** — занизите, и появятся накладки; завысите, и потеряете слоты. Засеките время сами. - **Буферное время** — всегда закладывайте буфер на подготовку кабинета, заметки или сборы. Даже 5–10 минут спасают от спешки. - **Цены** — указывайте ту цену, которую заплатит клиент. Если работаете с депозитами, задайте `prepay_amount` равным депозиту и `prepay_required: true`. - **Цвета** — назначьте разные цвета категориям услуг — календарь сотрудников станет намного читаемее. ## Расписания Расписание определяет, когда сотрудник может принимать записи. Пока расписание не задано, слоты для этого сотрудника не генерируются. ### Создание записи расписания ```bash POST /api/org/schedule Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" } ``` `day_of_week`: `0` = воскресенье, `1` = понедельник, ..., `6` = суббота. ### Просмотр расписания ```bash GET /api/org/schedule?staff_id=1 ``` ### Обновление записи расписания ```bash PUT /api/org/schedule/{id} Content-Type: application/json ``` ```json { "start_time": "10:00", "end_time": "19:00" } ``` ### Удаление записи расписания ```bash DELETE /api/org/schedule/{id} ``` ### Пример на всю неделю Типичное расписание с понедельника по пятницу, с 9 до 18, для сотрудника №1: ```json [ { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 2, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 3, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 4, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 5, "start_time": "09:00", "end_time": "18:00" } ] ``` ## Исключения доступности Исключения переопределяют обычное расписание на конкретные даты — удобно для праздников, выходных или особых часов работы. ### Создание исключения ```bash POST /api/org/availability/exceptions Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "date": "2026-05-01", "is_day_off": true, "reason": "National holiday" } ``` Для неполного дня (другие часы): ```json { "staff_id": 1, "date": "2026-12-31", "is_day_off": false, "start_time": "09:00", "end_time": "14:00", "reason": "New Year's Eve — half day" } ``` ### Список исключений ```bash GET /api/org/availability/exceptions?staff_id=1 ``` **Советы:** - В начале года создайте исключения сразу на все известные праздники - Если сотрудник заболел, создайте исключение на этот же день с `is_day_off: true` — существующие записи сохраняются, их можно перенести - Исключения имеют приоритет над обычным расписанием на свою дату ## Как рассчитываются слоты Калькулятор слотов учитывает: 1. **Расписание сотрудника** — когда он работает (день, время начала и окончания) 2. **Исключения доступности** — переопределения для конкретных дат 3. **Существующие записи** — занятые слоты блокируются 4. **Длительность услуги** — длина слота соответствует услуге 5. **Буферное время** — добавляется после каждой записи 6. **Настройки организации** — лимиты предварительной записи, интервал слотов, минимальный запас времени Слоты возвращаются с полями `start_time`, `end_time` и `staff_id` доступного сотрудника. ### Проверка доступных слотов Клиенты (и вы, через API) могут проверить слоты: ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-04-01 ``` Или для диапазона: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-04-01&end_date=2026-04-07 ``` ## Просмотр календаря Календарь организации показывает все записи по всем сотрудникам: ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Возвращает записи, сгруппированные по датам, — удобно для отрисовки месячного или недельного календаря. # Работа с записями ## Обзор Записи — основа Bronjoy. Это руководство описывает перспективу сотрудника и владельца: создание, просмотр, обновление и управление записями на протяжении всего их жизненного цикла. Клиентская часть процесса описана в разделе [Процесс записи](https://docs.bronjoy.com/ru/guides/booking-flow). ## Схема статусов записи ```text Draft → Pending → Confirmed → Completed ↓ ↓ Cancelled NoShow ``` | Статус | Значение | | ----------- | ---------------------------------------------------- | | `Pending` | Создана, ожидает подтверждения или оплаты | | `Confirmed` | Оплата получена или подтверждено сотрудником вручную | | `Completed` | Услуга оказана — устанавливается сотрудником вручную | | `Cancelled` | Отменено клиентом или сотрудником | | `NoShow` | Клиент не пришёл | ## Создание записей (сотрудником) Сотрудники могут создавать записи от имени клиентов: ```bash POST /api/org/appointments Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "branch_id": 1, "start_time": "2026-04-01T10:00:00Z", "notes": "Regular client, prefers extra pressure" } ``` **Советы:** - Всегда заполняйте `notes` для клиентов с особыми пожеланиями или медицинскими показаниями - Если клиента ещё нет в базе, сначала создайте его через `POST /api/org/clients` - Записи, созданные сотрудником, по умолчанию сразу имеют статус `Confirmed` (минуя оплату) ## Список записей ### Все записи ```bash GET /api/org/appointments Authorization: Bearer your-token ``` Фильтрация по диапазону дат, статусу или сотруднику: ```bash GET /api/org/appointments?start_date=2026-04-01&end_date=2026-04-30&status=Confirmed&staff_id=3 ``` ### Записи в ожидании Посмотреть записи, требующие действия (подтверждение, оплата): ```bash GET /api/org/appointments/pending ``` Регулярно просматривайте этот список — зависшие записи в ожидании могут означать проблемы с оплатой или забытые подтверждения. ### Вид календаря ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Возвращает структуру, удобную для отрисовки календаря. Используйте этот эндпоинт для календаря в своей панели управления. ## Обновление записи ```bash PUT /api/org/appointments/{appointment} Content-Type: application/json ``` ```json { "notes": "Updated preference: light pressure only", "staff_id": 4 } ``` Большинство полей записи можно менять, пока она не завершена и не отменена. ## Переходы между статусами ### Подтвердить запись Вручную подтвердите запись в ожидании (например, оплата получена офлайн): ```bash POST /api/org/appointments/{appointment}/submit ``` ### Отмена ```bash POST /api/org/appointments/{appointment}/cancel Content-Type: application/json ``` ```json { "reason": "Staff unavailable due to illness" } ``` При отмене клиент получает уведомление. Если оплата была получена, возврат нужно инициировать отдельно (см. [Платежи](https://docs.bronjoy.com/ru/guides/payments)). ### Перенос ```bash POST /api/org/appointments/{appointment}/reschedule Content-Type: application/json ``` ```json { "start_time": "2026-04-02T11:00:00Z", "staff_id": 3 } ``` Клиент получает уведомление о новом времени. ## Массовые операции Эффективное управление сразу несколькими записями: ### Массовое обновление ```bash POST /api/org/appointments/batch-update Content-Type: application/json ``` ```json { "ids": [101, 102, 103], "data": { "status": "Completed" } } ``` Удобно, чтобы отметить записи за день как завершённые. ### Массовое удаление ```bash POST /api/org/appointments/batch-destroy Content-Type: application/json ``` ```json { "ids": [104, 105] } ``` > Лучше отменять, чем удалять. Удалённые записи не попадают в историю и отчёты. ## Заметки о клиенте Прикрепляйте внутренние заметки к профилю клиента — они видны сотрудникам, но не клиентам: ```bash POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Allergic to certain hair dyes. Always check before service." } ``` Заметки показываются при просмотре записи клиента и помогают сотрудникам подготовиться. ## Лучшие практики ### Ежедневный рабочий процесс 1. **Утро** — просмотрите записи на сегодня в календаре. Проверьте, нет ли записей в статусе `Pending`, которые нужно подтвердить. 2. **В течение дня** — отмечайте записи как `Completed` после оказания услуги. 3. **Конец дня** — массовым обновлением завершите все оставшиеся записи за день. ### Что делать с неявками Если клиент не пришёл, отметьте запись как `NoShow`, а не отменяйте. Так сохраняются данные о неявках и легче выявить закономерности. Записи с неявкой не считаются отменами и не запускают логику возврата средств. ### Защита от двойных записей Калькулятор слотов автоматически предотвращает двойное бронирование. Однако: - Если вы создаёте записи вручную, будьте внимательны с `start_time` — при ручном создании он не проверяется на пересечение с существующими записями - Всегда проверяйте календарь перед созданием записи вручную на конкретное время ### Отмены в последний момент Настройте `cancellation_hours` в настройках, чтобы задать, за сколько времени клиенты могут отменять записи. После этого окна клиент всё ещё может запросить отмену, но обработать её сотруднику придётся вручную. ## Отчёты и аналитика ```bash GET /api/org/dashboard ``` Панель управления возвращает ключевые метрики, в том числе: - Количество записей на сегодня - Предстоящие записи на этой неделе - Сводку по выручке - Последние отмены и неявки Для детальных отчётов по транзакциям: ```bash GET /api/org/transactions GET /api/org/transactions/summary GET /api/org/transactions/export ``` # Управление клиентами ## Обзор Клиенты — это конечные покупатели, которые записываются на услуги. Bronjoy ведёт базу клиентов отдельно для каждой организации: один и тот же человек может быть клиентом нескольких организаций с разными профилями. ## Создание клиентов Клиенты создаются автоматически при первой записи. Также их можно создать вручную: ```bash POST /api/org/clients Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Maria Garcia", "phone": "+998901234567", "email": "maria@example.com", "notes": "New client, referred by Alex" } ``` ## Список клиентов ```bash GET /api/org/clients Authorization: Bearer your-token ``` Поиск и фильтрация: ```bash GET /api/org/clients?search=maria&sort=last_appointment_at&direction=desc ``` ## Профиль клиента ```bash GET /api/org/clients/{client} ``` Профиль клиента включает: - Контактную информацию - Статистику записей (всего, завершённых, отменённых, неявок) - Дату последней записи - Заметки ## История записей Посмотреть всю историю записей клиента в вашей организации: ```bash GET /api/org/clients/{client}/history ``` Это пригодится, когда: - Клиент звонит и спрашивает о прошлой записи - Вы проверяете, как часто клиент отменяет записи или не приходит - Вы хотите понять предпочтения клиента ## Заметки о клиенте Внутренние заметки видны только сотрудникам — клиенты их никогда не видят. Используйте заметки, чтобы фиксировать: - Предпочтения и особенности («предпочитает утренние записи») - Медицинские нюансы («аллергия на латекс») - Особенности общения («всегда звонить, на сообщения не отвечает») ```bash # Add a note POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Prefers stylist Alex. Very particular about fringe length." } ``` ```bash # View notes GET /api/org/clients/{client}/notes ``` ## Обновление клиента ```bash PUT /api/org/clients/{client} Content-Type: application/json ``` ```json { "phone": "+998909876543", "email": "maria.garcia@example.com" } ``` ## Массовые операции ```bash POST /api/org/clients/batch-update Content-Type: application/json ``` ```json { "ids": [10, 11, 12], "data": { "is_vip": true } } ``` ## Отзывы Клиенты оставляют отзыв после завершённой записи: ```bash GET /api/client/reviews/reviewable Authorization: Bearer client-token ``` ```bash POST /api/client/reviews Authorization: Bearer client-token Content-Type: application/json ``` ```json { "appointment_id": 101, "rating": 5, "comment": "Great service, will book again!" } ``` Просмотр отзывов клиентов и ответы на них (со стороны сотрудников): ```bash GET /api/org/reviews GET /api/org/reviews/stats GET /api/org/reviews/trend ``` Ответить на отзыв: ```bash POST /api/org/reviews/{review}/reply Content-Type: application/json ``` ```json { "reply": "Thank you for your feedback! We're so glad you enjoyed the experience." } ``` **Советы:** - Отвечайте на все отзывы, особенно на негативные — это показывает профессионализм - Пишите коротко и по-человечески - Не спорьте с негативными отзывами; признайте проблему и предложите решение вне публичного поля ## Рекомендации - **Никогда не удаляйте клиентов** — при необходимости деактивируйте их. Удаление стирает историю записей. - **Поддерживайте заметки в актуальном состоянии** — устаревшие заметки вводят в заблуждение. Если что-то изменилось, обновите заметку. - **Объединяйте дубликаты вручную** — если клиент записывается с разными контактными данными, могут появиться дубликаты. Найдите их по имени и объедините через эндпоинт обновления. - **Просматривайте список неявок** — клиентов, которые регулярно не приходят, можно помечать. Для таких клиентов стоит требовать предоплату. # Платежи ## Обзор Bronjoy позволяет принимать оплату в момент записи клиента — платежи обрабатываются через Stripe Checkout: клиент переходит на платёжную страницу Stripe, а всё остальное Bronjoy делает автоматически через вебхуки. Собственный аккаунт Stripe вам не нужен — достаточно включить платежи и задать свою политику. Как это включить, описано в разделе [Интеграция Stripe](https://docs.bronjoy.com/ru/integrations/stripe). ## Настройки платежей Каждая организация задаёт собственную политику оплаты: обязательна ли оплата, депозит или полная сумма, правила возврата и напоминания. ### Посмотреть текущие настройки ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ### Обновить политику ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` Полное описание полей смотрите в разделе [Интеграция Stripe](https://docs.bronjoy.com/ru/integrations/stripe). ### Включить или выключить платежи ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## Как работают платежи ### В момент записи Когда клиент записывается на услугу, требующую оплаты: 1. Клиент выбирает услугу и слот 2. Клиент отправляет запись 3. Bronjoy создаёт запись в статусе `Pending` 4. Создаётся Stripe Checkout Session 5. Клиент перенаправляется в Stripe для оплаты 6. После оплаты Stripe отправляет вебхук 7. Bronjoy подтверждает запись и сохраняет транзакцию ### Типы оплаты | Тип | Как это работает | | ----------------- | ------------------------------------------------------------------- | | **Полная оплата** | Клиент оплачивает полную стоимость услуги при записи | | **Депозит** | Клиент вносит фиксированный депозит; остаток оплачивается на приёме | Настраивается для каждой услуги: - `prepay_required: true` — включает оплату при записи - `prepay_amount: 50000` — сумма депозита (не указывайте для полной оплаты) ### Статусы платежа | Статус | Значение | | ----------- | ---------------------------------------------- | | `Pending` | Платёж инициирован, ожидается действие клиента | | `Completed` | Платёж получен | | `Cancelled` | Сессия оплаты истекла или платёж не прошёл | | `Refunded` | Платёж возвращён сотрудником | ## Управление транзакциями ### Просмотр транзакций ```bash GET /api/org/transactions Authorization: Bearer your-owner-token ``` Фильтрация по дате, статусу или услуге: ```bash GET /api/org/transactions?start_date=2026-03-01&end_date=2026-03-31&status=completed ``` ### Сводка по транзакциям ```bash GET /api/org/transactions/summary ``` Возвращает суммы по завершённым, возвращённым и ожидающим транзакциям за указанный период. ### Экспорт данных ```bash GET /api/org/transactions/export?start_date=2026-03-01&end_date=2026-03-31 ``` ## Возвраты Оформить возврат по завершённой транзакции: ```bash POST /api/org/payments/{transaction}/refund Authorization: Bearer your-owner-token ``` Возврат обрабатывается через Stripe. Статус транзакции меняется на `Refunded`, а клиент получает уведомление. ### Когда возвращать деньги - **Клиент отменил запись в рамках политики** — если срок отмены ещё не истёк, верните полную сумму - **Услуга не оказана** — верните деньги сами, не дожидаясь просьбы: это сохраняет доверие - **Частичное недовольство** — рассмотрите частичный возврат (оформляется напрямую в Stripe Dashboard) ## Платежи со стороны клиента Клиенты работают с платежами через эти эндпоинты: ```bash # Check if payment is required GET /api/client/payments/appointments/{appointment}/requirement # Initiate payment POST /api/client/payments/appointments/{appointment}/pay # View payment history GET /api/client/payments/appointments/{appointment}/transactions # Check transaction status GET /api/client/payments/transactions/{transaction} ``` ## Рекомендации - **Сначала протестируйте в тестовом режиме Stripe** — используйте ключи `pk_test_` / `sk_test_`, пока не убедитесь, что всё работает - **Задавайте разумный размер депозита** — слишком большой отпугивает клиентов, слишком маленький не защищает от неявок. Обычно это 20–50% стоимости услуги - **Включайте оплату только для услуг с частыми неявками** — предоплата нужна не всем услугам. Включайте её выборочно там, где неявки стоят вам времени и денег - **Просматривайте транзакции раз в неделю** — так вы вовремя заметите неудавшиеся платежи и истёкшие сессии - **Оформляйте возвраты быстро** — задержки приводят к чарджбэкам и подрывают доверие - **Не настраивайте Click.uz и Payme.uz** — эти платёжные провайдеры приостановлены до завершения регистрации юридического лица # Лист ожидания ## Обзор Когда все слоты по услуге заняты, клиенты могут встать в лист ожидания. Если запись отменяется, слот предлагается следующему в очереди. Очередью, предложениями и сроками их действия Bronjoy управляет автоматически. ## Как это работает ```text Client joins waitlist ↓ [Waiting] ← position in queue ↓ Slot opens (cancellation) ↓ [Offered] ← time-limited offer ↙ ↘ [Booked] [Expired/Declined] ↓ Next person offered ``` ### Статусы | Статус | Значение | | ----------- | ------------------------------------------------------------------- | | `Waiting` | В очереди, ожидает слот | | `Offered` | Слот предложен — у клиента есть ограниченное время на подтверждение | | `Booked` | Предложение принято, запись создана | | `Expired` | Клиент не ответил до истечения срока предложения | | `Cancelled` | Запись в листе ожидания отменена клиентом или сотрудником | ## Работа сотрудника ### Просмотр листа ожидания ```bash GET /api/org/waitlist Authorization: Bearer your-token ``` Фильтрация по услуге, статусу или желаемой дате: ```bash GET /api/org/waitlist?service_id=1&status=Waiting&preferred_date_from=2026-04-01 ``` Поиск по имени, email или телефону клиента: ```bash GET /api/org/waitlist?search=maria ``` ### Добавить клиента в лист ожидания ```bash POST /api/org/waitlist Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "preferred_date": "2026-04-01", "preferred_time_slot": "morning", "notes": "Only available before noon" } ``` Варианты `preferred_time_slot`: `morning`, `afternoon`, `evening` ### Предложить слот вручную Когда вы знаете, что слот освобождается: ```bash POST /api/org/waitlist/{waitlistEntry}/offer Authorization: Bearer your-token Content-Type: application/json ``` ```json { "start_time": "2026-04-01T10:00:00Z" } ``` Запись переходит в статус `Offered`. Клиент получает уведомление и ограниченное время на подтверждение (по умолчанию: 2 часа). ### Отменить запись в листе ожидания ```bash POST /api/org/waitlist/{waitlistEntry}/cancel Authorization: Bearer your-token ``` ### Посмотреть сводку Получить количество записей по каждому статусу: ```bash GET /api/org/waitlist/summary ``` ## Работа клиента Клиенты взаимодействуют с листом ожидания через процесс записи: ### Встать в лист ожидания С публичной страницы записи (работает и для гостей, и для авторизованных клиентов — так же, как обычная запись): ```bash POST /api/client/booking/{slug}/waitlist Content-Type: application/json ``` ```json { "service_id": 1, "preferred_date": "2026-04-01", "preferred_time_slot": "afternoon", "name": "Maria Garcia", "phone": "+998901234567" } ``` ### Посмотреть свои записи в листе ожидания ```bash GET /api/client/waitlist Authorization: Bearer client-token ``` ### Принять предложение Когда слот предложен: ```bash POST /api/client/waitlist/{waitlistEntry}/accept Authorization: Bearer client-token ``` Создаётся запись на предложенное время. Запись в листе ожидания переходит в статус `Booked`. ### Отклонить предложение ```bash POST /api/client/waitlist/{waitlistEntry}/decline Authorization: Bearer client-token ``` Слот предлагается следующему в очереди. ### Выйти из очереди ```bash POST /api/client/waitlist/{waitlistEntry}/cancel Authorization: Bearer client-token ``` ### Узнать длину очереди (публичный доступ) Аутентификация не нужна — можно показывать на странице записи: ```bash GET /api/booking/{slug}/waitlist/count?service_id=1&date=2026-04-01 ``` ## Автоматическое продвижение очереди Если функция включена, Bronjoy автоматически предлагает освободившийся слот следующему в очереди при отмене записи. Включается в настройках организации: | Настройка | Описание | По умолчанию | | --------------------------------- | ----------------------------------------- | ------------ | | `waitlist_auto_promote` | Автоматически предлагать слоты при отмене | `false` | | `waitlist_promotion_window_hours` | Через сколько часов истекает предложение | `2` | Когда автопродвижение включено: 1. Запись отменяется 2. Bronjoy находит следующую запись в статусе `Waiting` для этой услуги и даты 3. Слот предлагается автоматически 4. Если срок предложения истёк, слот предлагается следующему ## Рекомендации - **Включайте автопродвижение** для популярных услуг — освободившиеся слоты заполняются без участия сотрудников - **Задайте разумный срок предложения** — 2 часа подходят для записей в тот же день; для записей заранее увеличьте до 12–24 часов - **Следите за сводкой листа ожидания** — длинная очередь по услуге говорит о том, что нужно больше сотрудников или слотов - **Добавляйте заметки при предложении слота** — укажите конкретное предлагаемое время, чтобы клиент понимал суть предложения - **Используйте `preferred_time_of_day`** — это помогает подбирать клиентам слоты, которые они действительно примут, и снижает долю отказов # Реферальные программы ## Обзор В Bronjoy есть две независимые реферальные системы: | | Кто | Вознаграждение | | ------------------------------------- | -------------------------------- | --------------------------------------------- | | **Реферальная программа для бизнеса** | Одна организация приводит другую | Обе стороны получают бесплатные дни Avtopilot | | **Амбассадорская программа** | Любой человек приводит бизнесы | Денежная комиссия с того, что платит бизнес | ## Реферальная программа для бизнеса У каждой организации есть свой реферальный код, которым можно поделиться. Когда приведённый вами бизнес регистрируется и получает первую запись, вы оба получаете бесплатные дни [Avtopilot](https://docs.bronjoy.com/ru/for-owners/plans-and-billing). ### Получить реферальную ссылку ```bash GET /api/org/referrals/stats Authorization: Bearer your-token X-Organization-ID: 1 ``` ```json { "data": { "referral_code": "ABC12345", "referral_link": "https://bronjoy.com/onboarding/create?ref=ABC12345", "reward_days": 30, "total_referred": 3, "completed": 2 } } ``` Поделитесь ссылкой — все, кто создаст организацию по ней, автоматически закрепляются за вами. ### Отслеживать своих рефералов ```bash GET /api/org/referrals Authorization: Bearer your-token X-Organization-ID: 1 ``` Возвращает список приведённых вами организаций и их статус. ### Узнать, кто привёл вас ```bash GET /api/org/referrals/incoming ``` ### Получить новый код Если код попал туда, куда вы не хотели, сгенерируйте новый — старый перестанет работать: ```bash POST /api/org/referrals/regenerate-code Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Вознаграждение начисляется не при регистрации, а после того, как приведённая организация получит первую запись, — так награда достаётся за бизнесы, которые действительно начали работать. ## Амбассадорская программа Отдельно от этого любой человек — не только владельцы бизнеса — может стать амбассадором Bronjoy: приводить бизнесы к регистрации и получать периодическую комиссию с их платежей за тариф всё время, пока они остаются подписчиками. ```bash GET /api/client/referral Authorization: Bearer client-token ``` Возвращает ваш амбассадорский реферальный код, ссылку для распространения и сводку по заработку. Дальше: ```bash GET /api/client/referral/businesses # businesses you've referred GET /api/client/referral/commissions # your earnings ledger ``` Привязка способа выплаты и запрос выплаты поддерживаются в API (`POST /api/client/referral/payout-methods`, `POST /api/client/referral/payouts`) — если вы это настраиваете, сначала свяжитесь с поддержкой и уточните, открыты ли выплаты в вашем регионе. # Stripe ## Обзор Bronjoy обрабатывает карточные платежи через Stripe Checkout от вашего имени — вам не нужно создавать или подключать собственный аккаунт Stripe. Вы просто включаете платежи для своей организации и задаёте политику: требовать ли депозит или полную оплату, и как работают возвраты и напоминания. ## Включение платежей ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` | Поле | Описание | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | `provider` | `stripe` (Click, Payme и Uzum реализованы, но пока не открыты — см. [Платежи](https://docs.bronjoy.com/ru/guides/payments)) | | `is_enabled` | Включить или отключить приём платежей для этой организации | | `prepay_policy` | `none`, `partial` (депозит) или `full` | | `prepay_percentage` | Размер депозита в процентах от стоимости услуги, обязателен, когда `prepay_policy` равен `partial` | | `refund_on_cancellation` | Автоматически возвращать деньги при отмене оплаченной записи в пределах установленного окна | | `refund_deadline_hours` | За сколько часов до записи возвраты ещё выполняются автоматически | | `auto_remind_unpaid` | Отправлять напоминание о неоплаченных ожидающих записях | | `remind_after_minutes` | Задержка перед первым напоминанием о неоплаченной записи | Отключите приём платежей, не теряя настройки: ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## Переопределения на уровне услуги Поведение платежей можно задать и для каждой услуги отдельно — см. [Услуги и расписание](https://docs.bronjoy.com/ru/guides/services-scheduling) про параметры `prepay_required` и `prepay_amount` у отдельных услуг. ## Как это работает 1. Клиент записывается на услугу, требующую оплаты 2. Bronjoy создаёт запись в статусе `Pending` 3. Создаётся Stripe Checkout Session на нужную сумму 4. Клиент перенаправляется на страницу оплаты, размещённую у Stripe 5. Stripe уведомляет Bronjoy о завершении платежа 6. Bronjoy подтверждает запись и фиксирует транзакцию Подробности о событиях см. в разделе [Вебхуки](https://docs.bronjoy.com/ru/integrations/webhooks), а про повседневную работу с транзакциями и возвратами — в разделе [Платежи](https://docs.bronjoy.com/ru/guides/payments). # Интеграция MCP ## Обзор Bronjoy поддерживает [MCP (Model Context Protocol)](https://modelcontextprotocol.io/){rel=""nofollow""}, поэтому AI-ассистент — Claude, ChatGPT или любой другой, говорящий на MCP, — может найти заведение, ответить на вопросы о нём и записать клиента. Есть **два сервера** для двух разных аудиторий: | | [Сервер маркетплейса](https://docs.bronjoy.com/#%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%BF%D0%BB%D0%B5%D0%B9%D1%81%D0%B0) | [Сервер организации](https://docs.bronjoy.com/#%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8) | | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Для кого** | Для всех. Пользователи, разработчики, AI-ассистенты | Для ассистента одной организации | | **Охват** | Весь публичный каталог | Одна организация | | **Авторизация** | Не нужна | Bearer-токен | | **Адрес** | `https://api.bronjoy.com/api/mcp` | `https://api.bronjoy.com/api/mcp/organization/{id}` | | **Стоимость** | Бесплатно | Функция платного тарифа | Если вы хотите записаться на стрижку через своего ассистента — вам нужен сервер маркетплейса. Если вы бизнес и хотите, чтобы ваш собственный ассистент вёл ваш календарь — вам нужен сервер организации. --- ## Сервер маркетплейса Публичный каталог в виде MCP-сервера. Без аккаунта, без токена, без регистрации — он отдаёт ровно то, что сайт Bronjoy и так показывает любому браузеру, плюс тот же путь записи с подтверждением. ### Подключение ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy https://api.bronjoy.com/api/mcp ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp" } } } ``` ```txt [Любой MCP-клиент] Транспорт: Streamable HTTP Адрес: https://api.bronjoy.com/api/mcp Авторизация: не требуется ``` :: Это вся настройка. Попросите ассистента: *«найди барбершоп в Ташкенте»* — и он воспользуется инструментами ниже. ### Инструменты Шесть инструментов, в том порядке, в котором их использует разговор о записи. #### search-venues Поиск по каталогу: ключевое слово, город, категория. Все остальные инструменты принимают `slug`, который возвращает этот. | Параметр | Тип | Обяз. | Описание | | --------------- | ------- | ----- | --------------------------------------------------------------------------------------------------------------------- | | `query` | string | Нет | Свободный текст — название, услуга (`стрижка`, `haircut`) или ориентир. Работает и с латиницей, и с кириллицей | | `city` | string | Нет | Слаг или название города — `tashkent`, `samarkand`, `Бухара` | | `category` | string | Нет | Слаг категории — `barber`, `dental`, `car-wash` | | `bookable_only` | boolean | Нет | Возвращать только заведения с онлайн-записью. Указывайте, когда пользователь хочет *записаться*, а не узнать о местах | | `limit` | integer | Нет | 1–20, по умолчанию 5 | ```json { "venues": [ { "name": "Britva Barbershop", "slug": "demo-barber", "url": "https://bronjoy.com/tashkent/barber/demo-barber", "city": "Tashkent", "district": "Юнусабадский район", "address": "проспект Амира Темура, 15", "specialty": "Men's haircuts and beard care", "rating": 4.9, "reviews": 7, "is_bookable": true, "next_available": "Tomorrow 09:00", "price_from": 50000, "has_phone": true } ], "returned": 1, "total_matches": 1 } ``` #### get-venue Полный публичный профиль заведения: адрес, часы работы, услуги, удобства, способы оплаты, сайт, рейтинг. Телефон здесь возвращается **замаскированным**. | Параметр | Тип | Обяз. | Описание | | -------- | ------ | ----- | ------------------ | | `slug` | string | Да | Из `search-venues` | ```json { "name": "Britva Barbershop", "city": "Ташкент", "address": "проспект Амира Темура, 15", "is_bookable": true, "website": "https://britva.uz", "masked_phone": "+998 71 ***-**-70", "opening_hours": { "monday": { "open": "09:00", "close": "19:00" }, "saturday": { "open": "08:00", "close": "18:00" }, "sunday": { "open": null, "close": null } }, "service_tags": ["Haircuts", "Beard shaping", "Royal shave", "Styling"], "price_from": 50000, "price_to": 110000, "rating": "4.90", "reviews": 7, "booking": "Online booking is available — continue with check-availability." } ``` #### reveal-phone Настоящий номер телефона заведения. Намеренно вынесен из `get-venue` в отдельный вызов и ограничен **10 запросами в минуту** — запрашивайте его для заведения, которое пользователь действительно выбрал, а не пачкой по всем результатам поиска. | Параметр | Тип | Обяз. | Описание | | -------- | ------ | ----- | ------------------ | | `slug` | string | Да | Из `search-venues` | ```json { "name": "Britva Barbershop", "phone": "+998 71 200-70-70", "url": "https://bronjoy.com/tashkent/barber/demo-barber" } ``` #### check-availability Услуги, доступные для записи, и свободные слоты. Вызовите **без** `service_id`, чтобы получить список услуг с ценами, затем ещё раз **с** нужным `service_id`, чтобы получить его слоты. | Параметр | Тип | Обяз. | Описание | | ------------ | ------- | ----- | --------------------------------------------------------- | | `slug` | string | Да | Из `search-venues` | | `date` | string | Да | `YYYY-MM-DD`, сегодня или до 30 дней вперёд | | `service_id` | integer | Нет | Пропустите при первом вызове, чтобы получить список услуг | ```json { "date": "2026-09-10", "service": { "service_id": 1, "name": "Мужская стрижка", "duration_minutes": 30, "price": "80000.00", "currency": "UZS" }, "slots": [ { "start_time": "2026-09-10T09:00:00+05:00", "end_time": "2026-09-10T09:30:00+05:00", "staff_id": 1, "staff_name": "Азиз Рахимов" } ] } ``` `start_time` — ровно то значение, которое ожидает `book-appointment`. Не округляйте и не преобразуйте его. #### request-booking-code Отправляет 6-значный код на собственную почту или телефон пользователя. | Параметр | Тип | Обяз. | Описание | | -------- | ------ | ------------ | ------------------------------------- | | `slug` | string | Да | Заведение, куда идёт запись | | `email` | string | Одно из двух | Почта пользователя | | `phone` | string | Одно из двух | Телефон пользователя, `+998901234567` | ::warning **Ассистент никогда не получает код.** Код приходит на почту или телефон пользователя, и пользователь диктует его обратно. В этом и смысл: так подтверждается, что контакт принадлежит тому, кто записывается, и бизнес не получает записи с номеров, по которым никто не отвечает. :: Код действует **5 минут** и годится на одну запись. Отправки ограничены и по отправителю, и по получателю — не зацикливайтесь. #### book-appointment Создаёт запись. | Параметр | Тип | Обяз. | Описание | | ------------------- | ------- | ------------ | ------------------------------------------------------ | | `slug` | string | Да | Заведение | | `service_id` | integer | Да | Из `check-availability` | | `start_time` | string | Да | Точное `start_time` из слота | | `name` | string | Да | Имя пользователя в том виде, в каком его увидит бизнес | | `verification_code` | string | Да | 6 цифр, которые продиктовал пользователь | | `email` / `phone` | string | Одно из двух | Тот же контакт, на который отправлялся код | | `notes` | string | Нет | До 500 символов | Запись создаётся со статусом **pending** — бизнес ещё должен её подтвердить. Скажите пользователю, что запись отправлена, а не гарантирована. Если заведение берёт предоплату, в ответе придёт `payment_url`, который пользователю нужно открыть. ### Процесс записи ```text 1. search-venues → bookable_only: true 2. check-availability → выбрать услугу, затем слот 3. request-booking-code → код уходит пользователю, а не вам 4. попросить пользователя продиктовать код 5. book-appointment → с этим кодом ``` ### Два типа заведений У каждого результата есть поле `is_bookable`, и оно определяет, что вы можете предложить дальше: - **`is_bookable: true`** — заведение настроено на онлайн-запись. Процесс выше работает. - **`is_bookable: false`** — карточка справочника. Реальный адрес, реальные часы работы, часто список услуг и телефон, но **онлайн-записи нет**. Отвечайте по этим данным и предлагайте телефон. ::caution Сейчас бо́льшая часть каталога — второго типа. Ассистент, который считает, что записаться можно куда угодно, пообещает то, чего Bronjoy не может выполнить: передавайте `bookable_only: true` , когда пользователь хочет записаться, и прямо говорите, когда в заведение нужно звонить. :: ### Как читать данные - **Названия, услуги и адреса — на русском или узбекском.** Не переводите адрес, который пользователю придётся показать таксисту. - **Цены в узбекских сумах (UZS).** У многих карточек цены нет вовсе. `от 300000 сум` означает «от 300 000 сум». - **Время — в часовом поясе заведения**, со смещением в значении. - **Рейтинги в результатах поиска взяты из исходного справочника**, а не из отзывов Bronjoy. ### Ограничения | Область | Лимит | | ---------------------- | ------------------------------------------ | | Все запросы | 30/минуту на клиента | | `reveal-phone` | 10/минуту на клиента | | `request-booking-code` | 10/час на клиента плюс лимит на получателя | При превышении лимита возвращается ошибка с указанием, сколько секунд подождать. --- ## Сервер организации Приватный сервер отдельной организации, к которому владелец подключает собственного ассистента. Он управляет календарём **этой организации**: услуги, слоты, записи и отмены. Это функция платного тарифа, требуется токен. ### 1. Создайте токен Из панели управления или через API: ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "Claude Desktop", "expires_in_days": 90 } ``` Ответ: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Сохраните токен сразу — он показывается только один раз. ### 2. Подключите AI-клиент ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy-org \ https://api.bronjoy.com/api/mcp/organization/1 \ --header "Authorization: Bearer 3|AbCdEf..." ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp/organization/1", "headers": { "Authorization": "Bearer 3|AbCdEf..." } } } } ``` ```txt [Любой MCP-клиент] Транспорт: Streamable HTTP Адрес: https://api.bronjoy.com/api/mcp/organization/{id} Авторизация: Authorization: Bearer {token} ``` :: ### Инструменты #### list-services Список всех услуг, доступных для записи, с ценами и длительностью. Начинайте с него, чтобы узнать ID услуг. **Параметры:** нет ```json { "services": [ { "id": 1, "name": "Haircut", "description": "Classic haircut with styling", "duration_minutes": 30, "price": "25.00", "currency": "USD", "category": "Hair Services" } ], "total": 1 } ``` #### search-availability Поиск свободных слотов для конкретной услуги и даты. | Параметр | Тип | Обяз. | Описание | | ------------ | ------- | ----- | ------------------------------------------- | | `service_id` | integer | Да | ID услуги (из `list-services`) | | `date` | string | Да | `YYYY-MM-DD`, сегодня или до 30 дней вперёд | | `staff_id` | integer | Нет | Конкретный сотрудник | ```json { "date": "2026-03-26", "service": "Haircut", "timezone": "Asia/Tashkent", "available_times": ["09:00", "10:00", "14:30", "15:00"], "total_found": 10, "showing": 4, "note": "Times are in H:i format (24-hour) in the organization timezone." } ``` #### create-appointment Создать запись для клиента. | Параметр | Тип | Обяз. | Описание | | -------------- | ------- | ----- | ---------------------------------------------------------------- | | `client_name` | string | Да | Полное имя клиента (2–100 символов) | | `client_phone` | string | Да | Телефон в международном формате (`+998901234567`) | | `service_id` | integer | Да | ID услуги | | `date` | string | Да | `YYYY-MM-DD` | | `time` | string | Да | `HH:MM`, 24-часовой формат | | `staff_id` | integer | Нет | Конкретный сотрудник (назначается автоматически, если не указан) | | `branch_id` | integer | Нет | Филиал | | `notes` | string | Нет | До 500 символов | ```json { "success": true, "appointment_id": 123, "message": "Appointment booked for John Doe on 2026-03-26 at 14:30." } ``` #### check-appointment Поиск существующих записей по номеру телефона. | Параметр | Тип | Обяз. | Описание | | ---------------- | ------- | ----- | ----------------------------------------------------- | | `client_phone` | string | Да | Телефон в международном формате | | `appointment_id` | integer | Нет | Конкретная запись (если не указана — все предстоящие) | Возвращает одну запись или до 5 предстоящих записей для этого номера. #### cancel-appointment Отменить существующую запись. Телефон клиента должен совпадать с записью. | Параметр | Тип | Обяз. | Описание | | ---------------- | ------- | ----- | -------------------------- | | `appointment_id` | integer | Да | ID записи | | `client_phone` | string | Да | Должен совпадать с записью | | `reason` | string | Нет | До 500 символов | ### Ресурсы #### organization://profile Профиль организации — услуги, сотрудники, филиалы, часовой пояс и валюта. Позволяет AI-клиенту получить контекст, не вызывая инструменты по отдельности. ### Промпты #### booking-assistant Системный промпт, который настраивает разговор о записи и содержит инструкции по рекомендуемому процессу. ### Рекомендуемый процесс ```text 1. list-services → Показать, что есть 2. search-availability → Найти свободные слоты для выбранной услуги 3. Подтвердить с пользователем → Пусть человек выберет время 4. create-appointment → Записать ``` Для отмены: ```text 1. check-appointment → Найти запись по телефону 2. Подтвердить с пользователем → Какую именно отменить? 3. cancel-appointment → Отменить ``` ### Ограничения | Область | Лимит | | -------------- | ------------------- | | На токен | 60 запросов/минуту | | На организацию | 120 запросов/минуту | При превышении возвращается `429 Too Many Requests`. ### Безопасность - Каждый токен привязан к **одной организации** — он не даёт доступа к данным другой - Токены истекают через заданное количество дней (по умолчанию 90, максимум 365) - Сервер работает **только с записями** — без внутренних управляющих эндпоинтов, финансовых данных и настроек сотрудников - Номер телефона подтверждает клиента при проверке и отмене - Все операции логируются для аудита ### Решение проблем | Проблема | Решение | | ----------------------- | ---------------------------------------------------------------- | | `401 Unauthorized` | Токен истёк или недействителен — создайте новый | | `403 Forbidden` | У токена нет доступа к этой организации | | `429 Too Many Requests` | Превышен лимит — подождите и повторите | | `Feature not available` | Доступ к MCP не включён для этой организации | | Слоты не возвращаются | Не заданы графики сотрудников или к услуге не привязан сотрудник | # Платёжные вебхуки ## Обзор Bronjoy обрабатывает платежи от вашего имени (см. [Stripe](https://docs.bronjoy.com/ru/integrations/stripe)), поэтому вам не нужно самостоятельно настраивать вебхук — эта страница просто объясняет, что происходит «под капотом» между оплатой клиента и подтверждением его записи. ## Что происходит после завершения платежа 1. Платёжный провайдер уведомляет Bronjoy о том, что оплата прошла успешно, истекла или была возвращена 2. Запись о транзакции обновляется до статуса `Completed`, `Cancelled` или `Refunded` 3. Если запись ожидала оплаты, она подтверждается автоматически 4. Клиент и сотрудник получают уведомления о подтверждении или отмене Всё это происходит в течение одной-двух секунд после того, как клиент завершил оплату, — опрашивать API не нужно. Отследить результат со своей стороны можно через [транзакции](https://docs.bronjoy.com/ru/guides/payments#managing-transactions) или статус записи. ## Провайдеры | Провайдер | Статус | | ------------ | -------------------------------------------------------------------------------------- | | **Stripe** | Работает — см. [Интеграция со Stripe](https://docs.bronjoy.com/ru/integrations/stripe) | | **Click.uz** | Приостановлен до завершения регистрации юридического лица | | **Payme.uz** | Приостановлен до завершения регистрации юридического лица | Все суммы для Click и Payme обрабатываются в UZS; суммы Stripe используют валюту, заданную в транзакции. # Google Calendar ## Обзор Bronjoy интегрируется с Google Calendar, чтобы записи сотрудников всегда были синхронизированы. Доступны два режима синхронизации: | Режим | Направление | Как это работает | | ----------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------- | | **Синхронизация с Google Calendar** | Двусторонняя | Подключение по OAuth; отправляет записи в Google и забирает внешние события, блокируя слоты | | **Лента iCal** | Односторонняя (чтение) | Подписка из любого календарного приложения; только чтение, обновляется автоматически | ## Синхронизация с Google Calendar ### Подключение 1. Получите URL авторизации: ```bash GET /api/org/calendar/auth-url?provider=google Authorization: Bearer your-token ``` :brВозвращает URL согласия Google OAuth. Сотрудник открывает его в браузере. 2. После предоставления доступа Google перенаправляет обратно в Bronjoy. Подключение создаётся автоматически. 3. Проверьте подключение: ```bash GET /api/org/calendar/connections Authorization: Bearer your-token ``` ### Поведение синхронизации После подключения Bronjoy синхронизирует данные в обе стороны: **Отправка (Bronjoy → Google):** - Новые записи создаются как события Google Calendar - Перенесённые записи обновляют событие - Отменённые записи удаляют событие - В описание события входят название услуги, данные клиента и заметки **Получение (Google → Bronjoy):** - Внешние события в календаре сотрудника блокируют слоты доступности - Полученные события кешируются и периодически обновляются - События на весь день обрабатываются корректно (блокируют весь день) ### Переключение функций синхронизации Управляйте тем, что синхронизируется, для каждого подключения: ```bash PATCH /api/org/calendar/connections/{connection}/toggle Authorization: Bearer your-token Content-Type: application/json ``` ```json { "push_enabled": true, "pull_enabled": true } ``` | Настройка | Что делает | | -------------- | ---------------------------------------------------------------------- | | `push_enabled` | Отправлять записи Bronjoy в Google Calendar | | `pull_enabled` | Забирать события Google, чтобы блокировать доступность в Bronjoy | | `sync_enabled` | Главный переключатель — при значении false отключает всю синхронизацию | ### Ручная синхронизация Запустите немедленную синхронизацию (полезно после изменений в Google Calendar): ```bash POST /api/org/calendar/connections/{connection}/sync Authorization: Bearer your-token ``` ### Отключение ```bash DELETE /api/org/calendar/connections/{connection} Authorization: Bearer your-token ``` Это отзывает OAuth-токен, удаляет кешированные события и останавливает всю синхронизацию. Уже созданные Bronjoy события в Google Calendar **не удаляются**. ## Лента iCal Лента iCal — это URL только для чтения, на который может подписаться любое календарное приложение. В ней отображаются предстоящие записи сотрудника. ### Получение URL ленты ```bash GET /api/org/calendar/feed-url Authorization: Bearer your-token ``` Возвращает URL вида: ```text https://api.bronjoy.com/api/calendar/feed/abc123token.ics ``` ### Подписка в календарном приложении **Google Calendar:** 1. Откройте Google Calendar → Другие календари → По URL 2. Вставьте URL ленты 3. Google обновляет её автоматически (обычно раз в несколько часов) **Apple Calendar:** 1. Файл → Новая подписка на календарь 2. Вставьте URL ленты **Outlook:** 1. Добавить календарь → Из Интернета 2. Вставьте URL ленты ### Подробности о ленте - Содержит предстоящие записи на ближайшие 6 месяцев - Не включает отменённые записи - Каждое событие содержит: название услуги, имя клиента, заметки, место - Обновляется каждые 60 минут (зависит от календарного приложения) - Аутентификация по токену — вход в систему не требуется ### Скачивание отдельной записи Клиенты могут скачать отдельную запись в виде файла `.ics`: ```bash GET /api/client/appointments/{appointment}/ics Authorization: Bearer client-token ``` Или получить ссылки для добавления в конкретные календарные приложения: ```bash GET /api/client/appointments/{appointment}/calendar-links ``` Возвращает прямые ссылки для Google Calendar и Outlook. ## Рекомендации - **Используйте синхронизацию с Google Calendar**, если сотрудники активно ведут своё расписание в Google Calendar — она предотвращает двойные записи, забирая внешние события - **Используйте ленту iCal**, если сотрудникам нужен только просмотр своих записей Bronjoy в привычном календарном приложении - **Включите получение событий** для сотрудников, у которых в Google Calendar есть личные события, блокирующие слоты для записи - **Не используйте одновременно** синхронизацию с Google Calendar и ленту iCal для одного сотрудника — это приведёт к дублированию событий # Telegram ## Обзор Bronjoy интегрируется с Telegram тремя способами: 1. **Клиентское Mini App** — клиенты записываются через Telegram Mini App 2. **Уведомления сотрудникам** — сотрудники получают уведомления о записях с кнопками действий 3. **Собственные боты** — организации могут подключить свой Telegram-бот для white-label решения ## Сценарий для клиентов Клиенты могут авторизоваться и взаимодействовать с Bronjoy через Telegram Mini App. ### Аутентификация ```bash POST /api/client/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` Значение `init_data` приходит из [Telegram Mini App API](https://core.telegram.org/bots/webapps){rel=""nofollow""}. Bronjoy проверяет подпись HMAC-SHA256 и создаёт или связывает аккаунт клиента. ### Действия с записью через inline-кнопки Когда клиент получает подтверждение записи в Telegram, inline-кнопки позволяют выполнить действия напрямую: - **Отменить запись** — отправляет callback `cancel_appointment:{id}` Бот обрабатывает callback и подтверждает отмену прямо в чате. ## Сценарий для сотрудников ### Аутентификация ```bash POST /api/org/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` ### Привязка и отвязка аккаунта Telegram Сотрудники с существующим аккаунтом могут привязать свой Telegram: ```bash POST /api/org/telegram/link Authorization: Bearer your-token Content-Type: application/json ``` ```json { "init_data": "..." } ``` Чтобы отвязать: ```bash POST /api/org/telegram/unlink Authorization: Bearer your-token ``` ### Уведомления сотрудникам При создании новой записи сотрудник получает сообщение в Telegram, содержащее: - Имя клиента и детали услуги - Дату и время - Inline-кнопки: **Подтвердить** / **Отклонить** Сотрудники могут подтверждать или отклонять записи прямо в Telegram, не открывая панель управления. ### Онбординг через Telegram Новые пользователи могут создать организацию или присоединиться к ней через Telegram: ```bash POST /api/org/telegram/create-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "My Salon", "category": "beauty" } ``` ```bash POST /api/org/telegram/join-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` ## Собственный Telegram-бот (white-label) Организации могут подключить свой Telegram-бот, чтобы работать под собственным брендом. Вместо стандартного бота Bronjoy клиенты взаимодействуют с ботом организации. ### Подключение собственного бота **Только для владельца.** Требуется флаг функциональности `custom_telegram_bot`. ```bash POST /api/org/telegram-bot/connect Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "bot_token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" } ``` Bronjoy проверяет токен через Telegram API, настраивает вебхук и добавляет кнопку меню со ссылкой на ваше Mini App. ### Проверка статуса подключения ```bash GET /api/org/telegram-bot Authorization: Bearer your-owner-token ``` Возвращает информацию о боте, статус вебхука и текущие ошибки, если они есть. ### Отключение ```bash POST /api/org/telegram-bot/disconnect Authorization: Bearer your-owner-token ``` Удаляет вебхук и отключает собственный бот. Вместо него снова используется стандартный бот Bronjoy. ## Рекомендации - **Подключите собственный бот**, если для вас важна узнаваемость бренда — клиенты будут видеть имя и аватар вашего бота - **Настройте бот для сотрудников** заранее — это заметно сокращает время реакции на новые записи - **Предлагайте клиентам записываться через Telegram** — это удобнее, чем авторизация по email или телефону # Что такое Bronjoy и чем он полезен вашему бизнесу ## Что такое Bronjoy Bronjoy — это платформа онлайн-записи для сервисного бизнеса: салонов, барбершопов, клиник, студий и подобных. Она даёт вашему бизнесу присутствие в интернете, где клиенты могут вас найти и записаться сами, и даёт вам инструменты для повседневной работы: календарь, базу клиентов, расписание, платежи и отзывы. ## Что вы получаете - **Страницу онлайн-записи**, на которую клиенты попадают по ссылке или через Telegram: они выбирают услугу и время и записываются сами — смотрите [Как клиенты записываются к вам онлайн](https://docs.bronjoy.com/ru/for-owners/getting-clients-online). - **Календарь** всех записей, который синхронизируется автоматически, когда клиенты записываются, переносят или отменяют визит. - **Базу клиентов** с контактами каждого клиента, историей записей и заметками. - **Управление расписанием** — рабочие часы по дням недели, выходные и особые часы, из которых складываются доступные слоты для клиентов. - **Автоматические подтверждения и напоминания** вам и вашим клиентам (в том числе через Telegram), которые снижают число неявок. - **Платежи** — по желанию принимайте предоплату или полную оплату при записи. - **Отзывы** — собирайте отзывы клиентов и отвечайте на них. ## Бизнес-ассистент В Bronjoy встроен AI-ассистент для бизнеса, с которым можно общаться (в панели управления и в Telegram). Он может делать работу за вас: создавать записи и управлять ими, находить клиентов и вести их базу, настраивать расписание, управлять услугами, сотрудниками и локациями, отвечать на вопросы о выручке и показателях бизнеса и объяснять, как устроен продукт. Просто напишите ему обычными словами. # Первая настройка бизнеса ## Порядок настройки Чтобы начать принимать онлайн-записи, настраивайте всё в таком порядке. Большинство этих шагов ассистент может сделать за вас — просто попросите. 1. **Добавьте локацию.** Это место, где вы работаете. Пока у бизнеса нет хотя бы одной локации, клиенты не смогут записаться. Скажите ассистенту название и адрес. 2. **Добавьте услуги.** Каждой услуге нужны название, цена и длительность. Именно их клиенты видят и выбирают на странице записи, поэтому добавляйте настоящие (например, «Мужская стрижка — 30 мин — 50 000»). 3. **Задайте рабочее расписание.** Укажите рабочие часы по дням недели (например, пн–сб 09:00–19:00) и выходные. Страница записи превращает эти часы в свободные слоты, которые может выбрать клиент. Нет расписания — нет и слотов для записи. 4. **Добавьте сотрудников (если у вас команда).** Добавьте каждого сотрудника и услуги, которые он оказывает, чтобы клиенты могли записаться к нужному человеку. Если работаете один — пропустите этот шаг. 5. **Опубликуйте профиль.** Заполните профиль бизнеса (название, описание, фотографии) и переведите его в статус **опубликован**. После этого страница записи станет публичной, и вы получите ссылку, которой можно делиться. ## После настройки Когда профиль опубликован, поделитесь ссылкой на страницу записи, чтобы клиенты могли записываться — смотрите [Как клиенты записываются к вам онлайн](https://docs.bronjoy.com/ru/for-owners/getting-clients-online). Дальше новые записи будут появляться в календаре автоматически, а управлять ими можно из панели управления или через ассистента. ## Совет Если на странице записи что-то выглядит неправильно или пусто (нет услуг, нет свободного времени), почти всегда дело в пропущенном шаге из списка выше — обычно это услуги или расписание, либо профиль ещё не опубликован. # Как клиенты записываются к вам онлайн ## Если коротко Как только бизнес настроен и **опубликован**, Bronjoy даёт вашим клиентам собственный онлайн-способ записаться к вам: они выбирают услугу, видят ваши реальные свободные слоты, выбирают время и подтверждают — без звонков и переписки. Вам ничего не нужно создавать: Bronjoy сам делает всё для записи. Ваша задача — настроить бизнес, опубликовать его и **поделиться ссылкой**. Есть два способа, которыми клиенты попадают к вам: ## 1. Ваша публичная страница записи (веб-ссылка) У каждого бизнеса есть своя страница записи в интернете: ваш адрес на Bronjoy плюс короткое имя бизнеса — например, `bronjoy.com/your-handle`. Любой, у кого есть ссылка, может открыть её в браузере и записаться: ни приложение, ни аккаунт для просмотра не нужны. Искать этот адрес не придётся — просто спросите ассистента («какая у меня ссылка на запись?»), и он даст точный URL и скажет, работает ли она уже. Ссылку также можно найти в панели управления: когда профиль **опубликован**, в верхней панели появляется зелёный значок **«Опубликовано»** — нажмите на него, чтобы открыть свою страницу записи и скопировать URL. **Где разместить ссылку, чтобы клиенты ею пользовались:** - В описании профиля в Instagram / Telegram / Facebook («Записаться 👇») - В профиле бизнеса на Google Maps / 2GIS - В ответах на заявки на запись в WhatsApp/Telegram - В QR-коде на двери, на стойке или на визитке (сгенерируйте его из ссылки) - На вашем сайте, если он есть ## 2. Приложение записи в Telegram Клиенты также могут записаться прямо в Telegram — через клиентское Mini App Bronjoy по адресу **t.me/bronjoy\_bot**. Если вы поделитесь Telegram-ссылкой именно на свой бизнес, она сразу откроет запись *к вам*. Для многих клиентов это самый удобный вариант, потому что всё происходит в мессенджере, которым они и так пользуются, и подтверждение с напоминаниями тоже приходят в Telegram. > Обратите внимание: приложение записи в Telegram для **клиентов** — это не то же самое, что бот бизнес-ассистента (он предназначен для вас, владельца и сотрудников). ## Прежде чем клиенты смогут записаться: вы должны быть «в эфире» Если страница записи пуста или недоступна, почти всегда дело в том, что бизнес ещё не настроен до конца и не опубликован. Чтобы выйти в эфир, вам как минимум нужны: 1. **Локация** — где вы работаете 2. **Хотя бы одна услуга** — то, на что можно записаться, с ценой и длительностью 3. **Рабочее расписание** — ваши часы, чтобы страница могла показать свободные слоты 4. **Опубликованный профиль** — переведите профиль в статус *опубликован*, чтобы страница стала публичной Пока профиль не опубликован, страница записи не будет публичной, и делиться будет нечем. Если чего-то из перечисленного не хватает — сначала настройте это, и тогда появятся значок «Опубликовано» и ваша ссылка. ## Что происходит после того, как клиент записался Запись автоматически попадает в ваш календарь Bronjoy, а вы и клиент получаете подтверждение (и напоминания). Подтвердить, перенести или отменить запись можно из панели управления или через ассистента. # Тарифы и оплата ## Тарифы | | Spark (бесплатно) | Avtopilot | | ------------------------------ | ----------------- | ------------------------------ | | Страница онлайн-записи | ✓ | ✓ | | Записи, сотрудники, расписание | ✓ | ✓ | | SMS-уведомления | ✓ | ✓ | | Локации | 1 | 1, плюс платные дополнительные | | AI-ассистент для бизнеса | — | ✓ | | Онлайн-платежи (Stripe) | — | ✓ | | Собственный бот в Telegram | — | ✓ | | Расширенная аналитика | — | ✓ | | Приоритетная поддержка | — | ✓ | | Надпись «Powered by Bronjoy» | показывается | убрана | Каждый бизнес начинает на тарифе **Spark** — он бесплатен сколько угодно долго и не требует привязки карты. **Avtopilot** — это фиксированная ежемесячная подписка, которая открывает AI-ассистента, платежи внутри приложения, собственного бота в Telegram и аналитику. ## Дополнительные локации Нужно больше одной локации на Avtopilot? Добавляйте локации по одной, вместо перехода на более дорогой тариф — каждая дополнительная локация стоит небольшую сумму в месяц и оплачивается вместе с подпиской. ```bash POST /api/org/subscription/branches/add Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Удалить локацию можно так же: ```bash POST /api/org/subscription/branches/remove ``` ## AI-кредиты У AI-ассистента на тарифе Avtopilot есть включённый дневной лимит, общий для всей вашей команды. Если у вас много работы и лимит закончился, пополните баланс разовым пакетом кредитов, не дожидаясь обнуления на следующий день: ```bash POST /api/org/subscription/ai-credits/topup Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Кредиты не сгорают и расходуются только после того, как закончится включённый дневной лимит. ## Управление подпиской ```bash GET /api/org/subscription Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Возвращает ваш текущий тариф, расход и дату продления. **Переход на другой тариф:** ```bash POST /api/org/subscription/checkout Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "tier": "avtopilot" } ``` Возвращает ссылку на Stripe Checkout — завершите оплату там, чтобы тариф активировался. **Отмена и возобновление:** ```bash POST /api/org/subscription/cancel POST /api/org/subscription/resume ``` Отмена не отключает вас сразу: Avtopilot действует до конца уже оплаченного периода, а затем организация автоматически возвращается на Spark. Возобновить подписку можно в любой момент до этой даты, и тариф не прервётся. Всё перечисленное также доступно в настройках оплаты в панели управления — а ассистент может провести вас по шагам. # Подтвердите права на свой бизнес ## Почему бизнес уже может быть на платформе Bronjoy собирает данные о тысячах сервисных бизнесов из открытых справочников, чтобы каталог был полезен с первого дня, — поэтому у вашего бизнеса уже может быть профиль с названием, адресом и категорией, даже если вы никогда не регистрировались. Такой профиль считается неподтверждённым, пока вы не докажете, что действительно являетесь владельцем. Это защищает бизнесы от того, чтобы их профиль отредактировал или присвоил кто-то посторонний. ## Как заявить права 1. Найдите свой бизнес на Bronjoy и откройте его профиль 2. Создайте заявку, указав своё имя, свою роль (владелец, управляющий, сотрудник или представитель) и короткое сообщение 3. Загрузите хотя бы один подтверждающий документ — свидетельство о государственной регистрации, справку из налоговой или лицензию. Можно приложить до 5 файлов (PDF, JPG, PNG или WEBP) ```bash POST /api/claims Authorization: Bearer your-token Content-Type: multipart/form-data ``` ```json { "organization_slug": "downtown-barbershop", "applicant_role": "owner", "applicant_name": "Jane Smith", "applicant_phone": "+998901234567", "message": "I'm the owner of this barbershop, registered in 2023. Documents attached.", "documents": [ { "file": "", "kind": "registration_cert" } ] } ``` `kind` — одно из значений `registration_cert`, `tax_cert`, `license`, `lease`, `utility_bill` или `other`; хотя бы один документ должен быть свидетельством о регистрации, справкой из налоговой или лицензией. Мы подтверждаем право собственности документами, а не кодом из SMS или письма: сообщение на номер не доказывает, что бизнес принадлежит вам. ## После подачи заявки ```bash GET /api/claims GET /api/claims/{claimRequest} ``` Отслеживайте статус заявки. Если проверяющим понадобится что-то ещё, добавьте дополнительные документы к той же заявке: ```bash POST /api/claims/{claimRequest}/documents ``` Заявку, которую вы больше не хотите отправлять на рассмотрение, можно отозвать: ```bash POST /api/claims/{claimRequest}/withdraw ``` ## После одобрения Вы становитесь владельцем организации — с полным доступом к панели управления, сотрудникам, услугам, расписанию и настройкам. Дальше следуйте инструкции [Первая настройка бизнеса](https://docs.bronjoy.com/ru/for-owners/first-time-setup), чтобы всё донастроить и выйти в эфир. # Kirish ## Bronjoy nima? Bronjoy — bu xizmat ko'rsatuvchi bizneslarga jadval, xodimlar va mijozlar bilan munosabatlarni boshqarishda yordam beradigan multi-tenant qabulga yozilish platformasi. Bronjoy'dagi har bir tashkilot mustaqil sozlamalarga ega o'z ish maydonini oladi. ## Asosiy tushunchalar ### Tashkilotlar Tashkilot — bu Bronjoy'dagi biznes: salon, klinika, konsalting kompaniyasi yoki har qanday xizmat ko'rsatuvchi. Har bir tashkilotning o'ziga tegishli quyidagilari bo'ladi: - **Xizmatlar** — biznes nimani taklif qiladi (soch olish, konsultatsiya, massaj va h.k.) - **Xodimlar** — xizmatlarni kim ko'rsatadi, individual jadvallari bilan - **Manzillar** — xizmatlar ko'rsatiladigan jismoniy yoki virtual joylar - **Mijozlar** — yozilishlar tarixi va afzalliklari bilan mijozlar bazasi ### Qabullar Markaziy obyekt. Qabul **mijoz**ni aniq **vaqt** va **manzil**da **xodim** tomonidan ko'rsatiladigan **xizmat** bilan bog'laydi. Qabullar quyidagi holatlar bo'ylab o'tadi: `Pending` → `Confirmed` → `Completed` (yoki `Cancelled` / `NoShow`). ### Mavjudlik va vaqt oraliqlari Xodimlar o'z ish vaqtlarini **jadvallar** orqali belgilaydi. Slot kalkulyatori quyidagilarni hisobga oladi: - Xodimning jadvali va tanaffuslari - Mavjud qabullar - Xizmat davomiyligi va bufer vaqtlari - Tashkilot darajasidagi sozlamalar (oldindan yozilish cheklovlari, slot intervallari) ### To'lovlar Tashkilotlar yozilish paytida to'lovni talab qilishi mumkin. Bronjoy to'lovlarni qayta ishlash uchun **Stripe** bilan integratsiyalashgan — Checkout Sessions orqali to'liq to'lovlar va depozitlar qo'llab-quvvatlanadi. ## Arxitektura Bronjoy — bu REST API bo'lib, uning ustiga ikkita ilova qurilgan: - **Boshqaruv paneli** — tashkilot egalari va xodimlari o'z biznesini boshqaradigan joy - **Mijoz ilovasi** — mijozlar bizneslarni topib, qabulga yoziladigan joy Ikkala ilova ham ushbu hujjatlarda tavsiflangan bir xil ochiq API bilan ishlaydi, ya'ni ular qila oladigan hamma narsani sizning integratsiyangiz ham qila oladi. API to'liq OpenAPI spetsifikatsiyasi bilan hujjatlashtirilgan — barcha endpointlarni [API Reference](https://docs.bronjoy.com/api-reference) bo'limidan ko'ring. ## Keyingi qadamlar - [Tez boshlash qo'llanmasi](https://docs.bronjoy.com/uz/getting-started/quickstart) — API'ga birinchi avtorizatsiyalangan so'rovingizni yuboring - [Autentifikatsiya](https://docs.bronjoy.com/uz/getting-started/authentication) — API tokenlar va avtorizatsiya jarayonlari - [Tashkilotni sozlash](https://docs.bronjoy.com/uz/guides/organization-setup) — yangi egalar uchun to'liq sozlash ro'yxati - [Yozilish jarayoni](https://docs.bronjoy.com/uz/guides/booking-flow) — yozilish qanday kechishini tushunib oling - [MCP integratsiyasi](https://docs.bronjoy.com/uz/integrations/mcp) — AI mijozlarni tashkilotingizga ulang - [API Reference](https://docs.bronjoy.com/api-reference) — barcha endpointlarni ko'rib chiqing # Tez boshlash ## Asosiy URL Ushbu hujjatlardagi barcha misollar quyidagidan foydalanadi: ```text https://api.bronjoy.com/api ``` ## 1. Hisob yarating Agar sizda hali Bronjoy biznes hisobi bo'lmasa, ro'yxatdan o'ting: ```bash POST https://api.bronjoy.com/api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` Elektron pochtangizga kelgan kodni tasdiqlang — javobda Bearer token qaytariladi. To'liq ma'lumot [Autentifikatsiya](https://docs.bronjoy.com/uz/getting-started/authentication) bo'limida. ## 2. Tashkilot yarating Foydalanuvchi bir yoki bir nechta tashkilotga egalik qilishi yoki ularga qo'shilishi mumkin. Tashkilot yarating: ```bash POST https://api.bronjoy.com/api/org/organizations Authorization: Bearer your-token Content-Type: application/json ``` ```json { "business_name": "Downtown Barbershop", "slug": "downtown-barbershop" } ``` `slug` — bu yozilish sahifangizning manzili (`bronjoy.com/downtown-barbershop`) — qisqa va noyob nom tanlang. Javobda tashkilotning `id` raqami bo'ladi — u quyidagi har bir so'rov uchun kerak bo'ladi. ## 3. Tashkilot kontekstini belgilang `/api/org/...` ostidagi har bir so'rov qaysi tashkilot bilan ishlayotganingizni bilishi kerak. Buni har bir so'rovda header sifatida yuboring: ```bash X-Organization-ID: 1 ``` ## 4. Birinchi so'rovingizni yuboring Sozlash ro'yxatingizni tekshiring: ```bash GET https://api.bronjoy.com/api/org/setup-status Authorization: Bearer your-token X-Organization-ID: 1 ``` Yoki xizmatlaringiz ro'yxatini oling (birinchisini yaratmaguningizcha bo'sh bo'ladi — [Tashkilotni sozlash](https://docs.bronjoy.com/uz/guides/organization-setup) bo'limiga qarang): ```bash GET https://api.bronjoy.com/api/org/services Authorization: Bearer your-token X-Organization-ID: 1 ``` ## Keyingi qadamlar - [Autentifikatsiya](https://docs.bronjoy.com/uz/getting-started/authentication) — xodimlar va mijozlar uchun to'liq avtorizatsiya jarayonlari hamda cheklangan huquqli API tokenlarni yaratish - [Tashkilotni sozlash](https://docs.bronjoy.com/uz/guides/organization-setup) — biznesingiz yozilishlarni qabul qila boshlashi uchun to'liq sozlash ro'yxati - [Yozilish jarayoni](https://docs.bronjoy.com/uz/guides/booking-flow) — mijoz qabulga qanday yozilishi, boshidan oxirigacha - [MCP integratsiyasi](https://docs.bronjoy.com/uz/integrations/mcp) — AI mijozni tashkilotingizga ulang - [API Reference](https://docs.bronjoy.com/api-reference) — har bir endpoint, so'rov va javob tuzilishi # Autentifikatsiya ## Umumiy ma'lumot Bronjoy API autentifikatsiyasi uchun **Laravel Sanctum**dan foydalanadi. Barcha himoyalangan endpointlar `Authorization` headerida Bearer token talab qiladi. ```bash Authorization: Bearer your-token-here ``` > Ushbu hujjatlardagi har bir `/api/org/...` misoli quyida tavsiflangan `X-Organization-ID` headerini ham talab qiladi — qisqalik uchun u alohida misollarda ko'rsatilmagan. ## Foydalanuvchi turlari Bronjoy'da alohida autentifikatsiya jarayoniga ega ikkita foydalanuvchi turi mavjud: | Turi | Kim | Auth marshrut prefiksi | | --------- | ------------------------------------ | ---------------------- | | **Xodim** | Tashkilot egalari va xodimlari | `/api/org/auth/...` | | **Mijoz** | Qabulga yoziladigan yakuniy mijozlar | `/api/client/auth/...` | ## Xodim autentifikatsiyasi ### Ro'yxatdan o'tish ```bash POST /api/org/auth/register Content-Type: application/json ``` ```json { "name": "Jane Smith", "email": "jane@example.com", "password": "secret" } ``` Elektron pochtaga tasdiqlash kodi yuboriladi. Uni tasdiqlang: ```bash POST /api/org/auth/verify Content-Type: application/json ``` ```json { "email": "jane@example.com", "code": "123456" } ``` Javobda Bearer token qaytariladi: ```json { "token": "1|abc123...", "user": { "id": 1, "name": "Jane Smith", "email": "jane@example.com" } } ``` ### Kirish ```bash POST /api/org/auth/login Content-Type: application/json ``` ```json { "email": "jane@example.com", "password": "secret" } ``` ### Chiqish ```bash POST /api/auth/logout Authorization: Bearer your-token-here ``` Bu joriy tokenni bekor qiladi. ## Mijoz autentifikatsiyasi Mijozlar telefon yoki elektron pochta orqali OTP kod bilan kiradi — parol talab qilinmaydi. ### Telefon (OTP) ```bash POST /api/client/auth/phone/request Content-Type: application/json ``` ```json { "phone": "+998901234567" } ``` ```bash POST /api/client/auth/phone/verify Content-Type: application/json ``` ```json { "phone": "+998901234567", "code": "1234" } ``` ### Elektron pochta (OTP) ```bash POST /api/client/auth/email/request Content-Type: application/json ``` ```json { "email": "client@example.com" } ``` ```bash POST /api/client/auth/email/verify Content-Type: application/json ``` ```json { "email": "client@example.com", "code": "123456" } ``` Ikkala jarayonda ham javobda `token` maydoni qaytariladi. ## Tashkilot konteksti Ko'pchilik `/api/org/...` endpointlari tashkilot kontekstini talab qiladi, chunki xodim hisobi bir nechta tashkilotga tegishli bo'lishi mumkin. Tashkilot ID'sini har bir so'rovda header sifatida yuboring: ```bash X-Organization-ID: 1 ``` Ushbu headersiz `/api/org/...` ga yuborilgan so'rovlar `400 Bad Request` qaytaradi. Siz kirish huquqiga ega bo'lmagan tashkilotga yuborilgan so'rovlar `403 Forbidden` qaytaradi. ## Shaxsiy API tokenlar Dasturiy kirish uchun nomlangan va cheklangan huquqli API tokenlarni yaratishingiz mumkin — bu skriptlar, integratsiyalar va MCP mijozlari uchun qulay. ### Token yaratish ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "My Integration", "expires_in_days": 90 } ``` Javob: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Tokenlar faqat bir marta ko'rsatiladi. Ularni xavfsiz saqlang — qayta olish imkoni yo'q. Yaratilgan token `mcp:organization:{id}` huquqi bilan aniq bir tashkilotga cheklanadi va sukut bo'yicha 90 kundan keyin muddati tugaydi (maksimal 365 kun). ## Joriy foydalanuvchini olish ```bash GET /api/auth/me Authorization: Bearer your-token-here ``` Autentifikatsiyadan o'tgan foydalanuvchining profilini qaytaradi. # Yozilish jarayoni ## Umumiy ma'lumot Bronjoy'dagi yozilish jarayoni bir necha bosqichdan iborat: mijoz xizmatni tanlaydi, xodim va vaqt oralig'ini belgilaydi, o'z ma'lumotlarini kiritadi, kerak bo'lsa to'lovni amalga oshiradi va tasdiqni oladi. ## 1-qadam: Xizmatni tanlash Mijoz tashkilotning ochiq yozilish sahifasidagi mavjud xizmatlarni ko'rib chiqadi. ```bash GET /api/booking/{slug}/services ``` Har bir xizmatning nomi, davomiyligi, narxi va uni qaysi xodimlar ko'rsata olishi ko'rsatiladi. Autentifikatsiya talab etilmaydi — bu ochiq yozilish sahifasining endpoint'i. ## 2-qadam: Bo'sh vaqtlarni tekshirish Xizmat tanlangach, ma'lum bir sana uchun bo'sh vaqt oraliqlarini oling. ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-03-25 ``` Yoki bir yo'la butun sana oralig'i uchun: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-03-25&end_date=2026-03-31 ``` Slot kalkulyatori quyidagilarni hisobga oladi: - Xodimning ish vaqti va tanaffuslari - Mavjud yozilishlar - Xizmat davomiyligi + bufer vaqti - Tashkilotning oldindan yozilish cheklovlari Tayinlangan xodim bilan birga bo'sh vaqt oraliqlari massivini qaytaradi. ## 3-qadam: Qabulni yaratish Tanlangan slot bilan yozilishni yuboring. Bu ham mehmonlar, ham tizimga kirgan mijozlar uchun ishlaydi — Bronjoy mijozni mavjud bo'lsa auth token orqali, aks holda so'rov tanasidagi aloqa ma'lumotlari orqali aniqlaydi. ```bash POST /api/client/booking/{slug} Content-Type: application/json ``` ```json { "service_id": 1, "staff_id": 3, "start_time": "2026-03-25T10:00:00Z", "notes": "First visit", "name": "Maria Garcia", "phone": "+998901234567" } ``` Mehmon sifatida yozilishda `name` hamda `phone` yoki `email` dan kamida bittasi talab etiladi; agar so'rovda mijozning Bearer token'i bo'lsa, ular e'tiborga olinmaydi. Qabul `Pending` holatida yaratiladi. ## 4-qadam: To'lov (agar talab etilsa) Agar tashkilot to'lovni talab qilsa, Stripe Checkout Session avtomatik yaratiladi. Mijoz to'lovni yakunlash uchun Stripe'ga yo'naltiriladi. ```bash POST /api/client/payments/appointments/{appointment}/pay Authorization: Bearer client-token ``` To'lov muvaffaqiyatli amalga oshgach, qabul `Confirmed` holatiga o'tadi. To'liq jarayon uchun [To'lovlar](https://docs.bronjoy.com/uz/guides/payments) bo'limiga qarang. ## 5-qadam: Tasdiqlash Mijoz qabul tafsilotlari bilan tasdiqni oladi. Bildirishnomalar quyidagi kanallar orqali yuboriladi: - Ma'lumotlar bazasidagi bildirishnoma (ilovada ko'rinadi) - Telegram (agar mijoz o'z hisobini ulagan bo'lsa) ## Holatlar oqimi ```text Pending → Confirmed → Completed ↓ ↓ Cancelled Cancelled ↓ NoShow ``` - **Pending** — tasdiq yoki to'lov kutilmoqda - **Confirmed** — to'lov qabul qilindi yoki xodim tomonidan qo'lda tasdiqlandi - **Completed** — xizmat ko'rsatildi - **Cancelled** — mijoz yoki xodim tomonidan bekor qilindi - **NoShow** — mijoz kelmadi # Tashkilotni sozlash ## Umumiy ma'lumot Ro'yxatdan o'tib, tashkilotingizni yaratganingizdan so'ng, mijozlar yozila boshlashidan oldin sozlash ro'yxatini to'ldirishingiz kerak. Ushbu qo'llanma har bir qadamni tavsiya etilgan tartibda ko'rsatib beradi. Joriy sozlash holatini istalgan vaqtda tekshirishingiz mumkin: ```bash GET /api/org/setup-status Authorization: Bearer your-token ``` ## 1-qadam: Tashkilot profili Profilingiz — bu mijozlar biznesingizni topganda ko'radigan ochiq sahifa. Uni to'liq to'ldiring — bu ishonch va konversiyaga bevosita ta'sir qiladi. ```bash GET /api/org/organization-profile PUT /api/org/organization-profile ``` **To'ldirish tavsiya etiladigan maydonlar:** | Maydon | Nima uchun muhim | | --------------- | -------------------------------------------------------------------- | | `name` | Hamma joyda ko'rsatiladi — haqiqiy biznes nomingizdan foydalaning | | `description` | Mijozlarga nima bilan shug'ullanishingizni ayting. 2–4 gap ideal | | `category` | Mijozlarga sizni qidiruvda topishga yordam beradi | | `address` | Jismoniy manzilingiz bo'lsa, majburiy | | `phone` | Mijozlar yozilishdan oldin qo'ng'iroq qilishni xohlaydi | | `website` | Ishonchni oshiradi | | `logo` | Qidiruv natijalarida va yozilish sahifasida ko'rsatiladi | | `cover_image` | Profil sahifangizdagi birinchi taassurot | | `working_hours` | Profilda ko'rsatiladi, shunda mijozlar qachon ochiqligingizni biladi | **Maslahatlar:** - Faqat xizmat nomlarini emas, balki mijozga keladigan foydani ta'kidlaydigan tavsif yozing - Yuqori sifatli kvadrat logotipdan foydalaning (kamida 200×200px) - Faol foydalanadigan barcha ijtimoiy tarmoq havolalarini to'ldiring ### Profilingizni chop etish Profilingiz **qoralama** sifatida boshlanadi — ya'ni ommaga ko'rinmaydi. Tayyor bo'lgach: ```bash POST /api/org/organization-profile/toggle-publish Authorization: Bearer your-token ``` ## 2-qadam: Filiallar Bir yoki bir nechta jismoniy manzilingiz bo'lsa, ularni filial sifatida yarating. ```bash POST /api/org/branches Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Main Branch", "address": "123 Main St, Tashkent", "phone": "+998901234567" } ``` Hatto bitta manzilingiz bo'lsa ham, uni yarating — qabullar filiallarga bog'lanadi. ## 3-qadam: Xizmatlar Xizmatlar — bu mijozlar yoziladigan narsalar. Boshlash uchun kamida bitta xizmat yarating. ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Haircut", "description": "Classic haircut with styling", "duration": 60, "price": 50000, "category_id": 1, "buffer_time": 10 } ``` **Asosiy maydonlar:** | Maydon | Tavsif | | ------------------ | --------------------------------------------------------- | | `duration` | Xizmat davomiyligi (daqiqalarda) | | `price` | Valyutaning eng kichik birligidagi narx (masalan, tiyin) | | `buffer_time` | Qabuldan keyin qo'shiladigan tanaffus (tozalash vaqti) | | `prepay_required` | Yozilish paytida to'lov talab etiladimi | | `prepay_amount` | Oldindan to'lov talab etilsa, belgilangan depozit summasi | | `max_advance_days` | Mijozlar bu xizmatga qancha vaqt oldin yozila oladi | **Maslahatlar:** - `buffer_time` ni real belgilang — u ketma-ket yozilishlar orasida nafas olish imkonini beradi - Bog'liq xizmatlarni bitta turkum ostida guruhlang - Agar xizmat turli xodimlar uchun turlicha davom etsa, alohida variantlar yarating ## 4-qadam: Xodimlar Jamoangizni qo'shing. Har bir xodim o'z jadvaliga ega bo'ladi va muayyan xizmatlarga tayinlanishi mumkin. To'liq qo'llanma uchun [Xodimlarni boshqarish](https://docs.bronjoy.com/uz/guides/staff-management) bo'limiga qarang. ## 5-qadam: Jadval va bandlik Slotlar paydo bo'lishi uchun har bir xodimga ish jadvali kerak. Jadval belgilanmaguncha hech qanday slot yaratilmaydi. To'liq qo'llanma uchun [Xizmatlar va jadval](https://docs.bronjoy.com/uz/guides/services-scheduling) bo'limiga qarang. ## 6-qadam: Sozlamalar Tashkilot darajasidagi xatti-harakatlarni sozlang: ```bash GET /api/org/settings PUT /api/org/settings ``` **Muhim sozlamalar:** | Sozlama | Tavsif | Tavsiya | | -------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------- | | `booking_lead_time` | Slotni band qilishdan oldingi minimal soatlar | So'nggi daqiqadagi kutilmagan holatlardan qochish uchun 1–2 soat qiling | | `max_advance_booking_days` | Mijozlar necha kun oldin yozila oladi | 30–60 kun standart hisoblanadi | | `appointment_auto_confirm` | Yangi yozilishlarni avtomatik tasdiqlash | Qo'lda tasdiqlash kerak bo'lmasa, yoqing | | `allow_guest_booking` | Mijoz hisobisiz yozilishga ruxsat berish | Jarayonni soddalashtirish uchun yoqing | | `slot_interval` | Slot boshlanish vaqtlari orasidagi daqiqalar | Xizmat davomiyligiga moslang | | `cancellation_hours` | Mijozlar qabuldan necha soat oldin bekor qila oladi | 24–48 soat odatiy | ## 7-qadam: To'lov sozlamalari (ixtiyoriy) Agar yozilish paytida to'lovlarni qabul qilmoqchi bo'lsangiz, buni yoqing va depozit/qaytarish siyosatingizni belgilang — sizdan Stripe hisobi talab etilmaydi. Sozlash bo'yicha ko'rsatmalar uchun [Stripe](https://docs.bronjoy.com/uz/integrations/stripe) bo'limiga qarang. ## 8-qadam: Bildirishnoma sozlamalari Mijozlar va xodimlarga qaysi bildirishnomalar yuborilishini sozlang: ```bash GET /api/org/notification-settings PUT /api/org/notification-settings ``` **Yoqish tavsiya etiladigan bildirishnomalar:** - Qabul tasdig'i (mijoz) - Qabul haqida eslatma (mijoz) — odatda 24 soat va 1 soat oldin - Yangi qabul haqida bildirishnoma (xodim) - Bekor qilish haqida bildirishnoma (ikkalasi uchun) ## Taklif kodi Tashkilotingizning taklif kodini xodimlar bilan ulashing, shunda ular ish maydoningizga qo'shila oladi: ```bash POST /api/org/invite-code/generate Authorization: Bearer your-token ``` Xodimlar bu koddan ro'yxatdan o'tishda yoki mavjud hisobdan qo'shilishda foydalanadi. ## Boshqaruv paneli Sozlash tugagach, biznesingizni boshqaruv panelidan kuzatib boring: ```bash GET /api/org/dashboard Authorization: Bearer your-token ``` Bugungi qabullar, kelgusi yozilishlar, daromad va so'nggi harakatlar bo'yicha ko'rsatkichlarni qaytaradi. # Xodimlarni boshqarish ## Umumiy ma'lumot Xodimlar — bu tashkilotingizda mijozlarga xizmat ko'rsatadigan odamlar. Har bir xodim: - O'z jadvali va bandligiga ega - Muayyan xizmatlarga tayinlanishi mumkin - Rolga ega (owner yoki staff) - Yozilish saytida o'zining ochiq profil sahifasiga ega ## Xodimlarni taklif qilish ### Taklif kodini yaratish ```bash POST /api/org/invite-code/generate Authorization: Bearer your-owner-token ``` Qaytgan kodni taklif qilayotgan odamingiz bilan ulashing. U bu kod orqali tashkilotingizga qo'shiladi. ### Elektron pochta orqali taklif qilish Bevosita elektron pochta orqali ham taklif qilishingiz mumkin: ```bash POST /api/org/auth/invite Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "email": "newstaff@example.com" } ``` ### Taklif kodi orqali qo'shilish Taklif qilingan shaxs ro'yxatdan o'tadi yoki tizimga kiradi, so'ng qo'shilish so'rovini yuboradi: ```bash POST /api/org/join-requests Authorization: Bearer their-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` Egasi sifatida kutilayotgan qo'shilish so'rovlarini tasdiqlang yoki rad eting: ```bash GET /api/org/join-requests # list pending requests POST /api/org/join-requests/{joinRequest}/approve # approve POST /api/org/join-requests/{joinRequest}/reject # reject ``` ## Xodimlarni boshqarish ### Xodimlar ro'yxati ```bash GET /api/org/staff Authorization: Bearer your-token ``` ### Xodimni to'g'ridan-to'g'ri yaratish (faqat egasi) Taklif jarayonisiz xodim hisobini yaratmoqchi bo'lsangiz: ```bash POST /api/org/staff Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "email": "alex@example.com", "phone": "+998901234567", "role": "staff", "bio": "Experienced barber with 5 years of experience", "position": "Senior Stylist" } ``` ### Xodim ma'lumotlarini yangilash ```bash PUT /api/org/staff/{staff} Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Alex Johnson", "position": "Lead Stylist", "bio": "Updated bio" } ``` ### Faollashtirish / Faolsizlantirish Xodimni faolsizlantirish uni yozilish jarayonidan chiqaradi — mijozlar unga yozila olmaydi, lekin mavjud qabullar saqlanib qoladi. ```bash POST /api/org/staff/{staff}/activate POST /api/org/staff/{staff}/deactivate ``` **Qachon faolsizlantirish kerak:** xodim ta'tilga chiqqanda yoki kompaniyani tark etganda. O'chirmang — qabullar tarixini saqlab qolish uchun faolsizlantiring. ## Xodim rollari | Rol | Imkoniyatlar | | ------- | --------------------------------------------------------------------------------------------------- | | `owner` | To'liq huquq: xodimlar, sozlamalar, hisob-kitob, to'lov ma'lumotlari va taklif kodlarini boshqarish | | `staff` | Qabullar va o'z bandligini boshqarish; tashkilot sozlamalarining ko'pchiligini faqat ko'rish | Rollar har bir tashkilot uchun alohida belgilanadi — bir shaxs bitta tashkilotda egasi, boshqasida xodim bo'lishi mumkin. ## Xodimlarga xizmatlarni tayinlash Har bir xodim o'zi ko'rsata oladigan xizmatlarga tayinlanishi kerak. Tayinlanmasa, u o'sha xizmat uchun yozilish jarayonida ko'rinmaydi. ```bash # View current service assignments GET /api/org/staff/{staff}/services # Assign services (replaces existing assignments) POST /api/org/staff/{staff}/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "service_ids": [1, 2, 3] } ``` Shu bilan bir qatorda, xodimlarni xizmat tomonidan ham tayinlash mumkin: ```bash POST /api/org/services/{service}/staff Content-Type: application/json ``` ```json { "staff_ids": [1, 2] } ``` **Maslahat:** Yangi xizmat qo'shganingizda, uni darhol tegishli xodimlarga tayinlang — aks holda u yozilish uchun ko'rinmaydi. ## Xodimning bandligi Slotlar yaratilishi uchun har bir xodimga jadval kerak. Jadvallarni jadval endpoint'lari orqali boshqaring ([Xizmatlar va jadval](https://docs.bronjoy.com/uz/guides/services-scheduling) bo'limiga qarang). Xodimning hisoblangan bandligini ko'rishingiz mumkin: ```bash GET /api/org/staff/{staff}/availability ``` ## Xodim profillari Har bir xodimning mijozlarga ko'rinadigan ochiq profil sahifasi bor. Xodimlarni quyidagilarni to'ldirishga undang: - **Foto** — ishonch uchun juda muhim - **Bio** — malaka va tajribani qisqacha tasvirlab bering - **Lavozim** — biznesdagi roli/unvoni Mijozlar yozilishda xodim bo'yicha filtrlashi mumkin, shuning uchun to'liq profil yozilishlar sonini oshiradi. ## Ommaviy amallar Bir vaqtning o'zida bir nechta xodimni yangilang yoki o'chiring: ```bash POST /api/org/staff/batch-update Content-Type: application/json ``` ```json { "ids": [2, 3], "data": { "is_active": false } } ``` ```bash POST /api/org/staff/batch-destroy Content-Type: application/json ``` ```json { "ids": [4, 5] } ``` > batch-destroy dan ehtiyotkorlik bilan foydalaning — bu qaytarib bo'lmaydi. Tarixni saqlab qolmoqchi bo'lsangiz, faolsizlantirishni afzal ko'ring. # Xizmatlar va jadval ## Xizmatlar Xizmatlar — bu tashkilotingizning yozilish mumkin bo'lgan takliflari. Har bir xizmatning o'z davomiyligi, narxi va uni qaysi xodimlar ko'rsata olishi belgilanadi. ### Xizmat yaratish ```bash POST /api/org/services Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Deep Tissue Massage", "description": "60-minute full-body deep tissue massage", "duration": 60, "price": 150000, "category_id": 2, "buffer_time": 15, "color": "#6366f1" } ``` **Maydonlar ma'lumotnomasi:** | Maydon | Tur | Tavsif | | ------------------ | ------- | ---------------------------------------------------------- | | `name` | string | Mijozlarga ko'rsatiladigan xizmat nomi | | `description` | string | Qisqa tavsif (1–3 gap) | | `duration` | integer | Davomiyligi (daqiqalarda) | | `price` | integer | Valyutaning eng kichik birligidagi narx | | `category_id` | integer | Turkum bo'yicha guruhlash (ixtiyoriy) | | `buffer_time` | integer | Qabuldan keyingi tanaffus, daqiqalarda (tozalash, yo'l) | | `color` | string | Kalendarda ko'rsatish uchun Hex rang | | `prepay_required` | boolean | Yozilish paytida to'lovni talab qilish | | `prepay_amount` | integer | Belgilangan depozit summasi (agar prepay\_required bo'lsa) | | `max_advance_days` | integer | Bu xizmatga necha kun oldin yozilish mumkin | | `min_lead_hours` | integer | Yozilishdan oldin talab etiladigan minimal soatlar | | `is_active` | boolean | Xizmat ko'rinadigan va yozilish mumkin bo'lgan holatdami | ### Xizmat turkumlari Yozilish sahifangizda tartibni yaxshilash uchun xizmatlarni turkumlarga guruhlang: ```bash GET /api/org/services/categories ``` Turkumlar butun tashkilotingiz bo'ylab umumiy bo'ladi va mijozlarga xizmatlar ro'yxatida yo'l topishga yordam beradi. ### Xizmatlar bo'yicha maslahatlar - **Davomiylik aniqligi** — Kam baholasangiz bo'shliqlar paydo bo'ladi; ko'p baholasangiz slotlarni yo'qotasiz. O'zingizni vaqt bilan tekshiring. - **Bufer vaqti** — Xonani tayyorlash, izoh yozish yoki tayyorgarlik uchun doim bufer qo'shing. Hatto 5–10 daqiqa ham shoshqaloqlikning oldini oladi. - **Narx** — Mijoz to'laydigan narxni belgilang. Depozitdan foydalansangiz, `prepay_amount` ni depozit summasiga qo'ying va `prepay_required: true` qiling. - **Ranglar** — Xizmat turkumlariga turli ranglar bering — bu xodimlar kalendarini o'qishni ancha osonlashtiradi. ## Jadvallar Jadval xodim qabullarni qachon qabul qila olishini belgilaydi. Jadval belgilanmaguncha o'sha xodim uchun hech qanday slot yaratilmaydi. ### Jadval yozuvini yaratish ```bash POST /api/org/schedule Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" } ``` `day_of_week`: `0` = yakshanba, `1` = dushanba, ..., `6` = shanba. ### Jadvalni ko'rish ```bash GET /api/org/schedule?staff_id=1 ``` ### Jadval yozuvini yangilash ```bash PUT /api/org/schedule/{id} Content-Type: application/json ``` ```json { "start_time": "10:00", "end_time": "19:00" } ``` ### Jadval yozuvini o'chirish ```bash DELETE /api/org/schedule/{id} ``` ### To'liq hafta namunasi 1-raqamli xodim uchun odatiy dushanba–juma, 9:00–18:00 jadvali: ```json [ { "staff_id": 1, "day_of_week": 1, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 2, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 3, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 4, "start_time": "09:00", "end_time": "18:00" }, { "staff_id": 1, "day_of_week": 5, "start_time": "09:00", "end_time": "18:00" } ] ``` ## Bandlik istisnolari Istisnolar muayyan sanalar uchun odatdagi jadvalni bekor qiladi — bayramlar, dam olish kunlari yoki maxsus ish vaqtlari uchun qulay. ### Istisno yaratish ```bash POST /api/org/availability/exceptions Authorization: Bearer your-token Content-Type: application/json ``` ```json { "staff_id": 1, "date": "2026-05-01", "is_day_off": true, "reason": "National holiday" } ``` Kunning bir qismi uchun (boshqa ish vaqti): ```json { "staff_id": 1, "date": "2026-12-31", "is_day_off": false, "start_time": "09:00", "end_time": "14:00", "reason": "New Year's Eve — half day" } ``` ### Istisnolar ro'yxati ```bash GET /api/org/availability/exceptions?staff_id=1 ``` **Maslahatlar:** - Yil boshida barcha ma'lum bayramlar uchun istisnolarni yaratib qo'ying - Xodim kasal bo'lsa, o'sha kun uchun `is_day_off: true` bilan istisno yarating — mavjud qabullar saqlanadi va vaqtini qayta belgilash mumkin - Istisnolar o'z sanasi uchun odatdagi jadvaldan ustun turadi ## Slotlar qanday hisoblanadi Slot kalkulyatori quyidagilarni hisobga oladi: 1. **Xodim jadvali** — qachon ishlashi (kun, boshlanish va tugash vaqtlari) 2. **Bandlik istisnolari** — muayyan sanalar uchun o'zgartirishlar 3. **Mavjud qabullar** — band qilingan slotlar bloklanadi 4. **Xizmat davomiyligi** — slot uzunligi xizmatga mos keladi 5. **Bufer vaqti** — har bir qabuldan keyin qo'shiladi 6. **Tashkilot sozlamalari** — oldindan yozilish cheklovlari, slot intervali, minimal muddat Slotlar `start_time`, `end_time` va bo'sh xodimning `staff_id` si bilan qaytariladi. ### Bo'sh slotlarni tekshirish Mijozlar (va siz, API orqali) slotlarni tekshirishi mumkin: ```bash GET /api/booking/{slug}/slots?service_id=1&date=2026-04-01 ``` Yoki oraliq uchun: ```bash GET /api/booking/{slug}/slots/range?service_id=1&start_date=2026-04-01&end_date=2026-04-07 ``` ## Kalendarni ko'rish Tashkilot kalendari barcha xodimlar bo'yicha barcha qabullarni ko'rsatadi: ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Oylik/haftalik kalendar ko'rinishini chizishga mos ravishda, sana bo'yicha guruhlangan qabullarni qaytaradi. # Qabullar bilan ishlash ## Umumiy ma'lumot Qabullar — Bronjoy'ning asosidir. Ushbu qo'llanma xodim/ega nuqtai nazarini qamrab oladi: qabullarni yaratish, ko'rib chiqish, yangilash va ularning butun hayot sikli davomida boshqarish. Mijoz tomonidagi yozilish jarayoni uchun [Yozilish jarayoni](https://docs.bronjoy.com/uz/guides/booking-flow) bo'limiga qarang. ## Qabul holatlari oqimi ```text Draft → Pending → Confirmed → Completed ↓ ↓ Cancelled NoShow ``` | Holat | Ma'nosi | | ----------- | -------------------------------------------------------------- | | `Pending` | Yaratilgan, tasdiq yoki to'lov kutilmoqda | | `Confirmed` | To'lov qabul qilingan yoki xodim tomonidan qo'lda tasdiqlangan | | `Completed` | Xizmat ko'rsatilgan — xodim tomonidan qo'lda belgilanadi | | `Cancelled` | Mijoz yoki xodim tomonidan bekor qilingan | | `NoShow` | Mijoz kelmagan | ## Qabullarni yaratish (xodimlar) Xodimlar mijozlar nomidan qabullar yaratishi mumkin: ```bash POST /api/org/appointments Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "branch_id": 1, "start_time": "2026-04-01T10:00:00Z", "notes": "Regular client, prefers extra pressure" } ``` **Maslahatlar:** - Maxsus istaklari yoki tibbiy jihatlari bo'lgan mijozlar uchun doim `notes` ni to'ldiring - Agar mijoz hali mavjud bo'lmasa, avval uni `POST /api/org/clients` orqali yarating - Xodim yaratgan qabullar sukut bo'yicha `Confirmed` holatida boshlanadi (to'lovni chetlab o'tib) ## Qabullar ro'yxati ### Barcha qabullar ```bash GET /api/org/appointments Authorization: Bearer your-token ``` Sana oralig'i, holat yoki xodim bo'yicha filtrlash: ```bash GET /api/org/appointments?start_date=2026-04-01&end_date=2026-04-30&status=Confirmed&staff_id=3 ``` ### Kutilayotgan qabullar Harakat kutilayotgan (tasdiqlash, to'lov) qabullarni ko'ring: ```bash GET /api/org/appointments/pending ``` Bu ro'yxatni muntazam ko'rib chiqing — uzoq vaqt kutib turgan qabullar to'lov muammolari yoki unutilgan tasdiqlarni anglatishi mumkin. ### Kalendar ko'rinishi ```bash GET /api/org/appointments/calendar?start=2026-04-01&end=2026-04-30 ``` Kalendarni chizishga mos tuzilgan ko'rinishni qaytaradi. Boshqaruv paneli kalendarini shu endpoint orqali ishlating. ## Qabulni yangilash ```bash PUT /api/org/appointments/{appointment} Content-Type: application/json ``` ```json { "notes": "Updated preference: light pressure only", "staff_id": 4 } ``` Qabul yakunlanmagan yoki bekor qilinmagan bo'lsa, undagi ko'pchilik maydonlarni yangilashingiz mumkin. ## Holat o'zgarishlari ### Qabulni tasdiqlash Kutilayotgan qabulni qo'lda tasdiqlang (masalan, to'lov naqd qabul qilingan bo'lsa): ```bash POST /api/org/appointments/{appointment}/submit ``` ### Bekor qilish ```bash POST /api/org/appointments/{appointment}/cancel Content-Type: application/json ``` ```json { "reason": "Staff unavailable due to illness" } ``` Bekor qilganingizda mijoz bildirishnoma oladi. Agar to'lov olingan bo'lsa, pulni qaytarishni alohida boshlang ([To'lovlar](https://docs.bronjoy.com/uz/guides/payments) bo'limiga qarang). ### Vaqtni qayta belgilash ```bash POST /api/org/appointments/{appointment}/reschedule Content-Type: application/json ``` ```json { "start_time": "2026-04-02T11:00:00Z", "staff_id": 3 } ``` Mijozga yangi vaqt haqida xabar beriladi. ## Ommaviy amallar Bir vaqtning o'zida bir nechta qabulni samarali boshqaring: ### Ommaviy yangilash ```bash POST /api/org/appointments/batch-update Content-Type: application/json ``` ```json { "ids": [101, 102, 103], "data": { "status": "Completed" } } ``` Kun oxiridagi qabullarni yakunlangan deb belgilash uchun qulay. ### Ommaviy o'chirish ```bash POST /api/org/appointments/batch-destroy Content-Type: application/json ``` ```json { "ids": [104, 105] } ``` > O'chirish o'rniga bekor qilishni afzal ko'ring. O'chirilgan qabullar tarixda ham, hisobotlarda ham ko'rinmaydi. ## Mijoz haqida izohlar Mijoz profiliga ichki izohlar biriktiring — ular xodimlarga ko'rinadi, mijozlarga esa yo'q: ```bash POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Allergic to certain hair dyes. Always check before service." } ``` Izohlar mijozning qabuli ko'rilganda har safar ko'rsatiladi va xodimlarga tayyorgarlik ko'rishga yordam beradi. ## Eng yaxshi amaliyotlar ### Kundalik ish tartibi 1. **Ertalab** — Kalendar ko'rinishida bugungi qabullarni ko'rib chiqing. Tasdiqlash kerak bo'lgan `Pending` qabullar bor-yo'qligini tekshiring. 2. **Kun davomida** — Xizmat ko'rsatilgach, qabullarni `Completed` deb belgilang. 3. **Kun oxirida** — Kunning qolgan barcha qabullarini yakunlash uchun ommaviy yangilashdan foydalaning. ### Kelmagan mijozlar bilan ishlash Agar mijoz kelmasa, qabulni bekor qilish o'rniga `NoShow` deb belgilang. Bu kelmaganlik bo'yicha ma'lumotlaringizni saqlaydi va qonuniyatlarni aniqlashga yordam beradi. Kelmaganlik holatidagi qabullar bekor qilish sifatida hisoblanmaydi va pul qaytarish mantig'ini ishga tushirmaydi. ### Ortiqcha yozilishning oldini olish Slot kalkulyatori ikki marta band qilishning oldini avtomatik oladi. Biroq: - Qabullarni qo'lda yaratsangiz, `start_time` bilan ehtiyot bo'ling — qo'lda yaratish jarayonida u mavjud yozilishlarga qarshi tekshirilmaydi - Muayyan vaqtga qo'lda qabul yaratishdan oldin doim kalendarni tekshiring ### So'nggi daqiqadagi bekor qilishlar Mijozlar qancha vaqt oldin bekor qila olishini nazorat qilish uchun sozlamalaringizda `cancellation_hours` ni belgilang. Bu muddat o'tgach, mijozlar bekor qilishni baribir so'rashi mumkin, lekin xodimlar uni qo'lda ko'rib chiqishi kerak bo'ladi. ## Hisobotlar va tahlillar ```bash GET /api/org/dashboard ``` Boshqaruv paneli quyidagi asosiy ko'rsatkichlarni qaytaradi: - Bugungi qabullar soni - Shu haftadagi kelgusi qabullar - Daromad xulosasi - So'nggi bekor qilishlar va kelmaganlik holatlari Batafsil tranzaksiya hisobotlari uchun: ```bash GET /api/org/transactions GET /api/org/transactions/summary GET /api/org/transactions/export ``` # Mijozlarni boshqarish ## Umumiy ma'lumot Mijozlar — bu qabulga yoziladigan yakuniy xaridorlar. Bronjoy har bir tashkilot uchun alohida mijozlar bazasini yuritadi — bir odam bir nechta tashkilotda alohida profillar bilan mijoz bo'lishi mumkin. ## Mijoz yaratish Mijozlar birinchi marta qabulga yozilganda avtomatik tarzda yaratiladi. Ularni qo'lda ham yaratishingiz mumkin: ```bash POST /api/org/clients Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "Maria Garcia", "phone": "+998901234567", "email": "maria@example.com", "notes": "New client, referred by Alex" } ``` ## Mijozlar ro'yxati ```bash GET /api/org/clients Authorization: Bearer your-token ``` Qidiruv va filtrlash: ```bash GET /api/org/clients?search=maria&sort=last_appointment_at&direction=desc ``` ## Mijoz profili ```bash GET /api/org/clients/{client} ``` Mijoz profilida quyidagilar mavjud: - Aloqa ma'lumotlari - Qabullar statistikasi (jami, yakunlangan, bekor qilingan, kelmagan) - Oxirgi qabul sanasi - Izohlar ## Qabullar tarixi Mijozning tashkilotingizdagi to'liq qabullar tarixini ko'ring: ```bash GET /api/org/clients/{client}/history ``` Bundan quyidagi hollarda foydalaning: - Mijoz o'tgan qabul haqida so'rash uchun qo'ng'iroq qilganda - Mijozning bekor qilish yoki kelmaslik odatini tekshirayotganingizda - Mijozning afzalliklarini tushunmoqchi bo'lganingizda ## Mijoz izohlari Ichki izohlarni faqat xodimlar ko'radi — mijozlar ularni hech qachon ko'rmaydi. Izohlardan quyidagilarni yozib qo'yish uchun foydalaning: - Afzalliklar va sezgirliklar ("ertalabki qabullarni afzal ko'radi") - Tibbiy jihatlar ("lateksga allergiyasi bor") - Aloqa haqidagi izohlar ("doim qo'ng'iroq qiling, SMS'ga javob bermaydi") ```bash # Add a note POST /api/org/clients/{client}/notes Content-Type: application/json ``` ```json { "note": "Prefers stylist Alex. Very particular about fringe length." } ``` ```bash # View notes GET /api/org/clients/{client}/notes ``` ## Mijozni yangilash ```bash PUT /api/org/clients/{client} Content-Type: application/json ``` ```json { "phone": "+998909876543", "email": "maria.garcia@example.com" } ``` ## Ommaviy amallar ```bash POST /api/org/clients/batch-update Content-Type: application/json ``` ```json { "ids": [10, 11, 12], "data": { "is_vip": true } } ``` ## Sharhlar Mijozlar yakunlangan qabuldan keyin sharh qoldiradi: ```bash GET /api/client/reviews/reviewable Authorization: Bearer client-token ``` ```bash POST /api/client/reviews Authorization: Bearer client-token Content-Type: application/json ``` ```json { "appointment_id": 101, "rating": 5, "comment": "Great service, will book again!" } ``` Mijozlar sharhlarini ko'rish va ularga javob berish (xodimlar tomoni): ```bash GET /api/org/reviews GET /api/org/reviews/stats GET /api/org/reviews/trend ``` Sharhga javob berish: ```bash POST /api/org/reviews/{review}/reply Content-Type: application/json ``` ```json { "reply": "Thank you for your feedback! We're so glad you enjoyed the experience." } ``` **Maslahatlar:** - Barcha sharhlarga, ayniqsa salbiylariga javob bering — bu professionallikni ko'rsatadi - Javoblarni qisqa va samimiy qiling - Salbiy sharhlar bilan bahslashmang; muammoni tan oling va yechimni shaxsiy aloqada taklif qiling ## Yaxshi amaliyotlar - **Mijozlarni hech qachon o'chirmang** — kerak bo'lsa, ularni nofaol qiling. O'chirish qabullar tarixini ham yo'q qiladi. - **Izohlarni yangilab boring** — eskirgan izohlar chalg'itadi. Biror narsa o'zgarsa, izohni yangilang. - **Takrorlanuvchi yozuvlarni qo'lda birlashtiring** — mijoz turli aloqa ma'lumotlari bilan yozilsa, takroriy profillar paydo bo'lishi mumkin. Ularni ism bo'yicha aniqlang va yangilash endpoint'i orqali birlashtiring. - **Kelmaganlar ro'yxatini ko'rib chiqing** — bir necha marta kelmagan mijozlarni belgilab qo'yish mumkin. Bunday mijozlar uchun oldindan to'lovni talab qilishni ko'rib chiqing. # To'lovlar ## Umumiy ma'lumot Bronjoy mijozlar qabulga yozilayotganda to'lovlarni qabul qilishni qo'llab-quvvatlaydi; to'lovlar Stripe Checkout orqali amalga oshiriladi — mijozlar Stripe'ning to'lov sahifasiga yo'naltiriladi, qolgan hamma narsani esa Bronjoy webhook'lar orqali avtomatik bajaradi. Sizga o'zingizning Stripe hisobingiz kerak emas; shunchaki to'lovlarni yoqasiz va o'z qoidangizni belgilaysiz. Buni qanday yoqish haqida [Stripe integratsiyasi](https://docs.bronjoy.com/uz/integrations/stripe) bo'limiga qarang. ## To'lov sozlamalari Har bir tashkilot o'z to'lov qoidasini belgilaydi — to'lov majburiymi, depozitmi yoki to'liq to'lovmi, pulni qaytarish tartibi va eslatmalar. ### Joriy sozlamalarni ko'rish ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ### Qoidangizni yangilash ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` Maydonlarning to'liq tavsifi uchun [Stripe integratsiyasi](https://docs.bronjoy.com/uz/integrations/stripe) bo'limiga qarang. ### To'lovlarni yoqish/o'chirish ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## To'lovlar qanday ishlaydi ### Yozilish paytida Mijoz to'lov talab qilinadigan xizmatga yozilganda: 1. Mijoz xizmat va vaqt oralig'ini tanlaydi 2. Mijoz yozilishni yuboradi 3. Bronjoy qabulni `Pending` holatida yaratadi 4. Stripe Checkout Session yaratiladi 5. Mijoz to'lov uchun Stripe'ga yo'naltiriladi 6. To'lovdan so'ng Stripe webhook yuboradi 7. Bronjoy qabulni tasdiqlaydi va tranzaksiyani yozib qo'yadi ### To'lov turlari | Turi | Qanday ishlaydi | | ----------------- | -------------------------------------------------------------------------- | | **To'liq to'lov** | Mijoz yozilish paytida xizmatning to'liq narxini to'laydi | | **Depozit** | Mijoz belgilangan depozitni to'laydi; qolgan summa qabul paytida to'lanadi | Har bir xizmat uchun sozlanadi: - `prepay_required: true` — yozilish paytida to'lovni yoqadi - `prepay_amount: 50000` — depozit summasi (to'liq to'lov uchun ko'rsatilmaydi) ### To'lov holatlari | Holat | Ma'nosi | | ----------- | ------------------------------------------------------------ | | `Pending` | To'lov boshlandi, mijozning harakati kutilmoqda | | `Completed` | To'lov qabul qilindi | | `Cancelled` | Checkout sessiyasi muddati tugadi yoki to'lov amalga oshmadi | | `Refunded` | To'lov xodim tomonidan qaytarildi | ## Tranzaksiyalarni boshqarish ### Tranzaksiyalarni ko'rish ```bash GET /api/org/transactions Authorization: Bearer your-owner-token ``` Sana, holat yoki xizmat bo'yicha filtrlash: ```bash GET /api/org/transactions?start_date=2026-03-01&end_date=2026-03-31&status=completed ``` ### Tranzaksiyalar xulosasi ```bash GET /api/org/transactions/summary ``` Berilgan davr uchun yakunlangan, qaytarilgan va kutilayotgan tranzaksiyalar bo'yicha umumiy summalarni qaytaradi. ### Ma'lumotlarni eksport qilish ```bash GET /api/org/transactions/export?start_date=2026-03-01&end_date=2026-03-31 ``` ## Pulni qaytarish Yakunlangan tranzaksiya bo'yicha pulni qaytarish: ```bash POST /api/org/payments/{transaction}/refund Authorization: Bearer your-owner-token ``` Pul Stripe orqali qaytariladi. Tranzaksiya holati `Refunded` ga o'zgaradi va mijozga xabar beriladi. ### Qachon pul qaytariladi - **Mijoz qoida doirasida bekor qilsa** — bekor qilish muddati o'tmagan bo'lsa, to'liq summani qaytaring - **Xizmat ko'rsatilmagan bo'lsa** — ishonchni saqlash uchun o'zingiz tashabbus bilan qaytaring - **Qisman norozilik** — qisman qaytarishni ko'rib chiqing (to'g'ridan-to'g'ri Stripe Dashboard'da bajariladi) ## Mijoz tomonidan to'lov Mijozlar to'lovlar bilan quyidagi endpoint'lar orqali ishlaydi: ```bash # Check if payment is required GET /api/client/payments/appointments/{appointment}/requirement # Initiate payment POST /api/client/payments/appointments/{appointment}/pay # View payment history GET /api/client/payments/appointments/{appointment}/transactions # Check transaction status GET /api/client/payments/transactions/{transaction} ``` ## Yaxshi amaliyotlar - **Avval Stripe test rejimida sinab ko'ring** — ishonch hosil qilguningizcha `pk_test_` / `sk_test_` kalitlaridan foydalaning - **Depozit summasini oqilona belgilang** — juda yuqori summa yozilishlarni kamaytiradi, juda past summa esa kelmaslikdan himoya qilmaydi. Odatda xizmat narxining 20–50% qismi olinadi - **To'lovni faqat kelmaslik ko'p bo'ladigan xizmatlar uchun yoqing** — har bir xizmat oldindan to'lovni talab qilmaydi. Uni kelmaslik sizga vaqt va pul yo'qotishiga sabab bo'ladigan xizmatlar uchun tanlab yoqing - **Tranzaksiyalarni har hafta ko'rib chiqing** — amalga oshmagan to'lovlar va muddati tugagan sessiyalarni erta aniqlang - **Pulni tezda qaytaring** — kechiktirilgan qaytarishlar chargeback'larga olib keladi va ishonchni yo'qotadi - **Click.uz yoki Payme.uz'ni sozlamang** — bu to'lov provayderlari yuridik shaxs ro'yxatdan o'tkazilgunicha to'xtatib qo'yilgan # Navbat ## Umumiy ma'lumot Xizmat uchun barcha vaqt oraliqlari band bo'lganda, mijozlar navbatga yozilishi mumkin. Agar qabul bekor qilinsa, navbatdagi keyingi odamga bu slot taklif qilinadi. Bronjoy navbatni, takliflarni va ularning muddatini avtomatik boshqaradi. ## Bu qanday ishlaydi ```text Client joins waitlist ↓ [Waiting] ← position in queue ↓ Slot opens (cancellation) ↓ [Offered] ← time-limited offer ↙ ↘ [Booked] [Expired/Declined] ↓ Next person offered ``` ### Holatlar | Holat | Ma'nosi | | ----------- | -------------------------------------------------------------------- | | `Waiting` | Navbatda, slot bo'shashini kutmoqda | | `Offered` | Slot taklif qilindi — mijozda qabul qilish uchun cheklangan vaqt bor | | `Booked` | Taklif qabul qilindi, qabul yaratildi | | `Expired` | Mijoz taklif muddati tugagunicha javob bermadi | | `Cancelled` | Mijoz yoki xodim yozuvni bekor qildi | ## Xodimlar uchun ish jarayoni ### Navbatni ko'rish ```bash GET /api/org/waitlist Authorization: Bearer your-token ``` Xizmat, holat yoki afzal ko'rilgan sana bo'yicha filtrlash: ```bash GET /api/org/waitlist?service_id=1&status=Waiting&preferred_date_from=2026-04-01 ``` Mijoz ismi, elektron pochtasi yoki telefon raqami bo'yicha qidirish: ```bash GET /api/org/waitlist?search=maria ``` ### Mijozni navbatga qo'shish ```bash POST /api/org/waitlist Authorization: Bearer your-token Content-Type: application/json ``` ```json { "client_id": 42, "service_id": 1, "staff_id": 3, "preferred_date": "2026-04-01", "preferred_time_slot": "morning", "notes": "Only available before noon" } ``` `preferred_time_slot` variantlari: `morning`, `afternoon`, `evening` ### Slotni qo'lda taklif qilish Qachonki bo'sh joy paydo bo'lishini bilsangiz: ```bash POST /api/org/waitlist/{waitlistEntry}/offer Authorization: Bearer your-token Content-Type: application/json ``` ```json { "start_time": "2026-04-01T10:00:00Z" } ``` Yozuv `Offered` holatiga o'tadi. Mijozga xabar beriladi va uni qabul qilish uchun cheklangan vaqt beriladi (standart: 2 soat). ### Navbat yozuvini bekor qilish ```bash POST /api/org/waitlist/{waitlistEntry}/cancel Authorization: Bearer your-token ``` ### Xulosani ko'rish Yozuvlar sonini holatlar bo'yicha oling: ```bash GET /api/org/waitlist/summary ``` ## Mijozlar uchun ish jarayoni Mijozlar navbat bilan yozilish jarayoni orqali ishlaydi: ### Navbatga yozilish Ommaviy yozilish sahifasidan (mehmonlar va tizimga kirgan mijozlar uchun bir xil ishlaydi, xuddi yozilishdek): ```bash POST /api/client/booking/{slug}/waitlist Content-Type: application/json ``` ```json { "service_id": 1, "preferred_date": "2026-04-01", "preferred_time_slot": "afternoon", "name": "Maria Garcia", "phone": "+998901234567" } ``` ### Navbat yozuvlarini ko'rish ```bash GET /api/client/waitlist Authorization: Bearer client-token ``` ### Taklifni qabul qilish Slot taklif qilinganda: ```bash POST /api/client/waitlist/{waitlistEntry}/accept Authorization: Bearer client-token ``` Bu taklif qilingan vaqtga qabul yaratadi. Navbat yozuvi `Booked` holatiga o'tadi. ### Taklifni rad etish ```bash POST /api/client/waitlist/{waitlistEntry}/decline Authorization: Bearer client-token ``` Slot navbatdagi keyingi odamga taklif qilinadi. ### Kutishni bekor qilish ```bash POST /api/client/waitlist/{waitlistEntry}/cancel Authorization: Bearer client-token ``` ### Navbat uzunligini tekshirish (ommaviy) Autentifikatsiya talab qilinmaydi — yozilish sahifasida ko'rsating: ```bash GET /api/booking/{slug}/waitlist/count?service_id=1&date=2026-04-01 ``` ## Avtomatik taklif Yoqilgan bo'lsa, qabul bekor qilinganda Bronjoy slotni navbatdagi keyingi odamga avtomatik taklif qiladi. Tashkilot sozlamalarida yoqing: | Sozlama | Tavsif | Standart | | --------------------------------- | -------------------------------------------------- | -------- | | `waitlist_auto_promote` | Bekor qilinganda slotlarni avtomatik taklif qilish | `false` | | `waitlist_promotion_window_hours` | Taklif muddati tugagunicha necha soat qolishi | `2` | Avtomatik taklif yoqilganda: 1. Qabul bekor qilinadi 2. Bronjoy o'sha xizmat/sana uchun keyingi `Waiting` yozuvini topadi 3. Slot avtomatik taklif qilinadi 4. Agar taklif muddati tugasa, keyingi odamga taklif qilinadi ## Yaxshi amaliyotlar - **Ommabop xizmatlar uchun avtomatik taklifni yoqing** — u bekor qilingan slotlarni xodimlar aralashuvisiz to'ldiradi - **Taklif muddatini oqilona belgilang** — o'sha kunlik yozilishlar uchun 2 soat mos keladi; oldindan yozilishlar uchun 12–24 soatgacha uzaytiring - **Navbat xulosasini kuzatib boring** — biror xizmat uchun uzun navbat ko'proq xodim yoki vaqt oralig'i kerakligini bildiradi - **Slot taklif qilayotganda izoh qo'shing** — taklif qilinayotgan aniq vaqtni ko'rsating, shunda mijozlar taklifni to'g'ri tushunadi - **preferred\_time\_of\_day dan foydalaning** — bu mijozlarni ular haqiqatan qabul qiladigan slotlarga moslashtirishga yordam beradi va rad etishlar sonini kamaytiradi # Referal dasturi ## Umumiy ma'lumot Bronjoy'da ikkita alohida referal tizimi mavjud: | | Kim | Mukofot | | ---------------------- | ---------------------------------------- | ------------------------------------------------ | | **Biznes referallari** | Bir tashkilot boshqasini taklif qiladi | Ikkala tomon ham bepul Avtopilot kunlarini oladi | | **Ambassador dasturi** | Istalgan shaxs bizneslarni taklif qiladi | Biznes to'lagan summadan naqd komissiya | ## Biznes referallari Har bir tashkilot ulashish mumkin bo'lgan referal kodini oladi. Siz taklif qilgan biznes ro'yxatdan o'tib, birinchi qabulini rasmiylashtirganda, ikkalangiz ham bepul [Avtopilot](https://docs.bronjoy.com/uz/for-owners/plans-and-billing) kunlarini olasiz. ### Referal havolangizni olish ```bash GET /api/org/referrals/stats Authorization: Bearer your-token X-Organization-ID: 1 ``` ```json { "data": { "referral_code": "ABC12345", "referral_link": "https://bronjoy.com/onboarding/create?ref=ABC12345", "reward_days": 30, "total_referred": 3, "completed": 2 } } ``` Havolani ulashing — u orqali o'z tashkilotini yaratgan har bir kishi avtomatik ravishda sizga biriktiriladi. ### Referallaringizni kuzatish ```bash GET /api/org/referrals Authorization: Bearer your-token X-Organization-ID: 1 ``` Siz taklif qilgan tashkilotlar va ularning holatini ko'rsatadi. ### Sizni kim taklif qilganini tekshirish ```bash GET /api/org/referrals/incoming ``` ### Yangi kod olish Agar kodingiz siz istamagan joyga tarqalib ketgan bo'lsa, uni qaytadan yarating — eski kod ishlamay qoladi: ```bash POST /api/org/referrals/regenerate-code Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Mukofot faqat ro'yxatdan o'tish uchun emas, balki taklif qilingan tashkilot birinchi qabulini rasmiylashtirgandan keyin hisoblanadi — bu mukofotni haqiqatan ishlay boshlagan bizneslarga bog'lab turadi. ## Ambassador dasturi Bundan alohida, istalgan shaxs — faqat biznes egalari emas — Bronjoy ambassadori bo'lishi mumkin: bizneslarni ro'yxatdan o'tishga taklif qiling va ular obunani davom ettirgan vaqt davomida ularning obuna to'lovlaridan doimiy komissiya oling. ```bash GET /api/client/referral Authorization: Bearer client-token ``` Ambassador referal kodingizni, ulashish havolangizni va daromadlar xulosasini qaytaradi. Undan keyin: ```bash GET /api/client/referral/businesses # businesses you've referred GET /api/client/referral/commissions # your earnings ledger ``` To'lov usulini ulash va to'lovni so'rash API'da qo'llab-quvvatlanadi (`POST /api/client/referral/payout-methods`, `POST /api/client/referral/payouts`) — agar buni sozlamoqchi bo'lsangiz, avval qo'llab-quvvatlash xizmatiga murojaat qilib, hududingizda to'lovlar ochiqligini aniqlang. # Stripe ## Umumiy ma'lumot Bronjoy karta orqali to'lovlarni sizning nomingizdan Stripe Checkout orqali qayta ishlaydi — sizga Stripe hisobini yaratish yoki ulash kerak emas. Siz shunchaki tashkilotingiz uchun to'lovlarni yoqasiz va siyosatingizni belgilaysiz: depozit yoki to'liq to'lov talab qilinishi hamda qaytarishlar va eslatmalar qanday ishlashi. ## To'lovlarni yoqish ```bash GET /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` ```bash POST /api/org/payment-settings Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "provider": "stripe", "is_enabled": true, "prepay_policy": "partial", "prepay_percentage": 30, "refund_on_cancellation": true, "refund_deadline_hours": 24, "auto_remind_unpaid": true, "remind_after_minutes": 60 } ``` | Maydon | Tavsif | | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | | `provider` | `stripe` (Click, Payme va Uzum mavjud, lekin hali ochilmagan — [To'lovlar](https://docs.bronjoy.com/uz/guides/payments) bo'limiga qarang) | | `is_enabled` | Ushbu tashkilot uchun to'lov yig'ishni yoqish yoki o'chirish | | `prepay_policy` | `none`, `partial` (depozit) yoki `full` | | `prepay_percentage` | Xizmat narxining depozit foizi, `prepay_policy` `partial` bo'lganda talab qilinadi | | `refund_on_cancellation` | To'langan qabul belgilangan muddat ichida bekor qilinganda pulni avtomatik qaytarish | | `refund_deadline_hours` | Qabuldan necha soat oldin pul qaytarish hali ham avtomatik bo'ladi | | `auto_remind_unpaid` | To'lanmagan kutilayotgan yozilishlar uchun eslatma yuborish | | `remind_after_minutes` | To'lanmagan yozilish bo'yicha birinchi eslatmagacha kechikish | Sozlamalaringizni yo'qotmasdan uni o'chirib qo'ying: ```bash POST /api/org/payment-settings/{paymentSetting}/toggle ``` ## Xizmat bo'yicha maxsus sozlamalar To'lov xatti-harakatini har bir xizmat uchun alohida belgilash ham mumkin — alohida xizmatlardagi `prepay_required` va `prepay_amount` uchun [Xizmatlar va jadval](https://docs.bronjoy.com/uz/guides/services-scheduling) bo'limiga qarang. ## Bu qanday ishlaydi 1. Mijoz to'lov talab qiladigan xizmatga yoziladi 2. Bronjoy qabulni `Pending` holatida yaratadi 3. Talab qilingan summa uchun Stripe Checkout Session yaratiladi 4. Mijoz Stripe'ning hosting qilingan to'lov sahifasiga yo'naltiriladi 5. To'lov yakunlangach, Stripe Bronjoy'ga xabar beradi 6. Bronjoy qabulni tasdiqlaydi va tranzaksiyani qayd etadi Hodisa tafsilotlari uchun [Webhooklar](https://docs.bronjoy.com/uz/integrations/webhooks) bo'limiga, tranzaksiyalar va pul qaytarishlarni kundalik boshqarish uchun esa [To'lovlar](https://docs.bronjoy.com/uz/guides/payments) bo'limiga qarang. # MCP integratsiyasi ## Umumiy ma'lumot Bronjoy [MCP (Model Context Protocol)](https://modelcontextprotocol.io/){rel=""nofollow""} tilida gaplashadi, shuning uchun AI yordamchisi — Claude, ChatGPT yoki MCP'ni qo'llab-quvvatlaydigan boshqa har qanday dastur — muassasani topishi, u haqida savollarga javob berishi va qabulga yozishi mumkin. Ikki xil auditoriya uchun **ikkita server** bor: | | [Marketplace serveri](https://docs.bronjoy.com/#marketplace-serveri) | [Tashkilot serveri](https://docs.bronjoy.com/#tashkilot-serveri) | | ----------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------- | | **Kim uchun** | Hamma uchun. Foydalanuvchilar, dasturchilar, AI yordamchilar | Bitta tashkilotning o'z yordamchisi uchun | | **Qamrovi** | Butun ommaviy katalog | Bitta tashkilot | | **Avtorizatsiya** | Kerak emas | Bearer token | | **Manzil** | `https://api.bronjoy.com/api/mcp` | `https://api.bronjoy.com/api/mcp/organization/{id}` | | **Narxi** | Bepul | Pullik tarif imkoniyati | Agar siz yordamchingiz orqali sartaroshga yozilmoqchi bo'lgan odam bo'lsangiz — sizga marketplace serveri kerak. Agar siz biznes bo'lsangiz va o'z yordamchingiz kalendaringizni yuritishini xohlasangiz — sizga tashkilot serveri kerak. --- ## Marketplace serveri Ommaviy katalog MCP server ko'rinishida. Akkauntsiz, tokensiz, ro'yxatdan o'tishsiz — u Bronjoy sayti allaqachon har qanday brauzerga ko'rsatadigan narsani, ustiga tasdiqlash orqali yozilish yo'lini beradi. ### Ulanish ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy https://api.bronjoy.com/api/mcp ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp" } } } ``` ```txt [Istalgan MCP mijoz] Transport: Streamable HTTP Manzil: https://api.bronjoy.com/api/mcp Avtorizatsiya: kerak emas ``` :: Sozlash shu bilan tugadi. Yordamchingizdan *«Toshkentdan sartaroshxona top»* deb so'rang — u quyidagi vositalardan foydalanadi. ### Vositalar Oltita vosita — yozilish suhbati ularni qanday tartibda ishlatsa, shu tartibda. #### search-venues Katalogdan kalit so'z, shahar va toifa bo'yicha qidirish. Qolgan barcha vositalar shu qaytaradigan `slug`ni oladi. | Parametr | Turi | Majburiy | Tavsif | | --------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `query` | string | Yo'q | Erkin matn — nomi, xizmat (`стрижка`, `soch olish`) yoki mo'ljal. Lotin va kirill yozuvida ham ishlaydi | | `city` | string | Yo'q | Shahar slug'i yoki nomi — `tashkent`, `samarkand`, `Бухара` | | `category` | string | Yo'q | Toifa slug'i — `barber`, `dental`, `car-wash` | | `bookable_only` | boolean | Yo'q | Faqat onlayn yozilish mumkin bo'lgan muassasalarni qaytarish. Foydalanuvchi joylar haqida eshitishni emas, *yozilishni* xohlaganda qo'ying | | `limit` | integer | Yo'q | 1–20, standart 5 | ```json { "venues": [ { "name": "Britva Barbershop", "slug": "demo-barber", "url": "https://bronjoy.com/tashkent/barber/demo-barber", "city": "Tashkent", "district": "Юнусабадский район", "address": "проспект Амира Темура, 15", "specialty": "Men's haircuts and beard care", "rating": 4.9, "reviews": 7, "is_bookable": true, "next_available": "Tomorrow 09:00", "price_from": 50000, "has_phone": true } ], "returned": 1, "total_matches": 1 } ``` #### get-venue Bitta muassasaning to'liq ommaviy profili: manzil, ish vaqti, xizmatlar, qulayliklar, to'lov usullari, sayt, reyting. Telefon raqami bu yerda **niqoblangan** holda qaytadi. | Parametr | Turi | Majburiy | Tavsif | | -------- | ------ | -------- | ------------------ | | `slug` | string | Ha | `search-venues`dan | ```json { "name": "Britva Barbershop", "city": "Ташкент", "address": "проспект Амира Темура, 15", "is_bookable": true, "website": "https://britva.uz", "masked_phone": "+998 71 ***-**-70", "opening_hours": { "monday": { "open": "09:00", "close": "19:00" }, "saturday": { "open": "08:00", "close": "18:00" }, "sunday": { "open": null, "close": null } }, "service_tags": ["Haircuts", "Beard shaping", "Royal shave", "Styling"], "price_from": 50000, "price_to": 110000, "rating": "4.90", "reviews": 7, "booking": "Online booking is available — continue with check-availability." } ``` #### reveal-phone Muassasaning haqiqiy telefon raqami. Ataylab `get-venue`dan ajratilgan va **daqiqasiga 10 marta** bilan cheklangan — uni foydalanuvchi haqiqatan tanlagan muassasa uchun so'rang, qidiruv natijalari bo'ylab to'p-to'p emas. | Parametr | Turi | Majburiy | Tavsif | | -------- | ------ | -------- | ------------------ | | `slug` | string | Ha | `search-venues`dan | ```json { "name": "Britva Barbershop", "phone": "+998 71 200-70-70", "url": "https://bronjoy.com/tashkent/barber/demo-barber" } ``` #### check-availability Yozilish mumkin bo'lgan xizmatlar va bo'sh vaqtlar. Avval `service_id`**siz** chaqiring — xizmatlar va narxlar ro'yxatini olasiz, keyin biror `service_id` **bilan** qayta chaqiring — o'sha xizmatning bo'sh vaqtlarini olasiz. | Parametr | Turi | Majburiy | Tavsif | | ------------ | ------- | -------- | ------------------------------------------------------------------- | | `slug` | string | Ha | `search-venues`dan | | `date` | string | Ha | `YYYY-MM-DD`, bugun yoki 30 kungacha oldinga | | `service_id` | integer | Yo'q | Birinchi chaqiruvda xizmatlar ro'yxatini olish uchun tashlab keting | ```json { "date": "2026-09-10", "service": { "service_id": 1, "name": "Мужская стрижка", "duration_minutes": 30, "price": "80000.00", "currency": "UZS" }, "slots": [ { "start_time": "2026-09-10T09:00:00+05:00", "end_time": "2026-09-10T09:30:00+05:00", "staff_id": 1, "staff_name": "Азиз Рахимов" } ] } ``` `start_time` — bu aynan `book-appointment` kutadigan qiymat. Uni yaxlitlamang va o'zgartirmang. #### request-booking-code Foydalanuvchining o'z pochtasiga yoki telefoniga 6 xonali kod yuboradi. | Parametr | Turi | Majburiy | Tavsif | | -------- | ------ | -------------- | --------------------------------------- | | `slug` | string | Ha | Yozilayotgan muassasa | | `email` | string | Ikkisidan biri | Foydalanuvchi pochtasi | | `phone` | string | Ikkisidan biri | Foydalanuvchi telefoni, `+998901234567` | ::warning **Yordamchi kodni hech qachon olmaydi.** Kod foydalanuvchining o'z pochtasiga yoki telefoniga boradi, foydalanuvchi esa uni aytib beradi. Mana shu asosiy nuqta: bu kontakt yozilayotgan odamniki ekanini isbotlaydi, shuning uchun biznesga hech kim javob bermaydigan raqamlardan yozuvlar tushmaydi. :: Kod **5 daqiqa** amal qiladi va bitta yozuvga yetadi. Yuborishlar ham jo'natuvchi, ham qabul qiluvchi bo'yicha cheklangan — takror-takror chaqirmang. #### book-appointment Yozuvni yaratadi. | Parametr | Turi | Majburiy | Tavsif | | ------------------- | ------- | -------------- | ------------------------------------------------------- | | `slug` | string | Ha | Muassasa | | `service_id` | integer | Ha | `check-availability`dan | | `start_time` | string | Ha | Bo'sh vaqtdagi aniq `start_time` | | `name` | string | Ha | Foydalanuvchi ismi — biznes uni shu ko'rinishda ko'radi | | `verification_code` | string | Ha | Foydalanuvchi aytgan 6 xona | | `email` / `phone` | string | Ikkisidan biri | Kod yuborilgan kontaktning o'zi | | `notes` | string | Yo'q | 500 belgigacha | Yozuv **pending** holatida yaratiladi — biznes uni hali tasdiqlashi kerak. Foydalanuvchiga so'rov yuborilgani haqida ayting, kafolatlangani haqida emas. Agar muassasa oldindan to'lov olsa, javobda foydalanuvchi ochishi kerak bo'lgan `payment_url` keladi. ### Yozilish jarayoni ```text 1. search-venues → bookable_only: true 2. check-availability → xizmatni, keyin vaqtni tanlang 3. request-booking-code → kod sizga emas, foydalanuvchiga boradi 4. foydalanuvchidan kodni so'rang 5. book-appointment → o'sha kod bilan ``` ### Ikki xil muassasa Har bir natijada `is_bookable` maydoni bor va u keyin nima taklif qilishingizni belgilaydi: - **`is_bookable: true`** — onlayn yozilishga sozlangan. Yuqoridagi jarayon ishlaydi. - **`is_bookable: false`** — ma'lumotnoma kartochkasi. Haqiqiy manzil, haqiqiy ish vaqti, ko'pincha xizmatlar ro'yxati va telefon bor, lekin **onlayn yozilish yo'q**. Shu ma'lumotlar asosida javob bering va telefon raqamini taklif qiling. ::caution Hozircha katalogning katta qismi ikkinchi turdagi. Hamma joyga yozilsa bo'ladi deb o'ylagan yordamchi Bronjoy bajara olmaydigan va'dani beradi: foydalanuvchi yozilishni xohlaganda `bookable_only: true` uzating va qayerga qo'ng'iroq qilish kerakligini ochiq ayting. :: ### Ma'lumotni qanday o'qish kerak - **Nomlar, xizmatlar va manzillar rus yoki o'zbek tilida.** Foydalanuvchi taksi haydovchisiga ko'rsatadigan manzilni tarjima qilmang. - **Narxlar o'zbek so'mida (UZS).** Ko'p kartochkalarda narx umuman yo'q. `от 300000 сум` — «300 000 so'mdan» degani. - **Vaqt muassasaning mahalliy vaqt mintaqasida**, qiymatida siljishi bilan birga keladi. - **Qidiruv natijalaridagi reytinglar manba ma'lumotnomasidan olingan**, Bronjoy sharhlaridan emas. ### Cheklovlar | Qamrov | Cheklov | | ---------------------- | ----------------------------------------------------------------- | | Barcha so'rovlar | Bir mijozga daqiqasiga 30 ta | | `reveal-phone` | Bir mijozga daqiqasiga 10 ta | | `request-booking-code` | Bir mijozga soatiga 10 ta, ustiga qabul qiluvchi bo'yicha cheklov | Cheklov oshib ketsa, necha soniya kutish kerakligi ko'rsatilgan xato qaytadi. --- ## Tashkilot serveri Egasi o'z yordamchisini ulaydigan, alohida tashkilot uchun yopiq server. U **shu tashkilotning** kalendarini yuritadi: xizmatlar, bo'sh vaqtlar, yozuvlar va bekor qilishlar. Bu pullik tarif imkoniyati va token talab qiladi. ### 1. Token yarating Provayder paneli orqali yoki API orqali: ```bash POST /api/org/ai/tokens Authorization: Bearer your-staff-token Content-Type: application/json ``` ```json { "name": "Claude Desktop", "expires_in_days": 90 } ``` Javob: ```json { "token": "3|AbCdEf...", "mcp_endpoint": "https://api.bronjoy.com/api/mcp/organization/1", "expires_at": "2026-06-23T12:00:00Z", "instructions": "Use this token in the Authorization header: Bearer " } ``` > Tokenni darhol saqlang — u faqat bir marta ko'rsatiladi. ### 2. AI mijozini ulang ::code-group ```bash [Claude Code] claude mcp add --transport http bronjoy-org \ https://api.bronjoy.com/api/mcp/organization/1 \ --header "Authorization: Bearer 3|AbCdEf..." ``` ```json [Claude Desktop] { "mcpServers": { "bronjoy": { "url": "https://api.bronjoy.com/api/mcp/organization/1", "headers": { "Authorization": "Bearer 3|AbCdEf..." } } } } ``` ```txt [Istalgan MCP mijoz] Transport: Streamable HTTP Manzil: https://api.bronjoy.com/api/mcp/organization/{id} Avtorizatsiya: Authorization: Bearer {token} ``` :: ### Vositalar #### list-services Yozilish mumkin bo'lgan barcha xizmatlarni narxi va davomiyligi bilan ro'yxatlaydi. Xizmat ID'larini bilish uchun shundan boshlang. **Parametrlar:** yo'q ```json { "services": [ { "id": 1, "name": "Haircut", "description": "Classic haircut with styling", "duration_minutes": 30, "price": "25.00", "currency": "USD", "category": "Hair Services" } ], "total": 1 } ``` #### search-availability Muayyan xizmat va sana uchun bo'sh vaqtlarni topadi. | Parametr | Turi | Majburiy | Tavsif | | ------------ | ------- | -------- | -------------------------------------------- | | `service_id` | integer | Ha | Xizmat ID (`list-services`dan) | | `date` | string | Ha | `YYYY-MM-DD`, bugun yoki 30 kungacha oldinga | | `staff_id` | integer | Yo'q | Muayyan xodim | ```json { "date": "2026-03-26", "service": "Haircut", "timezone": "Asia/Tashkent", "available_times": ["09:00", "10:00", "14:30", "15:00"], "total_found": 10, "showing": 4, "note": "Times are in H:i format (24-hour) in the organization timezone." } ``` #### create-appointment Mijoz uchun yozuv yaratadi. | Parametr | Turi | Majburiy | Tavsif | | -------------- | ------- | -------- | --------------------------------------------------- | | `client_name` | string | Ha | Mijozning to'liq ismi (2–100 belgi) | | `client_phone` | string | Ha | Xalqaro formatdagi telefon (`+998901234567`) | | `service_id` | integer | Ha | Xizmat ID | | `date` | string | Ha | `YYYY-MM-DD` | | `time` | string | Ha | `HH:MM`, 24 soatlik format | | `staff_id` | integer | Yo'q | Muayyan xodim (ko'rsatilmasa avtomatik tayinlanadi) | | `branch_id` | integer | Yo'q | Filial | | `notes` | string | Yo'q | 500 belgigacha | ```json { "success": true, "appointment_id": 123, "message": "Appointment booked for John Doe on 2026-03-26 at 14:30." } ``` #### check-appointment Telefon raqami bo'yicha mavjud yozuvlarni qidiradi. | Parametr | Turi | Majburiy | Tavsif | | ---------------- | ------- | -------- | ------------------------------------------------------- | | `client_phone` | string | Ha | Xalqaro formatdagi telefon | | `appointment_id` | integer | Yo'q | Muayyan yozuv (ko'rsatilmasa — barcha kelgusi yozuvlar) | Bitta yozuvni yoki shu raqam uchun 5 tagacha kelgusi yozuvni qaytaradi. #### cancel-appointment Mavjud yozuvni bekor qiladi. Mijoz telefoni yozuvdagi bilan mos kelishi shart. | Parametr | Turi | Majburiy | Tavsif | | ---------------- | ------- | -------- | --------------------------------- | | `appointment_id` | integer | Ha | Yozuv ID | | `client_phone` | string | Ha | Yozuvdagi bilan mos kelishi kerak | | `reason` | string | Yo'q | 500 belgigacha | ### Resurslar #### organization://profile Tashkilot profili — xizmatlar, xodimlar, filiallar, vaqt mintaqasi va valyuta. AI mijozga vositalarni alohida chaqirmasdan kontekstni tushunish imkonini beradi. ### Promptlar #### booking-assistant Yozilish suhbatini boshlaydigan tizim prompti, tavsiya etilgan jarayon bo'yicha ko'rsatmalar bilan. ### Tavsiya etilgan jarayon ```text 1. list-services → Nima borligini ko'rsatish 2. search-availability → Tanlangan xizmat uchun bo'sh vaqtlarni topish 3. Foydalanuvchi bilan tasdiqlash → Vaqtni odam tanlasin 4. create-appointment → Yozish ``` Bekor qilish uchun: ```text 1. check-appointment → Telefon bo'yicha yozuvni topish 2. Foydalanuvchi bilan tasdiqlash → Qaysi birini bekor qilish kerak? 3. cancel-appointment → Bekor qilish ``` ### Cheklovlar | Qamrov | Cheklov | | --------------- | --------------------- | | Bir tokenga | Daqiqasiga 60 so'rov | | Bir tashkilotga | Daqiqasiga 120 so'rov | Cheklov oshib ketsa `429 Too Many Requests` qaytadi. ### Xavfsizlik - Har bir token **bitta tashkilotga** bog'langan — u boshqa tashkilot ma'lumotlariga yeta olmaydi - Tokenlar belgilangan kundan keyin muddati tugaydi (standart 90, maksimum 365) - Server **faqat yozuvlar bilan** ishlaydi — ichki boshqaruv endpointlari, moliyaviy ma'lumotlar va xodim sozlamalarisiz - Telefon raqami tekshirish va bekor qilishda mijozni tasdiqlaydi - Barcha amallar audit uchun jurnalga yoziladi ### Muammolarni hal qilish | Muammo | Yechim | | ------------------------- | ----------------------------------------------------------------- | | `401 Unauthorized` | Token muddati tugagan yoki yaroqsiz — yangisini yarating | | `403 Forbidden` | Tokenda bu tashkilotga ruxsat yo'q | | `429 Too Many Requests` | Cheklov oshib ketdi — kutib, qayta urinib ko'ring | | `Feature not available` | Bu tashkilot uchun MCP kirish yoqilmagan | | Bo'sh vaqtlar qaytmayapti | Xodim jadvallari kiritilmagan yoki xizmatga xodim biriktirilmagan | # To'lov webhooklari ## Umumiy ma'lumot Bronjoy to'lovlarni sizning nomingizdan qayta ishlaydi ([Stripe](https://docs.bronjoy.com/uz/integrations/stripe) bo'limiga qarang), shuning uchun siz hech qachon webhookni o'zingiz sozlamaysiz — bu sahifa shunchaki mijozning to'lov qilishi va uning qabuli tasdiqlanishi orasida sahna ortida nima sodir bo'lishini tushuntiradi. ## To'lov yakunlanganda nima bo'ladi 1. To'lov provayderi Bronjoy'ga checkout muvaffaqiyatli o'tgani, muddati tugagani yoki pul qaytarilgani haqida xabar beradi 2. Tranzaksiya yozuvi `Completed`, `Cancelled` yoki `Refunded` holatiga yangilanadi 3. Agar qabul to'lovni kutayotgan bo'lsa, u avtomatik tasdiqlanadi 4. Mijoz va xodim tasdiqlash/bekor qilish bildirishnomalarini oladi Bularning barchasi mijoz checkoutni yakunlaganidan keyin bir-ikki soniya ichida sodir bo'ladi — doimiy so'rov yuborish shart emas. Natijani o'z tomoningizdan [tranzaksiyalar](https://docs.bronjoy.com/uz/guides/payments#managing-transactions) orqali yoki qabul holati orqali kuzatib boring. ## Provayderlar | Provayder | Holat | | ------------ | ------------------------------------------------------------------------------------------------ | | **Stripe** | Faol — [Stripe integratsiyasi](https://docs.bronjoy.com/uz/integrations/stripe) bo'limiga qarang | | **Click.uz** | Yuridik shaxs ro'yxatdan o'tguniga qadar to'xtatilgan | | **Payme.uz** | Yuridik shaxs ro'yxatdan o'tguniga qadar to'xtatilgan | Click va Payme uchun barcha summalar UZS'da qayta ishlanadi; Stripe summalari esa tranzaksiyada sozlangan valyutaga bog'liq. # Google Calendar ## Umumiy ma'lumot Bronjoy xodimlar qabullarini sinxron holda saqlash uchun Google Calendar bilan integratsiyalashadi. Ikkita sinxronizatsiya rejimi mavjud: | Rejim | Yo'nalish | Qanday ishlaydi | | ------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------- | | **Google Calendar sinxronizatsiyasi** | Ikki tomonlama | OAuth ulanishi; qabullarni Google'ga yuboradi, tashqi hodisalarni olib vaqt oralig'larini bandlaydi | | **iCal tasmasi** | Bir tomonlama (o'qish) | Istalgan kalendar ilovasidan obuna bo'ling; faqat o'qish uchun, avtomatik yangilanadi | ## Google Calendar sinxronizatsiyasi ### Ulanish 1. Avtorizatsiya URL'ini oling: ```bash GET /api/org/calendar/auth-url?provider=google Authorization: Bearer your-token ``` :brGoogle OAuth rozilik URL'ini qaytaradi. Xodim uni brauzerida ochadi. 2. Ruxsat berilgandan so'ng Google Bronjoy'ga qaytadan yo'naltiradi. Ulanish avtomatik yaratiladi. 3. Ulanishni tekshiring: ```bash GET /api/org/calendar/connections Authorization: Bearer your-token ``` ### Sinxronizatsiya xatti-harakati Ulangandan so'ng Bronjoy ikkala yo'nalishda sinxronlaydi: **Yuborish (Bronjoy → Google):** - Yangi qabullar Google Calendar hodisalari sifatida yaratiladi - Qayta belgilangan qabullar hodisani yangilaydi - Bekor qilingan qabullar hodisani o'chiradi - Hodisa tavsifi xizmat nomi, mijoz ma'lumotlari va izohlarni o'z ichiga oladi **Olish (Google → Bronjoy):** - Xodim kalendaridagi tashqi hodisalar bo'sh vaqt oralig'larini bandlaydi - Olingan hodisalar keshlanadi va vaqti-vaqti bilan yangilanadi - Kun bo'yi davom etadigan hodisalar to'g'ri qayta ishlanadi (butun kunni bandlaydi) ### Sinxronizatsiya imkoniyatlarini yoqish/o'chirish Har bir ulanish uchun nima sinxronlanishini boshqaring: ```bash PATCH /api/org/calendar/connections/{connection}/toggle Authorization: Bearer your-token Content-Type: application/json ``` ```json { "push_enabled": true, "pull_enabled": true } ``` | Sozlama | Nima qiladi | | -------------- | ------------------------------------------------------------------- | | `push_enabled` | Bronjoy qabullarini Google Calendar'ga yuboradi | | `pull_enabled` | Bronjoy'da bo'sh vaqtlarni bandlash uchun Google hodisalarini oladi | | `sync_enabled` | Asosiy tugma — false bo'lganda barcha sinxronizatsiyani o'chiradi | ### Qo'lda sinxronlash Darhol sinxronizatsiyani ishga tushiring (Google Calendar'da o'zgartirish kiritgandan keyin foydali): ```bash POST /api/org/calendar/connections/{connection}/sync Authorization: Bearer your-token ``` ### Ulanishni uzish ```bash DELETE /api/org/calendar/connections/{connection} Authorization: Bearer your-token ``` Bu OAuth tokenini bekor qiladi, keshlangan hodisalarni o'chiradi va barcha sinxronizatsiyani to'xtatadi. Bronjoy tomonidan yaratilgan mavjud Google Calendar hodisalari **o'chirilmaydi**. ## iCal tasmasi iCal tasmasi — bu istalgan kalendar ilovasi obuna bo'lishi mumkin bo'lgan, faqat o'qish uchun mo'ljallangan URL. U xodimning kelgusi qabullarini ko'rsatadi. ### Tasma URL'ini olish ```bash GET /api/org/calendar/feed-url Authorization: Bearer your-token ``` Quyidagi kabi URL qaytaradi: ```text https://api.bronjoy.com/api/calendar/feed/abc123token.ics ``` ### Kalendar ilovangizda obuna bo'lish **Google Calendar:** 1. Google Calendar'ni oching → Boshqa kalendarlar → URL orqali 2. Tasma URL'ini joylashtiring 3. Google uni avtomatik yangilaydi (odatda har necha soatda) **Apple Calendar:** 1. Fayl → Yangi kalendar obunasi 2. Tasma URL'ini joylashtiring **Outlook:** 1. Kalendar qo'shish → Internetdan 2. Tasma URL'ini joylashtiring ### Tasma tafsilotlari - Keyingi 6 oy uchun kelgusi qabullarni o'z ichiga oladi - Bekor qilingan qabullarni o'z ichiga olmaydi - Har bir hodisada quyidagilar bor: xizmat nomi, mijoz ismi, izohlar, manzil - Har 60 daqiqada yangilanadi (kalendar ilovasiga qarab farq qilishi mumkin) - Token orqali autentifikatsiya qilinadi — tizimga kirish talab etilmaydi ### Bitta qabulni yuklab olish Mijozlar bitta qabulni `.ics` fayli sifatida yuklab olishlari mumkin: ```bash GET /api/client/appointments/{appointment}/ics Authorization: Bearer client-token ``` Yoki muayyan kalendar ilovalariga qo'shish uchun havolalarni oling: ```bash GET /api/client/appointments/{appointment}/calendar-links ``` Google Calendar va Outlook uchun to'g'ridan-to'g'ri havolalarni qaytaradi. ## Eng yaxshi amaliyotlar - Agar xodimlar o'z jadvalini Google Calendar'da faol boshqarsa, **Google Calendar sinxronizatsiyasidan foydalaning** — u tashqi hodisalarni olib, ikki marta yozilishning oldini oladi - Agar xodimlar Bronjoy qabullarini o'zlari afzal ko'rgan kalendar ilovasida faqat ko'rishni istasa, **iCal tasmasidan foydalaning** - Google Calendar'da yozilish vaqtlarini bandlashi kerak bo'lgan shaxsiy hodisalari bor xodimlar uchun **olish sinxronizatsiyasini yoqing** - Bir xodim uchun Google Calendar sinxronizatsiyasi va iCal tasmasini **birga ishlatmang** — bu takroriy hodisalarni keltirib chiqaradi # Telegram ## Umumiy ma'lumot Bronjoy Telegram bilan uch xil usulda integratsiyalashadi: 1. **Mijoz Mini App'i** — mijozlar Telegram Mini App orqali qabulga yoziladi 2. **Xodimlarga bildirishnomalar** — xodimlar amal tugmalari bilan yozilish bildirishnomalarini oladi 3. **Maxsus botlar** — tashkilotlar white-label tajriba uchun o'z Telegram botini ulashi mumkin ## Mijozning Telegram jarayoni Mijozlar Telegram Mini App orqali autentifikatsiyadan o'tishi va Bronjoy bilan ishlashi mumkin. ### Autentifikatsiya ```bash POST /api/client/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` `init_data` [Telegram Mini App API](https://core.telegram.org/bots/webapps){rel=""nofollow""} dan keladi. Bronjoy HMAC-SHA256 imzosini tekshiradi va mijoz hisobini yaratadi yoki bog'laydi. ### Inline tugmalar orqali qabul amallari Mijoz Telegram'da yozilish tasdiqlanishini olganda, inline tugmalar to'g'ridan-to'g'ri amallarni bajarish imkonini beradi: - **Qabulni bekor qilish** — `cancel_appointment:{id}` ga callback yuboradi Bot callbackni qayta ishlaydi va bekor qilishni chat ichida tasdiqlaydi. ## Xodimning Telegram jarayoni ### Autentifikatsiya ```bash POST /api/org/auth/telegram Content-Type: application/json ``` ```json { "init_data": "query_id=...&user=...&auth_date=...&hash=..." } ``` ### Telegram hisobini bog'lash/uzish Mavjud hisobi bor xodimlar o'z Telegram'ini bog'lashi mumkin: ```bash POST /api/org/telegram/link Authorization: Bearer your-token Content-Type: application/json ``` ```json { "init_data": "..." } ``` Bog'lanishni uzish uchun: ```bash POST /api/org/telegram/unlink Authorization: Bearer your-token ``` ### Xodimlarga bildirishnomalar Yangi qabul yaratilganda, xodimlar Telegram xabarini oladi, unda: - Mijoz ismi va xizmat tafsilotlari - Sana va vaqt - Inline tugmalar: **Tasdiqlash** / **Rad etish** Xodimlar panelni ochmasdan, to'g'ridan-to'g'ri Telegram'dan qabullarni tasdiqlashi yoki rad etishi mumkin. ### Telegram orqali onboarding Yangi foydalanuvchilar Telegram orqali tashkilot yaratishi yoki unga qo'shilishi mumkin: ```bash POST /api/org/telegram/create-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "name": "My Salon", "category": "beauty" } ``` ```bash POST /api/org/telegram/join-organization Authorization: Bearer your-token Content-Type: application/json ``` ```json { "invite_code": "ABC123" } ``` ## Maxsus Telegram bot (White-Label) Tashkilotlar brendlangan tajriba uchun o'z Telegram botini ulashi mumkin. Standart Bronjoy boti o'rniga mijozlar tashkilotning boti bilan ishlaydi. ### Maxsus botni ulash **Faqat egasi uchun.** `custom_telegram_bot` feature flag'i talab qilinadi. ```bash POST /api/org/telegram-bot/connect Authorization: Bearer your-owner-token Content-Type: application/json ``` ```json { "bot_token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" } ``` Bronjoy tokenni Telegram API orqali tekshiradi, webhookni sozlaydi va Mini App'ingizga olib boradigan menyu tugmasini o'rnatadi. ### Ulanish holatini tekshirish ```bash GET /api/org/telegram-bot Authorization: Bearer your-owner-token ``` Bot ma'lumotlari, webhook holati va kutilayotgan xatolarni qaytaradi. ### Ulanishni uzish ```bash POST /api/org/telegram-bot/disconnect Authorization: Bearer your-owner-token ``` Webhookni olib tashlaydi va maxsus botni uzadi. Uning o'rniga standart Bronjoy boti ishlatiladi. ## Eng yaxshi amaliyotlar - Agar brend o'ziga xosligingiz muhim bo'lsa, **maxsus botni ulang** — mijozlar sizning bot nomingiz va avataringizni ko'radi - **Xodimlar botini** erta sozlang — u yangi yozilishlarga javob berish vaqtini sezilarli darajada qisqartiradi - Yozilish uchun **mijozlarni Telegram'dan foydalanishga undang** — bu email/telefon orqali autentifikatsiyaga qaraganda kamroq to'siq yaratadi # Bronjoy nima va u biznesingizga nima beradi ## Bronjoy nima Bronjoy — xizmat ko'rsatuvchi bizneslar uchun qabulga yozilish platformasi: salonlar, sartaroshxonalar, klinikalar, studiyalar va shunga o'xshashlar. U biznesingizga onlayn joy beradi — mijozlar sizni topadi va o'zlari qabulga yoziladi. Shu bilan birga kundalik ishni yuritish uchun vositalarni ham beradi: kalendar, mijozlar ro'yxati, jadval, to'lovlar va sharhlar. ## Siz nima olasiz - **Onlayn yozilish sahifasi** — mijozlar unga havola orqali yoki Telegram orqali kiradi, xizmat va vaqtni tanlab, o'zlari yoziladi. Batafsil: [Mijozlaringiz sizga onlayn qanday yoziladi](https://docs.bronjoy.com/uz/for-owners/getting-clients-online). - **Kalendar** — barcha qabullar bir joyda; mijozlar yozilganda, vaqtni o'zgartirganda yoki bekor qilganda avtomatik yangilanadi. - **Mijozlar ro'yxati** — har bir mijozning aloqa ma'lumotlari, yozilishlar tarixi va izohlar. - **Jadvalni boshqarish** — haftalik ish vaqtingiz, dam olish kunlari va maxsus ish vaqtlari; mijozlar ko'radigan bo'sh vaqt oraliqlari aynan shulardan hosil bo'ladi. - **Avtomatik tasdiqlash va eslatmalar** — sizga ham, mijozlaringizga ham (jumladan Telegram orqali); bu kelmay qolish holatlarini kamaytiradi. - **To'lovlar** — xohlasangiz, yozilish paytida depozit yoki to'liq to'lovni qabul qiling. - **Sharhlar** — mijozlardan sharh yig'ing va ularga javob bering. ## Biznes yordamchisi Bronjoy tarkibida siz bilan suhbatlashadigan AI biznes yordamchisi bor (kabinetda ham, Telegramda ham). U ishni siz uchun bajaradi: qabullarni yozadi va boshqaradi, mijozlarni topadi va boshqaradi, jadvalingizni sozlaydi, xizmatlar/xodimlar/filiallarni boshqaradi, daromadingiz va natijalaringiz haqidagi savollarga javob beradi, mahsulot qanday ishlashini tushuntiradi. Oddiy tilda so'rashning o'zi kifoya. # Biznesingizni birinchi marta sozlash ## Sozlash tartibi Onlayn yozilishlarni qabul qilishni boshlash uchun quyidagi tartibda sozlang. Bu qadamlarning ko'pchiligini yordamchi siz uchun bajarib beradi — shunchaki so'rang. 1. **Filial (manzil) qo'shing.** Bu — siz ishlaydigan joy. Mijozlar yozilishidan oldin biznesda kamida bitta filial bo'lishi kerak. Yordamchiga nom va manzilni ayting. 2. **Xizmatlaringizni qo'shing.** Har bir xizmatga nom, narx va davomiylik kerak. Mijozlar yozilish sahifangizda aynan shularni ko'radi va tanlaydi, shuning uchun haqiqiylarini qo'shing (masalan, "Erkaklar sochini olish — 30 daqiqa — 50,000"). 3. **Ish jadvalingizni belgilang.** Haftalik ish vaqtingizni (masalan, Du–Sha 09:00–19:00) va dam olish kunlarini kiriting. Yozilish sahifasi shu vaqtlardan mijozlar tanlay oladigan bo'sh vaqt oraliqlarini hosil qiladi. Jadval bo'lmasa, yozilish uchun bo'sh vaqt ham bo'lmaydi. 4. **Xodimlarni qo'shing (jamoangiz bo'lsa).** Har bir jamoa a'zosini va u ko'rsatadigan xizmatlarni qo'shing — shunda mijozlar kerakli mutaxassisga yozila oladi. Yolg'iz ishlasangiz, bu qadamni o'tkazib yuboring. 5. **Profilingizni nashr qiling.** Biznes profilingizni to'ldiring (nom, tavsif, suratlar) va uni **nashr qilingan** holatiga o'tkazing. Shundan so'ng yozilish sahifangiz hammaga ochiq bo'ladi va sizda ulashiladigan havola paydo bo'ladi. ## Sozlashdan keyin Nashr qilganingizdan so'ng yozilish sahifangiz havolasini ulashing, toki mijozlar yozila olsin — qarang: [Mijozlaringiz sizga onlayn qanday yoziladi](https://docs.bronjoy.com/uz/for-owners/getting-clients-online). Shundan keyin yangi yozilishlar kalendaringizda avtomatik paydo bo'ladi va siz ularni kabinetdan yoki yordamchidan so'rab boshqarasiz. ## Maslahat Agar yozilish sahifangizda nimadir noto'g'ri yoki bo'sh ko'rinsa (xizmatlar yo'q, bo'sh vaqtlar yo'q), deyarli har doim yuqoridagi qadamlardan biri bajarilmagan bo'ladi — odatda xizmatlar yoki jadval, yoki profil hali nashr qilinmagan. # Mijozlaringiz sizga onlayn qanday yoziladi ## Qisqacha javob Biznesingiz sozlangan va **nashr qilingan** bo'lsa, Bronjoy mijozlaringizga sizga onlayn yozilishning o'z yo'lini beradi — ular xizmatni tanlaydi, sizning haqiqiy bo'sh vaqt oraliqlaringizni ko'radi, vaqtni tanlab tasdiqlaydi, va bularning hammasi sizga qo'ng'iroq qilmasdan yoki yozmasdan bo'ladi. Siz hech narsa qurmaysiz; yozilish jarayonini Bronjoy o'zi yaratib beradi. Sizning ishingiz — biznesni sozlash, nashr qilish va **havolani ulashish**. Mijozlar sizga ikki yo'l bilan yetib keladi: ## 1. Ochiq yozilish sahifangiz (veb-havola) Har bir biznes internetda o'z yozilish sahifasiga ega bo'ladi: Bronjoy manzili va undan keyin biznesingiz nomi — masalan, `bronjoy.com/your-handle`. Havolaga ega bo'lgan har kim uni brauzerda ochib, yozila oladi; ko'rish uchun ilova ham, hisob ham kerak emas. Bu manzilni qidirib yurishingiz shart emas — yordamchidan so'rang ("yozilish havolam qanday?"), u sizga aniq URL beradi va u ishlayotgan-ishlamayotganini aytadi. Uni kabinetdan ham topasiz: profilingiz **nashr qilingan** bo'lsa, yuqori panelda yashil **"Nashr qilingan"** belgisi paydo bo'ladi — uni bosib, jonli yozilish sahifangizni oching va URL nusxasini oling. **Mijozlar foydalanishi uchun havolani qayerga qo'yish kerak:** - Instagram / Telegram / Facebook profilingiz tavsifiga ("Bu yerdan yoziling 👇") - Google Maps / 2GIS'dagi biznes profilingizga - Yozilish so'rovlariga WhatsApp/Telegram javoblariga - Eshikdagi, peshtaxtadagi yoki tashrif qog'ozidagi QR-kodga (havoladan QR-kod yasang) - Veb-saytingizga, agar u bo'lsa ## 2. Telegramdagi yozilish ilovasi Mijozlar Telegram ichida ham, **t.me/bronjoy\_bot** manzilidagi Bronjoy mijoz Mini App'i orqali yozila oladi. Agar biznesingizga bog'langan maxsus Telegram havolasini ulashsangiz, u to'g'ridan-to'g'ri *sizning* yozilish jarayoningizni ochadi. Ko'p mijozlar uchun bu eng qulay variant, chunki u ular allaqachon ishlatadigan chatning ichida joylashgan, tasdiqlash va eslatmalar ham Telegramga keladi. > Eslatma: **mijozlar** uchun Telegramdagi yozilish ilovasi biznes yordamchisi botidan alohida (u — siz, ya'ni ega va xodimlar uchun). ## Mijozlar yozilishidan oldin: siz "jonli" bo'lishingiz kerak Agar yozilish sahifangiz bo'sh bo'lsa yoki ochilmasa, deyarli har doim sababi — biznes hali to'liq sozlanmagan va nashr qilinmagan. Jonli bo'lish uchun kamida quyidagilar kerak: 1. **Filial (manzil)** — siz ishlaydigan joy 2. **Kamida bitta xizmat** — mijozlar yozila oladigan narsa, narxi va davomiyligi bilan 3. **Ish jadvali** — ish vaqtingiz, toki sahifa bo'sh vaqtlarni ko'rsata olsin 4. **Nashr qilingan profil** — profilingizni *nashr qilingan* holatiga o'tkazing, shunda sahifa ochiq bo'ladi Profil nashr qilinmaguncha yozilish sahifasi ochiq bo'lmaydi va ulashish uchun havola ham bo'lmaydi. Shulardan biri yetishmasa, avval uni sozlang — shundan keyin "Nashr qilingan" belgisi (va ulashiladigan havolangiz) paydo bo'ladi. ## Mijoz yozilgandan keyin nima bo'ladi Qabul Bronjoy kalendaringizga avtomatik tushadi, siz ham, mijoz ham tasdiq (va eslatmalar) oladi. Uni kabinetdan yoki yordamchidan so'rab tasdiqlashingiz, vaqtini o'zgartirishingiz yoki bekor qilishingiz mumkin. # Tariflar va to'lovlar ## Tariflar | | Spark (bepul) | Avtopilot | | ---------------------------- | ------------- | ------------------------------ | | Onlayn yozilish sahifasi | ✓ | ✓ | | Qabullar, xodimlar, jadval | ✓ | ✓ | | SMS bildirishnomalar | ✓ | ✓ | | Filiallar | 1 | 1, ustiga pullik qo'shimchalar | | AI biznes yordamchisi | — | ✓ | | Onlayn to'lovlar (Stripe) | — | ✓ | | Shaxsiy Telegram bot | — | ✓ | | Kengaytirilgan analitika | — | ✓ | | Ustuvor qo'llab-quvvatlash | — | ✓ | | "Powered by Bronjoy" belgisi | ko'rinadi | olib tashlanadi | Har bir biznes **Spark** tarifidan boshlaydi — u xohlagancha muddat bepul, karta talab qilinmaydi. **Avtopilot** — belgilangan oylik obuna bo'lib, u AI yordamchisi, ilova ichidagi to'lovlar, shaxsiy Telegram botingiz va analitikani ochib beradi. ## Qo'shimcha filiallar Avtopilotda bittadan ortiq manzil kerakmi? Kattaroq tarifga o'tish o'rniga filiallarni bittalab qo'shing — har bir qo'shimcha filial obunangiz bilan birga hisoblanadigan kichik oylik qo'shimcha to'lovdir. ```bash POST /api/org/subscription/branches/add Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Xuddi shu tarzda olib tashlanadi: ```bash POST /api/org/subscription/branches/remove ``` ## AI kreditlari Avtopilotdagi AI yordamchisi butun jamoangiz uchun umumiy bo'lgan kunlik byudjet bilan keladi. Agar ishingiz gavjum bo'lib, byudjet tugab qolsa, ertangi kunga qadar kutmasdan bir martalik kredit to'plami bilan to'ldiring: ```bash POST /api/org/subscription/ai-credits/topup Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Kreditlarning muddati hech qachon tugamaydi va ular faqat kunlik byudjetingiz tugagandan keyin sarflanadi. ## Obunangizni boshqarish ```bash GET /api/org/subscription Authorization: Bearer your-owner-token X-Organization-ID: 1 ``` Joriy tarifingizni, sarfingizni va yangilanish sanasini qaytaradi. **Tarifni ko'tarish:** ```bash POST /api/org/subscription/checkout Authorization: Bearer your-owner-token X-Organization-ID: 1 Content-Type: application/json ``` ```json { "tier": "avtopilot" } ``` Stripe Checkout havolasini qaytaradi — faollashtirish uchun to'lovni o'sha yerda yakunlang. **Bekor qilish yoki davom ettirish:** ```bash POST /api/org/subscription/cancel POST /api/org/subscription/resume ``` Bekor qilish sizni darhol uzib qo'ymaydi — Avtopilot siz allaqachon to'lagan hisob davri oxirigacha faol qoladi, so'ng tashkilot avtomatik ravishda Spark tarifiga qaytadi. Tarifingiz uzilmasligi uchun o'sha sanagacha istalgan vaqtda davom ettiring. Yuqoridagilarning barchasini kabinetdagi to'lov sozlamalaridan ham bajarish mumkin — yordamchi ham sizga yo'l-yo'riq ko'rsatadi. # Biznesingizni o'zingizga biriktiring ## Nega biznes allaqachon ro'yxatda bo'lishi mumkin Bronjoy bozorni birinchi kundanoq foydali qilish uchun ochiq ma'lumotnomalardan minglab xizmat ko'rsatuvchi bizneslarni yig'adi — shuning uchun siz hech qachon ro'yxatdan o'tmagan bo'lsangiz ham, biznesingizning nomi, manzili va turkumi bilan to'ldirilgan profili allaqachon mavjud bo'lishi mumkin. Siz haqiqatan ham egasi ekanligingizni tasdiqlamaguningizcha, bu profil biriktirilmagan holatda qoladi. Bu bizneslarni o'z ro'yxatining boshqa birov tomonidan tahrirlanishi yoki biriktirilishidan himoya qiladi. ## Qanday biriktirish mumkin 1. Bronjoyda biznesingizni toping va uning profilini oching 2. Ismingiz, rolingiz (ega, menejer, xodim yoki vakil) va qisqa xabar bilan biriktirish so'rovini boshlang 3. Kamida bitta tasdiqlovchi hujjat yuklang — davlat ro'yxatidan o'tganlik guvohnomasi, soliq guvohnomasi yoki biznes litsenziyasi. 5 tagacha fayl biriktirishingiz mumkin (PDF, JPG, PNG yoki WEBP) ```bash POST /api/claims Authorization: Bearer your-token Content-Type: multipart/form-data ``` ```json { "organization_slug": "downtown-barbershop", "applicant_role": "owner", "applicant_name": "Jane Smith", "applicant_phone": "+998901234567", "message": "I'm the owner of this barbershop, registered in 2023. Documents attached.", "documents": [ { "file": "", "kind": "registration_cert" } ] } ``` `kind` quyidagilardan biri bo'ladi: `registration_cert`, `tax_cert`, `license`, `lease`, `utility_bill` yoki `other` — kamida bitta hujjat ro'yxatdan o'tganlik guvohnomasi, soliq guvohnomasi yoki biznes litsenziyasi bo'lishi shart. Biz egalikni telefon yoki elektron pochtaga yuborilgan kod bilan emas, hujjatlar bilan tasdiqlaymiz — raqamga kelgan SMS biznes sizniki ekanligining isboti emas. ## So'rov yuborganingizdan keyin ```bash GET /api/claims GET /api/claims/{claimRequest} ``` So'rovingiz holatini kuzatib boring. Tekshiruvchilarga qo'shimcha ma'lumot kerak bo'lsa, o'sha so'rovga qo'shimcha hujjatlar qo'shing: ```bash POST /api/claims/{claimRequest}/documents ``` Ko'rib chiqilishini istamay qolgan so'rovni qaytarib olishingiz mumkin: ```bash POST /api/claims/{claimRequest}/withdraw ``` ## Tasdiqlangandan keyin Siz tashkilotning egasiga aylanasiz — kabinet, xodimlar, xizmatlar, jadval va sozlamalarga to'liq kirish huquqiga ega bo'lasiz. Shundan so'ng tafsilotlarni to'g'ri sozlab, jonli ishga tushish uchun [Biznesingizni birinchi marta sozlash](https://docs.bronjoy.com/uz/for-owners/first-time-setup) bo'limiga o'ting.