# Criteria

## Add a criterion to a rubric

`client.Rubrics.Criteria.New(ctx, rubricID, body) (*RubricCriteriaResponse, error)`

**post** `/v5/rubrics/{rubric_id}/criteria`

Add a single criterion to an existing rubric.

Creates a new criterion at version 1 under the given rubric. Criteria are
versioned independently of the rubric they belong to. The request is rejected
if the target rubric is archived.

### Parameters

- `rubricID string`

- `body RubricCriterionNewParams`

  - `RubricCriteriaInput param.Field[RubricCriteriaInput]`

### Returns

- `type RubricCriteriaResponse struct{…}`

  - `ID string`

  - `CreatedAt Time`

  - `RubricID string`

  - `Title string`

  - `Version int64`

  - `Annotations map[string, any]`

  - `Object RubricCriteriaResponseObject`

    - `const RubricCriteriaResponseObjectRubricCriteria RubricCriteriaResponseObject = "rubric_criteria"`

  - `Weight float64`

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/scaleapi/sgp-dev-go"
  "github.com/scaleapi/sgp-dev-go/option"
)

func main() {
  client := sgpdev.NewClient(
    option.WithAPIKey("My API Key"),
    option.WithAccountID("My Account ID"),
  )
  rubricCriteriaResponse, err := client.Rubrics.Criteria.New(
    context.TODO(),
    "rubric_id",
    sgpdev.RubricCriterionNewParams{
      RubricCriteriaInput: sgpdev.RubricCriteriaInputParam{
        Title: "x",
      },
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", rubricCriteriaResponse.ID)
}
```

#### Response

```json
{
  "id": "id",
  "created_at": "2019-12-27T18:11:19.117Z",
  "rubric_id": "rubric_id",
  "title": "title",
  "version": 0,
  "annotations": {
    "foo": "bar"
  },
  "object": "rubric_criteria",
  "weight": 0
}
```

## Update a criterion

`client.Rubrics.Criteria.Update(ctx, rubricCriteriaID, params) (*RubricCriteriaResponse, error)`

**patch** `/v5/rubrics/{rubric_id}/criteria/{rubric_criteria_id}`

Apply a partial update to a criterion, creating a new version.

Updates are append-only: rather than overwriting the criterion in place, each
update inserts a new immutable version with an incremented version number, so
every prior state stays available through the versions endpoint. Fields not
supplied are carried forward from the current version. The request is rejected
if the criterion does not belong to the rubric named in the path.

### Parameters

- `rubricCriteriaID string`

- `params RubricCriterionUpdateParams`

  - `RubricID param.Field[string]`

    Path param

  - `Annotations param.Field[map[string, any]]`

    Body param: Free-form metadata for the Criteria

  - `Title param.Field[string]`

    Body param: The Criteria text

  - `Weight param.Field[float64]`

    Body param: Weight multiplier for scoring

### Returns

- `type RubricCriteriaResponse struct{…}`

  - `ID string`

  - `CreatedAt Time`

  - `RubricID string`

  - `Title string`

  - `Version int64`

  - `Annotations map[string, any]`

  - `Object RubricCriteriaResponseObject`

    - `const RubricCriteriaResponseObjectRubricCriteria RubricCriteriaResponseObject = "rubric_criteria"`

  - `Weight float64`

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/scaleapi/sgp-dev-go"
  "github.com/scaleapi/sgp-dev-go/option"
)

func main() {
  client := sgpdev.NewClient(
    option.WithAPIKey("My API Key"),
    option.WithAccountID("My Account ID"),
  )
  rubricCriteriaResponse, err := client.Rubrics.Criteria.Update(
    context.TODO(),
    "rubric_criteria_id",
    sgpdev.RubricCriterionUpdateParams{
      RubricID: "rubric_id",
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", rubricCriteriaResponse.ID)
}
```

#### Response

```json
{
  "id": "id",
  "created_at": "2019-12-27T18:11:19.117Z",
  "rubric_id": "rubric_id",
  "title": "title",
  "version": 0,
  "annotations": {
    "foo": "bar"
  },
  "object": "rubric_criteria",
  "weight": 0
}
```

## List criterion versions

`client.Rubrics.Criteria.ListVersions(ctx, rubricCriteriaID, params) (*RubricCriterionListVersionsResponse, error)`

**get** `/v5/rubrics/{rubric_id}/criteria/{rubric_criteria_id}/versions`

List the full version history of a single criterion, paginated.

Because criterion updates are append-only, this returns one entry per version,
exposing every prior state of the criterion, ordered by version descending
(newest first) by default. The request is rejected if the criterion does not
belong to the rubric named in the path.

### Parameters

- `rubricCriteriaID string`

- `params RubricCriterionListVersionsParams`

  - `RubricID param.Field[string]`

    Path param

  - `EndingBefore param.Field[string]`

    Query param

  - `Limit param.Field[int64]`

    Query param

  - `SortBy param.Field[string]`

    Query param

  - `SortOrder param.Field[SortOrder]`

    Query param

  - `StartingAfter param.Field[string]`

    Query param

### Returns

- `type RubricCriterionListVersionsResponse struct{…}`

  - `HasMore bool`

    Whether there are more items left to be fetched.

  - `Items []RubricCriteriaResponse`

    - `ID string`

    - `CreatedAt Time`

    - `RubricID string`

    - `Title string`

    - `Version int64`

    - `Annotations map[string, any]`

    - `Object RubricCriteriaResponseObject`

      - `const RubricCriteriaResponseObjectRubricCriteria RubricCriteriaResponseObject = "rubric_criteria"`

    - `Weight float64`

  - `Total int64`

    The total of items that match the query. This is greater than or equal to the number of items returned.

  - `Limit int64`

    The maximum number of items to return.

  - `Object RubricCriterionListVersionsResponseObject`

    - `const RubricCriterionListVersionsResponseObjectList RubricCriterionListVersionsResponseObject = "list"`

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/scaleapi/sgp-dev-go"
  "github.com/scaleapi/sgp-dev-go/option"
)

func main() {
  client := sgpdev.NewClient(
    option.WithAPIKey("My API Key"),
    option.WithAccountID("My Account ID"),
  )
  response, err := client.Rubrics.Criteria.ListVersions(
    context.TODO(),
    "rubric_criteria_id",
    sgpdev.RubricCriterionListVersionsParams{
      RubricID: "rubric_id",
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", response.HasMore)
}
```

#### Response

```json
{
  "has_more": true,
  "items": [
    {
      "id": "id",
      "created_at": "2019-12-27T18:11:19.117Z",
      "rubric_id": "rubric_id",
      "title": "title",
      "version": 0,
      "annotations": {
        "foo": "bar"
      },
      "object": "rubric_criteria",
      "weight": 0
    }
  ],
  "total": 0,
  "limit": 0,
  "object": "list"
}
```

## Domain Types

### Rubric Criteria Input

- `type RubricCriteriaInput struct{…}`

  - `Title string`

    The Criteria text

  - `Annotations map[string, any]`

    Free-form metadata for the Criteria

  - `Weight float64`

    Weight multiplier for scoring

### Rubric Criteria Response

- `type RubricCriteriaResponse struct{…}`

  - `ID string`

  - `CreatedAt Time`

  - `RubricID string`

  - `Title string`

  - `Version int64`

  - `Annotations map[string, any]`

  - `Object RubricCriteriaResponseObject`

    - `const RubricCriteriaResponseObjectRubricCriteria RubricCriteriaResponseObject = "rubric_criteria"`

  - `Weight float64`

### Rubric Criteria Summary Response

- `type RubricCriteriaSummaryResponse struct{…}`

  Slim criteria projection for list endpoints (title + weight only).

  - `Title string`

  - `Weight float64`
