Sail

Create Reimbursement

POST/users/{user_id}/reimbursements

Initiates a reimbursement: pays the user back from their own benefit account for a set of eligible expenses. Requires the benefit_account key scope, and the benefit_account product on the funding account’s connection. Processing is asynchronous: the reimbursement is created pending and progresses through submitted/processing to completed or failed, with a reimbursement.status_changed webhook per transition. On completion the underlying expenses transition to reimbursed. Expenses must be eligible and not already part of an in-flight reimbursement (409 conflict otherwise).

Path Parameters

user_idstringrequired

The Sail user id.

Body application/json

expense_idsstring[]required

Expenses to reimburse. All must be eligible and belong to this user.

account_idstringrequired

The benefit account to pay from. Its owning connection must have the benefit_account product.

Response

Reimbursement created. Processing has begun.

idstring

The Sail reimbursement id.

status"pending" | "submitted" | "processing" | "completed" | "failed"

The reimbursement’s current processing status.

amountnumber<float>

Sum of the included expenses, USD.

account_idstring

The funding account. Join to /accounts/{account_id} for provider and balance context.

expensesobject[]

The expenses included in this reimbursement.

Show expenses properties
idstring

The Sail expense id.

namestring

The expense’s display name.

amountnumber<float>

The expense’s amount, USD.

datestring<date>

The expense’s transaction date.

receipt_urlstring

Reimbursement receipt document. Populated once completed; present on the single-resource GET only.

submitted_atstring<date-time>

When the reimbursement was submitted for processing.

completed_atstring<date-time>

When the reimbursement completed. Null while still in progress.

conflict: an expense is not eligible, or is already in an in-flight reimbursement.

Standard error envelope covering 400, 401, 403, 404, 429, and 500.

errorobject

The error detail.

Show error properties
codestring

Machine-readable code, e.g. not_found, token_scope_mismatch, product_not_enabled, insufficient_key_scope, insufficient_token_scope, user_token_required, user_token_expired, invalid_user_token, invalid_key_configuration, connection_not_reconnectable, rate_limited.

messagestring

Human-readable error message. May change, so match on error.code instead.

paramstring

The request field that caused the error, when applicable. Null otherwise.

Request
curl -X POST "https://live.savewithsail.com/api/v1/users/<user_id>/reimbursements" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{
  "expense_ids": [
    "string"
  ],
  "account_id": "string"
}'
Response
{
  "id": "reimb_8c1f",
  "status": "pending",
  "amount": 0,
  "account_id": "string",
  "expenses": [
    {
      "id": "string",
      "name": "string",
      "amount": 0,
      "date": "2024-01-01"
    }
  ],
  "receipt_url": "string",
  "submitted_at": "1970-01-01T00:00:00.000Z",
  "completed_at": "1970-01-01T00:00:00.000Z"
}