---
title: "Start Penny Validation"
method: POST
path: "/v1/transactions/penny_validation"
tags: ["Transactions"]
---

# Start Penny Validation

`POST /v1/transactions/penny_validation`

## Request

- Base URL: `https://apicore.stg.finch.lat`
- URL: `https://apicore.stg.finch.lat/v1/transactions/penny_validation`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/monato/apis/fincore-api/docs/v1/transactions/penny_validation/post.ts> (a function with typed inputs; its response is checked against the schema)

Sends a $0.01 MXN validation transfer to the destination instrument and starts the CEP lookup process. Register a `CEP` webhook before using this endpoint so you receive status updates. `INITIALIZED` in the API response should be treated like `PENDING`; webhook statuses are `PENDING`, `DELAYED`, `COMPLETED`, or `FAILED`.

## Headers

- `Idempotency-Key` string

## Request body

- PennyValidationRequest: Request to start a Penny Validation transfer. This endpoint sets the validation flow explicitly and uses a `0.01` MXN transaction internally.
  - `client_id` string, uuid, required: Client UUID that owns the validation transaction.
  - `source_instrument_id` string, uuid, required: Source instrument UUID used to send the validation amount.
  - `destination_instrument_id` string, uuid, required: Destination instrument UUID to validate.
  - `description` string: Optional concept for the validation transaction.
  - `external_reference` string: Optional numeric reference with a maximum of 7 digits.

## Response `200`

Penny Validation transaction created.

- PennyValidationResponse: Money Out transaction accepted by Fincore.
  - `id` string, uuid, required: Transaction UUID.
  - `bankId` string, uuid, required: Bank UUID used by the source account.
  - `clientId` string, uuid, required: Client UUID that owns the transaction.
  - `externalReference` string, required: Client-provided numeric reference.
  - `trackingId` string, required: Tracking key assigned to the transaction for reconciliation.
  - `description` string, required: Payment concept sent with the transaction.
  - `amount` string, required: Decimal amount as a string with exactly two decimal places.
  - `currency` 'MXN', required
  - `category` 'CREDIT_TRANS' | 'DEBIT_TRANS' | 'INTER_TRANS' | 'OTHER', required
  - `subCategory` 'OTHERS' | 'SPEI_CREDIT' | 'SPEI_DEBIT' | 'INT_DEBIT' | 'INT_CREDIT' | 'SPEI_REFUNDED' | 'SPEI_REFUNDED_CREDIT' | 'SPEI_REFUNDED_DEBIT' | 'INT_ADJ_CREDIT' | 'INT_ADJ_DEBIT', required
  - `transactionStatus` 'INITIALIZED' | 'IN_PROGRESS' | 'LIQUIDATED' | 'CANCELLED' | 'REFUNDED' | 'REJECTED' | 'DECLINED', required
  - `audit` object: Transaction lifecycle timestamps.
    - `createdAt` string, date-time: Timestamp when the transaction was created.
    - `updatedAt` string, date-time: Timestamp when the transaction was last updated.
    - `deletedAt` string, nullable: Timestamp when the transaction was deleted, or null.
    - `blockedAt` string, nullable: Timestamp when the transaction was blocked, or null.
  - `sourceInstrument` TransactionInstrument: Instrument snapshot associated with a transaction.
    - `id` string, uuid: Instrument UUID.
    - `bankId` string, uuid: Bank UUID associated with the instrument.
    - `clientId` string, uuid: Client UUID associated with the instrument.
    - `ownerId` string, uuid: UUID of the client or customer that owns the instrument.
    - `instrumentAlias` string: Human-friendly label for the instrument.
    - `instrumentStatus` 'ACTIVE' | 'BLOCKED' | 'DELETED': Current instrument lifecycle status.
    - `instrumentType` 'RECEIVER' | 'SENDER_RECEIVER'
    - `instrumentDetail` union: Details of the instrument as stored on the transaction. The shape depends on the instrument type: card destinations return `cardNumber`, `expirationDate` and `holderName`; CLABE instruments return `accountNumber`, `clabeNumber` and `holderName`.
      - CardInstrumentDetail: Debit-card instrument details returned by Fincore.
        - `cardNumber` string, required: Debit card number associated with the instrument.
        - `expirationDate` string, nullable: Card expiration date when available; null otherwise.
        - `holderName` string, required: Debit-card holder name.
      - ClabeInstrumentDetail: CLABE instrument details returned by Fincore.
        - `accountNumber` string, required: Account number without bank prefix.
        - `clabeNumber` string, required: Full 18-digit CLABE.
        - `holderName` string, required: CLABE account holder name.
    - `rfc` string: RFC associated with the instrument holder.
    - `customerId` string, uuid: Customer UUID when the instrument belongs to a Business Unit.
  - `destinationInstrument` TransactionInstrument: Instrument snapshot associated with a transaction.
    - `id` string, uuid: Instrument UUID.
    - `bankId` string, uuid: Bank UUID associated with the instrument.
    - `clientId` string, uuid: Client UUID associated with the instrument.
    - `ownerId` string, uuid: UUID of the client or customer that owns the instrument.
    - `instrumentAlias` string: Human-friendly label for the instrument.
    - `instrumentStatus` 'ACTIVE' | 'BLOCKED' | 'DELETED': Current instrument lifecycle status.
    - `instrumentType` 'RECEIVER' | 'SENDER_RECEIVER'
    - `instrumentDetail` union: Details of the instrument as stored on the transaction. The shape depends on the instrument type: card destinations return `cardNumber`, `expirationDate` and `holderName`; CLABE instruments return `accountNumber`, `clabeNumber` and `holderName`.
      - CardInstrumentDetail: Debit-card instrument details returned by Fincore.
        - `cardNumber` string, required: Debit card number associated with the instrument.
        - `expirationDate` string, nullable: Card expiration date when available; null otherwise.
        - `holderName` string, required: Debit-card holder name.
      - ClabeInstrumentDetail: CLABE instrument details returned by Fincore.
        - `accountNumber` string, required: Account number without bank prefix.
        - `clabeNumber` string, required: Full 18-digit CLABE.
        - `holderName` string, required: CLABE account holder name.
    - `rfc` string: RFC associated with the instrument holder.
    - `customerId` string, uuid: Customer UUID when the instrument belongs to a Business Unit.
  - `originalTransactionId` string, uuid: Present on refund-related transactions.
  - `refundTransactionId` string, uuid: Present on original transactions after refund.
  - `metadata` object, required: Metadata required in Penny Validation responses.
    - `dataCep` TransactionDataCep, required: CEP validation metadata associated with a transaction.
      - `cepUrl` string, uri: Banxico CEP URL when the CEP document is available.
      - `validationId` string, uuid: Internal UUID for the CEP validation process.
      - `beneficiaryName` string: Beneficiary name returned by the CEP validation process.
      - `beneficiaryRfc` string: Beneficiary RFC returned by the CEP validation process.
      - `status` 'INITIALIZED' | 'PENDING' | 'DELAYED' | 'COMPLETED' | 'FAILED': Current CEP validation status.
      - `createdAt` string, date-time: Timestamp when the CEP validation record was created.
      - `processedAt` string, date-time, nullable: Timestamp when CEP processing finished, or null while pending.
    - `dataReturn` object: Return or refund metadata when available.
      - `trackingId` string
      - `originalTrackingId` string
      - `reason` string
      - `reasonDescription` string
  - `clientReference` string: Optional client reference returned when it was supplied in the request.

## Other responses

- `400`: Penny Validation request is invalid. Possible causes: missing source or destination instrument, invalid description, invalid external reference, unsupported currency/amount rule, or malformed UUIDs. It also covers client or rail state that prevents validation.
- `401`: Missing, expired, invalid, or environment-mismatched API key or bearer token. See [Authentication](/products/fincore/guides/authentication.md).
- `404`: Source instrument, destination instrument, client, bank, or related account was not found.
- `409`: Idempotency conflict. Possible causes: same `Idempotency-Key` reused with a different payload, or the original request is still in progress.
- `500`: Unexpected server error. See [Error catalog](/products/fincore/guides/error-catalog.md) before retrying non-idempotent operations.

## Changes

- **2026-09-26** `e22ef66945df`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monato/apis/fincore-api/changes/v1/transactions/penny_validation/post.md)

---

[API](https://skmtc.dev/monato/apis/fincore-api.md) - [All operations](https://skmtc.dev/monato/apis/fincore-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monato/apis/fincore-api/revisions/e22ef66945df?raw)
