MoneyHash Loyalty API
The Loyalty API from MoneyHash — 4 operation(s) for loyalty.
The Loyalty API from MoneyHash — 4 operation(s) for loyalty.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/moneyhash:moneyhash-loyalty-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: MoneyHash Loyalty API
version: 1.1.0
description: MoneyHash Public APIs documentation
servers:
- url: https://web.moneyhash.io
tags:
- name: Loyalty
paths:
/api/v1.4/loyalty/earn/:
post:
operationId: v1.1_loyalty_earn_create
description: Creates a loyalty earn transaction for the account and queues processing with the configured provider. The transaction starts in PENDING status.
summary: Create loyalty earn
tags:
- Loyalty
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateEarnRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/CreateEarnRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/CreateEarnRequest'
required: true
security:
- ApiKeyAuth: []
- AccessTokenAuth: []
responses:
'202':
content:
application/json:
schema:
$ref: '#/components/schemas/EarnCreateResponse'
examples:
CreatedEarnTransaction:
value:
status:
code: 202
message: success
errors: []
data:
id: 550e8400-e29b-41d4-a716-446655440000
status: PENDING
provider_id: gwG0y8j
amount: '75.00'
currency: SAR
merchant_reference: merchant-ref-1
created: '2026-05-13T12:00:00Z'
count: 1
next: null
previous: null
summary: Created earn transaction
description: Transaction accepted and async earn queued.
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse400'
examples:
UnsupportedCurrency:
value:
status:
code: 400
message: ''
errors:
- error: Currency USD is not supported by this provider.
data: {}
count: null
next: null
previous: null
summary: Unsupported currency
description: ''
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse401'
examples:
UnauthorizedAPIKey:
value:
status:
code: 401
message: ''
errors:
- detail: Authentication credentials were not provided.
data: {}
count: null
next: null
previous: null
summary: Unauthorized API key
description: ''
/api/v1.4/loyalty/earn/{id}/:
get:
operationId: v1.1_loyalty_earn_retrieve
description: Returns the current state of a loyalty earn transaction belonging to the authenticated account.
summary: Retrieve loyalty earn
parameters:
- in: path
name: id
schema:
type: string
description: Loyalty earn transaction UUID is a unique identifier for the loyalty earn transaction.
required: true
tags:
- Loyalty
security:
- ApiKeyAuth: []
- AccessTokenAuth: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/EarnDetail'
examples:
EarnedTransaction:
value:
status:
code: 200
message: success
errors: []
data:
id: 550e8400-e29b-41d4-a716-446655440000
status: EARNED
provider: Qitaf
provider_id: gwG0y8j
identifier: '+966500000020'
identifier_type: PHONE_NUMBER
amount: '12.00'
currency: SAR
merchant_reference: retrieve-ref
provider_reference_id: prov-x
reverse_provider_reference_id: null
failure_reason: null
reversed_at: null
created: '2026-05-13T12:00:00Z'
modified: '2026-05-13T12:00:05Z'
count: 1
next: null
previous: null
summary: Earned transaction
description: ''
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse401'
examples:
UnauthorizedAPIKey:
value:
status:
code: 401
message: ''
errors:
- detail: Authentication credentials were not provided.
data: {}
count: null
next: null
previous: null
summary: Unauthorized API key
description: ''
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse404'
examples:
NotFound:
value:
status:
code: 404
message: ''
errors:
- error: Transaction not found
data: {}
count: null
next: null
previous: null
summary: Not found
description: Unknown UUID or transaction belongs to another account.
description: ''
/api/v1.4/loyalty/earn/{id}/reverse/:
post:
operationId: v1.1_loyalty_earn_reverse_create
description: Queues a reversal of an EARNED loyalty transaction. The amount in the body must match the original earn amount. Status moves to PENDING_REVERSE status. while the provider is called. When the reversal is successful, the status moves to REVERSED status.
summary: Reverse loyalty earn
parameters:
- in: path
name: id
schema:
type: string
description: Loyalty earn transaction UUID is a unique identifier for the loyalty earn transaction.
required: true
tags:
- Loyalty
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ReverseRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/ReverseRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/ReverseRequest'
required: true
security:
- ApiKeyAuth: []
- AccessTokenAuth: []
responses:
'202':
content:
application/json:
schema:
$ref: '#/components/schemas/ReverseResponse'
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse400'
examples:
InvalidAmount:
value:
status:
code: 400
message: ''
errors:
- error: Reverse amount must be equal to earn amount.
data: {}
count: null
next: null
previous: null
summary: Invalid amount
description: ''
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse401'
examples:
UnauthorizedAPIKey:
value:
status:
code: 401
message: ''
errors:
- detail: Authentication credentials were not provided.
data: {}
count: null
next: null
previous: null
summary: Unauthorized API key
description: ''
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse404'
examples:
EarnNotFound:
value:
status:
code: 404
message: ''
errors:
- error: Earn not found.
data: {}
count: null
next: null
previous: null
summary: Earn not found
description: ''
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse409'
examples:
EarnNotInAReversibleState:
value:
status:
code: 409
message: ''
errors:
- error: Earn is not in a reversible state (must be EARNED).
data: {}
count: null
next: null
previous: null
summary: Earn not in a reversible state
description: ''
/api/v1.4/loyalty/eligibility/:
post:
operationId: v1.1_loyalty_eligibility_create
description: Checks whether a customer identifier is eligible to earn loyalty points for the given loyalty provider. Some providers do not support this call; in that case the response returns eligible null with a reason.
summary: Check loyalty eligibility
tags:
- Loyalty
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CheckEligibilityRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/CheckEligibilityRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/CheckEligibilityRequest'
required: true
security:
- ApiKeyAuth: []
- AccessTokenAuth: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/CheckEligibilityResponse'
examples:
EligibleCustomer:
value:
status:
code: 200
message: success
errors: []
data:
eligible: true
reason: null
count: 1
next: null
previous: null
summary: Eligible customer
description: Provider reports the identifier is eligible.
ProviderDoesNotSupportEligibility:
value:
status:
code: 200
message: success
errors: []
data:
eligible: null
reason: This provider does not support eligibility check.
count: 1
next: null
previous: null
summary: Provider does not support eligibility
description: eligible is null when the integration has no eligibility API.
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse400'
examples:
ValidationError:
value:
status:
code: 400
message: ''
errors:
- error: Invalid identifier format.
data: {}
count: null
next: null
previous: null
summary: Validation error
description: Invalid body, unknown provider, or invalid identifier format.
ProviderEligibilityFailure:
value:
status:
code: 400
message: ''
errors:
- error: Eligibility check failed at provider.
data: {}
count: null
next: null
previous: null
summary: Provider eligibility failure
description: The upstream loyalty provider rejected or failed the check.
description: ''
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/DocsErrorResponse401'
examples:
UnauthorizedAPIKey:
value:
status:
code: 401
message: ''
errors:
- detail: Authentication credentials were not provided.
data: {}
count: null
next: null
previous: null
summary: Unauthorized API key
description: Missing or invalid account API key.
description: ''
components:
schemas:
CreateEarnRequest:
type: object
properties:
merchant_reference:
type: string
description: Your unique reference for this earn
maxLength: 255
amount:
type: string
format: decimal
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
description: Monetary amount driving the earn (provider rules apply).
currency:
enum:
- USD
- CAD
- EUR
- AED
- AFN
- ALL
- AMD
- ARS
- AUD
- AZN
- BAM
- BDT
- BGN
- BHD
- BIF
- BND
- BOB
- BRL
- BWP
- BYN
- BZD
- CDF
- CHF
- CLP
- CNY
- COP
- CRC
- CVE
- CZK
- DJF
- DKK
- DOP
- DZD
- EEK
- EGP
- ERN
- ETB
- GBP
- GEL
- GHS
- GNF
- GTQ
- HKD
- HNL
- HRK
- HUF
- IDR
- ILS
- INR
- IQD
- IRR
- ISK
- JMD
- JOD
- JPY
- KES
- KHR
- KMF
- KRW
- KWD
- KZT
- LBP
- LKR
- LTL
- LVL
- LYD
- MAD
- MDL
- MGA
- MKD
- MMK
- MOP
- MUR
- MXN
- MYR
- MZN
- NAD
- NGN
- NIO
- NOK
- NPR
- NZD
- OMR
- PAB
- PEN
- PHP
- PKR
- PLN
- PYG
- QAR
- RON
- RSD
- RUB
- RWF
- SAR
- SDG
- SEK
- SGD
- SOS
- SYP
- THB
- TND
- TOP
- TRY
- TTD
- TWD
- TZS
- UAH
- UGX
- UYU
- UZS
- VEF
- VND
- XAF
- XOF
- YER
- ZAR
- ZMK
- ZWL
- MRU
type: string
x-spec-enum-id: 926115c6927e9c0a
description: 'ISO currency code; must be supported by the loyalty provider.
* `USD` - USD
* `CAD` - CAD
* `EUR` - EUR
* `AED` - AED
* `AFN` - AFN
* `ALL` - ALL
* `AMD` - AMD
* `ARS` - ARS
* `AUD` - AUD
* `AZN` - AZN
* `BAM` - BAM
* `BDT` - BDT
* `BGN` - BGN
* `BHD` - BHD
* `BIF` - BIF
* `BND` - BND
* `BOB` - BOB
* `BRL` - BRL
* `BWP` - BWP
* `BYN` - BYN
* `BZD` - BZD
* `CDF` - CDF
* `CHF` - CHF
* `CLP` - CLP
* `CNY` - CNY
* `COP` - COP
* `CRC` - CRC
* `CVE` - CVE
* `CZK` - CZK
* `DJF` - DJF
* `DKK` - DKK
* `DOP` - DOP
* `DZD` - DZD
* `EEK` - EEK
* `EGP` - EGP
* `ERN` - ERN
* `ETB` - ETB
* `GBP` - GBP
* `GEL` - GEL
* `GHS` - GHS
* `GNF` - GNF
* `GTQ` - GTQ
* `HKD` - HKD
* `HNL` - HNL
* `HRK` - HRK
* `HUF` - HUF
* `IDR` - IDR
* `ILS` - ILS
* `INR` - INR
* `IQD` - IQD
* `IRR` - IRR
* `ISK` - ISK
* `JMD` - JMD
* `JOD` - JOD
* `JPY` - JPY
* `KES` - KES
* `KHR` - KHR
* `KMF` - KMF
* `KRW` - KRW
* `KWD` - KWD
* `KZT` - KZT
* `LBP` - LBP
* `LKR` - LKR
* `LTL` - LTL
* `LVL` - LVL
* `LYD` - LYD
* `MAD` - MAD
* `MDL` - MDL
* `MGA` - MGA
* `MKD` - MKD
* `MMK` - MMK
* `MOP` - MOP
* `MUR` - MUR
* `MXN` - MXN
* `MYR` - MYR
* `MZN` - MZN
* `NAD` - NAD
* `NGN` - NGN
* `NIO` - NIO
* `NOK` - NOK
* `NPR` - NPR
* `NZD` - NZD
* `OMR` - OMR
* `PAB` - PAB
* `PEN` - PEN
* `PHP` - PHP
* `PKR` - PKR
* `PLN` - PLN
* `PYG` - PYG
* `QAR` - QAR
* `RON` - RON
* `RSD` - RSD
* `RUB` - RUB
* `RWF` - RWF
* `SAR` - SAR
* `SDG` - SDG
* `SEK` - SEK
* `SGD` - SGD
* `SOS` - SOS
* `SYP` - SYP
* `THB` - THB
* `TND` - TND
* `TOP` - TOP
* `TRY` - TRY
* `TTD` - TTD
* `TWD` - TWD
* `TZS` - TZS
* `UAH` - UAH
* `UGX` - UGX
* `UYU` - UYU
* `UZS` - UZS
* `VEF` - VEF
* `VND` - VND
* `XAF` - XAF
* `XOF` - XOF
* `YER` - YER
* `ZAR` - ZAR
* `ZMK` - ZMK
* `ZWL` - ZWL
* `MRU` - MRU'
webhook_url:
type:
- string
- 'null'
format: uri
description: Optional HTTPS URL for loyalty earn callbacks.
loyalty:
allOf:
- $ref: '#/components/schemas/LoyaltyDataInput'
description: Loyalty program and customer identifier for this earn.
required:
- amount
- currency
- loyalty
- merchant_reference
DocsErrorResponse400:
type: object
properties:
status:
$ref: '#/components/schemas/DocsStatus'
data:
type: object
additionalProperties: {}
count:
type:
- integer
- 'null'
description: Total number of items.
next:
type:
- string
- 'null'
description: Next page url if exists
previous:
type:
- string
- 'null'
description: Previous page url if exists
required:
- count
- data
- next
- previous
- status
DocsErrorResponse404:
type: object
properties:
status:
$ref: '#/components/schemas/DocsStatus'
data:
type: object
additionalProperties: {}
count:
type:
- integer
- 'null'
description: Total number of items.
next:
type:
- string
- 'null'
description: Next page url if exists
previous:
type:
- string
- 'null'
description: Previous page url if exists
required:
- count
- data
- next
- previous
- status
DocsErrorResponse401:
type: object
properties:
status:
$ref: '#/components/schemas/DocsStatus'
data:
type: object
additionalProperties: {}
count:
type:
- integer
- 'null'
description: Total number of items.
next:
type:
- string
- 'null'
description: Next page url if exists
previous:
type:
- string
- 'null'
description: Previous page url if exists
required:
- count
- data
- next
- previous
- status
DocsErrorResponse409:
type: object
properties:
status:
$ref: '#/components/schemas/DocsStatus'
data:
type: object
additionalProperties: {}
count:
type:
- integer
- 'null'
description: Total number of items.
next:
type:
- string
- 'null'
description: Next page url if exists
previous:
type:
- string
- 'null'
description: Previous page url if exists
required:
- count
- data
- next
- previous
- status
CheckEligibilityResponse:
type: object
properties:
eligible:
type:
- boolean
- 'null'
description: Whether the customer is eligible. Null when the provider does not expose an eligibility check.
reason:
type:
- string
- 'null'
description: Explanation when eligible is false or null.
required:
- eligible
ReverseRequest:
type: object
properties:
amount:
type: string
format: decimal
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
description: Amount to be reversed
required:
- amount
CheckEligibilityRequest:
type: object
properties:
provider_id:
type: string
description: MoneyHash loyalty service id (hashid) connected to the account.
identifier:
type: string
description: Customer identifier in the format required by identifier_type.
identifier_type:
enum:
- PHONE_NUMBER
- NATIONAL_ID
- EMAIL
type: string
x-spec-enum-id: 3515c240a9887624
description: 'How to interpret identifier (for example PHONE_NUMBER, EMAIL, etc.).
* `PHONE_NUMBER` - PHONE_NUMBER
* `NATIONAL_ID` - NATIONAL_ID
* `EMAIL` - EMAIL'
required:
- identifier
- identifier_type
- provider_id
DocsStatus:
type: object
properties:
data:
description: Response message
required:
- data
ReverseResponse:
type: object
properties:
id:
type: string
description: UUID is a unique identifier for the loyalty earn transaction.
status:
enum:
- PENDING
- EARNED
- PENDING_REVERSE
- REVERSE_FAILED
- REVERSED
- FAILED
type: string
x-spec-enum-id: 6cf248feb958f547
description: 'Lifecycle state: pending earn, earned, reversal, terminal failure, etc.
* `PENDING` - PENDING
* `EARNED` - EARNED
* `PENDING_REVERSE` - PENDING_REVERSE
* `REVERSE_FAILED` - REVERSE_FAILED
* `REVERSED` - REVERSED
* `FAILED` - FAILED'
reversed_at:
type:
- string
- 'null'
format: date-time
required:
- id
LoyaltyDataInput:
type: object
properties:
provider_id:
type: string
description: MoneyHash loyalty service id (hashid) connected to the account.
identifier:
type: string
description: Customer identifier in the format required by identifier_type.
identifier_type:
enum:
- PHONE_NUMBER
- NATIONAL_ID
- EMAIL
type: string
x-spec-enum-id: 3515c240a9887624
description: 'How to interpret identifier (for example PHONE_NUMBER, EMAIL, etc.).
* `PHONE_NUMBER` - PHONE_NUMBER
* `NATIONAL_ID` - NATIONAL_ID
* `EMAIL` - EMAIL'
required:
- identifier
- identifier_type
- provider_id
EarnCreateResponse:
type: object
description: Slim response shape for ``POST /loyalty/earn/`` (mirrors the spec).
properties:
id:
type: string
description: UUID is a unique identifier for the loyalty earn transaction.
status:
enum:
- PENDING
- EARNED
- PENDING_REVERSE
- REVERSE_FAILED
- REVERSED
- FAILED
type: string
x-spec-enum-id: 6cf248feb958f547
description: 'Lifecycle state: pending earn, earned, reversal, terminal failure, etc.
* `PENDING` - PENDING
* `EARNED` - EARNED
* `PENDING_REVERSE` - PENDING_REVERSE
* `REVERSE_FAILED` - REVERSE_FAILED
* `REVERSED` - REVERSED
* `FAILED` - FAILED'
provider_id:
type: string
readOnly: true
description: MoneyHash loyalty service id (hashid).
amount:
type: string
format: decimal
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
description: Earn amount.
currency:
type: string
description: ISO currency code of the earn amount.
merchant_reference:
type: string
description: Merchant-supplied reference.
maxLength: 255
created:
type: string
format: date-time
readOnly: true
required:
- amount
- created
- currency
- id
- merchant_reference
- provider_id
EarnDetail:
type: object
properties:
id:
type: string
description: UUID is a unique identifier for the loyalty earn transaction.
status:
enum:
- PENDING
- EARNED
- PENDING_REVERSE
- REVERSE_FAILED
- REVERSED
- FAILED
type: string
x-spec-enum-id: 6cf248feb958f547
description: 'Lifecycle state: pending earn, earned, reversal, terminal failure, etc.
* `PENDING` - PENDING
* `EARNED` - EARNED
* `PENDING_REVERSE` - PENDING_REVERSE
* `REVERSE_FAILED` - REVERSE_FAILED
* `REVERSED` - REVERSED
* `FAILED` - FAILED'
provider:
type: string
description: Display name of the loyalty provider.
provider_id:
type: string
readOnly: true
description: MoneyHash loyalty service id (hashid)
identifier:
type: string
description: Customer identifier
maxLength: 255
identifier_type:
enum:
- PHONE_NUMBER
- NATIONAL_ID
- EMAIL
type: string
x-spec-enum-id: 3515c240a9887624
description: 'How the identifier value should be interpreted (e.g. phone number).
* `PHONE_NUMBER` - PHONE_NUMBER
* `NATIONAL_ID` - NATIONAL_ID
* `EMAIL` - EMAIL'
amount:
type: string
format: decimal
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
description: Earn amount.
currency:
type: string
description: ISO currency code of the earn amount.
merchant_reference:
type: string
description: Merchant-supplied reference.
maxLength: 255
provider_reference_id:
type:
- string
- 'null'
description: Provider-side id returned by the earn call.
maxLength: 255
reverse_provider_reference_id:
type:
- string
- 'null'
description: Provider-side id returned by the reverse call.
maxLength: 255
failure_reason:
type:
- string
- 'null'
readOnly: true
reversed_at:
type:
- string
- 'null'
format: date-time
created:
type: string
format: date-time
readOnly: true
modified:
type: string
format: date-time
readOnly: true
required:
- amount
- created
- currency
- failure_reason
- id
- identifier
- identifier_type
- merchant_reference
- modified
- provider
- provider_id
securitySchemes:
AccessTokenAuth:
type: apiKey
in: query
name: access_token
ApiKeyAuth:
type: apiKey
in: header
name: X-Api-Key
x-provenance:
method: searched
source: https://docs.moneyhash.io/reference
harvested: '2026-10-26'
tool: harvest-readme-openapi.py
note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored.
assembled_from:
- https://docs.moneyhash.io/reference/v11_accounts_create.md
- https://docs.moneyhash.io/reference/v11_accounts_get_from_access_token_retrieve.md
- https://docs.moneyhash.io/reference/v11_accounts_list.md
- https://docs.moneyhash.io/reference/v11_accounts_payment_methods_create.md
- https://docs.moneyhash.io/reference/v11_accounts_reset_access_token_create.md
- https://docs.moneyhash.io/reference/v11_accounts_transactions_list.md
- https://docs.moneyhash.io/reference/v11_customers_cards_destroy.md
- https://docs.moneyhash.io/reference/v11_customers_cards_list.md
- https://docs.moneyhash.io/reference/v11_customers_create.md
- https://docs.moneyhash.io/reference/v11_customers_destroy.md
- https://docs.moneyhash.io/reference/v11_customers_list.md
- https://docs.moneyhash.io/reference/v11_customers_partial_update.md
- https://docs.moneyhash.io/reference/v11_customers_retrieve.md
- https://docs.moneyhash.io/reference/v11_customers_subscriptions_retrieve.md
- https://docs.moneyhash.io/reference/v11_customers_transactions_list.md
- https://docs.moneyhash.io/reference/v11_customers_wallets_debit_create.md
- https://docs.moneyhash.io/reference/v11_customers_wallets_top_up_create.md
- https://docs.moneyhash.io/reference/v11_direct_payments_intent_create.md
- https://docs.moneyhash.io/reference/v11_direct_payments_intents_card_token_create.md
# --- truncated at 32 KB (37 KB total) ---
# Full source: https://artifacts.apis.io/moneyhash/openapi/moneyhash-loyalty-api-openapi.yml