Reference · version 2026-10-15
Grip Rails business clients API (phase 1)
Payment accounts in Argentine pesos, CVUs, transfers through COELSA and events for business clients of FCM Payment Solutions S.A.S.
Download openapi.en.yaml openapi.en.json
This reference is generated from the English version of the OpenAPI 3.1.0 contract. The contract is the source of truth; its canonical version is in Spanish (openapi.yaml).
API through which business clients of FCM Payment Solutions S.A.S. (a payment service provider that offers payment accounts, registered with the BCRA, the Central Bank of Argentina; PSP 214 at COELSA, the Argentine clearing house for immediate transfers) operate payment accounts in Argentine pesos: check balances, use their CVUs (Argentine virtual account numbers), validate counterparties, order transfers through COELSA and learn about incoming credits.
This is the phase 1 contract, multi-client from day one: each entity has its own credentials, signing keys, webhook URL, ledger accounts, CVUs, limits and fee. This contract is stable: the implementation may change and the client's integration does not have to.
What this API does not do
- It does not handle digital assets. There are no crypto-assets, stablecoins, blockchain addresses, conversions or quotes. The BCRA's consolidated rules for payment service providers (section 4.6) prohibit FCM Payment Solutions S.A.S. from carrying them out or facilitating them. If a client operates crypto, that leg is executed by another regulated legal entity and FCM Payment Solutions S.A.S. only moves pesos against instructions.
- It does not handle foreign currency or cross-border transfers. The only currency is
ARS, and destinations are CBUs, CVUs or aliases of the Argentine system. - It does not create CVUs or accounts in phase 1. Grip Rails creates them at the entity's request (they show up as listable account numbers). Creation through the API is phase 2.
FCM Payment Solutions S.A.S. limits itself to offering payment services and is not authorized by the BCRA to operate as a financial institution. Funds deposited in payment accounts do not constitute deposits in a financial institution, nor do they have any of the guarantees that such deposits may enjoy under the laws and regulations applicable to deposits in financial institutions.
Authentication: API key and a signature on every request
Every request carries both:
Authorization: Bearer fcm_live_…: the entity's API key. Grip Rails stores it hashed. Two can be active at once so you can rotate without downtime.- An HTTP signature of the request (RFC 9421, HTTP Message Signatures) made with the client's private key. Grip
Rails stores only the public key, registered at onboarding (up to two active per environment). Algorithms:
ed25519orecdsa-p256-sha256.- Required signed components:
"@method"and"@target-uri". If the request has a body, also"content-type","content-digest"and"idempotency-key". If you sendFCM-Version, also"fcm-version"."authorization"is not signed: a signature that covers it is rejected withsignature_invalid. That way Grip Rails can re-verify the signature of each instruction with your public key, without your API key, which it only stores hashed. - Required signature parameters:
created(Unix seconds; ±300 s accepted),nonce(16 to 64 base64url characters, unique per key for 10 minutes),keyid(the id of your public key,ck_…) andalg. - With a body:
Content-Digest: sha-256=:…:(RFC 9530) computed over the exact bytes you send.
- Required signed components:
POST /v1/outgoing_transfers HTTP/1.1
Host: api.fcmpayments.com
Authorization: Bearer fcm_live_3kTq…
Content-Type: application/json
Idempotency-Key: 01JA2B3C4D5E6F7G8H9JKMNPQR
Content-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
Signature-Input: sig1=("@method" "@target-uri" "content-type" "content-digest" "idempotency-key");created=1760112000;nonce="Vq3n8sZx0bR1yTqLkM2pWg";keyid="ck_01JA2B3C4D5E6F7G8H9JKMNPQS";alg="ed25519"
Signature: sig1=:Kp9…==:
In production the entity can request an IP allowlist. mTLS is offered as an additional layer in phase 2 for those who require it; it does not replace the signature.
Idempotency
Idempotency-Keyis required on everyPOST(16 to 128 charactersA-Z a-z 0-9 . _ : -; a UUID or ULID is recommended). Its scope is the entity in that environment.- Same key and same request: same response (status code and body), with
Idempotent-Replayed: true. - Same key with a different request (SHA-256 fingerprint of method, path and body canonicalized per RFC 8785):
409 idempotency_key_reused. - While the first request is in progress:
409 idempotency_request_in_progress(retryable). 5xxresponses are not stored: retry with the same key.- The full record lives for 35 days and can be looked up with
GET /v1/idempotency_keys/{idempotency_key}. A transfer's key stays bound to that transfer forever: it cannot be reused even after the 35 days, and the transfer can be found withGET /v1/outgoing_transfers?idempotency_key=…. - If the first response was lost (for example, a dropped connection), the retry returns the current state of the same transfer, which may be further along than the original.
- A
202response is stored and replayed like any2xx. The current state is available atGET /v1/outgoing_transfers/{id}or arrives by webhook.
Versioning
- The major version goes in the path (
/v1) and changes only with a complete redesign. - The date-based version goes in
FCM-Version: YYYY-MM-DD. Each entity is pinned to the version that is current when it is onboarded and can try another one by sending the header. The response returns the version used. - Additive changes ship without a new version: new endpoints, new optional fields in requests, new fields in responses, new values in response enums and new event types. Your integration must ignore unknown fields and event types and tolerate new enum values.
- Breaking changes only ship in a new version. A version is maintained for at least 12 months after the next one is
published, and its retirement is announced 6 months in advance (
DeprecationandSunsetheaders, an email to the technical contact and the changelog). At most two versions are live at the same time. - Webhooks and events are built in the entity's pinned version (
api_versionfield).
Amounts, currency and dates
- Amounts: integers in cents of Argentine pesos (
150000= ARS 1,500.00). Currency:ARSonly. - Dates and times: RFC 3339 in UTC. The business day and the daily and monthly limits use the Buenos Aires calendar
(
America/Argentina/Buenos_Aires).
Pagination
Lists return newest first. limit goes from 1 to 100 (25 by default); for the next page, send starting_after with
the next_cursor you received. Events are different: ascending order by sequence (see "Events and webhooks").
Outgoing transfers: authorize before transferring
See POST /v1/outgoing_transfers. States and their ISO 20022 equivalent (pacs.002, TransactionStatus):
status |
What it means | Ledger hold | ISO 20022 |
|---|---|---|---|
pending |
Grip Rails received the order but cannot confirm the authorization yet. Money may be on hold. Do not retry with another Idempotency-Key. | There may be a pending one | PDNG |
rejected |
The authorization declined it. No money moved. | None, or released | RJCT |
reserved |
Authorized; amount plus charges on hold; not yet sent to COELSA. | Pending | ACCP |
submitted |
Sent to COELSA; the result is pending. With status_reason: late_settlement_review, reopened by a late settlement (see below). |
Pending (reopened: released, with the amount already debited) | ACSP |
completed |
COELSA credited it at the destination. | Posted | ACCC |
failed |
COELSA rejected it or it expired. No charge. If COELSA credits it later, it is reopened and the amount is debited, always without a fee (see below). | Released | RJCT |
Late settlement. If COELSA credits a transfer we already reported to you as failed (its notice arrived late or
was lost), the money left and Grip Rails reopens it: it goes back to submitted with status_reason: late_settlement_review (ISO ACSP; failure and failed_at go back to null) and we notify you with the event
transfer.outgoing.reopened. The amount is debited from your funds account with a compensating entry (its references
are in the event); if the funds are not enough, your guarantee account covers the shortfall and the rest remains as a
debt to FCM Payment Solutions S.A.S., as set out in the contract. Grip Rails disables your outgoing transfers, and they
stay disabled, even after completed, until Grip Rails enables them again (only in the sandbox are they re-enabled
automatically after the simulated closing: see Sandbox). When two people at Grip Rails confirm the settlement, the
transfer moves to completed (event transfer.outgoing.completed) free of charge: Grip Rails charges no fee for a
reopened transfer, because the reopening is not your fault (Grip Rails only releases a hold with evidence). charges
shows it with an fcm_fee charge of 0 and its reason, and total_debit_amount is the amount. It is the only way out
of failed; do not repeat it with another Idempotency-Key.
Incoming credits have a single state in phase 1, posted, equivalent to BOOK (camt.054).
Rate limits
Per entity: 5 writes and 25 reads per second (can be raised by contract). Above that: 429 rate_limited with
Retry-After.
More in Errors, Webhooks and signatures and Environments.
Entity
The authenticated business client, its limits, its usage and its fees.
Get the authenticated entity
Returns the entity that owns the API key, with its limits, its usage for the day and the month, and its fees.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The entity.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: Entity
object"entity"requiredlegal_namestring requiredmax. length200CUIT under which the entity holds its CVUs with COELSA.
suspended: it can read but cannot order transfers.environmentstring requiredValues:live,testapi_versionstring requiredContract version pinned for the entity.
pattern^\d{4}-\d{2}-\d{2}$The entity's limits for outgoing transfers, set by contract (approved by Grip Rails; they cannot be changed through the API). They count the amount, without charges, of transfers in
reserved,submittedandcompleted.null= no limit.Fee per movement, as set in the contract. It is charged as a separate ledger entry: on an outgoing transfer it is held together with the transfer and released if the transfer fails; on an incoming one it is deducted when posting and never exceeds the amount received.
created_atstring (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Accounts
The entity's payment accounts in pesos (funds and guarantee), with their ledger balance.
List accounts
Lists the entity's accounts with their balance and status.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Query
limitintegerMaximum number of objects per page.
min.1· max.100· default25starting_afterstringOpaque cursor (
next_cursorfrom the previous page).max. length200
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 Page of accounts.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: AccountList
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get an account (balance and status)
Balance and status of an account. The balance comes from the ledger at the time of the request:
posted is what has been posted, held what is on hold for outgoing transfers in progress, and available = posted − held.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The account.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: Account
object"account"requiredfunds: funds account, the one that operates.guarantee: guarantee account (a reserve) that the client deposits as set in the contract to cover shortfalls; it is visible but cannot be debited through the API.namestring requiredmax. length80The API's only currency.
frozen: it cannot order outgoing transfers; incoming ones are posted.CVU shown as the origin to COELSA if the transfer does not specify another one.
created_atstring (date-time) requiredupdated_atstring (date-time) required
Funds account with an outgoing transfer in progress
{
"id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"object": "account",
"entity_id": "ent_01JA2B3C4D5E6F7G8H9JKMNPQA",
"type": "funds",
"name": "Fondos operativos",
"currency": "ARS",
"status": "active",
"balances": {
"posted": 2500000,
"held": 150050,
"available": 2349950
},
"primary_account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQB",
"created_at": "2026-10-15T13:00:00Z",
"updated_at": "2026-10-16T18:22:41Z"
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Account numbers
The CVUs of each account (N per account). The entity is the holder of all of them.
List account numbers (CVUs)
Lists the entity's CVUs. An account can have N CVUs (for example, one for each of the client's users or merchants, to attribute collections); the entity is the holder of all of them, and whatever comes in through any of them is posted to the same account. In phase 1 Grip Rails creates them.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Query
account_idAccountIdFilters by account.
statusAccountNumberStatusFilters by status.
limitintegerMaximum number of objects per page.
min.1· max.100· default25starting_afterstringOpaque cursor (
next_cursorfrom the previous page).max. length200
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 Page of account numbers.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: AccountNumberList
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get an account number
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The account number.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: AccountNumber
object"account_number"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
pending: registration with COELSA in progress.inactive: deregistered or inactive at COELSA.Holder registered with COELSA. In phase 1 it is always the entity.
Fields of
holdernamestring requiredmax. length120CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.
is_primaryboolean requiredLabel the client requested for this CVU (for example, the id of its user or merchant). No personal data.
created_atstring (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Counterparties
Validation of a destination's holder against COELSA before paying.
Validate a counterparty
Asks COELSA who the holder of a CBU, CVU or alias is, whether the account is active and whether it passes Grip Rails' compliance controls. It does not move money.
A valid validation lasts 15 minutes (expires_at) and can be passed in counterparty_validation_id when creating the
transfer so it is not looked up again. A negative result is not an HTTP error: it responds 201 with the corresponding
result. If COELSA does not answer: 503 rail_unavailable.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: CounterpartyValidationRequest
Destination of a transfer or of a validation.
expected_cuitCuitIf present, the result is
holder_mismatchwhen COELSA reports another CUIT.
Validate an alias expecting a CUIT
{
"destination": {
"type": "alias",
"value": "proveedor.ejemplo"
},
"expected_cuit": "27000000006"
}
Responses
201 Validation done (the result may be negative).
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: CounterpartyValidation
object"counterparty_validation"requiredDestination of a transfer or of a validation.
valid: holder found, account active and controls in order.not_found: COELSA does not know the account or the alias.inactive: the account exists but is not active.holder_mismatch: the CUIT is not the expected one.blocked: Grip Rails cannot operate with that account (compliance control; no details).display_messagestring | null requiredText in Spanish to show the end user when the result is not
valid.Present if COELSA reported a holder (
valid,inactiveandholder_mismatch).validated_atstring (date-time) requiredexpires_atstring (date-time) requiredUntil when it can be used in a transfer (15 minutes).
Holder found and active
{
"id": "cval_01JA2B3C4D5E6F7G8H9JKMNPQC",
"object": "counterparty_validation",
"destination": {
"type": "alias",
"value": "proveedor.ejemplo"
},
"expected_cuit": "27000000006",
"result": "valid",
"display_message": null,
"counterparty": {
"name": "PROVEEDOR EJEMPLO",
"cuit": "27000000006",
"account": "0110599520000001234569",
"account_type": "cbu",
"bank_code": "011",
"alias": "proveedor.ejemplo",
"is_fcm_account": false
},
"validated_at": "2026-10-16T18:20:03Z",
"expires_at": "2026-10-16T18:35:03Z"
}
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Outgoing transfers
Payments in pesos to a CBU, CVU or alias, with prior authorization and a ledger hold.
Create an outgoing transfer
Orders a transfer in pesos from one of the entity's accounts to a CBU, CVU or alias.
Before moving a single peso, Grip Rails authorizes, in this order:
- Account and entity active, account not frozen and transfers enabled.
- Per-transaction limit.
- Hold in the ledger (pending transfer) for the amount plus charges. Without an available
balance:
insufficient_funds. - Destination holder according to COELSA (or a valid validation passed in
counterparty_validation_id): it exists, is active, is not the same account and, if you sentexpected_counterparty_cuit, matches. - Sanctions lists (Argentina's RePET, the UN and OFAC) on the destination holder.
- The entity's daily and monthly limits (transfers in
reserved,submittedandcompletedcount). - Anti-fraud rules.
If everything passes: 201 with the transfer in reserved and the event transfer.outgoing.reserved. Grip Rails
sends it to COELSA right away (submitted) and closes it with COELSA's notice: completed (the money arrived and the
hold is posted, with the event transfer.outgoing.completed) or failed (the hold is released, there is no charge,
event transfer.outgoing.failed). If COELSA credits it after reporting it as failed, Grip Rails reopens it
(submitted with status_reason: late_settlement_review, event transfer.outgoing.reopened) and closes it as
completed: see "Late settlement" in the general description.
If Grip Rails cannot confirm the result right away: 202 with the transfer in pending, or in submitted with
status_reason: rail_outcome_unknown if a retry finds it already sent and without a result. The order exists and is
bound to your Idempotency-Key: do not repeat it with another key. A pending transfer ends in reserved (event
transfer.outgoing.reserved) or in failed with failure.code: canceled_by_fcm (event transfer.outgoing.failed).
If something fails: 422 with the reason in error.code. The transfer is stored as rejected (its id is in
error.transfer_id) and the hold, if it was taken, is released. Malformed requests (400) create nothing.
COELSA is irreversible: Grip Rails does not release a hold that was already sent without evidence of a rejection. If
the result does not arrive, the transfer stays submitted with status_reason: rail_outcome_unknown and the money stays
on hold until it is resolved. It is never resent with another identifier.
If the destination is a Grip Rails account, the transfer is internal (rail.name: fcm_book) and completes immediately.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: OutgoingTransferCreateRequest
account_number_idAccountNumberIdCVU of the account shown as the origin to COELSA. By default, the account's primary one.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Destination of a transfer or of a validation.
expected_counterparty_cuitCuitAlways recommended. If COELSA reports another CUIT for the holder, it is rejected with
destination_holder_mismatch.counterparty_validation_idCounterpartyValidationIdA current
validvalidation (15 minutes) of the same destination. If it expired or does not match,400 parameter_invalid.conceptConceptBCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstringThe client's text. It stays at Grip Rails; in phase 1 it does not travel to COELSA.
max. length140external_referenceExternalReferenceThe client's reference for reconciliation. It does not have to be unique and it does not travel to COELSA.
metadataMetadataUp to 20 key-value pairs from the client. Do not include personal data.
Payment to a CBU with a holder check
{
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"amount": 150000,
"currency": "ARS",
"destination": {
"type": "cbu",
"value": "0110599520000001234569"
},
"expected_counterparty_cuit": "27000000006",
"concept": "FAC",
"description": "Factura 0003-00001234",
"external_reference": "pedido-7781",
"metadata": {
"agent_id": "agt_42"
}
}
Responses
201 Authorized and on hold.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: OutgoingTransfer
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
Just authorized
{
"id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV",
"object": "outgoing_transfer",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQB",
"amount": 150000,
"currency": "ARS",
"charges": [
{
"type": "fee",
"code": "fcm_fee",
"amount": 50,
"description": "Comisión por transferencia saliente"
}
],
"total_debit_amount": 150050,
"destination": {
"type": "cbu",
"value": "0110599520000001234569"
},
"counterparty": {
"name": "PROVEEDOR EJEMPLO",
"cuit": "27000000006",
"account": "0110599520000001234569",
"account_type": "cbu",
"bank_code": "011",
"alias": null,
"is_fcm_account": false
},
"concept": "FAC",
"description": "Factura 0003-00001234",
"external_reference": "pedido-7781",
"metadata": {
"agent_id": "agt_42"
},
"status": "reserved",
"status_reason": null,
"iso20022": {
"status": "ACCP",
"reason": null
},
"authorization": {
"decision": "approved",
"decided_at": "2026-10-16T18:22:41Z",
"rationale": {
"code": "approved",
"message": "Pasó todos los controles."
},
"checks": [
{
"name": "account",
"result": "passed"
},
{
"name": "limits",
"result": "passed"
},
{
"name": "funds",
"result": "passed"
},
{
"name": "counterparty",
"result": "passed"
},
{
"name": "compliance",
"result": "passed"
}
]
},
"reservation": {
"amount": 150050,
"state": "held",
"placed_at": "2026-10-16T18:22:41Z",
"resolved_at": null,
"ledger_references": [
"7f3a9c2e4b1d8f6a0c5e3b9d7a1f4c2e",
"1b8e4d2c9a7f3e5d0b6c8a2f4e1d9c7b"
]
},
"rail": null,
"failure": null,
"idempotency_key": "01JA2B3C4D5E6F7G8H9JKMNPQR",
"created_at": "2026-10-16T18:22:40Z",
"updated_at": "2026-10-16T18:22:41Z",
"completed_at": null,
"failed_at": null
}
202 Received; the result cannot be confirmed yet. Do not retry with another Idempotency-Key.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: OutgoingTransfer
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
422 The authorization declined the transfer. It was stored as rejected and no money moved.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: Error
sin_saldo
{
"error": {
"type": "transfer_declined",
"code": "insufficient_funds",
"message": "La cuenta acc_01JA2B3C4D5E6F7G8H9JKMNPQR tiene 120000 centavos disponibles y la transferencia necesita 150050.",
"display_message": "No hay saldo suficiente para esta transferencia.",
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#insufficient_funds",
"transfer_id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV"
}
}
titular
{
"error": {
"type": "transfer_declined",
"code": "destination_holder_mismatch",
"message": "COELSA informa otro CUIT para el titular del destino.",
"display_message": "La cuenta de destino no es de quien esperabas.",
"param": "expected_counterparty_cuit",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#destination_holder_mismatch",
"transfer_id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV"
}
}
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
List outgoing transfers
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Query
account_idAccountIdFilters by account.
statusOutgoingTransferStatusFilters by status.
idempotency_keyIdempotencyKeyValueFinds the transfer created with this Idempotency-Key (it also works after the 35 days).
external_referenceExternalReferenceFilters by your reference.
created_afterstring (date-time)Only objects created at or after this instant (RFC 3339).
created_beforestring (date-time)Only objects created before this instant (RFC 3339).
limitintegerMaximum number of objects per page.
min.1· max.100· default25starting_afterstringOpaque cursor (
next_cursorfrom the previous page).max. length200
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 Page of outgoing transfers.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: OutgoingTransferList
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get an outgoing transfer
Current state of the transfer. It is what you should look up when you receive a webhook.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The transfer.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: OutgoingTransfer
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
Credited by COELSA
{
"id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV",
"object": "outgoing_transfer",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQB",
"amount": 150000,
"currency": "ARS",
"charges": [
{
"type": "fee",
"code": "fcm_fee",
"amount": 50,
"description": "Comisión por transferencia saliente"
}
],
"total_debit_amount": 150050,
"destination": {
"type": "cbu",
"value": "0110599520000001234569"
},
"counterparty": {
"name": "PROVEEDOR EJEMPLO",
"cuit": "27000000006",
"account": "0110599520000001234569",
"account_type": "cbu",
"bank_code": "011",
"alias": null,
"is_fcm_account": false
},
"concept": "FAC",
"description": "Factura 0003-00001234",
"external_reference": "pedido-7781",
"metadata": {
"agent_id": "agt_42"
},
"status": "completed",
"status_reason": null,
"iso20022": {
"status": "ACCC",
"reason": null
},
"authorization": {
"decision": "approved",
"decided_at": "2026-10-16T18:22:41Z",
"rationale": {
"code": "approved",
"message": "Pasó todos los controles."
},
"checks": [
{
"name": "account",
"result": "passed"
},
{
"name": "limits",
"result": "passed"
},
{
"name": "funds",
"result": "passed"
},
{
"name": "counterparty",
"result": "passed"
},
{
"name": "compliance",
"result": "passed"
}
]
},
"reservation": {
"amount": 150050,
"state": "posted",
"placed_at": "2026-10-16T18:22:41Z",
"resolved_at": "2026-10-16T18:22:44Z",
"ledger_references": [
"7f3a9c2e4b1d8f6a0c5e3b9d7a1f4c2e",
"1b8e4d2c9a7f3e5d0b6c8a2f4e1d9c7b"
]
},
"rail": {
"name": "coelsa",
"operation_id": "86VRPQ2GX0O4XQ4Y9GLY0X",
"origin_reference": "9000000000017",
"status_code": "7500",
"submitted_at": "2026-10-16T18:22:42Z",
"finalized_at": "2026-10-16T18:22:44Z"
},
"failure": null,
"idempotency_key": "01JA2B3C4D5E6F7G8H9JKMNPQR",
"created_at": "2026-10-16T18:22:40Z",
"updated_at": "2026-10-16T18:22:44Z",
"completed_at": "2026-10-16T18:22:44Z",
"failed_at": null
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Incoming transfers
Credits received on the entity's CVUs, posted with real settlement from COELSA.
List incoming credits
Credits received on the entity's CVUs. Each one comes from a verified COELSA notice (a credit already settled in the collection account of FCM Payment Solutions S.A.S.) and is posted to the ledger with its fee as a separate entry.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Query
account_idAccountIdFilters by account.
account_number_idAccountNumberIdFilters by the CVU it came in through.
created_afterstring (date-time)Only objects created at or after this instant (RFC 3339).
created_beforestring (date-time)Only objects created before this instant (RFC 3339).
limitintegerMaximum number of objects per page.
min.1· max.100· default25starting_afterstringOpaque cursor (
next_cursorfrom the previous page).max. length200
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 Page of incoming credits.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: IncomingTransferList
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get an incoming credit
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The incoming credit.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: IncomingTransfer
Deterministic, derived from COELSA's id for the credit.
object"incoming_transfer"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Amount in cents of Argentine pesos; it can be zero.
Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.
conceptstring | null requiredBCRA purpose code reported by COELSA, if present.
pattern^[A-Z]{3}$statusstring requiredIn phase 1 always
posted.Values:postediso20022object requiredFields of
iso20022entry_statusstring requiredcamt.054
EntryStatus.Values:BOOK
railobject requiredFields of
railnamestring requiredValues:coelsa,fcm_bookoperation_idstring requiredCOELSA's id for the credit, or the originating
otr_…ifnameisfcm_book(internal between Grip Rails accounts). It is the idempotency key of the ledger entry.max. length64business_datestring (date) | null requiredBusiness (clearing) date reported by COELSA.
posted_atstring (date-time) requiredcreated_atstring (date-time) required
Credit through a reference CVU
{
"id": "itr_01JA2B3C4D5E6F7G8H9JKMNPQW",
"object": "incoming_transfer",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQD",
"cvu": "0000214300000009999994",
"amount": 1500000,
"currency": "ARS",
"charges": [
{
"type": "fee",
"code": "fcm_fee",
"amount": 50,
"description": "Comisión por crédito entrante"
}
],
"net_amount": 1499950,
"payer": {
"name": "PAGADOR EJEMPLO",
"cuit": "20000000001",
"account": "0000999100000000000420",
"account_type": "cvu",
"bank_code": null
},
"concept": "VAR",
"status": "posted",
"iso20022": {
"entry_status": "BOOK"
},
"rail": {
"name": "coelsa",
"operation_id": "WY7ZEPN6YGGPE6LV2Q0M5X",
"business_date": "2026-10-16"
},
"ledger_references": [
"3c9e1a7b5d2f8e4c6a0b9d3f7e1c5a2b",
"9d4b2f8a6c1e7d3b5f0a8c2e6d4b1f9a",
"5e2c8a4f1b7d9e3c6a0f2b8d4e6c1a7f"
],
"posted_at": "2026-10-16T21:20:15Z",
"created_at": "2026-10-16T21:20:15Z"
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Events
An ordered record of what happened, for reconciliation and for webhooks.
List events by cursor
The entity's events in ascending order of sequence, starting after after_sequence. Without a type filter,
sequence is contiguous: store the last one you processed and fetch from there. With the type filter the sequence has
gaps by design (it is only for lookups). It is the source for reconciliation; webhooks are a notice.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Query
after_sequenceinteger (int64)Returns the events with a
sequencegreater than this value. 0 by default (from the first one available).min.0· default0typeEventTypeFilters by event type.
limitintegerMaximum number of events (1 to 100).
min.1· max.100· default100
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 Page of events.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: EventList
object"list"requiredhas_moreboolean requirednext_after_sequenceinteger (int64) | null requiredValue for the next
after_sequence(thesequenceof the last event returned).
Two events
{
"object": "list",
"data": [
{
"id": "evt_01JA2B3C4D5E6F7G8H9JKMNPQX",
"object": "event",
"type": "transfer.outgoing.reserved",
"sequence": 41,
"entity_id": "ent_01JA2B3C4D5E6F7G8H9JKMNPQA",
"api_version": "2026-10-15",
"created_at": "2026-10-16T18:22:41Z",
"data": {
"object": "outgoing_transfer",
"id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"ledger_references": [
"7f3a9c2e4b1d8f6a0c5e3b9d7a1f4c2e",
"1b8e4d2c9a7f3e5d0b6c8a2f4e1d9c7b"
]
}
},
{
"id": "evt_01JA2B3C4D5E6F7G8H9JKMNPQY",
"object": "event",
"type": "transfer.outgoing.completed",
"sequence": 42,
"entity_id": "ent_01JA2B3C4D5E6F7G8H9JKMNPQA",
"api_version": "2026-10-15",
"created_at": "2026-10-16T18:22:44Z",
"data": {
"object": "outgoing_transfer",
"id": "otr_01JA2B3C4D5E6F7G8H9JKMNPQV",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"ledger_references": [
"2a6d9f3c8e1b5a7d4c0e9b2f6a8d3c1e",
"8c3f7a1e5d9b2c6f0a4e8d1b7c5f3a9e"
]
}
}
],
"has_more": false,
"next_after_sequence": 42
}
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get an event
Useful for confirming a received webhook through another channel.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The event.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Idempotency
Lookup of a used Idempotency-Key.
Look up an Idempotency-Key
Says whether the key is in progress or finished, which request it was used with (fingerprint), what we responded and
which object it created. Available for 35 days from first use. Transfer keys stay bound to their transfer after that
period (see GET /v1/outgoing_transfers?idempotency_key=).
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The key's record.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
FCM-VersionstringContract version used for the response.
Schema: IdempotencyRecord
object"idempotency_key"requiredstatusstring requiredValues:in_progress,completedmethodstring requiredValues:POSTpathstring requiredmax. length200request_fingerprintstring requiredSHA-256 of method, path and canonicalized body (RFC 8785).
pattern^[0-9a-f]{64}$response_statusinteger | null requiredmin.200· max.499resourceobject | null requiredObject created or affected, if any.
Variant object
objectstring requiredidstring required
created_atstring (date-time) requiredexpires_atstring (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Grip Rails keys
Public keys with which Grip Rails signs webhooks.
Grip Rails public keys for verifying webhooks
JWKS (RFC 7517) with the current public keys with which Grip Rails signs webhooks. No authentication required. The private keys live in KMS and never leave it.
No authentication.
Responses
200 Key set.
Headers
Cache-ControlstringCan be cached for 5 minutes.
Schema: Jwks
- min. items
1
A current P-256 key
{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
"kid": "fcm-whk-2026-10",
"alg": "ES256",
"use": "sig"
}
]
}
429 You exceeded the limit of requests per second.
Sandbox
Simulators. They exist only in the sandbox.
Simulate an incoming credit
Builds a synthetic COELSA notice to one of the entity's CVUs and runs it through the same path as a real one: an entry in
the sandbox ledger, the fee, the event transfer.incoming.posted and the webhook. Sandbox only.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: SimulateIncomingTransferRequest
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.payerobjectData of the simulated payer. If missing, a synthetic one is used.
conceptConceptBCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
ARS 15,000 credit
{
"account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQD",
"amount": 1500000
}
Responses
201 Credit simulated and posted.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: IncomingTransfer
Deterministic, derived from COELSA's id for the credit.
object"incoming_transfer"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Amount in cents of Argentine pesos; it can be zero.
Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.
conceptstring | null requiredBCRA purpose code reported by COELSA, if present.
pattern^[A-Z]{3}$statusstring requiredIn phase 1 always
posted.Values:postediso20022object requiredFields of
iso20022entry_statusstring requiredcamt.054
EntryStatus.Values:BOOK
railobject requiredFields of
railnamestring requiredValues:coelsa,fcm_bookoperation_idstring requiredCOELSA's id for the credit, or the originating
otr_…ifnameisfcm_book(internal between Grip Rails accounts). It is the idempotency key of the ledger entry.max. length64business_datestring (date) | null requiredBusiness (clearing) date reported by COELSA.
posted_atstring (date-time) requiredcreated_atstring (date-time) required
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
429 You exceeded the limit of requests per second.
Simulate COELSA's result for a transfer
Injects COELSA's result notice (equivalent to AvisoOperacionFinalizada) for a transfer in submitted: completed
posts the hold and failed releases it. On a failed transfer that went out through COELSA, completed simulates a
late settlement: the notice arrives after the hold was released and Grip Rails reopens the transfer through the same
path as in production (compensating debit of the amount, outgoing transfers disabled, submitted with status_reason: late_settlement_review and the event transfer.outgoing.reopened). Sandbox only. Any other case responds
400 parameter_invalid: another state, a failed transfer with outcome: failed, a failed transfer that never went
out to COELSA, or a reopened one (Grip Rails closes it: see
POST /v1/simulations/outgoing_transfers/{id}/late_settlement_review).
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: SimulateRailResultRequest
outcomestring requiredValues:completed,failedcoelsa_codestringCOELSA code to simulate. By default 7500 if
completedand 7699 iffailed.pattern^\d{2,4}$
COELSA rejects because the account does not exist
{
"outcome": "failed",
"coelsa_code": "7502"
}
On a failed transfer, COELSA credits it later (late settlement)
{
"outcome": "completed"
}
Responses
200 Result applied. Returns the updated transfer.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: OutgoingTransfer
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
429 You exceeded the limit of requests per second.
Simulate that two people at Grip Rails confirm a late settlement
For a transfer reopened by a late settlement (submitted with status_reason: late_settlement_review), simulates that
two people at Grip Rails confirm the settlement: in the sandbox they are two different synthetic operators who propose
and approve the reconciliation through the same path as in production. The 202 response carries the transfer still
reopened; a few seconds later Grip Rails closes it as completed, free of charge (charges with an fcm_fee of 0
and its reason), with the event transfer.outgoing.completed, and a few seconds after that it enables your outgoing
transfers again (GET /v1/entity is back to active; not if Grip Rails blocked your entity in the meantime): that
automatic re-enabling exists only in the sandbox; in production they stay disabled until Grip Rails re-enables them.
Sandbox only. A transfer that is not reopened responds 400 parameter_invalid.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: SimulateLateSettlementReviewRequest
outcomestring requiredThe only outcome of the review of a late settlement: two people at Grip Rails confirm that the money left, and the transfer is closed as
completed, free of charge.Values:completed
Two people at Grip Rails confirm the late settlement
{
"outcome": "completed"
}
Responses
202 Confirmed by two synthetic people. Returns the transfer still reopened; Grip Rails closes it as completed within seconds.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: OutgoingTransfer
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
429 You exceeded the limit of requests per second.
500 A Grip Rails error. Retry with the same Idempotency-Key.
Get the entity's test clock
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048
Responses
200 The clock.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: SandboxClock
object"sandbox_clock"requirednowstring (date-time) requiredThe entity's time in the sandbox.
offset_secondsinteger (int64) requiredHow far ahead it is of the real time.
min.0
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
429 You exceeded the limit of requests per second.
Advance the test clock
Moves the entity's time in the sandbox forward (never back). It affects the day and month of the limits, pending webhook retries and simulated expirations. Every date the sandbox returns for that entity uses this clock.
Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).
Headers
FCM-VersionstringDate-based version of the contract. If missing, the entity's pinned version is used.
pattern^\d{4}-\d{2}-\d{2}$Unique key per client intent. Required on every POST. See "Idempotency".
Signature-Inputstring requiredRFC 9421 signature parameters (covered components,
created,nonce,keyid,alg).max. length2048Content-Digeststring requiredSHA-256 of the exact bytes of the body, per RFC 9530.
pattern^sha-256=:[A-Za-z0-9+/]{43}=:$
Request body required
Schema: AdvanceClockRequest
advance_secondsinteger requiredSeconds to advance (up to 31 days per request).
min.1· max.2678400
Advance one day
{
"advance_seconds": 86400
}
Responses
200 Clock advanced.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Idempotent-Replayedbooleantrueif this is the stored response for that Idempotency-Key.
Schema: SandboxClock
object"sandbox_clock"requirednowstring (date-time) requiredThe entity's time in the sandbox.
offset_secondsinteger (int64) requiredHow far ahead it is of the real time.
min.0
400 Malformed request or invalid parameter. Nothing was created.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
parametro
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount tiene que ser un entero positivo en centavos.",
"display_message": null,
"param": "amount",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#amount_invalid",
"transfer_id": null
}
}
401 The API key or the signature is missing, or they are not valid.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
firma
{
"error": {
"type": "authentication_error",
"code": "signature_expired",
"message": "El parámetro created de la firma está fuera de la ventana de ±300 segundos.",
"display_message": null,
"param": null,
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": true,
"doc_url": "https://docs.fcmpayments.com/errores#signature_expired",
"transfer_id": null
}
}
403 The credential is valid but cannot do this (IP, environment or suspended entity).
404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
409 Idempotency conflict.
Headers
FCM-Request-IdRequestIdId of the request at Grip Rails. Quote it in any support inquiry.
Schema: Error
reusada
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La Idempotency-Key 01JA2B3C4D5E6F7G8H9JKMNPQR ya se usó con otro pedido (POST /v1/outgoing_transfers, huella distinta).",
"display_message": null,
"param": "Idempotency-Key",
"request_id": "req_01JA2B3C4D5E6F7G8H9JKMNPQT",
"retryable": false,
"doc_url": "https://docs.fcmpayments.com/errores#idempotency_key_reused",
"transfer_id": null
}
}
429 You exceeded the limit of requests per second.
Webhooks
What Grip Rails sends to your URL. How to verify them: Webhooks and signatures.
Money came into one of the entity's accounts
An incoming credit was posted. Call GET /v1/incoming_transfers/{data.id} for the details.
No authentication.
Headers
FCM-Signaturestring requiredCompact JWS (JWT) signed by Grip Rails. See "Events and webhooks" for the claims and the verification steps.
pattern^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$Id of the event (equal to the body's
id). The key for deduplication.Type of the event (equal to the body's
type).FCM-Delivery-Idstring requiredId of this delivery attempt (equal to the
jticlaim).pattern^whd_[0-9A-HJKMNP-TV-Z]{26}$FCM-Delivery-Attemptinteger requiredAttempt number (1 to 25).
min.1· max.25
Request body required
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
credito
{
"id": "evt_01JA2B3C4D5E6F7G8H9JKMNPQZ",
"object": "event",
"type": "transfer.incoming.posted",
"sequence": 43,
"entity_id": "ent_01JA2B3C4D5E6F7G8H9JKMNPQA",
"api_version": "2026-10-15",
"created_at": "2026-10-16T21:20:15Z",
"data": {
"object": "incoming_transfer",
"id": "itr_01JA2B3C4D5E6F7G8H9JKMNPQW",
"account_id": "acc_01JA2B3C4D5E6F7G8H9JKMNPQR",
"ledger_references": [
"3c9e1a7b5d2f8e4c6a0b9d3f7e1c5a2b",
"9d4b2f8a6c1e7d3b5f0a8c2e6d4b1f9a",
"5e2c8a4f1b7d9e3c6a0f2b8d4e6c1a7f"
]
}
}
Responses
2XX Received. Respond within 10 s at most and process in the background.
default Cualquier otra respuesta, o ninguna en 10 s, dispara un reintento según la política.
An outgoing transfer was authorized and put on hold
The authorization approved the transfer, and the amount plus charges are on hold in the ledger.
No authentication.
Headers
FCM-Signaturestring requiredCompact JWS (JWT) signed by Grip Rails. See "Events and webhooks" for the claims and the verification steps.
pattern^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$Id of the event (equal to the body's
id). The key for deduplication.Type of the event (equal to the body's
type).FCM-Delivery-Idstring requiredId of this delivery attempt (equal to the
jticlaim).pattern^whd_[0-9A-HJKMNP-TV-Z]{26}$FCM-Delivery-Attemptinteger requiredAttempt number (1 to 25).
min.1· max.25
Request body required
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
Responses
2XX Received.
default Reintento según la política.
An outgoing transfer was credited
COELSA confirmed the credit at the destination and the hold was posted. It is irreversible. A transfer reopened by a
late settlement arrives here when Grip Rails closes it, free of charge: its only debit is the compensating entry (its
references are in data.ledger_references).
No authentication.
Headers
FCM-Signaturestring requiredCompact JWS (JWT) signed by Grip Rails. See "Events and webhooks" for the claims and the verification steps.
pattern^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$Id of the event (equal to the body's
id). The key for deduplication.Type of the event (equal to the body's
type).FCM-Delivery-Idstring requiredId of this delivery attempt (equal to the
jticlaim).pattern^whd_[0-9A-HJKMNP-TV-Z]{26}$FCM-Delivery-Attemptinteger requiredAttempt number (1 to 25).
min.1· max.25
Request body required
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
Responses
2XX Received.
default Reintento según la política.
An outgoing transfer failed
COELSA rejected it or it expired, or Grip Rails canceled it before sending it. The hold was released and there was no charge. The reason is in the object's failure. If COELSA credits it later, transfer.outgoing.reopened arrives.
No authentication.
Headers
FCM-Signaturestring requiredCompact JWS (JWT) signed by Grip Rails. See "Events and webhooks" for the claims and the verification steps.
pattern^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$Id of the event (equal to the body's
id). The key for deduplication.Type of the event (equal to the body's
type).FCM-Delivery-Idstring requiredId of this delivery attempt (equal to the
jticlaim).pattern^whd_[0-9A-HJKMNP-TV-Z]{26}$FCM-Delivery-Attemptinteger requiredAttempt number (1 to 25).
min.1· max.25
Request body required
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
Responses
2XX Received.
default Reintento según la política.
A failed outgoing transfer was reopened
COELSA credited a transfer we had already reported to you as failed (late settlement): the money left. The transfer
goes back to submitted with status_reason: late_settlement_review, the amount was debited with a compensating entry
(its references are in data.ledger_references) and Grip Rails closes it as completed (event
transfer.outgoing.completed) when two people confirm the settlement. Call GET /v1/outgoing_transfers/{data.id} for
the current state.
No authentication.
Headers
FCM-Signaturestring requiredCompact JWS (JWT) signed by Grip Rails. See "Events and webhooks" for the claims and the verification steps.
pattern^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$Id of the event (equal to the body's
id). The key for deduplication.Type of the event (equal to the body's
type).FCM-Delivery-Idstring requiredId of this delivery attempt (equal to the
jticlaim).pattern^whd_[0-9A-HJKMNP-TV-Z]{26}$FCM-Delivery-Attemptinteger requiredAttempt number (1 to 25).
min.1· max.25
Request body required
Schema: Event
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
Responses
2XX Received.
default Reintento según la política.
Schemas
Every object in the contract. The type links in the reference lead here.
EntityId string
^ent_[0-9A-HJKMNP-TV-Z]{26}$AccountId string
^acc_[0-9A-HJKMNP-TV-Z]{26}$AccountNumberId string
^acn_[0-9A-HJKMNP-TV-Z]{26}$OutgoingTransferId string
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
^otr_[0-9A-HJKMNP-TV-Z]{26}$IncomingTransferId string
Deterministic, derived from COELSA's id for the credit.
^itr_[0-9A-HJKMNP-TV-Z]{26}$CounterpartyValidationId string
^cval_[0-9A-HJKMNP-TV-Z]{26}$EventId string
^evt_[0-9A-HJKMNP-TV-Z]{26}$RequestId string
^req_[0-9A-HJKMNP-TV-Z]{26}$IdempotencyKeyValue string
^[A-Za-z0-9._:-]{16,128}$Amount integer (int64)
Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.
1 · max. 9007199254740991AmountOrZero integer (int64)
Amount in cents of Argentine pesos; it can be zero.
0 · max. 9007199254740991Currency string
The API's only currency.
ARSCuit string
CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.
^\d{11}$BankKey string
A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
^\d{22}$Alias string
Alias in the COELSA system (the human-readable name of a CBU or CVU).
^[A-Za-z0-9.-]{6,20}$LedgerReference string
Opaque, stable reference to a ledger entry (128-bit id, in hexadecimal). It is derived from stable identifiers (COELSA id, entity and Idempotency-Key), so it does not change if the ledger is rebuilt.
^[0-9a-f]{32}$ExternalReference string
The client's reference for reconciliation. It does not have to be unique and it does not travel to COELSA.
^[A-Za-z0-9._:-]{1,64}$Metadata object
Up to 20 key-value pairs from the client. Do not include personal data.
Concept string
BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
VAR, ALQ, CUO, EXP, FAC, HAB, HON, PRE, SEG · default VAREntityStatus string
suspended: it can read but cannot order transfers.
active, suspended, closedEntity object
object"entity"requiredlegal_namestring requiredmax. length200CUIT under which the entity holds its CVUs with COELSA.
suspended: it can read but cannot order transfers.environmentstring requiredValues:live,testapi_versionstring requiredContract version pinned for the entity.
pattern^\d{4}-\d{2}-\d{2}$The entity's limits for outgoing transfers, set by contract (approved by Grip Rails; they cannot be changed through the API). They count the amount, without charges, of transfers in
reserved,submittedandcompleted.null= no limit.Fee per movement, as set in the contract. It is charged as a separate ledger entry: on an outgoing transfer it is held together with the transfer and released if the transfer fails; on an incoming one it is deducted when posting and never exceeds the amount received.
created_atstring (date-time) required
Limits object
The entity's limits for outgoing transfers, set by contract (approved by Grip Rails; they cannot be changed through the
API). They count the amount, without charges, of transfers in reserved, submitted and completed. null = no limit.
per_transfer_max_amountinteger (int64) | null requiredmin.1daily_max_amountinteger (int64) | null requiredmin.1monthly_max_amountinteger (int64) | null requiredmin.1
LimitUsage object
business_datestring (date) requiredBuenos Aires day to which the daily usage corresponds.
Amount in cents of Argentine pesos; it can be zero.
daily_remaining_amountinteger (int64) | null requirednullif there is no daily limit.min.0monthstring requiredpattern^\d{4}-\d{2}$Amount in cents of Argentine pesos; it can be zero.
monthly_remaining_amountinteger (int64) | null requirednullif there is no monthly limit.min.0
FeeRule object
Amount in cents of Argentine pesos; it can be zero.
rate_bpsinteger requiredPercentage in basis points of the amount (100 = 1%). The fee is fixed + percentage, rounded down to the cent.
min.0· max.10000
FeeSchedule object
Fee per movement, as set in the contract. It is charged as a separate ledger entry: on an outgoing transfer it is held together with the transfer and released if the transfer fails; on an incoming one it is deducted when posting and never exceeds the amount received.
AccountType string
funds: funds account, the one that operates. guarantee: guarantee account (a reserve) that the client deposits as
set in the contract to cover shortfalls; it is visible but cannot be debited through the API.
funds, guaranteeAccountStatus string
frozen: it cannot order outgoing transfers; incoming ones are posted.
active, frozen, closedBalances object
Amount in cents of Argentine pesos; it can be zero.
Amount in cents of Argentine pesos; it can be zero.
Amount in cents of Argentine pesos; it can be zero.
Account object
object"account"requiredfunds: funds account, the one that operates.guarantee: guarantee account (a reserve) that the client deposits as set in the contract to cover shortfalls; it is visible but cannot be debited through the API.namestring requiredmax. length80The API's only currency.
frozen: it cannot order outgoing transfers; incoming ones are posted.CVU shown as the origin to COELSA if the transfer does not specify another one.
created_atstring (date-time) requiredupdated_atstring (date-time) required
AccountList object
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
AccountNumberStatus string
pending: registration with COELSA in progress. inactive: deregistered or inactive at COELSA.
active, inactive, pendingHolder object
namestring requiredmax. length120CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.
AccountNumber object
object"account_number"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
pending: registration with COELSA in progress.inactive: deregistered or inactive at COELSA.Holder registered with COELSA. In phase 1 it is always the entity.
Fields of
holdernamestring requiredmax. length120CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.
is_primaryboolean requiredLabel the client requested for this CVU (for example, the id of its user or merchant). No personal data.
created_atstring (date-time) required
AccountNumberList object
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
Destination DestinationCbu | DestinationCvu | DestinationAlias
Destination of a transfer or of a validation.
One of: DestinationCbu, DestinationCvu, DestinationAlias
DestinationCbu object
type"cbu"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
DestinationCvu object
type"cvu"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
DestinationAlias object
type"alias"requiredAlias in the COELSA system (the human-readable name of a CBU or CVU).
Counterparty object
The destination's holder and account according to COELSA, as verified at authorization.
namestring requiredmax. length120CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.
A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
account_typestring requiredValues:cbu,cvubank_codestring | null requiredCode of the financial institution of the CBU, if COELSA reports it.
pattern^\d{3}$is_fcm_accountboolean requiredtrueif the destination is a Grip Rails account (the transfer is internal).
CounterpartyValidationRequest object
Destination of a transfer or of a validation.
expected_cuitCuitIf present, the result is
holder_mismatchwhen COELSA reports another CUIT.
CounterpartyValidationResult string
valid: holder found, account active and controls in order. not_found: COELSA does not know the account or the
alias. inactive: the account exists but is not active. holder_mismatch: the CUIT is not the expected one.
blocked: Grip Rails cannot operate with that account (compliance control; no details).
valid, not_found, inactive, holder_mismatch, blockedCounterpartyValidation object
object"counterparty_validation"requiredDestination of a transfer or of a validation.
valid: holder found, account active and controls in order.not_found: COELSA does not know the account or the alias.inactive: the account exists but is not active.holder_mismatch: the CUIT is not the expected one.blocked: Grip Rails cannot operate with that account (compliance control; no details).display_messagestring | null requiredText in Spanish to show the end user when the result is not
valid.Present if COELSA reported a holder (
valid,inactiveandholder_mismatch).validated_atstring (date-time) requiredexpires_atstring (date-time) requiredUntil when it can be used in a transfer (15 minutes).
OutgoingTransferCreateRequest object
account_number_idAccountNumberIdCVU of the account shown as the origin to COELSA. By default, the account's primary one.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Destination of a transfer or of a validation.
expected_counterparty_cuitCuitAlways recommended. If COELSA reports another CUIT for the holder, it is rejected with
destination_holder_mismatch.counterparty_validation_idCounterpartyValidationIdA current
validvalidation (15 minutes) of the same destination. If it expired or does not match,400 parameter_invalid.conceptConceptBCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstringThe client's text. It stays at Grip Rails; in phase 1 it does not travel to COELSA.
max. length140external_referenceExternalReferenceThe client's reference for reconciliation. It does not have to be unique and it does not travel to COELSA.
metadataMetadataUp to 20 key-value pairs from the client. Do not include personal data.
OutgoingTransferStatus string
See the table of states in the general description.
pending, rejected, reserved, submitted, completed, failedOutgoingTransferStatusReason string
Only in submitted. awaiting_rail_result: waiting for COELSA's notice (normal, seconds).
rail_outcome_unknown: the result did not arrive within the expected time; Grip Rails is resolving it with COELSA and
the money stays on hold. Do not retry with another Idempotency-Key: you could pay twice.
late_settlement_review: COELSA credited the transfer after we reported it to you as failed (late settlement). The
money left and the amount was debited with a compensating entry; Grip Rails closes it as completed when two people
confirm the settlement.
awaiting_rail_result, rail_outcome_unknown, late_settlement_reviewChargeType string
fee, taxChargeCode string
fcm_fee: Grip Rails fee. idcb: tax on bank debits and credits withheld by FCM Payment Solutions S.A.S. as withholding agent, when applicable.
fcm_fee, idcbCharge object
fcm_fee: Grip Rails fee.idcb: tax on bank debits and credits withheld by FCM Payment Solutions S.A.S. as withholding agent, when applicable.Amount in cents of Argentine pesos; it can be zero.
descriptionstring requiredmax. length140
Iso20022OutgoingStatus object
statusstring requiredpacs.002
TransactionStatus(ExternalPaymentTransactionStatus1Code).Values:PDNG,ACCP,ACSP,ACCC,RJCTreasonstring | null requiredExternalStatusReason1Code when
statusisRJCT(for example AM04, AC03, AC04, AB05, RR04).pattern^[A-Z0-9]{4}$
AuthorizationCheckName string
account: entity and account enabled. limits: limits. funds: ledger hold. counterparty: the destination's holder
at COELSA. compliance: sanctions lists and anti-fraud (reported together, without details).
account, limits, funds, counterparty, complianceAuthorizationCheck object
account: entity and account enabled.limits: limits.funds: ledger hold.counterparty: the destination's holder at COELSA.compliance: sanctions lists and anti-fraud (reported together, without details).resultstring requiredValues:passed,failed,not_run
Rationale object
codestring requiredapproved, or the error code of the rejection (for exampleinsufficient_funds).messagestring requiredmax. length300
Authorization object
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
decisionstring requiredapproved,declinedorpending(the authorization has not finished yet;decided_atis the time it became pending).Values:approved,declined,pendingdecided_atstring (date-time) requiredOne result per control.
not_runif it did not get to run because an earlier one failed.
Reservation object
Hold in the ledger (pending transfers) for the amount plus charges.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.statestring requiredheld: on hold.posted: posted (the money left).voided: released. A transfer reopened by a late settlement staysvoided(the hold was released when it failed and the amount was debited with a compensating entry); when Grip Rails closes it ascompleted, free of charge, it becomespostedfor the amount, with the references of the compensating entry.Values:held,posted,voidedplaced_atstring (date-time) requiredresolved_atstring (date-time) | null required
Rail object
namestring requiredcoelsa: transfer through COELSA.fcm_book: internal between Grip Rails accounts.Values:coelsa,fcm_bookoperation_idstring | null requiredId of the operation at COELSA.
max. length64origin_referencestring | null requiredori_trx_idwith which Grip Rails sent the operation. It does not change between retries.pattern^\d{1,16}$status_codestring | null requiredLatest COELSA status code (for example 7541 persisted, 7500 credited).
max. length8submitted_atstring (date-time) | null requiredfinalized_atstring (date-time) | null required
FailureCode string
rail_rejected: COELSA rejected it (details in rail.status_code and iso20022.reason). rail_expired: it expired at
COELSA. destination_closed: the destination account does not exist or is closed at the time of crediting.
canceled_by_fcm: Grip Rails canceled it before sending it (emergency stop, a control after the hold, or a pending transfer that could not be authorized).
rail_rejected, rail_expired, destination_closed, canceled_by_fcmFailure object
rail_rejected: COELSA rejected it (details inrail.status_codeandiso20022.reason).rail_expired: it expired at COELSA.destination_closed: the destination account does not exist or is closed at the time of crediting.canceled_by_fcm: Grip Rails canceled it before sending it (emergency stop, a control after the hold, or apendingtransfer that could not be authorized).messagestring requiredmax. length300display_messagestring | null requiredmax. length200
OutgoingTransfer object
Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.
object"outgoing_transfer"requiredCVU shown as the origin to COELSA.
nullif it was rejected before one was chosen.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Charges for this transfer. Each one with an amount is a separate ledger entry. A transfer reopened by a late settlement and completed carries no charge and says so with an
fcm_feeof0and its reason.Amount in cents of Argentine pesos.
150000= ARS 1,500.00.Destination of a transfer or of a validation.
Verified holder.
nullif it was rejected before the destination was looked up.BCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
descriptionstring | null requiredmax. length140Up to 20 key-value pairs from the client. Do not include personal data.
See the table of states in the general description.
Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.
nullif it was rejected before the hold.nulluntil it is sent.Present only in
failed.created_atstring (date-time) requiredupdated_atstring (date-time) requiredcompleted_atstring (date-time) | null requiredfailed_atstring (date-time) | null requiredTime at which it became
failed. It goes back tonullif it is reopened by a late settlement.
OutgoingTransferList object
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
Payer object
IncomingTransfer object
Deterministic, derived from COELSA's id for the credit.
object"incoming_transfer"requiredA 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.The API's only currency.
Amount in cents of Argentine pesos; it can be zero.
Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.
conceptstring | null requiredBCRA purpose code reported by COELSA, if present.
pattern^[A-Z]{3}$statusstring requiredIn phase 1 always
posted.Values:postediso20022object requiredFields of
iso20022entry_statusstring requiredcamt.054
EntryStatus.Values:BOOK
railobject requiredFields of
railnamestring requiredValues:coelsa,fcm_bookoperation_idstring requiredCOELSA's id for the credit, or the originating
otr_…ifnameisfcm_book(internal between Grip Rails accounts). It is the idempotency key of the ledger entry.max. length64business_datestring (date) | null requiredBusiness (clearing) date reported by COELSA.
posted_atstring (date-time) requiredcreated_atstring (date-time) required
IncomingTransferList object
object"list"requiredhas_moreboolean requirednext_cursorstring | null required
EventType string
Phase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: a failed transfer that COELSA credited later went back to submitted
(status_reason: late_settlement_review).
transfer.incoming.posted, transfer.outgoing.reserved, transfer.outgoing.completed, transfer.outgoing.failed, transfer.outgoing.reopenedEventData object
Thin reference to the object. For the current state, fetch the object.
objectstring requiredValues:incoming_transfer,outgoing_transferidstring requiredmax. length40Ledger entries that produced the event.
Event object
object"event"requiredPhase 1 types. New types can appear without a version notice; ignore the ones you do not know.
transfer.outgoing.reopened: afailedtransfer that COELSA credited later went back tosubmitted(status_reason: late_settlement_review).sequenceinteger (int64) requiredContiguous and increasing per entity, assigned in the order in which the change was confirmed.
min.1api_versionstring requiredpattern^\d{4}-\d{2}-\d{2}$created_atstring (date-time) requiredThin reference to the object. For the current state, fetch the object.
EventList object
object"list"requiredhas_moreboolean requirednext_after_sequenceinteger (int64) | null requiredValue for the next
after_sequence(thesequenceof the last event returned).
IdempotencyRecord object
object"idempotency_key"requiredstatusstring requiredValues:in_progress,completedmethodstring requiredValues:POSTpathstring requiredmax. length200request_fingerprintstring requiredSHA-256 of method, path and canonicalized body (RFC 8785).
pattern^[0-9a-f]{64}$response_statusinteger | null requiredmin.200· max.499resourceobject | null requiredObject created or affected, if any.
Variant object
objectstring requiredidstring required
created_atstring (date-time) requiredexpires_atstring (date-time) required
ErrorType string
invalid_request_error, authentication_error, permission_error, not_found_error, idempotency_error, transfer_declined, rate_limit_error, service_errorErrorCode string
See the table of codes in the general description.
invalid_request, parameter_missing, parameter_invalid, amount_invalid, currency_not_supported, concept_not_supported, destination_invalid, unsupported_version, idempotency_key_missing, idempotency_key_invalid, api_key_missing, api_key_invalid, signature_missing, signature_invalid, signature_expired, signature_replayed, signature_key_unknown, content_digest_mismatch, ip_not_allowed, environment_mismatch, entity_suspended, not_found, idempotency_key_reused, idempotency_request_in_progress, insufficient_funds, account_frozen, account_closed, limit_per_transfer_exceeded, limit_daily_exceeded, limit_monthly_exceeded, destination_not_found, destination_inactive, destination_is_source, destination_holder_mismatch, compliance_rejected, risk_rejected, rate_limited, internal_error, rail_unavailable, ledger_unavailable, transfers_paused, service_unavailableErrorBody object
See the table of codes in the general description.
messagestring requiredTechnical explanation for the integrator. Do not show it to end users.
display_messagestring | null requiredText in Spanish suitable for showing to an end user, or
null.paramstring | null requiredField or header that caused the error, if applicable.
retryableboolean requiredtrue: retry the same request with the same Idempotency-Key.doc_urlstring (uri) requiredIn a transfer
422, the id of the object that was left inrejected.
Error object
JwkOkp object
kty"OKP"requiredcrv"Ed25519"requiredxstring requiredpattern^[A-Za-z0-9_-]{43}$kidstring requiredmax. length64alg"EdDSA"requireduse"sig"required
JwkEc object
kty"EC"requiredcrv"P-256"requiredxstring requiredpattern^[A-Za-z0-9_-]{43}$ystring requiredpattern^[A-Za-z0-9_-]{43}$kidstring requiredmax. length64alg"ES256"requireduse"sig"required
SimulateIncomingTransferRequest object
Amount in cents of Argentine pesos.
150000= ARS 1,500.00.payerobjectData of the simulated payer. If missing, a synthetic one is used.
conceptConceptBCRA purpose code for the transfer, which travels to COELSA. Initial list; it can grow additively. VAR miscellaneous, ALQ rent, CUO installments, EXP building fees, FAC invoices, HAB salaries, HON professional fees, PRE loans, SEG insurance.
SimulateRailResultRequest object
outcomestring requiredValues:completed,failedcoelsa_codestringCOELSA code to simulate. By default 7500 if
completedand 7699 iffailed.pattern^\d{2,4}$
SimulateLateSettlementReviewRequest object
outcomestring requiredThe only outcome of the review of a late settlement: two people at Grip Rails confirm that the money left, and the transfer is closed as
completed, free of charge.Values:completed
SandboxClock object
object"sandbox_clock"requirednowstring (date-time) requiredThe entity's time in the sandbox.
offset_secondsinteger (int64) requiredHow far ahead it is of the real time.
min.0
AdvanceClockRequest object
advance_secondsinteger requiredSeconds to advance (up to 31 days per request).
min.1· max.2678400