Skip to content

Claims API

27 endpoints, generated from packages/core/openapi/v1.snapshot.json (OpenAPI 3.1.0, contract version 1.0). Conventions for lists, errors, money and authentication are on the API conventions page.

GET/api/v1/claims

List claims (own, team or all by role; `mine=true` for your own)

Access
Permission claims:read

Parameters

NameInTypeRequired
pagequeryintegerno
pageSizequeryintegerno
sortqueryenumno
qquerystringno
statusquerystringno
minequeryenumno
employeeIdquerystring (uuid)no
claimTypeIdquerystring (uuid)no
payoutqueryenumno
expenseFromquerystring (date)no
expenseToquerystring (date)no

Responses

200 Success. object

  • itemsarray of objectrequired
    • idstring (uuid)required
    • claimNumberstring | nullrequired
    • statusenumrequired

      one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

    • titlestring | nullrequired
    • employeeobjectrequired
      • idstring (uuid)required
      • namestringrequired
      • employeeNumberstringrequired
      • departmentNamestring | nullrequired
    • totalCentsintegerrequired

      min 0

    • gstCentsintegerrequired

      min 0

    • lineCountintegerrequired

      min -9007199254740991

    • typeNamesarray of stringrequired
    • expenseFromstring | nullrequired
    • expenseTostring | nullrequired
    • submittedAtstring | nullrequired
    • daysWaitinginteger or nullrequired

      min -9007199254740991

    • approvedOnstring | nullrequired
    • payoutMethodenum or nullrequired

      one of "payroll", "outside"

    • reservedByPayrollRunbooleanrequired
    • paidViaenum or nullrequired

      one of "payroll", "outside"

    • paidOnstring | nullrequired
    • paidReferencestring | nullrequired
    • approverTaskbooleanrequired
  • pageintegerrequired

    min -9007199254740991

  • pageSizeintegerrequired

    min -9007199254740991

  • totalintegerrequired

    min -9007199254740991

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

POST/api/v1/claims

Create a draft claim, or create and submit it (`submit: true`)

Access
Permission claims:create

Request body

application/json, object, required

  • employeeIdstring (uuid) or null
  • titlestring or null

    max length 100

  • linesarray of objectrequired
    • claimTypeIdstring (uuid)required
    • expenseDatestring (date)required
    • merchantstringrequired

      max length 100

    • descriptionstringrequired

      max length 200

    • currencystring

      default "SGD"

    • amountMinorintegerrequired

      min 1

    • ratestring or null

      max length 20

    • gstCentsinteger or null

      min 0

    • receiptIdsarray of string (uuid)

      default []

  • submitboolean

    Submit at once; when submission fails the draft is kept (details.draftId).

Responses

201 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 422 cap_exceeded, not_eligible

GET/api/v1/claims/{id}

Get a claim (lines, receipts subject to medical sensitivity, cap usage, duplicate flags)

Access
Permission claims:read

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

200 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required
  • 404 not_found

PUT/api/v1/claims/{id}

Replace a draft claim's title and lines

Access
Permission claims:create

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Request body

application/json, object, required

  • employeeIdstring (uuid) or null
  • titlestring or null

    max length 100

  • linesarray of objectrequired
    • claimTypeIdstring (uuid)required
    • expenseDatestring (date)required
    • merchantstringrequired

      max length 100

    • descriptionstringrequired

      max length 200

    • currencystring

      default "SGD"

    • amountMinorintegerrequired

      min 1

    • ratestring or null

      max length 20

    • gstCentsinteger or null

      min 0

    • receiptIdsarray of string (uuid)

      default []

Responses

200 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

DELETE/api/v1/claims/{id}

Delete a draft claim

Access
Permission claims:create

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

204 No content.

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

POST/api/v1/claims/{id}/copy

Copy a rejected or withdrawn claim into a new draft

Access
Permission claims:create

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

201 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

POST/api/v1/claims/{id}/submit

Submit a draft claim for approval

Access
Permission claims:create

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

200 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict
  • 422 cap_exceeded, not_eligible

POST/api/v1/claims/{id}/withdraw

Withdraw a submitted claim

Access
Permission claims:read

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

200 Success. object

  • idstring (uuid)required
  • claimNumberstring | nullrequired
  • statusenumrequired

    one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

  • titlestring | nullrequired
  • employeeobjectrequired
    • idstring (uuid)required
    • namestringrequired
    • employeeNumberstringrequired
    • departmentNamestring | nullrequired
  • totalCentsintegerrequired

    min 0

  • gstCentsintegerrequired

    min 0

  • payoutMethodenum or nullrequired

    one of "payroll", "outside"

  • approvalRequestIdstring (uuid) or nullrequired
  • submittedAtstring | nullrequired
  • decidedAtstring | nullrequired
  • approvedOnstring | nullrequired
  • decisionCommentstring | nullrequired
  • reservedByPayrollRunbooleanrequired
  • paidViaenum or nullrequired

    one of "payroll", "outside"

  • paidOnstring | nullrequired
  • paidReferencestring | nullrequired
  • copiedFromClaimIdstring (uuid) or nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • linesarray of objectrequired
    • idstring (uuid)required
    • positionintegerrequired

      min -9007199254740991

    • claimTypeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • expenseDatestringrequired
    • merchantstringsensitive: medical
    • descriptionstringsensitive: medical
    • receiptsarray of objectsensitive: medical
      • idstring (uuid)required
      • namestringrequired
      • mimestringrequired
      • sizeBytesintegerrequired

        min -9007199254740991

      • scanStatusenumrequired

        one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

      • removedbooleanrequired
      • previewablebooleanrequired

        Images browsers can show (not HEIC or PDF).

      • urlstringrequired
      • uploadedAtstringrequired
    • receiptCountintegerrequired

      min -9007199254740991

    • currencystringrequired
    • amountMinorintegerrequired

      min -9007199254740991

    • ratestring | nullrequired
    • sgdCentsintegerrequired

      min 0

    • gstCentsinteger or nullrequired

      min 0

    • receiptRequiredbooleanrequired
    • duplicatesarray of objectrequired
      • fileIdstring (uuid)required
      • claimIdstring (uuid)required
      • claimNumberstring | nullrequired
    • redactedFieldsarray of string
  • capUsagearray of objectrequired
    • typeIdstring (uuid)required
    • typeCodestringrequired
    • typeNamestringrequired
    • periodenumrequired

      one of "per_claim", "monthly", "yearly"

    • periodLabelstringrequired
    • capCentsintegerrequired

      min 0

    • usedCentsintegerrequired

      min 0

    • pendingCentsintegerrequired

      min 0

    • remainingCentsintegerrequired

      min 0

    • claimCentsintegerrequired

      min 0

  • actionsobjectrequired
    • editbooleanrequired
    • submitbooleanrequired
    • deletebooleanrequired
    • withdrawbooleanrequired
    • copybooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

GET/api/v1/claims/eligible-types

Claim types the employee may use, with cap usage for the period containing `date`

Access
Permission claims:create

Parameters

NameInTypeRequired
employeeIdquerystring (uuid)no
datequerystring (date)no
excludeClaimIdquerystring (uuid)no

Responses

200 Success. object

  • itemsarray of objectrequired
    • idstring (uuid)required
    • codestringrequired
    • namestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • receiptRuleenumrequired

      one of "always", "never", "above"

    • receiptAboveCentsinteger or nullrequired

      min 0

    • receiptHintstringrequired
    • gstApplicablebooleanrequired
    • capobject or nullrequired
      • typeIdstring (uuid)required
      • typeCodestringrequired
      • typeNamestringrequired
      • periodenumrequired

        one of "per_claim", "monthly", "yearly"

      • periodLabelstringrequired
      • capCentsintegerrequired

        min 0

      • usedCentsintegerrequired

        min 0

      • pendingCentsintegerrequired

        min 0

      • remainingCentsintegerrequired

        min 0

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required
  • 404 not_found

POST/api/v1/claims/mark-paid

Mark approved claims paid outside payroll (bulk, with a date and reference)

Access
Permission claims:pay

Request body

application/json, object, required

  • claimIdsarray of string (uuid)required
  • paidOnstring (date)required
  • referencestringrequired

    min length 1 · max length 100

Responses

200 Success. object

  • paidintegerrequired

    min -9007199254740991

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

GET/api/v1/claims/me/totals

My claim totals: waiting, approved and not yet paid, paid this year

Access
Any signed-in member (own data only)

Responses

200 Success. object

  • submittedCentsintegerrequired

    min -9007199254740991

  • approvedCentsintegerrequired

    min -9007199254740991

  • paidThisYearCentsintegerrequired

    min -9007199254740991

  • 401 session_expired, session_revoked, unauthenticated
  • 403 mfa_enrolment_required

GET/api/v1/claims/payable

Approved claims a payroll run for the period would reimburse (one entry per claim and type)

The same list payroll reads through `ReimbursementSource.listPayable`: approved, unpaid, payroll-payout claims approved (Asia/Singapore date) on or before `periodEnd`.

Access
Permission claims:pay

Parameters

NameInTypeRequired
periodEndquerystring (date)yes

Responses

200 Success. object

  • itemsarray of objectrequired
    • claimIdstring (uuid)required
    • employeeIdstring (uuid)required
    • typeNamestringrequired
    • amountCentsintegerrequired

      min -9007199254740991

    • claimNumberstring | nullrequired
    • employeeNamestringrequired
    • approvedOnstring | nullrequired
    • reservedbooleanrequired
  • totalCentsintegerrequired

    min -9007199254740991

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

POST/api/v1/claims/receipts

Upload a receipt (raw bytes in the body; PDF, JPEG, PNG, WebP or HEIC, at most 10 MB)

Send the file as the raw request body (any Content-Type; the type is detected from the file's signature, never from the name or header). `fileName` is for display only. Owners and hr_admins may upload for another employee with `employeeId`.

Access
Permission claims:create

Parameters

NameInTypeRequired
fileNamequerystringno
employeeIdquerystring (uuid)no

Responses

201 Success. object

  • idstring (uuid)required
  • namestringrequired
  • mimestringrequired
  • sizeBytesintegerrequired

    min -9007199254740991

  • scanStatusenumrequired

    one of "unscanned", "pending_scan", "clean", "infected", "scan_failed"

  • removedbooleanrequired
  • previewablebooleanrequired

    Images browsers can show (not HEIC or PDF).

  • urlstringrequired
  • uploadedAtstringrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 413 file_too_large
  • 415 unsupported_file_type

GET/api/v1/claims/receipts/{fileId}

Download or view a receipt

Images are served inline, PDFs and HEIC as attachments, always with the detected type, `X-Content-Type-Options: nosniff` and a sandbox CSP. 404 for anyone who may not see it.

Access
Permission claims:read

Parameters

NameInTypeRequired
fileIdpathstring (uuid)yes
downloadqueryenumno

Responses

200 The receipt file application/octet-stream

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required
  • 404 not_found

DELETE/api/v1/claims/receipts/{fileId}

Delete an uploaded receipt that no claim line uses

Access
Permission claims:create

Parameters

NameInTypeRequired
fileIdpathstring (uuid)yes

Responses

204 No content.

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 in_use

GET/api/v1/claims/reports/export

Export claims (summary, line register or payout register) as CSV or XLSX

Access
Permission reports_claims:export

Parameters

NameInTypeRequired
fromquerystring (date)yes
toquerystring (date)yes
reportqueryenumno
byqueryenumno
formatqueryenumno

Responses

200 CSV or XLSX file text/csv

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

GET/api/v1/claims/reports/summary

Claim totals by type, department, employee or month, per status (expense-date range)

Access
Permission reports_claims:read

Parameters

NameInTypeRequired
fromquerystring (date)yes
toquerystring (date)yes
byqueryenumno

Responses

200 Success. object

  • itemsarray of objectrequired
    • keystringrequired
    • labelstringrequired
    • statusenumrequired

      one of "draft", "submitted", "approved", "rejected", "withdrawn", "paid"

    • claimCountintegerrequired

      min -9007199254740991

    • lineCountintegerrequired

      min -9007199254740991

    • totalCentsintegerrequired

      min 0

    • gstCentsintegerrequired

      min 0

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

GET/api/v1/claims/settings

Claim settings (submission window, whether receipts are virus-scanned)

Access
Permission claim_types:read

Responses

200 Success. object

  • submissionWindowDaysintegerrequired

    min 7 · max 730

  • scanningboolean
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

PUT/api/v1/claims/settings

Update claim settings

Access
Permission policies:update

Request body

application/json, object, required

  • submissionWindowDaysintegerrequired

    min 7 · max 730

Responses

200 Success. object

  • submissionWindowDaysintegerrequired

    min 7 · max 730

  • scanningboolean
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required

GET/api/v1/claims/types

List claim types

Access
Permission claim_types:read

Parameters

NameInTypeRequired
includeArchivedqueryenumno

Responses

200 Success. object

  • itemsarray of objectrequired
    • idstring (uuid)required
    • codestringrequired
    • namestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • receiptRuleenumrequired

      one of "always", "never", "above"

    • receiptAboveCentsinteger or nullrequired

      min 0

    • capCentsinteger or nullrequired

      min 0

    • capPeriodenumrequired

      one of "none", "per_claim", "monthly", "yearly"

    • eligibleEmploymentTypesarray of enumrequired
    • availableDuringProbationbooleanrequired
    • defaultPayoutenumrequired

      one of "payroll", "outside"

    • gstApplicablebooleanrequired
    • taxablebooleanrequired
    • glCodestring | nullrequired
    • archivedbooleanrequired
    • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

POST/api/v1/claims/types

Create a claim type

Access
Permission policies:update

Request body

application/json, object, required

  • codestringrequired

    min length 2 · max length 32

  • namestringrequired

    min length 1 · max length 80

  • categoryenumrequired

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenumrequired

    one of "always", "never", "above"

  • receiptAboveCentsinteger or null

    min 0

  • capCentsinteger or null

    min 1

  • capPeriodenumrequired

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enum
  • availableDuringProbationboolean
  • defaultPayoutenum

    one of "payroll", "outside"

  • gstApplicableboolean
  • taxableboolean
  • glCodestring or null

    max length 40

Responses

201 Success. object

  • idstring (uuid)required
  • codestringrequired
  • namestringrequired
  • categoryenumrequired

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenumrequired

    one of "always", "never", "above"

  • receiptAboveCentsinteger or nullrequired

    min 0

  • capCentsinteger or nullrequired

    min 0

  • capPeriodenumrequired

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enumrequired
  • availableDuringProbationbooleanrequired
  • defaultPayoutenumrequired

    one of "payroll", "outside"

  • gstApplicablebooleanrequired
  • taxablebooleanrequired
  • glCodestring | nullrequired
  • archivedbooleanrequired
  • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 409 conflict

PATCH/api/v1/claims/types/{id}

Update a claim type

Access
Permission policies:update

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Request body

application/json, object, required

  • codestring

    min length 2 · max length 32

  • namestring

    min length 1 · max length 80

  • categoryenum

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenum

    one of "always", "never", "above"

  • receiptAboveCentsinteger or null

    min 0

  • capCentsinteger or null

    min 1

  • capPeriodenum

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enum
  • availableDuringProbationboolean
  • defaultPayoutenum

    one of "payroll", "outside"

  • gstApplicableboolean
  • taxableboolean
  • glCodestring or null

    max length 40

Responses

200 Success. object

  • idstring (uuid)required
  • codestringrequired
  • namestringrequired
  • categoryenumrequired

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenumrequired

    one of "always", "never", "above"

  • receiptAboveCentsinteger or nullrequired

    min 0

  • capCentsinteger or nullrequired

    min 0

  • capPeriodenumrequired

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enumrequired
  • availableDuringProbationbooleanrequired
  • defaultPayoutenumrequired

    one of "payroll", "outside"

  • gstApplicablebooleanrequired
  • taxablebooleanrequired
  • glCodestring | nullrequired
  • archivedbooleanrequired
  • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 conflict

DELETE/api/v1/claims/types/{id}

Delete an unused claim type (used ones can only be archived)

Access
Permission policies:update

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

204 No content.

  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found
  • 409 in_use

POST/api/v1/claims/types/{id}/archive

Archive a claim type (it stays on existing claims)

Access
Permission policies:update

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

200 Success. object

  • idstring (uuid)required
  • codestringrequired
  • namestringrequired
  • categoryenumrequired

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenumrequired

    one of "always", "never", "above"

  • receiptAboveCentsinteger or nullrequired

    min 0

  • capCentsinteger or nullrequired

    min 0

  • capPeriodenumrequired

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enumrequired
  • availableDuringProbationbooleanrequired
  • defaultPayoutenumrequired

    one of "payroll", "outside"

  • gstApplicablebooleanrequired
  • taxablebooleanrequired
  • glCodestring | nullrequired
  • archivedbooleanrequired
  • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found

POST/api/v1/claims/types/{id}/restore

Restore an archived claim type

Access
Permission policies:update

Parameters

NameInTypeRequired
idpathstring (uuid)yes

Responses

200 Success. object

  • idstring (uuid)required
  • codestringrequired
  • namestringrequired
  • categoryenumrequired

    one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

  • receiptRuleenumrequired

    one of "always", "never", "above"

  • receiptAboveCentsinteger or nullrequired

    min 0

  • capCentsinteger or nullrequired

    min 0

  • capPeriodenumrequired

    one of "none", "per_claim", "monthly", "yearly"

  • eligibleEmploymentTypesarray of enumrequired
  • availableDuringProbationbooleanrequired
  • defaultPayoutenumrequired

    one of "payroll", "outside"

  • gstApplicablebooleanrequired
  • taxablebooleanrequired
  • glCodestring | nullrequired
  • archivedbooleanrequired
  • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required
  • 404 not_found

GET/api/v1/claims/types/starter

The suggested starter set of claim types (not yet created)

Access
Permission claim_types:read

Responses

200 Success. object

  • itemsarray of objectrequired
    • codestringrequired

      min length 2 · max length 32

    • namestringrequired

      min length 1 · max length 80

    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • receiptRuleenumrequired

      one of "always", "never", "above"

    • receiptAboveCentsinteger or null

      min 0

    • capCentsinteger or null

      min 1

    • capPeriodenumrequired

      one of "none", "per_claim", "monthly", "yearly"

    • eligibleEmploymentTypesarray of enum
    • availableDuringProbationboolean
    • defaultPayoutenum

      one of "payroll", "outside"

    • gstApplicableboolean
    • taxableboolean
    • glCodestring or null

      max length 40

  • 401 session_expired, session_revoked, unauthenticated
  • 403 forbidden, mfa_enrolment_required

POST/api/v1/claims/types/starter

Create the starter claim types (or a chosen subset) that don't exist yet

Access
Permission policies:update

Request body

application/json, object, required

  • codesarray of string

Responses

201 Success. object

  • itemsarray of objectrequired
    • idstring (uuid)required
    • codestringrequired
    • namestringrequired
    • categoryenumrequired

      one of "medical", "dental", "transport", "meals", "entertainment", "travel", "phone", "training", "other"

    • receiptRuleenumrequired

      one of "always", "never", "above"

    • receiptAboveCentsinteger or nullrequired

      min 0

    • capCentsinteger or nullrequired

      min 0

    • capPeriodenumrequired

      one of "none", "per_claim", "monthly", "yearly"

    • eligibleEmploymentTypesarray of enumrequired
    • availableDuringProbationbooleanrequired
    • defaultPayoutenumrequired

      one of "payroll", "outside"

    • gstApplicablebooleanrequired
    • taxablebooleanrequired
    • glCodestring | nullrequired
    • archivedbooleanrequired
    • inUsebooleanrequired
  • 400 validation_failed
  • 401 session_expired, session_revoked, unauthenticated
  • 403 csrf_rejected, forbidden, mfa_enrolment_required