Skip to content

Domestic wires

A domestic wire sends funds from a pocket to a US bank account your customer has registered and verified with Jiko. Wires are credit-push only and settle within a bank business day; there is no return window and no equivalent of an ACH return.

Required end-user disclosure. When you build wire entry screens in your own UI, you must show your end users the following: "By using this service, you hereby acknowledge that sending wires to third parties presents an increased risk of fraud, and that as per the terms of your Commercial Bank Account Agreement (the "Agreement"), you agree that our security measures are commercially reasonable methods of providing security against unauthorized Funds Transfers, and that you shall be bound by any request for a Funds Transfer received by the Bank, whether or not authorized, issued in your name and accepted by the Bank in compliance with the security measures."

Prerequisites

Feature flags

Feature flags are set by Jiko per partner and evaluated against the API user making the request. A call that needs a flag you do not have fails with 403. Ask your Jiko point of contact for the ones you need.

FlagNeeded forWithout it
enable_counterparty_ownershipSending ownership_type on a wire counterparty at all — FIRST_PARTY and THIRD_PARTY both go through it403. Omitting the field is accepted, but the counterparty is then not marked third party, which changes the unverified rule below
unverified_wire_counterpartyunverified verification on a counterparty that is not explicitly THIRD_PARTY403 at counterparty creation
pre_verified_wire_counterpartypre_verified verification403 at counterparty creation

None of these gates the wire itself. POST /api/v1/jiko-accounts/{account_id}/wires/ carries no feature flag — the flags gate the counterparty you must have before you can send.

Everything else

  • Outbound wires enabled on your partnership. They are not on by default, and this is commercial rather than a flag.
  • An approved customer and a pocket in OPEN status.
  • A wire counterparty in LINKED status. Jiko never wires to a raw account number. PENDING is not enough, and FAILED, UNLINKED and CLOSED are terminal. Wait for counterparty.status.linked.
  • A verification method your ownership_type permits. unverified is not a way to skip verification on your customer's own account; see the table below. supporting_documents needs at least one already-uploaded document ID, and review takes days, so budget for it.
  • Balance that can actually move. Read liquidation_value_t0 and liquidation_value_t1 on the pocket's portfolio rather than total_value.
  • created_by on every wire. It is required, and it is what Jiko records as the instructing party.
  • A wire_id you generate. The create call returns 201 with an empty body, so without your own ID you have no handle on the wire.
  • The end-user disclosure above, shown in your own UI. It is a contractual condition of the product, not a recommendation.
  • A wire-enabled portal, to receive. The portal must be OPEN and carry WIRE in its payment_rails, and the payer must be given the values from the portal's funding instructions rather than assembled details.
  • A webhook subscription for transfers.wire.out.processing, transfers.wire.out.success, transfers.wire.out.rejected and, for inbound, transfers.wire.in.success and transfers.wire.in.rejected. Subscriptions are recorded against the API user that creates them.

Register the wire counterparty

POST /api/v2/customers/{customer_id}/counterparties/

A wire counterparty carries:

FieldNotes
counterparty_nameDiscriminated on type: individual (first_name, last_name) or business (business_name)
addressBeneficiary address, state required
institution_nameReceiving bank
routing_numberBeneficiary bank ABA
identifier / identifier_codeThe beneficiary account identifier and what kind it is — DIRECT_DEPOSIT_ACCOUNT, SWIFT_BIC, FED_ROUTING_NUMBER, CHIPS_PARTICIPANT and others
wire_instructionsUp to 140 characters, carried on the message
ownership_typeFIRST_PARTY or THIRD_PARTY
display_nameUp to 200 characters, your own label, no effect on routing

ownership_type decides which verification is acceptable

FIRST_PARTY means the destination account belongs to your customer. THIRD_PARTY means it belongs to someone else — a supplier, a landlord, a contractor.

Verification methodAllowed onNotes
incoming_wireFirst partyA wire was received from that account, proving control. Reference the receiving wire_id
supporting_documentsFirst or third partyDocuments submitted and reviewed. Reviewed by Jiko, takes days
pre_verifiedFirst partyYou verified by Plaid or micro-deposit on your side and assert it. Enabled per partner
unverifiedThird party onlyOwnership verification is not the right check when the account is not the customer's. Enabled per partner

unverified is not a shortcut for skipping verification on a customer's own account. A first-party destination must be verified by one of the other methods.

Wait for the counterparty.status.linked webhook before originating. It carries counterparty_id and customer_id.

Workflow

Partner systems:

  1. Decide ownership_type. It constrains which verification you may use, and it is the field that decides whether unverified needs a feature flag.
  2. Register the counterparty with type: "wire" and a verification block. For supporting_documents, upload the documents first — the request takes their IDs, at least one.
  3. Wait for counterparty.status.linked. FAILED, UNLINKED and CLOSED are terminal; recovering means registering a new counterparty.
  4. Create the wire with your own wire_id and a created_by.
  5. Track it by wire_id — through the webhooks, the wire resource, and filter[wire] on the transaction feed.

Relevant API endpoints

StepPurposeEndpoint
1Register the beneficiary as a counterpartyPOST /api/v2/customers/{customer_id}/counterparties/
2Check its status without waiting on the webhookGET /api/v2/customers/{customer_id}/counterparties/{counterparty_id}/
3Send the wirePOST /api/v1/jiko-accounts/{account_id}/wires/
4Read it back, including wire_tracking_infoGET /api/v1/wires/{wire_id}/
5Resolve it to its transactionGET /api/v2/transactions/?filter[wire]={wire_id}

Create a wire

POST /api/v1/jiko-accounts/{account_id}/wires/
FieldNotes
counterparty_idThe linked wire counterparty
amount_usdcAmount in USD cents
created_byIdentifier of the person or system instructing the wire. Required
descriptionUp to 100 characters, carried to the beneficiary as originator-to-beneficiary information
wire_idClient-generated UUID. Optional, but always supply one

Always supply wire_id

The endpoint returns 201 with an empty body. If you do not supply an ID, Jiko generates one and you have no direct way to learn it — you would have to list wires and match on amount and time. Supplying your own makes the call idempotent and gives you the handle for every subsequent lookup and every webhook.

created_by is recorded on the wire. Where a wire requires approval, Jiko also records the approvers and returns them as client_verifiers.

Lifecycle

StatusMeaning
PENDINGAccepted and progressing
SUCCESSSent to the network
REJECTEDRejected or cancelled

SUCCESS means the wire has been sent, not that the beneficiary bank has credited it.

Webhooks

EventMeaning
transfers.wire.out.processingWire accepted and in progress
transfers.wire.out.successWire sent
transfers.wire.out.rejectedWire rejected or cancelled

Payload: jiko_account_id and wire_id.

transfers.wire.out.processing can fire more than once as a wire moves between internal stages, all of which collapse to the same event. Treat it as "still in progress" and rely on success or rejected for terminal outcomes.

Endpoints

OperationEndpoint
Create a wirePOST /api/v1/jiko-accounts/{account_id}/wires/
List wiresGET /api/v1/wires/
Get a wireGET /api/v1/wires/{wire_id}/

GET /api/v1/wires/ is cursor-paginated and accepts direction=OUTGOING, customer_id and pocket_id. An outgoing wire returns status, amount, pocket_id, counterparty_id, client_verifiers and wire_tracking_info.

Tracing

Once the wire is exported, Jiko assigns the network identifiers and exposes them in wire_tracking_info:

  • uetr — the end-to-end reference that follows the payment through every institution in the chain. This is what a beneficiary's bank asks for when tracing a payment, and what you should surface to a customer chasing one.
  • imad — the clearing network's input reference.
  • instruction_identification and end_to_end_identification — party-assigned references on the ISO 20022 message, up to 35 characters each.

These are populated when the wire is sent, so they are absent while the wire is PENDING.

Reading the money

An outgoing wire appears in the transaction feed as type: "WIRE" with direction: "DEBIT", carrying wire_id, counterparty_name and reference_number.

Resolve a wire to its transaction with filter[wire], which accepts one or more wire IDs. filter[type]=WIRE narrows to the rail, and the usual amount_from / amount_to / time_booked_from / time_booked_to / time_settled_from / time_settled_to filters are available.

The wire resource and the transaction serve different purposes: the wire resource is the payment as the network sees it, the transaction is the money as the pocket sees it.

Receiving a domestic wire

Inbound domestic wires address a portal directly. The beneficiary account number on the wire is the portal's account number and the receiving bank is Jiko's domestic bank. Jiko resolves the portal from the account number and checks that the routing number on the wire matches the portal's; a mismatch stops the wire from being attributed automatically.

Get the details to hand a payer from:

GET /api/v2/pockets/{pocket_id}/portals/{portal_id}/funding-instructions/

The DOMESTIC_WIRE instruction returns the receiver bank (routing number, name, address) and the beneficiary (account number, the customer's legal name, address), already populated. Do not assemble them yourself from the portal's raw fields.

A wire-enabled portal returns both a domestic and an international instruction, and they are not interchangeable — the beneficiary account differs between them.

Inbound events are transfers.wire.in.success and transfers.wire.in.rejected, with a payload of jiko_account_id and wire_id. Where Jiko cannot resolve the beneficiary to a pocket, no event fires and no transaction exists.

Wires post within a bank business day. A wire arriving outside banking hours, at a weekend, or on a bank holiday posts on the next business day, not on receipt.

See also