{
  "$comment": "Agent Card (RFC 8615 well-known URI). Declares what an AI agent can do on coterielabs.com.au on a user's behalf. Every endpoint listed here is live and callable — nothing is aspirational.",
  "name": "CoterieLabs",
  "description": "AI implementation consultancy for Australian SME trades and professional-services businesses. Agents can check discovery-call availability, book a call for their user, and cancel it.",
  "url": "https://coterielabs.com.au",
  "version": "1.0.0",
  "provider": {
    "organization": "CoterieLabs",
    "url": "https://coterielabs.com.au",
    "contact": "contact@coterielabs.com.au",
    "areaServed": "AU",
    "timezone": "Australia/Sydney"
  },
  "documentation": "https://coterielabs.com.au/llms.txt",
  "authentication": {
    "schemes": [],
    "required": false,
    "$comment": "No authentication. Booking is deliberately open so an agent can act for its user. Abuse controls: per-IP rate limit, max 3 bookings per email per 24h, and every booking emails a cancel link to the person booked."
  },
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitions": true
  },
  "skills": [
    {
      "id": "check-availability",
      "name": "Check discovery-call availability",
      "description": "List the bookable 30-minute slots. Slots are weekdays, 9:00–11:30am and 1:00–4:30pm Australia/Sydney, from 4 hours ahead up to two weeks out. Already-booked slots are excluded.",
      "endpoint": {
        "method": "GET",
        "url": "https://coterielabs.com.au/api/bookings",
        "contentType": "application/json"
      },
      "output": {
        "type": "object",
        "properties": {
          "slots": {
            "type": "array",
            "items": { "type": "string", "format": "date-time" },
            "description": "ISO-8601 UTC start times, each the start of a 30-minute slot."
          }
        }
      }
    },
    {
      "id": "book-discovery-call",
      "name": "Book a 30-minute discovery call",
      "description": "Book a free 30-minute call for your user. Confirm the details with them first — this creates a real appointment in a real person's calendar. On success the person named is emailed a confirmation, an .ics calendar invite, and a cancel link.",
      "endpoint": {
        "method": "POST",
        "url": "https://coterielabs.com.au/api/bookings",
        "contentType": "application/json"
      },
      "input": {
        "type": "object",
        "required": ["name", "email", "company", "startsAt"],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "description": "Full name of the person the call is for."
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 320,
            "description": "Their email address. The confirmation, calendar invite and cancel link are sent here — it must be an address they actually control."
          },
          "company": {
            "type": "string",
            "maxLength": 500,
            "description": "Their business name."
          },
          "startsAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 UTC start time. Must exactly match one returned by check-availability."
          },
          "submissionToken": {
            "type": "string",
            "format": "uuid",
            "description": "Optional. Links the booking to a completed AI Opportunity Scan."
          }
        }
      },
      "output": {
        "type": "object",
        "properties": {
          "ok": { "type": "boolean" },
          "startsAt": { "type": "string", "format": "date-time" },
          "cancelUrl": {
            "type": "string",
            "format": "uri",
            "description": "Give this to your user. It also contains the token needed for cancel-booking."
          },
          "confirmationSentTo": { "type": "string", "format": "email" }
        }
      },
      "errors": [
        { "status": 400, "meaning": "Missing/invalid field, or startsAt is not an available slot." },
        { "status": 409, "meaning": "That slot was taken between your availability check and this request. Re-check availability and pick another." },
        { "status": 429, "meaning": "Rate limited, or this email already has 3 bookings in the last 24 hours." }
      ],
      "sideEffects": ["Creates a real appointment.", "Sends email to the person named and to CoterieLabs."],
      "requiresUserConfirmation": true
    },
    {
      "id": "cancel-booking",
      "name": "Cancel a booking",
      "description": "Cancel a booking using the token from its cancelUrl. Frees the slot for someone else.",
      "endpoint": {
        "method": "POST",
        "url": "https://coterielabs.com.au/api/bookings/cancel",
        "contentType": "application/json"
      },
      "input": {
        "type": "object",
        "required": ["token"],
        "properties": {
          "token": {
            "type": "string",
            "format": "uuid",
            "description": "The token from cancelUrl (the last path segment), or from the cancel link in the confirmation email."
          }
        }
      },
      "output": {
        "type": "object",
        "properties": {
          "ok": { "type": "boolean" },
          "cancelled": { "type": "string", "format": "date-time" }
        }
      },
      "errors": [{ "status": 404, "meaning": "Unknown token, or the booking was already cancelled." }],
      "sideEffects": ["Deletes the appointment.", "Notifies CoterieLabs."]
    }
  ],
  "relatedTools": [
    {
      "name": "AI Opportunity Scan",
      "url": "https://coterielabs.com.au/questionnaire",
      "description": "Free 6-question self-assessment; produces a personalised result and a token that can be passed to book-discovery-call."
    },
    {
      "name": "AI Exposure Check",
      "url": "https://coterielabs.com.au/ai-exposure",
      "description": "Free 2-minute check of how exposed a role is to AI."
    }
  ]
}
