noona.is

Noona (noona.is)

Iceland's booking platform: search businesses, list services, check availability, view your bookings — and book/cancel with confirmation and a prepayment guard.

v0.1.0 0/6 verified 2 mutating bookingsappointmentshealth
jokull <https://github.com/jokull> · https://noona.is · https://api.noona.is
ab-plus add noona.is && ab-plus login noona.is && ab-plus run noona.is/<op>

Auth paths

otp-token
Phone number + SMS code → long-lived HS256 JWT (issued per phone number, effectively non-expiring). Store the token in the keychain, not a plaintext file.
credentials: NOONA_TOKEN

Operations

Op Kind Risk Requires Description
noona.is/search rest read-only Search enterprises by name/query.
unverified
input
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    }
  },
  "required": [
    "query"
  ]
}
output
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "profile": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        }
      }
    },
    "companies": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          }
        }
      }
    }
  }
}
noona.is/services rest read-only Event types (services) for a company, with price and prepayment requirements.
unverified
input
{
  "type": "object",
  "properties": {
    "companyId": {
      "type": "string"
    }
  },
  "required": [
    "companyId"
  ]
}
output
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "minutes": {
      "type": "integer"
    },
    "payments": {
      "type": "object",
      "properties": {
        "total_payment": {
          "type": "number"
        },
        "pre_payment_required": {
          "type": "boolean"
        },
        "pre_payment_amount": {
          "type": "number"
        }
      }
    }
  }
}
noona.is/availability rest read-only Time slots for a company + event type over a date range.
unverified
input
{
  "type": "object",
  "properties": {
    "companyId": {
      "type": "string"
    },
    "eventTypeId": {
      "type": "string"
    },
    "startDate": {
      "type": "string",
      "format": "date"
    },
    "days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 30,
      "default": 7
    }
  },
  "required": [
    "companyId",
    "eventTypeId"
  ]
}
output
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date"
    },
    "slots": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "time": {
            "type": "string"
          },
          "employeeIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
noona.is/bookings rest read-only Upcoming bookings (events) with service, company, employee, price and status.
unverified
input
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20
    }
  }
}
output
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "starts_at": {
      "type": "string",
      "format": "date-time"
    },
    "ends_at": {
      "type": "string",
      "format": "date-time"
    },
    "confirmed": {
      "type": "boolean"
    },
    "status": {
      "type": "string"
    },
    "event_types": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "company": {
      "type": "object"
    },
    "employee": {
      "type": "object"
    },
    "payments": {
      "type": "object"
    }
  }
}
noona.is/book
not idempotent
dry-run ok
rest mutating · confirm Two-step: create time_slot_reservation, then confirm into an event. Refuses services that require prepayment (avoids accidental charges). Mutating.
unverified
input
{
  "type": "object",
  "properties": {
    "companyId": {
      "type": "string"
    },
    "eventTypeId": {
      "type": "string"
    },
    "startsAt": {
      "type": "string",
      "format": "date-time"
    },
    "employeeId": {
      "type": "string"
    }
  },
  "required": [
    "companyId",
    "eventTypeId",
    "startsAt"
  ]
}
output
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "starts_at": {
      "type": "string",
      "format": "date-time"
    },
    "ends_at": {
      "type": "string",
      "format": "date-time"
    },
    "confirmed": {
      "type": "boolean"
    },
    "status": {
      "type": "string"
    },
    "event_types": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "company": {
      "type": "object"
    },
    "employee": {
      "type": "object"
    },
    "payments": {
      "type": "object"
    }
  }
}
noona.is/cancel rest mutating · confirm Cancel an event by id. Mutating.
unverified
input
{
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string"
    }
  },
  "required": [
    "eventId"
  ]
}
output
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "starts_at": {
      "type": "string",
      "format": "date-time"
    },
    "ends_at": {
      "type": "string",
      "format": "date-time"
    },
    "confirmed": {
      "type": "boolean"
    },
    "status": {
      "type": "string"
    },
    "event_types": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "company": {
      "type": "object"
    },
    "employee": {
      "type": "object"
    },
    "payments": {
      "type": "object"
    }
  }
}

Raw artifacts

The manifest is the discovery record — the schema, the docs, and the search index in one file. manifest.json · recipe.ts · README.md