Skip to documentationDocumentation
On this page

List

List manual balance conversions for merchant activity.

Returns merchant-safe manual conversion history for the merchant activity log. Pending entries represent locked source funds only; target balance is credited only after settlement. Provider, route, raw execution, transaction, and treasury details are intentionally omitted.

Usage notes#

Requires balances:read. This feed lists standalone manual conversions in the API key’s merchant and environment. Preserve each operation ID when paging, and use Get to inspect its booked source, fee, return, and target amounts.

Live-only: a test API key returns 422 not_live. See conversion lifecycle and webhooks for completion, failure, recovery, and ID reconciliation.

GET/v1/conversions
curl
curl --request GET 'https://api.thehalfin.com/v1/conversions' \
  --header "X-API-Key: $HALFIN_API_KEY"

Authorization

  • X-API-KeystringRequired
    API key issued by the merchant dashboard. The key's environment (live/test) determines which data the caller can access. Permissions on the key control which endpoints are reachable.

    Example: $HALFIN_API_KEY

Query Parameters

  • limitintegerOptional
    Maximum number of items to return (default 20, max 100).
    • Minimum: 1
    • Maximum: 100
    • Default: 20

    Example: 20

  • cursorstringOptional
    Opaque cursor from meta.next_cursor. Omit for the first page. Bound to the collection, scope, filters, and ordering.
    • Maximum length: 8192

    Example: string

  • status"pending_execution" | "submitted" | "settled" | "failed" | "source_restored" | "stuck"Optional
    Merchant-visible conversion status, including the latest attempt's submitted projection.

    Example: pending_execution

  • currencystringOptional
    Filter by currency code.
    • Maximum length: 20

    Example: string

  • networkstringOptional
    Filter by payment network. Given together with currency it names one gate.
    • Maximum length: 40

    Example: string

  • fromstringOptional
    Start of date range (RFC 3339).
    • Format: date-time

    Example: 2026-01-01T00:00:00Z

  • tostringOptional
    End of date range (RFC 3339).
    • Format: date-time

    Example: 2026-01-01T00:00:00Z

Response Body

200 Manual conversion activity entries.

application/json

  • dataarray<object>Required

    Example: [{"operation_id":"00000000-0000-0000-0000-000000000001","status":"pending_execution","source_currency":"string","source_network":"string","target_currency":"string","target_network":"string","source_amount":"string","expected_target_amount":"string","effective_rate":"string","conversion_amount":"string","fee_amount":"string","fee_currency":"string","fee_network":"string","fee_payer":"merchant","converted_amount":"string","fee_charged_amount":"string","source_returned_amount":"string","credited_target_amount":"string","settled_at":null,"source_restored_at":null,"stuck_at":null,"retry_allowed":false,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}]

    • operation_idstringRequired
      Standalone conversion ID, equal to webhook conversion_id. Use with /v1/conversions/{operationID}.
      • Format: uuid

      Example: 00000000-0000-0000-0000-000000000001

    • status"pending_execution" | "submitted" | "settled" | "failed" | "source_restored" | "stuck"Required
      Merchant lifecycle status. failed is recoverable and may later become settled or source_restored. submitted and stuck are merchant-facing states; the admin ops_status is a separate operational projection, including pending_execution and ops_review_required.

      Example: pending_execution

    • source_currencystringRequired

      Example: string

    • source_networkstringRequired

      Example: string

    • target_currencystringRequired

      Example: string

    • target_networkstringRequired

      Example: string

    • source_amountstringRequired

      Example: string

    • expected_target_amountstringRequired

      Example: string

    • effective_ratestringRequired

      Example: string

    • conversion_amountstringOptional
      The principal actually exchanged: source_amount minus the merchant-paid fee. The fee is deducted from the amount and never added on top, so source_amount is the ceiling on what this operation may debit.

      Example: string

    • fee_amountstringOptional
      The fee withheld from source_amount when the whole principal is exchanged. "0" when the platform covers it, because nothing is then withheld from the merchant.

      Example: string

    • fee_currencystringOptional
      Rail of the fee. Always the source rail.

      Example: string

    • fee_networkstringOptional

      Example: string

    • fee_payer"merchant" | "platform"Optional

      Example: merchant

    • converted_amountstringOptional
      Principal the execution actually consumed. "0" until the ledger books it.

      Example: string

    • fee_charged_amountstringOptional
      Fee actually charged. "0" until the ledger books it.

      Example: string

    • source_returned_amountstringOptional
      Unspent source released back to the available balance. "0" until the ledger books it.

      Example: string

    • credited_target_amountstringOptional
      Target amount actually credited to the merchant. It is the frozen obligation scaled by the consumed share, not the amount the venue delivered — gain and loss against it are the platform's position. "0" until the ledger books it.

      Example: string

    • settled_atstring | nullRequired
      • Format: date-time

      Example: null

    • source_restored_atstring | nullRequired
      • Format: date-time

      Example: null

    • stuck_atstring | nullRequired
      • Format: date-time

      Example: null

    • retry_allowedbooleanRequired

      Example: false

    • created_atstringRequired
      • Format: date-time

      Example: 2026-01-01T00:00:00Z

    • updated_atstringRequired
      • Format: date-time

      Example: 2026-01-01T00:00:00Z

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001","has_more":false,"next_cursor":null}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. An inbound value is adopted only from explicitly trusted ingress; public client values are replaced.

      Example: string

    • has_morebooleanRequired
      True exactly when next_cursor is not null.

      Example: false

    • next_cursorstring | nullRequired
      Opaque cursor for the next page. Null when this is the last page.

      Example: null

200 response
{
  "data": [
    {
      "operation_id": "00000000-0000-0000-0000-000000000001",
      "status": "pending_execution",
      "source_currency": "string",
      "source_network": "string",
      "target_currency": "string",
      "target_network": "string",
      "source_amount": "string",
      "expected_target_amount": "string",
      "effective_rate": "string",
      "conversion_amount": "string",
      "fee_amount": "string",
      "fee_currency": "string",
      "fee_network": "string",
      "fee_payer": "merchant",
      "converted_amount": "string",
      "fee_charged_amount": "string",
      "source_returned_amount": "string",
      "credited_target_amount": "string",
      "settled_at": null,
      "source_restored_at": null,
      "stuck_at": null,
      "retry_allowed": false,
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z"
    }
  ],
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001",
    "has_more": false,
    "next_cursor": null
  }
}

400 `validation_error`: The request format or field values are invalid.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"validation_error","message":"string","details":["string"]}

    • code"validation_error"Required
      `validation_error`: The request format or field values are invalid.

      Example: validation_error

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

400 response
{
  "error": {
    "code": "validation_error",
    "message": "Request validation failed"
  },
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001"
  }
}

401 `unauthorized`: A valid API key is required.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"unauthorized","message":"string","details":["string"]}

    • code"unauthorized"Required
      `unauthorized`: A valid API key is required.

      Example: unauthorized

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

401 response
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid API key"
  },
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001"
  }
}

403 `forbidden`: The API key does not have permission for this operation. `api_key_ip_forbidden`: The request source address is not allowed by the API key.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"forbidden","message":"string","details":["string"]}

    • code"forbidden" | "api_key_ip_forbidden"Required
      `forbidden`: The API key does not have permission for this operation. `api_key_ip_forbidden`: The request source address is not allowed by the API key.

      Example: forbidden

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

403 response
{
  "error": {
    "code": "forbidden",
    "message": "Permission denied"
  },
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001"
  }
}

422 `not_live`: Manual conversion is available with live API keys only.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"not_live","message":"string","details":["string"]}

    • code"not_live"Required
      `not_live`: Manual conversion is available with live API keys only.

      Example: not_live

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

422 response
{
  "error": {
    "code": "not_live",
    "message": "Manual conversion is available in the live contour only."
  },
  "meta": {
    "request_id": "00000000-0000-4000-8000-000000000001"
  }
}

500 `internal_error`: The request could not be completed. Contact support with the request ID.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"internal_error","message":"string","details":["string"]}

    • code"internal_error"Required
      `internal_error`: The request could not be completed. Contact support with the request ID.

      Example: internal_error

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

500 response
{
  "error": {
    "code": "internal_error",
    "message": "Internal server error"
  },
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001"
  }
}

503 `service_unavailable`: The service is temporarily unavailable.

application/json

  • errorobjectRequired
    The error code and diagnostic message.
    • Unknown properties are rejected

    Example: {"code":"service_unavailable","message":"string","details":["string"]}

    • code"service_unavailable"Required
      `service_unavailable`: The service is temporarily unavailable.

      Example: service_unavailable

    • messagestringRequired
      Human-readable description of the error.

      Example: string

    • detailsarray<string>Optional
      Optional structured context (validation errors, etc.).

      Example: ["string"]

  • metaobjectRequired
    • Unknown properties are rejected

    Example: {"request_id":"00000000-0000-0000-0000-000000000001"}

    • request_idstringRequired
      Correlation identifier issued by the API, also returned in the X-Request-ID response header. Client-supplied X-Request-ID values are replaced.

      Example: string

503 response
{
  "error": {
    "code": "service_unavailable",
    "message": "Service temporarily unavailable"
  },
  "meta": {
    "request_id": "00000000-0000-0000-0000-000000000001"
  }
}