Moments & trackers

A tracker is a thing that you count or rate, for example coffee, mood, or water. A moment is one log against a tracker at a given time.

The machine-readable spec of all public endpoints: openapi.json.

Concepts

TermMeaning
TrackerThe definition of a thing to log. It has a name, a color, and a scale.
MomentOne logged entry against a tracker. A day can have many moments.
Shared defaultA tracker that Reassign gives to all users. When you edit or archive it, you get a private copy.

Scales

ScaleMeaningDefault value of a quick log
tallyEach log adds the stored step, or 1 when no step is stored. The API refuses step on a tally tracker.The stored step, or 1
ratingA bounded scale, for example mood from 1 to 5. The default bounds are 1 and 5.The midpoint of the bounds, rounded
quantityAn amount in unit, for example 250 ml.step

Time of a moment

  • time is a local datetime, "YYYY-MM-DDTHH:MM", in the time zone of the account. It has no seconds and no offset.
  • The day of a moment is the date part of time. A moment after midnight has the date of the next day, for example "2026-09-24T00:30".

Scopes

RouteScope
GET /trackers, GET /momentsevents:read or events:write
All other routes on this pageevents:write

All routes need Reassign Pro. The 7-day free trial includes it. Refer to Authentication.

  • A create (POST /trackers, POST /moments) returns 201. The other routes return 200.
  • A request body rejects a field that it does not know, with 422 and the code validation. A query parameter that the route does not know also returns 422.
  • The routes on this page return no undoToken. This is a stated exception to the undo rule of the API. To reverse a change, send a different write, for example a DELETE after a log.

For the error format, refer to Errors.

The tracker model

  • color is a hex color with 6 lowercase digits, #rrggbb.
  • icon is "" when no icon is set.
  • The server sends unit, step, ratingMin, ratingMax, target, energyKernel, energyImpact, and energyRole only when they are set.
  • isGlobal is always present. It is true for a shared default.
  • target is a daily target. You cannot set it with this API.
  • overridesId is always present. On a private copy of a shared default, it is the ID of the shared default. Else it is null.
  • order is the display order in the tray of the app. It is a whole number and it is always present. GET /trackers sorts the trackers from the lowest order to the highest.
  • Name
    id
    Type
    string, required
    Description
  • Name
    name
    Type
    string, required
    Description
  • Name
    icon
    Type
    string, required
    Description
  • Name
    color
    Type
    string, required
    Description
  • Name
    scale
    Type
    "tally" | "rating" | "quantity", required
    Description
  • Name
    order
    Type
    integer, required
    Description
  • Name
    unit
    Type
    string
    Description
  • Name
    step
    Type
    number
    Description
  • Name
    ratingMin
    Type
    integer
    Description
  • Name
    ratingMax
    Type
    integer
    Description
  • Name
    target
    Type
    number
    Description
  • Name
    isGlobal
    Type
    boolean, required
    Description
  • Name
    overridesId
    Type
    string | null, required
    Description

    The global tracker this one replaces; null when none.

  • Name
    energyImpact
    Type
    number
    Description

    Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

  • Name
    energyRole
    Type
    string
    Description

    Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

  • Name
    energyKernel
    Type
    object
    Description
    5 fields
    • Name
      X
      Type
      number, required
      Description
    • Name
      tauAbs
      Type
      number, required
      Description
    • Name
      tauElim
      Type
      number, required
      Description
    • Name
      rebound
      Type
      object | null
      Description
      4 fields
      • Name
        delay
        Type
        number, required
        Description
      • Name
        X
        Type
        number, required
        Description
      • Name
        tauAbs
        Type
        number, required
        Description
      • Name
        tauElim
        Type
        number, required
        Description
    • Name
      note
      Type
      string | null
      Description

Display order

ActionEffect on order
CreateReassign sets order to the highest order of all your trackers and the shared defaults, plus 1. Archived trackers count. The new tracker goes to the end of the tray.
UpdateThis API cannot change order. The body of PATCH /trackers/{id} does not accept it.
Private copyWhen you edit a shared default, the copy keeps the order of the shared default.

Energy fields (Beta)

The energy fields tell the energy model of Reassign how a log of this tracker changes the energy curve. The curve is a score of alertness from 0 to 100. Refer to Energy & weather.

FieldWhat it isWhen it is absent
energyKernelThe full energy effect of one log. This is the main source for the energy model. Refer to the next table.The model uses energyImpact.
energyImpactAn old form of the effect: one signed number. The model uses it only when energyKernel is absent or has X equal to 0. The effect then has a fixed shape: onset 0.1 hours, decay 3 hours, and no rebound.With no energyKernel also, a log has no effect on the curve.
energyRoleA free-form text tag, for example caffeine. It has no fixed list of values. For a tracker, the model uses it only as the key that groups the logs for the calibration of each user. With no energyRole, the name of the tracker is the key.The name is the key.

The fields of energyKernel:

FieldMeaning
XThe peak of the effect, in points on the 0 to 100 scale. A positive value lifts the curve, for example coffee. A negative value lowers it. 0 gives no effect.
tauAbsThe onset time, in hours. A small value makes a fast rise.
tauElimThe decay time, in hours. A large value makes a slow return. When tauElim is not more than tauAbs, the main effect is 0.
reboundOptional. A second effect with the opposite sign, for example the dip after caffeine. It has delay (hours after the log), X, tauAbs, and tauElim.
noteOptional. A short reason in plain words. The app shows it on the energy dial.

How the model uses a log:

  • The effect starts at the time of the moment. It rises with tauAbs, reaches X at its peak, and falls with tauElim.
  • The model multiplies X by the amount of the log, with a minimum of 1. For a quantity tracker, the amount is value divided by step. For a tally tracker, the amount is value. For example, a log with value 2 on a tally tracker makes the peak and the rebound two times larger.
  • A rating tracker has no energy effect. The model uses a rating log as a felt-energy label, for example a mood.
  • The calibration of each user can make the effect of a key larger, smaller, or opposite.

Examples from the shared defaults:

TrackerenergyKernel
CoffeeX 15, tauAbs 0.12, tauElim 4, and a rebound with delay 5, X -6, tauAbs 0.3, tauElim 2.
WaterX 0: no effect on the curve.

Who writes the energy fields:

  • You cannot write them with this API. POST /trackers and PATCH /trackers/{id} reject them with 422 and the code validation.
  • After a create or a change of name, Reassign can score the tracker with AI. The score sets or clears energyKernel. This occurs after the response, so the response does not show the score.
  • Reassign scores a tracker only when all these conditions are true:
    • The scale is not rating.
    • The tracker is not archived.
    • The name has 2 or more characters.
    • The name changed since the last score.
    • The account has a trial or Pro plan, with AI classification on.
  • A private copy of a shared default keeps the energy fields of the shared default.

The moment model

  • time is the local datetime of the moment. Refer to Concepts.
  • value is the effective value: the stored value, or else the default value of the tracker.
  • The server sends note only when it is not empty.
  • Name
    id
    Type
    string, required
    Description
  • Name
    trackerId
    Type
    string, required
    Description
  • Name
    time
    Type
    string, required
    Description
  • Name
    value
    Type
    number, required
    Description
  • Name
    note
    Type
    string
    Description

GET/api/v1/trackers

List trackers

Get all trackers that you can log against. The list contains your own trackers and the shared defaults. It does not contain archived trackers. The list is in display order: the lowest order first.

Each item of trackers is a tracker object.

Response fields

  • Name
    trackers
    Type
    object[], required
    Description
    16 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      name
      Type
      string, required
      Description
    • Name
      icon
      Type
      string, required
      Description
    • Name
      color
      Type
      string, required
      Description
    • Name
      scale
      Type
      "tally" | "rating" | "quantity", required
      Description
    • Name
      order
      Type
      integer, required
      Description
    • Name
      unit
      Type
      string
      Description
    • Name
      step
      Type
      number
      Description
    • Name
      ratingMin
      Type
      integer
      Description
    • Name
      ratingMax
      Type
      integer
      Description
    • Name
      target
      Type
      number
      Description
    • Name
      isGlobal
      Type
      boolean, required
      Description
    • Name
      overridesId
      Type
      string | null, required
      Description

      The global tracker this one replaces; null when none.

    • Name
      energyImpact
      Type
      number
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyRole
      Type
      string
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyKernel
      Type
      object
      Description
      5 fields
      • Name
        X
        Type
        number, required
        Description
      • Name
        tauAbs
        Type
        number, required
        Description
      • Name
        tauElim
        Type
        number, required
        Description
      • Name
        rebound
        Type
        object | null
        Description
        4 fields
        • Name
          delay
          Type
          number, required
          Description
        • Name
          X
          Type
          number, required
          Description
        • Name
          tauAbs
          Type
          number, required
          Description
        • Name
          tauElim
          Type
          number, required
          Description
      • Name
        note
        Type
        string | null
        Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:read or events:write gets scope "This token is not authorized to read events (requires events:read or events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
422validationThe request has a query parameter; this operation takes none.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

GET
/api/v1/trackers
curl "https://reassign.app/api/v1/trackers" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN"

Response

{
  "trackers": [
    {
      "id": "00000000-0000-4000-8000-000000000010",
      "name": "Coffee",
      "icon": "coffee",
      "color": "#8b5cf6",
      "scale": "tally",
      "order": 0,
      "step": 1,
      "isGlobal": false,
      "overridesId": null
    },
    {
      "id": "00000000-0000-4000-8000-000000000012",
      "name": "Mood",
      "icon": "smile",
      "color": "#f59e0b",
      "scale": "rating",
      "order": 1,
      "ratingMin": 1,
      "ratingMax": 5,
      "isGlobal": false,
      "overridesId": null
    }
  ]
}

POST/api/v1/trackers

Create a tracker

Create one tracker. The new tracker goes to the end of the tray: its order is the highest order plus 1. The response is 201 with the new tracker in created.

FieldRules
nameThe server removes the spaces at the start and at the end. Then the name must have 1 to 60 characters.
scaletally, rating, or quantity.
colorA hex color with 6 lowercase digits, #rrggbb. Omit color to get the default color, #64748b.
ratingMin, ratingMaxFor rating only. Whole numbers. The defaults are 1 and 5.
unitFor quantity only. The unit, for example ml.
stepFor quantity only. The amount of one log, more than 0. The default is 1.
  • A field of a different scale returns 422, for example `unit`: is not valid with scale `tally`.
  • A ratingMin above ratingMax returns 422. The server compares the bounds after it applies the defaults.
  • A color that is not lowercase #rrggbb returns 422.
  • You cannot send order or the energy fields. The body rejects them with 422. Reassign can add energyKernel after the response (Beta).

Request body

  • Name
    name
    Type
    string, required
    Description

    The tracker name, 1 to 60 characters.

  • Name
    scale
    Type
    "tally" | "rating" | "quantity", required
    Description

    tally counts: a log without value adds the read step, 1 when absent (a write cannot set step on a tally). rating is a bounded scale. quantity is an amount in unit; a log without value adds step.

  • Name
    color
    Type
    string
    Description
  • Name
    unit
    Type
    string | null
    Description

    Only with scale quantity.

  • Name
    step
    Type
    number
    Description

    Only with scale quantity.

  • Name
    ratingMin
    Type
    integer
    Description

    Only with scale rating.

  • Name
    ratingMax
    Type
    integer
    Description

    Only with scale rating.

Response fields

  • Name
    created
    Type
    object, required
    Description
    16 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      name
      Type
      string, required
      Description
    • Name
      icon
      Type
      string, required
      Description
    • Name
      color
      Type
      string, required
      Description
    • Name
      scale
      Type
      "tally" | "rating" | "quantity", required
      Description
    • Name
      order
      Type
      integer, required
      Description
    • Name
      unit
      Type
      string
      Description
    • Name
      step
      Type
      number
      Description
    • Name
      ratingMin
      Type
      integer
      Description
    • Name
      ratingMax
      Type
      integer
      Description
    • Name
      target
      Type
      number
      Description
    • Name
      isGlobal
      Type
      boolean, required
      Description
    • Name
      overridesId
      Type
      string | null, required
      Description

      The global tracker this one replaces; null when none.

    • Name
      energyImpact
      Type
      number
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyRole
      Type
      string
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyKernel
      Type
      object
      Description
      5 fields
      • Name
        X
        Type
        number, required
        Description
      • Name
        tauAbs
        Type
        number, required
        Description
      • Name
        tauElim
        Type
        number, required
        Description
      • Name
        rebound
        Type
        object | null
        Description
        4 fields
        • Name
          delay
          Type
          number, required
          Description
        • Name
          X
          Type
          number, required
          Description
        • Name
          tauAbs
          Type
          number, required
          Description
        • Name
          tauElim
          Type
          number, required
          Description
      • Name
        note
        Type
        string | null
        Description

Responses

StatusCodesMeaning
201—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
422validationThe request body is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

POST
/api/v1/trackers
curl -X POST "https://reassign.app/api/v1/trackers" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Water",
  "color": "#38bdf8",
  "scale": "quantity",
  "unit": "ml",
  "step": 250
}'

Response

{
  "created": {
    "id": "00000000-0000-4000-8000-000000000013",
    "name": "Water",
    "icon": "",
    "color": "#38bdf8",
    "scale": "quantity",
    "order": 2,
    "unit": "ml",
    "step": 250,
    "isGlobal": false,
    "overridesId": null
  }
}

PATCH/api/v1/trackers/{id}

Update a tracker

Change the name, the color, the scale, or the scale data of a tracker. Send only the fields that you want to change. Send at least one field, or the server returns 422. The fields have the same rules as for a create.

When you edit a shared default, the server makes a private copy for you. The id in updated is then the ID of the copy, not the ID in the path.

  • The server checks the scale fields against the scale of the result. When you do not send scale, that is the stored scale. A field of a different scale returns 422, and the server keeps the old tracker.
  • When you change ratingMin, ratingMax, or set scale to rating, the server checks the stored result. A ratingMin above ratingMax then returns 422, and the server keeps the old tracker.
  • Send unit: null to remove the unit of a quantity tracker.
  • A tracker ID that does not exist returns 404 with the message "Tracker not found.".
  • You cannot change order or the energy fields. The body rejects them with 422. A new name can make Reassign score the tracker again after the response (Beta).

Path parameters

  • Name
    id
    Type
    string, required
    Description

    The id of the tracker.

Request body

  • Name
    name
    Type
    string
    Description

    The tracker name, 1 to 60 characters.

  • Name
    scale
    Type
    "tally" | "rating" | "quantity"
    Description

    tally counts: a log without value adds the read step, 1 when absent (a write cannot set step on a tally). rating is a bounded scale. quantity is an amount in unit; a log without value adds step.

  • Name
    color
    Type
    string
    Description
  • Name
    unit
    Type
    string | null
    Description

    Only with scale quantity.

  • Name
    step
    Type
    number
    Description

    Only with scale quantity.

  • Name
    ratingMin
    Type
    integer
    Description

    Only with scale rating.

  • Name
    ratingMax
    Type
    integer
    Description

    Only with scale rating.

Response fields

  • Name
    updated
    Type
    object, required
    Description
    16 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      name
      Type
      string, required
      Description
    • Name
      icon
      Type
      string, required
      Description
    • Name
      color
      Type
      string, required
      Description
    • Name
      scale
      Type
      "tally" | "rating" | "quantity", required
      Description
    • Name
      order
      Type
      integer, required
      Description
    • Name
      unit
      Type
      string
      Description
    • Name
      step
      Type
      number
      Description
    • Name
      ratingMin
      Type
      integer
      Description
    • Name
      ratingMax
      Type
      integer
      Description
    • Name
      target
      Type
      number
      Description
    • Name
      isGlobal
      Type
      boolean, required
      Description
    • Name
      overridesId
      Type
      string | null, required
      Description

      The global tracker this one replaces; null when none.

    • Name
      energyImpact
      Type
      number
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyRole
      Type
      string
      Description

      Read-only legacy value. Nothing writes it now; energyKernel is the energy effect.

    • Name
      energyKernel
      Type
      object
      Description
      5 fields
      • Name
        X
        Type
        number, required
        Description
      • Name
        tauAbs
        Type
        number, required
        Description
      • Name
        tauElim
        Type
        number, required
        Description
      • Name
        rebound
        Type
        object | null
        Description
        4 fields
        • Name
          delay
          Type
          number, required
          Description
        • Name
          X
          Type
          number, required
          Description
        • Name
          tauAbs
          Type
          number, required
          Description
        • Name
          tauElim
          Type
          number, required
          Description
      • Name
        note
        Type
        string | null
        Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
404not_foundThe resource that the request names does not exist.
422validationThe request body is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

PATCH
/api/v1/trackers/{id}
curl -X PATCH "https://reassign.app/api/v1/trackers/TRACKER_ID" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Water intake",
  "color": "#0ea5e9"
}'

Response

{
  "updated": {
    "id": "00000000-0000-4000-8000-000000000013",
    "name": "Water intake",
    "icon": "",
    "color": "#0ea5e9",
    "scale": "quantity",
    "order": 2,
    "unit": "ml",
    "step": 250,
    "isGlobal": false,
    "overridesId": null
  }
}

DELETE/api/v1/trackers/{id}

Archive a tracker

Archive a tracker. The server does not delete it. The tracker is no longer in GET /trackers, and you cannot log new moments against it. The moments that you logged stay readable.

  • The response is { "deletedIds": [id] }, with the ID from the path.
  • For a shared default, the server writes an archived private copy.
  • This API has no route to restore an archived tracker.
  • A tracker ID that does not exist returns 404 with the message "Tracker not found.".

Path parameters

  • Name
    id
    Type
    string, required
    Description

    The id of the tracker.

Response fields

  • Name
    deletedIds
    Type
    string[], required
    Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
404not_foundThe resource that the request names does not exist.
422validationThe request has a query parameter; this operation takes none.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

DELETE
/api/v1/trackers/{id}
curl -X DELETE "https://reassign.app/api/v1/trackers/TRACKER_ID" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN"

Response

{
  "deletedIds": [
    "00000000-0000-4000-8000-000000000010"
  ]
}

GET/api/v1/moments

List moments

Get the moments of an inclusive range of days. The list also contains moments on archived trackers.

  • from and to are required. For one day, send the same date in the two.
  • A range can have at most 366 days. A wider range returns 422 `to`: The range is longer than 366 days.
  • A from after to returns 422.
  • Each item of entries is a moment object.

Query parameters

  • Name
    from
    Type
    string, required
    Description

    The first day, inclusive.

  • Name
    to
    Type
    string, required
    Description

    The last day, inclusive; the range is at most 366 days. Equal to from for one day.

Response fields

  • Name
    entries
    Type
    object[], required
    Description
    5 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      trackerId
      Type
      string, required
      Description
    • Name
      time
      Type
      string, required
      Description
    • Name
      value
      Type
      number, required
      Description
    • Name
      note
      Type
      string
      Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:read or events:write gets scope "This token is not authorized to read events (requires events:read or events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
422validationA query parameter is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

GET
/api/v1/moments
curl "https://reassign.app/api/v1/moments?from=2026-08-14&to=2026-08-14" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN"

Response

{
  "entries": [
    {
      "id": "00000000-0000-4000-8000-000000000011",
      "trackerId": "00000000-0000-4000-8000-000000000010",
      "time": "2026-08-13T09:30",
      "value": 1,
      "note": "double shot"
    }
  ]
}

POST/api/v1/moments

Log a moment

Log one moment against a tracker. A body with only trackerId is a quick log. The server then uses the current time and the default value of the tracker. The response is 201 with the new moment in created.

When you log a moment, Reassign also shows the layer of that tracker on the dial in the app.

FieldRules
trackerIdThe ID of a tracker from GET /trackers. An archived tracker or an unknown ID returns 404.
timeA local datetime, "YYYY-MM-DDTHH:MM". The default is the current time.
valueThe default is the default value of the scale. For a rating tracker, the value must be a whole number from ratingMin to ratingMax. Else the server returns 422, for example `value` must be a whole number from 1 to 5.
note1000 characters or less. The server removes the spaces at the start and at the end. A blank note gives no note.

Request body

  • Name
    trackerId
    Type
    string, required
    Description

    The tracker to log against.

  • Name
    time
    Type
    string
    Description

    When it happened; now if absent.

  • Name
    value
    Type
    number
    Description

    The value; the tracker default if absent.

  • Name
    note
    Type
    string
    Description

Response fields

  • Name
    created
    Type
    object, required
    Description
    5 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      trackerId
      Type
      string, required
      Description
    • Name
      time
      Type
      string, required
      Description
    • Name
      value
      Type
      number, required
      Description
    • Name
      note
      Type
      string
      Description

Responses

StatusCodesMeaning
201—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
404not_foundThe resource that the request names does not exist.
422validationThe request body is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

POST
/api/v1/moments
curl -X POST "https://reassign.app/api/v1/moments" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "trackerId": "00000000-0000-4000-8000-000000000010",
  "time": "2026-08-13T09:30",
  "note": "double shot"
}'

Response

{
  "created": {
    "id": "00000000-0000-4000-8000-000000000011",
    "trackerId": "00000000-0000-4000-8000-000000000010",
    "time": "2026-08-13T09:30",
    "value": 1,
    "note": "double shot"
  }
}

DELETE/api/v1/moments

Clear moments in a range (Beta)

Delete all moments that you logged in an inclusive range of days. The trackers do not change. The response lists the IDs of the deleted moments in deletedIds.

Query parameters

  • Name
    from
    Type
    string, required
    Description

    The first day, inclusive.

  • Name
    to
    Type
    string, required
    Description

    The last day, inclusive; the range is at most 366 days. Equal to from for one day.

Response fields

  • Name
    deletedIds
    Type
    string[], required
    Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
422validationA query parameter is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

DELETE
/api/v1/moments
curl -X DELETE "https://reassign.app/api/v1/moments?from=2026-08-14&to=2026-08-14" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN"

Response

{
  "deletedIds": [
    "00000000-0000-4000-8000-000000000011"
  ]
}

PATCH/api/v1/moments/{id}

Update a moment

Change the time, the value, or the note of one moment. The fields that you do not send keep their stored value. You cannot change trackerId. Send at least one field, or the server returns 422.

  • A new time can also move the moment to a different day.
  • value has the same rules as for a log. For a rating tracker, a value that is not a whole number inside the bounds returns 422.
  • Send note: null to remove the note.
  • A moment ID that does not exist returns 404 with the message "No logged entry with that id.".

Path parameters

  • Name
    id
    Type
    string, required
    Description

    The id of the logged entry.

Request body

  • Name
    time
    Type
    string
    Description
  • Name
    value
    Type
    number
    Description
  • Name
    note
    Type
    string | null
    Description

Response fields

  • Name
    updated
    Type
    object, required
    Description
    5 fields
    • Name
      id
      Type
      string, required
      Description
    • Name
      trackerId
      Type
      string, required
      Description
    • Name
      time
      Type
      string, required
      Description
    • Name
      value
      Type
      number, required
      Description
    • Name
      note
      Type
      string
      Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
404not_foundThe resource that the request names does not exist.
422validationThe request body is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

PATCH
/api/v1/moments/{id}
curl -X PATCH "https://reassign.app/api/v1/moments/MOMENT_ID" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "time": "2026-08-13T10:15",
  "value": 2
}'

Response

{
  "updated": {
    "id": "00000000-0000-4000-8000-000000000011",
    "trackerId": "00000000-0000-4000-8000-000000000010",
    "time": "2026-08-13T10:15",
    "value": 2,
    "note": "double shot"
  }
}

DELETE/api/v1/moments/{id}

Delete a moment

Delete one moment, for example a wrong log. The tracker does not change. The response is { "deletedIds": [id] }. This route returns no undoToken.

A moment ID that does not exist returns 404 with the message "No logged entry with that id.".

Path parameters

  • Name
    id
    Type
    string, required
    Description

    The id of the logged entry.

Response fields

  • Name
    deletedIds
    Type
    string[], required
    Description

Responses

StatusCodesMeaning
200—Success.
401unauthorizedNo Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata.
403permissionscopeA token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request."
404not_foundThe resource that the request names does not exist.
422validationThe request has a query parameter; this operation takes none.
429rate_limitedToo many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds.
503internalA fault on our side. The request is safe to retry.

Request

DELETE
/api/v1/moments/{id}
curl -X DELETE "https://reassign.app/api/v1/moments/MOMENT_ID" \
  -H "Authorization: Bearer rsk_live_YOUR_TOKEN"

Response

{
  "deletedIds": [
    "00000000-0000-4000-8000-000000000011"
  ]
}