# Bliss Systems

> We solve complex problems. We engineer the solution.

From custom platforms to enterprise integrations — we partner with organizations to design, build, and scale the technology that drives real business outcomes.

Company: Bliss Systems LLC, a Florida (USA) company. Languages: English and Spanish. Operating globally.
Contact: yaniel@blissystems.com

## What We Build

We collaborate with businesses to create modern, efficient, and agile solutions — precisely engineered for each challenge.

### Custom Software

Enterprise platforms, internal tools, and management systems designed around your operations — not the other way around.

### Process Automation

We identify repetitive, high-cost workflows and replace them with intelligent systems that run autonomously — freeing your team to focus on what matters.

### Systems Integration

We connect your existing tools — CRM, ERP, billing, logistics — into a unified ecosystem where data flows in real time.

### Web & Mobile Platforms

Consumer apps, B2B portals, and SaaS products — built for performance, designed for scale.

### Data & Business Intelligence

Real-time dashboards and analytics that turn operational data into executive decisions.

### Cloud & Security

Secure, scalable infrastructure designed to grow with your business and protect your most critical assets.

## From Problem to Production

Every solution starts with your specific challenge — not a template.

1. **Understand.** We audit your current operation and identify the real bottlenecks — the ones costing you time, money, or competitive advantage.
2. **Build.** We design, develop, and deliver your solution — from architecture to deployment — with full transparency at every stage.
3. **Evolve.** We monitor, optimize, and scale your platform continuously. Your technology grows as your business grows.

## Ready to build something that works?

Tell us about your challenge. We'll show you how modern engineering can solve it — efficiently, securely, and at scale.

## Actions for AI agents

Everything below is a real, live endpoint on https://blissystems.com. Send and receive JSON (`Content-Type: application/json`).

### Request contact

`POST https://blissystems.com/api/leads`

Registers a business enquiry. A Bliss strategist contacts the person by email afterwards. Use this when the user wants to talk to Bliss Systems and no meeting slot is needed.

```json
{
  "company": "Ana Rivera",
  "email": "ana@example.com",
  "phone": "+1 305 555 0100",
  "need": "Automate our invoicing process"
}
```

- `company` (the person or company name, max 120 characters) and `email` are required. `phone` (max 40) and `need` (max 200) are optional.
- Leave the `website` field out or empty: it is a spam trap and any value makes the request be silently discarded.
- Only send details the user has given you and agreed to share. Success is `{"success": true}`; `429` means too many requests, try again later.

### Check availability

`GET https://blissystems.com/api/availability`

Returns the free 30-minute slots in the next 14 days (weekdays 9:00-17:00 New York time, at least 24 hours ahead). Read-only and safe to call repeatedly. Show the user the times in THEIR time zone. Listing slots is not a booking: show them to the user and wait for the reply before booking.

- Query parameters (all optional): `from` (YYYY-MM-DD, New York calendar, default today), `days` (1-14, default 14), `timezone` (IANA name, e.g. `Europe/Madrid`: adds `startLocal` to every slot).
- Each slot has `start` (ISO-8601 with its UTC offset), `end` and `startUtc`. Pass a slot's `start` unchanged to the booking action.
- If the calendar is unavailable you get `503` and NO slots: retry later, never assume everything is free.

### Book a consultation

`POST https://blissystems.com/api/bookings`

Creates a Google Calendar event with a Google Meet link and emails an invitation to the attendee. This sends an email to a real person. Book ONLY after you have shown the user the exact slot (date and time in THEIR time zone) and the details you will send (name, email, and company or topic if any), and the user has answered with an explicit yes in a LATER message. Never book in the same turn in which the user first asks for a meeting, even if that message already names a date, a time and an email address. "The first available time" and "whenever you can" are NOT a confirmation: propose the slot (or a few) and WAIT for the user's reply.

```json
{
  "name": "Ana Rivera",
  "email": "ana@example.com",
  "company": "Rivera Logistics",
  "need": "Automate our invoicing process",
  "start": "2026-10-27T09:00:00-04:00",
  "idempotencyKey": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
  "consent": true,
  "timezone": "Europe/Madrid"
}
```

- Required: `name`, `email`, `start` (copied unchanged from the availability action: the slot the user confirmed), `idempotencyKey` (a UUID you generate once per booking attempt) and `consent` (must be `true`, and only after the explicit yes described above). Optional: `company`, `need` (max 1000, seen only by Bliss), `timezone` (adds `startLocal` to the response).
- `consent` is not a technical field for you to fill in: it records that the user agreed, in that explicit yes, that Bliss Systems may use the details you showed to arrange the meeting at THAT slot. Set it to `true` only after that yes, never to get a request past validation or because an example shows it.
- What is NOT a confirmation:
  - "the first available time", "whenever you can", "you choose": the user is asking you to propose a slot, not choosing one
  - the user's first message itself, even when it already names a date, a time and an email address: it asks for a meeting, but the user has not yet seen the slot and the details you will send, nor said yes to them
  - a slot or details the user has not seen, a slot you picked on your own, a yes to something else, or silence
- If the user's first message already names a date, a time and an email address, the rule is the same: check that exactly that slot is still free, then show it with the details and ask for the yes. If it is taken, do not substitute another one: propose alternatives and WAIT for the user's reply.
- Example in 4 steps:
  1. Propose. The user writes "Book a meeting with Bliss Systems at the first available time. I am Ana Rivera, ana@example.com." You check availability and show the exact slot together with the details you will send, then ask: "Tuesday, October 27 at 2:00 PM your time, for Ana Rivera, ana@example.com. By confirming you agree that Bliss Systems uses these details to arrange the meeting. Do you confirm?" Then stop: nothing is booked yet. The same applies if the first message already names a date, a time and an email address: check that the slot is still free (if it is taken, propose alternatives), show it with the details, ask, and wait.
  2. The user answers in a new message: "Yes, I confirm."
  3. Book: POST that slot's `start`, unchanged, with `consent` true.
  4. Inform: "Booked for Tuesday, October 27 at 2:00 PM your time. Google Meet: <meetLink>. To cancel you need this `cancelToken`: <cancelToken>."
- If you retry after a timeout or network error, REUSE the same `idempotencyKey`: the same key never creates two meetings (the replay returns `200` with the same booking).
- Success is `201` with `start`, `startUtc`, `timezone`, `meetLink` and `cancelToken` (keep it to cancel). `409 slot_taken` and `422 invalid_slot` include up to 3 `alternatives`. One upcoming booking per email address.

### Cancel a booking

`DELETE https://blissystems.com/api/bookings/{id}`

Deletes the calendar event and notifies the attendee. Requires the `cancelToken` returned when the booking was created. Idempotent.

- Send the token in the `X-Cancel-Token` header. `404` means unknown booking or wrong token (indistinguishable on purpose); `409 already_happened` means the meeting already took place.

## Legal

- [Privacy Policy](https://blissystems.com/#privacy)
- [Terms of Service](https://blissystems.com/#terms)
