{
  "$schema": "https://plus.solberg.is/schema/manifest.json",
  "site": "abler.io",
  "title": "Abler (abler.io)",
  "description": "Kids' sports platform used by Icelandic clubs (ÍR, Valur, Þróttur, Ármann…): profile and children, managed age groups, event details, and per-player attendance and payment status. The app has no public API — ops run inside an agent-browser session against its GraphQL endpoint.",
  "version": "0.1.0",
  "author": "jokull <https://github.com/jokull>",
  "license": "MIT",
  "tags": [
    "sports",
    "kids",
    "attendance",
    "payments",
    "session"
  ],
  "identities": [
    "parent",
    "coach"
  ],
  "origins": [
    "https://www.abler.io"
  ],
  "auth": [
    {
      "id": "phone-code",
      "type": "session",
      "description": "Phone number + SMS code sign-on (reCAPTCHA-gated, so it runs in a real browser): the runner fills the phone field and submits, the human reads the SMS code, the runner types it into the OTP boxes. Session persists via --restore; ops run in-session via eval against /graphql.",
      "flow": "phone-code",
      "loginUrl": "https://www.abler.io/sign-on/login",
      "successUrl": "/coach",
      "probe": "me",
      "ttl": "session",
      "default": true
    }
  ],
  "ops": [
    {
      "id": "me",
      "kind": "graphql",
      "title": "Profile, children and age groups",
      "description": "The signed-in user: name, ssn, email, family members, children, their age groups (with sport and groups), and age-group roles.",
      "tags": [
        "profile",
        "children"
      ],
      "risk": "read-only",
      "output": {
        "$ref": "#/schemas/Me"
      },
      "lastVerified": "2026-08-25"
    },
    {
      "id": "dashboard",
      "kind": "graphql",
      "title": "Organization dashboard",
      "description": "The age groups and clubs the user manages (coach/organization view) — id, name, label, sport and club per node.",
      "tags": [
        "groups",
        "organization"
      ],
      "risk": "read-only",
      "input": {
        "type": "object",
        "properties": {
          "clubIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional club id filter"
          },
          "first": {
            "type": "integer",
            "description": "Page size (default 25)"
          }
        }
      },
      "output": {
        "$ref": "#/schemas/DashboardNode"
      },
      "lastVerified": "2026-08-25"
    },
    {
      "id": "event",
      "kind": "graphql",
      "title": "Event details",
      "description": "One event by id: name, type, time window, registration window, location, groups, coaches, stats (present/absent/going counts) and the user's own attendance status.",
      "tags": [
        "schedule",
        "events"
      ],
      "risk": "read-only",
      "input": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Event id, e.g. RXZlbnQ6NDQ0MDUwMw=="
          },
          "ageGroupId": {
            "type": "string",
            "description": "Optional age group id for context"
          }
        }
      },
      "output": {
        "$ref": "#/schemas/Event"
      },
      "lastVerified": "2026-08-25"
    },
    {
      "id": "event-players",
      "kind": "graphql",
      "title": "Event attendance & payments",
      "description": "Per-player rows for one event: attendance status (going / not going / no response), coach status, payment status, waiting list, plus player profile (birth day, jersey number, position, groups, attendance history). Filterable by attendance or payment status.",
      "tags": [
        "attendance",
        "payments"
      ],
      "risk": "read-only",
      "input": {
        "type": "object",
        "properties": {
          "eventId": {
            "type": "string"
          },
          "ageGroupId": {
            "type": "string"
          },
          "attendanceStatus": {
            "type": "string",
            "description": "Filter, e.g. Going / NotGoing / NotResponded"
          },
          "paymentStatus": {
            "type": "string",
            "description": "Filter, e.g. Paid / Unpaid"
          },
          "first": {
            "type": "integer",
            "description": "Page size (default 15)"
          }
        }
      },
      "output": {
        "$ref": "#/schemas/EventPlayerRow"
      },
      "lastVerified": "2026-08-25"
    }
  ],
  "schemas": {
    "Me": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "displayName": {
          "type": "string"
        },
        "firstName": {
          "type": "string"
        },
        "lastName": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "ssn": {
          "type": "string",
          "description": "Kennitala"
        },
        "children": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "firstName": {
                "type": "string"
              },
              "lastName": {
                "type": "string"
              },
              "displayName": {
                "type": "string"
              }
            }
          }
        },
        "userAgeGroups": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "isActive": {
                "type": "boolean"
              },
              "sport": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                }
              },
              "groups": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "ageGroupRoles": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "ageGroupId": {
                "type": "string"
              },
              "role": {
                "type": "string"
              },
              "memberVisibility": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "DashboardNode": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "label": {
          "type": "string"
        },
        "logo": {
          "type": [
            "string",
            "null"
          ]
        },
        "ageGroup": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "sport": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              }
            }
          }
        },
        "club": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          }
        }
      }
    },
    "Event": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "eventId": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "type": {
          "type": "string"
        },
        "description": {
          "type": [
            "string",
            "null"
          ]
        },
        "from": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO datetime"
        },
        "to": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO datetime"
        },
        "locationAddress": {
          "type": [
            "string",
            "null"
          ]
        },
        "locationLink": {
          "type": [
            "string",
            "null"
          ]
        },
        "groupName": {
          "type": [
            "string",
            "null"
          ]
        },
        "groupLabel": {
          "type": [
            "string",
            "null"
          ]
        },
        "homeTeam": {
          "type": [
            "string",
            "null"
          ]
        },
        "awayTeam": {
          "type": [
            "string",
            "null"
          ]
        },
        "opponent": {
          "type": [
            "string",
            "null"
          ]
        },
        "result": {
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "type": [
            "string",
            "null"
          ]
        },
        "eventPlayerStats": {
          "type": "object",
          "properties": {
            "totalCount": {
              "type": "integer"
            },
            "presentCount": {
              "type": "integer"
            },
            "absentCount": {
              "type": "integer"
            },
            "goingCount": {
              "type": "integer"
            },
            "notGoingCount": {
              "type": "integer"
            },
            "maybeCount": {
              "type": "integer"
            },
            "notRespondedCount": {
              "type": "integer"
            }
          }
        },
        "currentPlayerAttendance": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "status": {
              "type": [
                "string",
                "null"
              ]
            },
            "comment": {
              "type": [
                "string",
                "null"
              ]
            },
            "coachStatus": {
              "type": [
                "string",
                "null"
              ]
            },
            "paymentStatus": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        }
      }
    },
    "EventPlayerRow": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": [
            "string",
            "null"
          ],
          "description": "Attendance: Going / NotGoing / NotResponded / Empty"
        },
        "statusExt": {
          "type": [
            "string",
            "null"
          ]
        },
        "comment": {
          "type": [
            "string",
            "null"
          ]
        },
        "coachStatus": {
          "type": [
            "string",
            "null"
          ]
        },
        "coachComment": {
          "type": [
            "string",
            "null"
          ]
        },
        "paymentStatus": {
          "type": [
            "string",
            "null"
          ]
        },
        "orderId": {
          "type": [
            "string",
            "null"
          ]
        },
        "waitingListNr": {
          "type": [
            "integer",
            "null"
          ]
        },
        "player": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "firstName": {
              "type": "string"
            },
            "displayName": {
              "type": "string"
            },
            "birthDay": {
              "type": [
                "string",
                "null"
              ]
            },
            "email": {
              "type": [
                "string",
                "null"
              ]
            },
            "phoneNumber": {
              "type": [
                "string",
                "null"
              ]
            },
            "jerseyNumber": {
              "type": [
                "string",
                "null"
              ]
            },
            "position": {
              "type": [
                "string",
                "null"
              ]
            },
            "attendanceHistoryPercentage": {
              "type": [
                "number",
                "null"
              ]
            },
            "groups": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
