RAILS
Sandbox

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:

  1. 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.
  2. 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: ed25519 or ecdsa-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 send FCM-Version, also "fcm-version". "authorization" is not signed: a signature that covers it is rejected with signature_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_…) and alg.
    • With a body: Content-Digest: sha-256=:…: (RFC 9530) computed over the exact bytes you send.
HTTP
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-Key is required on every POST (16 to 128 characters A-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).
  • 5xx responses 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 with GET /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 202 response is stored and replayed like any 2xx. The current state is available at GET /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 (Deprecation and Sunset headers, 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_version field).

Amounts, currency and dates

  • Amounts: integers in cents of Argentine pesos (150000 = ARS 1,500.00). Currency: ARS only.
  • 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/v1/entity#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The entity.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: Entity

  • id EntityId required
  • object "entity" required
  • legal_name string required
    max. length 200
  • cuit Cuit | null required

    CUIT under which the entity holds its CVUs with COELSA.

  • status EntityStatus required

    suspended: it can read but cannot order transfers.

  • environment string required
    Values: live, test
  • api_version string required

    Contract version pinned for the entity.

    pattern ^\d{4}-\d{2}-\d{2}$
  • limits Limits required

    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.

  • usage LimitUsage required
  • fees FeeSchedule required

    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_at string (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Accounts

The entity's payment accounts in pesos (funds and guarantee), with their ledger balance.

GET/v1/accounts#

List accounts

Lists the entity's accounts with their balance and status.

Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).

Query

  • limit integer

    Maximum number of objects per page.

    min. 1 · max. 100 · default 25
  • starting_after string

    Opaque cursor (next_cursor from the previous page).

    max. length 200

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 Page of accounts.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: AccountList

  • object "list" required
  • data array of Account required
  • has_more boolean required
  • next_cursor string | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/accounts/{account_id}#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The account.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: Account

  • id AccountId required
  • object "account" required
  • entity_id EntityId required
  • type AccountType required

    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.

  • name string required
    max. length 80
  • currency Currency required

    The API's only currency.

  • status AccountStatus required

    frozen: it cannot order outgoing transfers; incoming ones are posted.

  • balances Balances required
  • primary_account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA if the transfer does not specify another one.

  • created_at string (date-time) required
  • updated_at string (date-time) required

Funds account with an outgoing transfer in progress

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Account numbers

The CVUs of each account (N per account). The entity is the holder of all of them.

GET/v1/account_numbers#

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_id AccountId

    Filters by account.

  • Filters by status.

  • limit integer

    Maximum number of objects per page.

    min. 1 · max. 100 · default 25
  • starting_after string

    Opaque cursor (next_cursor from the previous page).

    max. length 200

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 Page of account numbers.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: AccountNumberList

  • object "list" required
  • data array of AccountNumber required
  • has_more boolean required
  • next_cursor string | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/account_numbers/{account_number_id}#

Get an account number

Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The account number.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: AccountNumber

  • id AccountNumberId required
  • object "account_number" required
  • account_id AccountId required
  • cvu BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • alias Alias | null required
  • status AccountNumberStatus required

    pending: registration with COELSA in progress. inactive: deregistered or inactive at COELSA.

  • holder Holder required

    Holder registered with COELSA. In phase 1 it is always the entity.

    Fields of holder
    • name string required
      max. length 120
    • cuit Cuit required

      CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

  • is_primary boolean required
  • external_reference ExternalReference | null required

    Label the client requested for this CVU (for example, the id of its user or merchant). No personal data.

  • created_at string (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Counterparties

Validation of a destination's holder against COELSA before paying.

POST/v1/counterparty_validations#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-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 Destination required

    Destination of a transfer or of a validation.

  • expected_cuit Cuit

    If present, the result is holder_mismatch when COELSA reports another CUIT.

Validate an alias expecting a CUIT

application/json
{
  "destination": {
    "type": "alias",
    "value": "proveedor.ejemplo"
  },
  "expected_cuit": "27000000006"
}

Responses

201 Validation done (the result may be negative).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: CounterpartyValidation

  • object "counterparty_validation" required
  • destination Destination required

    Destination of a transfer or of a validation.

  • expected_cuit Cuit | null required
  • 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_message string | null required

    Text in Spanish to show the end user when the result is not valid.

  • counterparty Counterparty | null required

    Present if COELSA reported a holder (valid, inactive and holder_mismatch).

  • validated_at string (date-time) required
  • expires_at string (date-time) required

    Until when it can be used in a transfer (15 minutes).

Holder found and active

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Outgoing transfers

Payments in pesos to a CBU, CVU or alias, with prior authorization and a ledger hold.

POST/v1/outgoing_transfers#

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:

  1. Account and entity active, account not frozen and transfers enabled.
  2. Per-transaction limit.
  3. Hold in the ledger (pending transfer) for the amount plus charges. Without an available balance: insufficient_funds.
  4. 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 sent expected_counterparty_cuit, matches.
  5. Sanctions lists (Argentina's RePET, the UN and OFAC) on the destination holder.
  6. The entity's daily and monthly limits (transfers in reserved, submitted and completed count).
  7. 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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-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_id AccountId required
  • account_number_id AccountNumberId

    CVU of the account shown as the origin to COELSA. By default, the account's primary one.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • destination Destination required

    Destination of a transfer or of a validation.

  • expected_counterparty_cuit Cuit

    Always recommended. If COELSA reports another CUIT for the holder, it is rejected with destination_holder_mismatch.

  • counterparty_validation_id CounterpartyValidationId

    A current valid validation (15 minutes) of the same destination. If it expired or does not match, 400 parameter_invalid.

  • concept Concept

    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.

  • description string

    The client's text. It stays at Grip Rails; in phase 1 it does not travel to COELSA.

    max. length 140
  • external_reference ExternalReference

    The client's reference for reconciliation. It does not have to be unique and it does not travel to COELSA.

  • metadata Metadata

    Up to 20 key-value pairs from the client. Do not include personal data.

Payment to a CBU with a holder check

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: OutgoingTransfer

  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

Just authorized

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: OutgoingTransfer

  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: Error

sin_saldo

application/json
{
  "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

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/outgoing_transfers#

List outgoing transfers

Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).

Query

  • account_id AccountId

    Filters by account.

  • Filters by status.

  • idempotency_key IdempotencyKeyValue

    Finds the transfer created with this Idempotency-Key (it also works after the 35 days).

  • external_reference ExternalReference

    Filters by your reference.

  • created_after string (date-time)

    Only objects created at or after this instant (RFC 3339).

  • created_before string (date-time)

    Only objects created before this instant (RFC 3339).

  • limit integer

    Maximum number of objects per page.

    min. 1 · max. 100 · default 25
  • starting_after string

    Opaque cursor (next_cursor from the previous page).

    max. length 200

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 Page of outgoing transfers.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: OutgoingTransferList

  • object "list" required
  • data array of OutgoingTransfer required
  • has_more boolean required
  • next_cursor string | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/outgoing_transfers/{outgoing_transfer_id}#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The transfer.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: OutgoingTransfer

  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

Credited by COELSA

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Incoming transfers

Credits received on the entity's CVUs, posted with real settlement from COELSA.

GET/v1/incoming_transfers#

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_id AccountId

    Filters by account.

  • account_number_id AccountNumberId

    Filters by the CVU it came in through.

  • created_after string (date-time)

    Only objects created at or after this instant (RFC 3339).

  • created_before string (date-time)

    Only objects created before this instant (RFC 3339).

  • limit integer

    Maximum number of objects per page.

    min. 1 · max. 100 · default 25
  • starting_after string

    Opaque cursor (next_cursor from the previous page).

    max. length 200

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 Page of incoming credits.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: IncomingTransferList

  • object "list" required
  • data array of IncomingTransfer required
  • has_more boolean required
  • next_cursor string | null required
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/incoming_transfers/{incoming_transfer_id}#

Get an incoming credit

Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The incoming credit.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: IncomingTransfer

  • id IncomingTransferId required

    Deterministic, derived from COELSA's id for the credit.

  • object "incoming_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId required
  • cvu BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required
  • net_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • payer Payer required

    Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.

  • concept string | null required

    BCRA purpose code reported by COELSA, if present.

    pattern ^[A-Z]{3}$
  • status string required

    In phase 1 always posted.

    Values: posted
  • iso20022 object required
    Fields of iso20022
    • entry_status string required

      camt.054 EntryStatus.

      Values: BOOK
  • rail object required
    Fields of rail
    • name string required
      Values: coelsa, fcm_book
    • operation_id string required

      COELSA's id for the credit, or the originating otr_… if name is fcm_book (internal between Grip Rails accounts). It is the idempotency key of the ledger entry.

      max. length 64
    • business_date string (date) | null required

      Business (clearing) date reported by COELSA.

  • ledger_references array of LedgerReference required
  • posted_at string (date-time) required
  • created_at string (date-time) required

Credit through a reference CVU

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Events

An ordered record of what happened, for reconciliation and for webhooks.

GET/v1/events#

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_sequence integer (int64)

    Returns the events with a sequence greater than this value. 0 by default (from the first one available).

    min. 0 · default 0
  • Filters by event type.

  • limit integer

    Maximum number of events (1 to 100).

    min. 1 · max. 100 · default 100

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 Page of events.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: EventList

  • object "list" required
  • data array of Event required
  • has_more boolean required
  • next_after_sequence integer (int64) | null required

    Value for the next after_sequence (the sequence of the last event returned).

Two events

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/events/{event_id}#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The event.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin 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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Idempotency

Lookup of a used Idempotency-Key.

GET/v1/idempotency_keys/{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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The key's record.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • FCM-Version string

    Contract version used for the response.

Schema: IdempotencyRecord

  • key IdempotencyKeyValue required
  • object "idempotency_key" required
  • status string required
    Values: in_progress, completed
  • method string required
    Values: POST
  • path string required
    max. length 200
  • request_fingerprint string required

    SHA-256 of method, path and canonicalized body (RFC 8785).

    pattern ^[0-9a-f]{64}$
  • response_status integer | null required
    min. 200 · max. 499
  • resource object | null required

    Object created or affected, if any.

    Variant object
    • object string required
    • id string required
  • created_at string (date-time) required
  • expires_at string (date-time) required
401 The API key or the signature is missing, or they are not valid.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

Grip Rails keys

Public keys with which Grip Rails signs webhooks.

GET/.well-known/jwks.json#

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-Control string

    Can be cached for 5 minutes.

Schema: Jwks

A current P-256 key

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

Sandbox

Simulators. They exist only in the sandbox.

POST/v1/simulations/incoming_transfers#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-256 of the exact bytes of the body, per RFC 9530.

    pattern ^sha-256=:[A-Za-z0-9+/]{43}=:$

Request body required

Schema: SimulateIncomingTransferRequest

  • account_number_id AccountNumberId required
  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • payer object

    Data of the simulated payer. If missing, a synthetic one is used.

    Fields of payer
    • name string
      max. length 120
    • cuit Cuit

      CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

    • account BankKey

      A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • concept Concept

    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.

ARS 15,000 credit

application/json
{
  "account_number_id": "acn_01JA2B3C4D5E6F7G8H9JKMNPQD",
  "amount": 1500000
}

Responses

201 Credit simulated and posted.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: IncomingTransfer

  • id IncomingTransferId required

    Deterministic, derived from COELSA's id for the credit.

  • object "incoming_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId required
  • cvu BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required
  • net_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • payer Payer required

    Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.

  • concept string | null required

    BCRA purpose code reported by COELSA, if present.

    pattern ^[A-Z]{3}$
  • status string required

    In phase 1 always posted.

    Values: posted
  • iso20022 object required
    Fields of iso20022
    • entry_status string required

      camt.054 EntryStatus.

      Values: BOOK
  • rail object required
    Fields of rail
    • name string required
      Values: coelsa, fcm_book
    • operation_id string required

      COELSA's id for the credit, or the originating otr_… if name is fcm_book (internal between Grip Rails accounts). It is the idempotency key of the ledger entry.

      max. length 64
    • business_date string (date) | null required

      Business (clearing) date reported by COELSA.

  • ledger_references array of LedgerReference required
  • posted_at string (date-time) required
  • created_at string (date-time) required
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

POST/v1/simulations/outgoing_transfers/{outgoing_transfer_id}/rail_result#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-256 of the exact bytes of the body, per RFC 9530.

    pattern ^sha-256=:[A-Za-z0-9+/]{43}=:$

Request body required

Schema: SimulateRailResultRequest

  • outcome string required
    Values: completed, failed
  • coelsa_code string

    COELSA code to simulate. By default 7500 if completed and 7699 if failed.

    pattern ^\d{2,4}$

COELSA rejects because the account does not exist

application/json
{
  "outcome": "failed",
  "coelsa_code": "7502"
}

On a failed transfer, COELSA credits it later (late settlement)

application/json
{
  "outcome": "completed"
}

Responses

200 Result applied. Returns the updated transfer.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: OutgoingTransfer

  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

POST/v1/simulations/outgoing_transfers/{outgoing_transfer_id}/late_settlement_review#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-256 of the exact bytes of the body, per RFC 9530.

    pattern ^sha-256=:[A-Za-z0-9+/]{43}=:$

Request body required

Schema: SimulateLateSettlementReviewRequest

  • outcome string required

    The 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

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: OutgoingTransfer

  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

503 COELSA, the ledger or transfers are not available right now. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

GET/v1/simulations/clock#

Get the entity's test clock

Authentication: API key (Authorization: Bearer) and request signature (Signature, Signature-Input).

Headers

  • FCM-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048

Responses

200 The clock.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: SandboxClock

  • object "sandbox_clock" required
  • entity_id EntityId required
  • now string (date-time) required

    The entity's time in the sandbox.

  • offset_seconds integer (int64) required

    How 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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

429 You exceeded the limit of requests per second.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

POST/v1/simulations/clock/advance#

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-Version string

    Date-based version of the contract. If missing, the entity's pinned version is used.

    pattern ^\d{4}-\d{2}-\d{2}$
  • Idempotency-Key IdempotencyKeyValue required

    Unique key per client intent. Required on every POST. See "Idempotency".

  • Signature-Input string required

    RFC 9421 signature parameters (covered components, created, nonce, keyid, alg).

    max. length 2048
  • Content-Digest string required

    SHA-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_seconds integer required

    Seconds to advance (up to 31 days per request).

    min. 1 · max. 2678400

Advance one day

application/json
{
  "advance_seconds": 86400
}

Responses

200 Clock advanced.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Idempotent-Replayed boolean

    true if this is the stored response for that Idempotency-Key.

Schema: SandboxClock

  • object "sandbox_clock" required
  • entity_id EntityId required
  • now string (date-time) required

    The entity's time in the sandbox.

  • offset_seconds integer (int64) required

    How far ahead it is of the real time.

    min. 0
400 Malformed request or invalid parameter. Nothing was created.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

parametro

application/json
{
  "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-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

firma

application/json
{
  "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).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

404 It does not exist, or it belongs to another entity (Grip Rails does not distinguish between the two cases).
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

409 Idempotency conflict.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

reusada

application/json
{
  "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.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

  • Retry-After integer

    Seconds to wait before retrying.

Schema: Error

500 A Grip Rails error. Retry with the same Idempotency-Key.
Headers
  • FCM-Request-Id RequestId

    Id of the request at Grip Rails. Quote it in any support inquiry.

Schema: Error

Webhooks

What Grip Rails sends to your URL. How to verify them: Webhooks and signatures.

POSTtransfer.incoming.posted#

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-Signature string required

    Compact 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_-]+$
  • FCM-Event-Id EventId required

    Id of the event (equal to the body's id). The key for deduplication.

  • FCM-Event-Type EventType required

    Type of the event (equal to the body's type).

  • FCM-Delivery-Id string required

    Id of this delivery attempt (equal to the jti claim).

    pattern ^whd_[0-9A-HJKMNP-TV-Z]{26}$
  • FCM-Delivery-Attempt integer required

    Attempt number (1 to 25).

    min. 1 · max. 25

Request body required

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin reference to the object. For the current state, fetch the object.

credito

application/json
{
  "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.
POSTtransfer.outgoing.reserved#

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-Signature string required

    Compact 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_-]+$
  • FCM-Event-Id EventId required

    Id of the event (equal to the body's id). The key for deduplication.

  • FCM-Event-Type EventType required

    Type of the event (equal to the body's type).

  • FCM-Delivery-Id string required

    Id of this delivery attempt (equal to the jti claim).

    pattern ^whd_[0-9A-HJKMNP-TV-Z]{26}$
  • FCM-Delivery-Attempt integer required

    Attempt number (1 to 25).

    min. 1 · max. 25

Request body required

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin reference to the object. For the current state, fetch the object.

Responses

2XX Received.
default Reintento según la política.
POSTtransfer.outgoing.completed#

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-Signature string required

    Compact 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_-]+$
  • FCM-Event-Id EventId required

    Id of the event (equal to the body's id). The key for deduplication.

  • FCM-Event-Type EventType required

    Type of the event (equal to the body's type).

  • FCM-Delivery-Id string required

    Id of this delivery attempt (equal to the jti claim).

    pattern ^whd_[0-9A-HJKMNP-TV-Z]{26}$
  • FCM-Delivery-Attempt integer required

    Attempt number (1 to 25).

    min. 1 · max. 25

Request body required

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin reference to the object. For the current state, fetch the object.

Responses

2XX Received.
default Reintento según la política.
POSTtransfer.outgoing.failed#

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-Signature string required

    Compact 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_-]+$
  • FCM-Event-Id EventId required

    Id of the event (equal to the body's id). The key for deduplication.

  • FCM-Event-Type EventType required

    Type of the event (equal to the body's type).

  • FCM-Delivery-Id string required

    Id of this delivery attempt (equal to the jti claim).

    pattern ^whd_[0-9A-HJKMNP-TV-Z]{26}$
  • FCM-Delivery-Attempt integer required

    Attempt number (1 to 25).

    min. 1 · max. 25

Request body required

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin reference to the object. For the current state, fetch the object.

Responses

2XX Received.
default Reintento según la política.
POSTtransfer.outgoing.reopened#

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-Signature string required

    Compact 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_-]+$
  • FCM-Event-Id EventId required

    Id of the event (equal to the body's id). The key for deduplication.

  • FCM-Event-Type EventType required

    Type of the event (equal to the body's type).

  • FCM-Delivery-Id string required

    Id of this delivery attempt (equal to the jti claim).

    pattern ^whd_[0-9A-HJKMNP-TV-Z]{26}$
  • FCM-Delivery-Attempt integer required

    Attempt number (1 to 25).

    min. 1 · max. 25

Request body required

Schema: Event

  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin 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
pattern ^ent_[0-9A-HJKMNP-TV-Z]{26}$
AccountId string
pattern ^acc_[0-9A-HJKMNP-TV-Z]{26}$
AccountNumberId string
pattern ^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.

pattern ^otr_[0-9A-HJKMNP-TV-Z]{26}$
IncomingTransferId string

Deterministic, derived from COELSA's id for the credit.

pattern ^itr_[0-9A-HJKMNP-TV-Z]{26}$
CounterpartyValidationId string
pattern ^cval_[0-9A-HJKMNP-TV-Z]{26}$
EventId string
pattern ^evt_[0-9A-HJKMNP-TV-Z]{26}$
RequestId string
pattern ^req_[0-9A-HJKMNP-TV-Z]{26}$
IdempotencyKeyValue string
pattern ^[A-Za-z0-9._:-]{16,128}$
Amount integer (int64)

Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

min. 1 · max. 9007199254740991
AmountOrZero integer (int64)

Amount in cents of Argentine pesos; it can be zero.

min. 0 · max. 9007199254740991
Currency string

The API's only currency.

Values: ARS
Cuit string

CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

pattern ^\d{11}$
BankKey string

A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

pattern ^\d{22}$
Alias string

Alias in the COELSA system (the human-readable name of a CBU or CVU).

pattern ^[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.

pattern ^[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.

pattern ^[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.

Values: VAR, ALQ, CUO, EXP, FAC, HAB, HON, PRE, SEG · default VAR
EntityStatus string

suspended: it can read but cannot order transfers.

Values: active, suspended, closed
Entity object
  • id EntityId required
  • object "entity" required
  • legal_name string required
    max. length 200
  • cuit Cuit | null required

    CUIT under which the entity holds its CVUs with COELSA.

  • status EntityStatus required

    suspended: it can read but cannot order transfers.

  • environment string required
    Values: live, test
  • api_version string required

    Contract version pinned for the entity.

    pattern ^\d{4}-\d{2}-\d{2}$
  • limits Limits required

    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.

  • usage LimitUsage required
  • fees FeeSchedule required

    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_at string (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_amount integer (int64) | null required
    min. 1
  • daily_max_amount integer (int64) | null required
    min. 1
  • monthly_max_amount integer (int64) | null required
    min. 1
LimitUsage object
  • business_date string (date) required

    Buenos Aires day to which the daily usage corresponds.

  • daily_used_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • daily_remaining_amount integer (int64) | null required

    null if there is no daily limit.

    min. 0
  • month string required
    pattern ^\d{4}-\d{2}$
  • monthly_used_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • monthly_remaining_amount integer (int64) | null required

    null if there is no monthly limit.

    min. 0
FeeRule object
  • fixed_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • rate_bps integer required

    Percentage 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.

Values: funds, guarantee
AccountStatus string

frozen: it cannot order outgoing transfers; incoming ones are posted.

Values: active, frozen, closed
Balances object
  • posted AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • held AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • available AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

Account object
  • id AccountId required
  • object "account" required
  • entity_id EntityId required
  • type AccountType required

    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.

  • name string required
    max. length 80
  • currency Currency required

    The API's only currency.

  • status AccountStatus required

    frozen: it cannot order outgoing transfers; incoming ones are posted.

  • balances Balances required
  • primary_account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA if the transfer does not specify another one.

  • created_at string (date-time) required
  • updated_at string (date-time) required
AccountList object
  • object "list" required
  • data array of Account required
  • has_more boolean required
  • next_cursor string | null required
AccountNumberStatus string

pending: registration with COELSA in progress. inactive: deregistered or inactive at COELSA.

Values: active, inactive, pending
Holder object
  • name string required
    max. length 120
  • cuit Cuit required

    CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

AccountNumber object
  • id AccountNumberId required
  • object "account_number" required
  • account_id AccountId required
  • cvu BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • alias Alias | null required
  • status AccountNumberStatus required

    pending: registration with COELSA in progress. inactive: deregistered or inactive at COELSA.

  • holder Holder required

    Holder registered with COELSA. In phase 1 it is always the entity.

    Fields of holder
    • name string required
      max. length 120
    • cuit Cuit required

      CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

  • is_primary boolean required
  • external_reference ExternalReference | null required

    Label the client requested for this CVU (for example, the id of its user or merchant). No personal data.

  • created_at string (date-time) required
AccountNumberList object
  • object "list" required
  • data array of AccountNumber required
  • has_more boolean required
  • next_cursor string | null required
Destination DestinationCbu | DestinationCvu | DestinationAlias

Destination of a transfer or of a validation.

One of: DestinationCbu, DestinationCvu, DestinationAlias

DestinationCbu object
  • type "cbu" required
  • value BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

DestinationCvu object
  • type "cvu" required
  • value BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

DestinationAlias object
  • type "alias" required
  • value Alias required

    Alias 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.

  • name string required
    max. length 120
  • cuit Cuit required

    CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

  • account BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • account_type string required
    Values: cbu, cvu
  • bank_code string | null required

    Code of the financial institution of the CBU, if COELSA reports it.

    pattern ^\d{3}$
  • alias Alias | null required
  • is_fcm_account boolean required

    true if the destination is a Grip Rails account (the transfer is internal).

CounterpartyValidationRequest object
  • destination Destination required

    Destination of a transfer or of a validation.

  • expected_cuit Cuit

    If present, the result is holder_mismatch when 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).

Values: valid, not_found, inactive, holder_mismatch, blocked
CounterpartyValidation object
  • object "counterparty_validation" required
  • destination Destination required

    Destination of a transfer or of a validation.

  • expected_cuit Cuit | null required
  • 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_message string | null required

    Text in Spanish to show the end user when the result is not valid.

  • counterparty Counterparty | null required

    Present if COELSA reported a holder (valid, inactive and holder_mismatch).

  • validated_at string (date-time) required
  • expires_at string (date-time) required

    Until when it can be used in a transfer (15 minutes).

OutgoingTransferCreateRequest object
  • account_id AccountId required
  • account_number_id AccountNumberId

    CVU of the account shown as the origin to COELSA. By default, the account's primary one.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • destination Destination required

    Destination of a transfer or of a validation.

  • expected_counterparty_cuit Cuit

    Always recommended. If COELSA reports another CUIT for the holder, it is rejected with destination_holder_mismatch.

  • counterparty_validation_id CounterpartyValidationId

    A current valid validation (15 minutes) of the same destination. If it expired or does not match, 400 parameter_invalid.

  • concept Concept

    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.

  • description string

    The client's text. It stays at Grip Rails; in phase 1 it does not travel to COELSA.

    max. length 140
  • external_reference ExternalReference

    The client's reference for reconciliation. It does not have to be unique and it does not travel to COELSA.

  • metadata Metadata

    Up to 20 key-value pairs from the client. Do not include personal data.

OutgoingTransferStatus string

See the table of states in the general description.

Values: pending, rejected, reserved, submitted, completed, failed
OutgoingTransferStatusReason 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.

Values: awaiting_rail_result, rail_outcome_unknown, late_settlement_review
ChargeType string
Values: fee, tax
ChargeCode 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.

Values: fcm_fee, idcb
Charge object
  • type ChargeType required
  • code ChargeCode required

    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 AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • description string required
    max. length 140
Iso20022OutgoingStatus object
  • status string required

    pacs.002 TransactionStatus (ExternalPaymentTransactionStatus1Code).

    Values: PDNG, ACCP, ACSP, ACCC, RJCT
  • reason string | null required

    ExternalStatusReason1Code when status is RJCT (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).

Values: account, limits, funds, counterparty, compliance
AuthorizationCheck 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).

  • result string required
    Values: passed, failed, not_run
Rationale object
  • code string required

    approved, or the error code of the rejection (for example insufficient_funds).

  • message string required
    max. length 300
Authorization object

Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • decision string required

    approved, declined or pending (the authorization has not finished yet; decided_at is the time it became pending).

    Values: approved, declined, pending
  • decided_at string (date-time) required
  • rationale Rationale required
  • checks array of AuthorizationCheck required

    One result per control. not_run if 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 Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • state string required

    held: on hold. posted: posted (the money left). voided: released. A transfer reopened by a late settlement stays voided (the hold was released when it failed and the amount was debited with a compensating entry); when Grip Rails closes it as completed, free of charge, it becomes posted for the amount, with the references of the compensating entry.

    Values: held, posted, voided
  • placed_at string (date-time) required
  • resolved_at string (date-time) | null required
  • ledger_references array of LedgerReference required
Rail object
  • name string required

    coelsa: transfer through COELSA. fcm_book: internal between Grip Rails accounts.

    Values: coelsa, fcm_book
  • operation_id string | null required

    Id of the operation at COELSA.

    max. length 64
  • origin_reference string | null required

    ori_trx_id with which Grip Rails sent the operation. It does not change between retries.

    pattern ^\d{1,16}$
  • status_code string | null required

    Latest COELSA status code (for example 7541 persisted, 7500 credited).

    max. length 8
  • submitted_at string (date-time) | null required
  • finalized_at string (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).

Values: rail_rejected, rail_expired, destination_closed, canceled_by_fcm
Failure object
  • code FailureCode required

    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).

  • message string required
    max. length 300
  • display_message string | null required
    max. length 200
OutgoingTransfer object
  • id OutgoingTransferId required

    Deterministic, derived from the entity and the Idempotency-Key, so a retry reaches the same object.

  • object "outgoing_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId | null required

    CVU shown as the origin to COELSA. null if it was rejected before one was chosen.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required

    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_fee of 0 and its reason.

  • total_debit_amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • destination Destination required

    Destination of a transfer or of a validation.

  • counterparty Counterparty | null required

    Verified holder. null if it was rejected before the destination was looked up.

  • concept Concept required

    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.

  • description string | null required
    max. length 140
  • external_reference ExternalReference | null required
  • metadata Metadata required

    Up to 20 key-value pairs from the client. Do not include personal data.

  • status OutgoingTransferStatus required

    See the table of states in the general description.

  • status_reason OutgoingTransferStatusReason | null required
  • iso20022 Iso20022OutgoingStatus required
  • authorization Authorization required

    Decision of the prior authorization, with its reason. FCM Payment Solutions S.A.S. also keeps the full detail of each control.

  • reservation Reservation | null required

    null if it was rejected before the hold.

  • rail Rail | null required

    null until it is sent.

  • failure Failure | null required

    Present only in failed.

  • idempotency_key IdempotencyKeyValue required
  • created_at string (date-time) required
  • updated_at string (date-time) required
  • completed_at string (date-time) | null required
  • failed_at string (date-time) | null required

    Time at which it became failed. It goes back to null if it is reopened by a late settlement.

OutgoingTransferList object
  • object "list" required
  • data array of OutgoingTransfer required
  • has_more boolean required
  • next_cursor string | null required
Payer object

Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.

  • name string | null required
    max. length 120
  • cuit Cuit | null required
  • account BankKey | null required
  • account_type string | null required
    Values: cbu, cvu, null
  • bank_code string | null required
    pattern ^\d{3}$
IncomingTransfer object
  • id IncomingTransferId required

    Deterministic, derived from COELSA's id for the credit.

  • object "incoming_transfer" required
  • account_id AccountId required
  • account_number_id AccountNumberId required
  • cvu BankKey required

    A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • currency Currency required

    The API's only currency.

  • charges array of Charge required
  • net_amount AmountOrZero required

    Amount in cents of Argentine pesos; it can be zero.

  • payer Payer required

    Who paid, according to COELSA's notice. Any field can be missing if COELSA does not report it.

  • concept string | null required

    BCRA purpose code reported by COELSA, if present.

    pattern ^[A-Z]{3}$
  • status string required

    In phase 1 always posted.

    Values: posted
  • iso20022 object required
    Fields of iso20022
    • entry_status string required

      camt.054 EntryStatus.

      Values: BOOK
  • rail object required
    Fields of rail
    • name string required
      Values: coelsa, fcm_book
    • operation_id string required

      COELSA's id for the credit, or the originating otr_… if name is fcm_book (internal between Grip Rails accounts). It is the idempotency key of the ledger entry.

      max. length 64
    • business_date string (date) | null required

      Business (clearing) date reported by COELSA.

  • ledger_references array of LedgerReference required
  • posted_at string (date-time) required
  • created_at string (date-time) required
IncomingTransferList object
  • object "list" required
  • data array of IncomingTransfer required
  • has_more boolean required
  • next_cursor string | 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).

Values: transfer.incoming.posted, transfer.outgoing.reserved, transfer.outgoing.completed, transfer.outgoing.failed, transfer.outgoing.reopened
EventData object

Thin reference to the object. For the current state, fetch the object.

  • object string required
    Values: incoming_transfer, outgoing_transfer
  • id string required
    max. length 40
  • account_id AccountId required
  • ledger_references array of LedgerReference required

    Ledger entries that produced the event.

Event object
  • id EventId required
  • object "event" required
  • type EventType required

    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).

  • sequence integer (int64) required

    Contiguous and increasing per entity, assigned in the order in which the change was confirmed.

    min. 1
  • entity_id EntityId required
  • api_version string required
    pattern ^\d{4}-\d{2}-\d{2}$
  • created_at string (date-time) required
  • data EventData required

    Thin reference to the object. For the current state, fetch the object.

EventList object
  • object "list" required
  • data array of Event required
  • has_more boolean required
  • next_after_sequence integer (int64) | null required

    Value for the next after_sequence (the sequence of the last event returned).

IdempotencyRecord object
  • key IdempotencyKeyValue required
  • object "idempotency_key" required
  • status string required
    Values: in_progress, completed
  • method string required
    Values: POST
  • path string required
    max. length 200
  • request_fingerprint string required

    SHA-256 of method, path and canonicalized body (RFC 8785).

    pattern ^[0-9a-f]{64}$
  • response_status integer | null required
    min. 200 · max. 499
  • resource object | null required

    Object created or affected, if any.

    Variant object
    • object string required
    • id string required
  • created_at string (date-time) required
  • expires_at string (date-time) required
ErrorType string
Values: invalid_request_error, authentication_error, permission_error, not_found_error, idempotency_error, transfer_declined, rate_limit_error, service_error
ErrorCode string

See the table of codes in the general description.

Values: 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_unavailable
ErrorBody object
  • type ErrorType required
  • code ErrorCode required

    See the table of codes in the general description.

  • message string required

    Technical explanation for the integrator. Do not show it to end users.

  • display_message string | null required

    Text in Spanish suitable for showing to an end user, or null.

  • param string | null required

    Field or header that caused the error, if applicable.

  • request_id RequestId required
  • retryable boolean required

    true: retry the same request with the same Idempotency-Key.

  • doc_url string (uri) required
  • transfer_id OutgoingTransferId | null required

    In a transfer 422, the id of the object that was left in rejected.

Error object
JwkOkp object
  • kty "OKP" required
  • crv "Ed25519" required
  • x string required
    pattern ^[A-Za-z0-9_-]{43}$
  • kid string required
    max. length 64
  • alg "EdDSA" required
  • use "sig" required
JwkEc object
  • kty "EC" required
  • crv "P-256" required
  • x string required
    pattern ^[A-Za-z0-9_-]{43}$
  • y string required
    pattern ^[A-Za-z0-9_-]{43}$
  • kid string required
    max. length 64
  • alg "ES256" required
  • use "sig" required
Jwks object
SimulateIncomingTransferRequest object
  • account_number_id AccountNumberId required
  • amount Amount required

    Amount in cents of Argentine pesos. 150000 = ARS 1,500.00.

  • payer object

    Data of the simulated payer. If missing, a synthetic one is used.

    Fields of payer
    • name string
      max. length 120
    • cuit Cuit

      CUIT or CUIL (Argentine tax or labor ID), 11 digits without hyphens.

    • account BankKey

      A 22-digit CBU or CVU (Argentine bank or virtual account number) with valid check digits.

  • concept Concept

    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.

SimulateRailResultRequest object
  • outcome string required
    Values: completed, failed
  • coelsa_code string

    COELSA code to simulate. By default 7500 if completed and 7699 if failed.

    pattern ^\d{2,4}$
SimulateLateSettlementReviewRequest object
  • outcome string required

    The 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" required
  • entity_id EntityId required
  • now string (date-time) required

    The entity's time in the sandbox.

  • offset_seconds integer (int64) required

    How far ahead it is of the real time.

    min. 0
AdvanceClockRequest object
  • advance_seconds integer required

    Seconds to advance (up to 31 days per request).

    min. 1 · max. 2678400